Language:
Fortran
Dialect:
SilverFrost F95 Express
Discussion:
This module contains a complete set of routines for controlling the text cursor in SilverFrost F95 Express.
Note the updates to the Fortran "locate" routine elsewhere on this web site. The cursorOff and cursorOn routines are new.
!---
! fCursor holds routines to manipulate the text cursor in Silverfrost
! Fortran 95.
!---
module fCursor
implicit none
type consoleCursorInfo
integer :: dwSize
logical :: bVisible
end type consoleCursorInfo
contains
! cls
! cursorOff
! cursorOn
! locate
! putd
! puti
! puts
! str
! uPause
! cls clears the screen and homes the cursor.
subroutine cls()
call SYSTEM('cls')
end subroutine cls
! cursorOff hides the text cursor.
subroutine cursorOff
include 'win32api.ins' ! Routines.
include 'win32prm.ins' ! Constants.
type(consoleCursorInfo) :: cInfo ! Cursor information.
integer :: handleForConsole ! From GetStdHandle routine.
handleForConsole = GetStdHandle(STD_OUTPUT_HANDLE);
cInfo%dwSize = 1
cInfo%bVisible = .false.
call SetConsoleCursorInfo(handleForConsole, cInfo)
end subroutine cursorOff
! cursorOn makes the text cursor visible.
subroutine cursorOn
include 'win32api.ins' ! Routines.
include 'win32prm.ins' ! Constants.
type(consoleCursorInfo) :: cInfo ! Cursor information.
integer :: handleForConsole ! From GetStdHandle routine.
handleForConsole = GetStdHandle(STD_OUTPUT_HANDLE);
cInfo%dwSize = 10
cInfo%bVisible = .true.
call SetConsoleCursorInfo(handleForConsole, cInfo)
end subroutine cursorOn
! locate does the Windows-API-related work of moving the text cursor.
subroutine locate(row, col)
implicit none
integer, intent(in) :: row ! On screen, 0-24.
integer, intent(in) :: col ! On screen, 0-79.
integer :: coord ! Composite value (row, column).
integer :: handleForConsole ! From GetStdHandle routine.
include 'win32api.ins' ! Routines.
include 'win32prm.ins' ! Constants.
coord = 65536 * (row-1) + (col-1) ! Jam both values in one integer.
handleForConsole = GetStdHandle(STD_OUTPUT_HANDLE)
call SetConsoleCursorPosition(handleForConsole, coord)
end subroutine locate
! putd writes a real number at row r, column c.
subroutine putd(r, c, x, w, dec)
implicit none
integer, parameter :: dbl = selected_real_kind(p=15)
integer, intent(in) :: r, c
real(dbl) :: x
integer, intent(in) :: w, dec
character(10) :: fmt
fmt = '(f'//trim(str(w))//'.'//trim(str(dec))//')'
call locate(r, c)
write(*, fmt) x
end subroutine putd
! puti writes an integer at row r, column c.
subroutine puti(r, c, i, w)
implicit none
integer, intent(in) :: r, c, i, w
character(8) :: fmt
fmt = '(i'//trim(str(w))//')'
call locate(r, c)
write(*, fmt) i
end subroutine puti
! puts writes a string at row r, column c.
subroutine puts(r, c, st)
implicit none
integer, intent(in) :: r, c
character(*), intent(in) :: st
integer :: length
character(8) :: fmt
length = len(st)
fmt = '(a'//trim(str(length))//')'
call locate(r, c)
write(*, fmt) st
end subroutine puts
! str converts an integer to a left-justified string.
character(len=20) function str(i)
implicit none
integer, intent(in) :: i
write (str, *) i
str = adjustl(str)
end function str
! uPause lets the user read before going on.
subroutine uPause
implicit none
character*(1) :: ans
call locate(25, 1)
write(*, '(''g + [Enter] to go on. '', $)')
read (*, *) ans
end subroutine uPause
end module fCursor
| Page created: | 08/15/2015 |
| Last modified: | 08/21/2017 |
| Author: | BPL |