[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
From: Michael Slack <mgslack@rsoc.rockwell.com>
> I need a way to enter strings while in graphics mode.
>
> Right now, I am just using ReadLn... for the first time I input a
> string, it gets shown, just as it would in DOS, in the upper-left hand
> corner of the screen. This is just fine, as there are no important
> screen elements there, and I can just erase it after the string is
> entered. But then, the next inputted string shows up on the next 'line'
> of the screen, just like a normal text cursor would move down a line. I
> need a way to either select where (and preferably in which font) the text
> would be entered, or a way to reposition the 'text' cursor back at its
> original home position in the upper-left corner. I really need this
> SOON, so PLEASE, if ya know, mail or followup. Thanks eversomuch...
Try using this. I wrote it some time ago.
(* INCLUDE file for inputting text in graphics mode *)
}
(************************************************************************)
{ AUTHOR: Michael G. Slack }
{ ENVIRONMENT: Turbo Pascal V6.0 }
{ PURPOSE: This include is used to implement a graphical input routine }
{ for text strings. It is general enough to be used by any graphics }
{ mode. }
(************************************************************************)
TYPE CHARSET = SET OF CHAR;
CONST Null = #0; {constants brought from editln unit}
Bell = ^G;
BS = #8;
LF = #10;
CR = #13;
ESC = #27;
Space = #32;
Tab = ^I;
BackTab = #143;
F1 = #187;
F2 = #188;
F3 = #189;
F4 = #190;
F5 = #191;
F6 = #192;
F7 = #193;
F8 = #194;
F9 = #195;
F10 = #196;
UpKey = #200;
DownKey = #208;
LeftKey = #203;
RightKey = #205;
PgUpKey = #201;
PgDnKey = #209;
HomeKey = #199;
EndKey = #207;
InsKey = #210;
DelKey = #211;
MouseClick = #255;
(************************************************************************)
FUNCTION ScanKey : CHAR;
(* Reads a key from the keyboard and converts 2 scan code escape *)
(* sequences into 1 character. *)
VAR Ch : CHAR;
BEGIN (*scankey*)
REPEAT UNTIL KeyPressed OR (Mouse.Event = $04) {left button released}
OR (Mouse.Event = $10); {right button released}
IF Mouse.Event > 0
THEN BEGIN
ScanKey := MouseClick; Mouse.Event := 0;
Exit;
END;
Ch := ReadKey;
IF (Ch = #0) AND KeyPressed
THEN BEGIN
Ch := ReadKey;
IF Ord(Ch) < 128 THEN Ch := Chr(Ord(Ch) + 128);
END;
ScanKey := Ch;
END; (*scankey*)
(************************************************************************)
FUNCTION CursorWait(X,Y,FCol,BCol : INTEGER) : CHAR;
(* function to wait for a keypress and return the key *)
VAR XX : INTEGER;
BEGIN (*cursorwait*)
XX := X+TextWidth('M');
Y := Y + 3 + TextHeight('M');
REPEAT
SetColor(FCol); Line(X,Y,XX,Y);
Delay(55);
SetColor(BCol); Line(X,Y,XX,Y);
Delay(55);
UNTIL Keypressed OR (Mouse.Event > 0);
CursorWait := ScanKey;
SetColor(FCol);
END; (*cursorwait*)
(************************************************************************)
PROCEDURE InputALineOfText(L, X, Y : INTEGER; Legal, Terms : CHARSET;
VAR S : STRING; VAR TC : CHAR);
(* procedure to allow an input of a line of text at an xy loc *)
(* in graphics mode. Will place cursor at end of string pas- *)
(* sed. will need to use editln.tpu (from database toolbox). *)
VAR P, PP : INTEGER;
Ch : CHAR ABSOLUTE TC;
SStr : STRING[1];
CSave : BYTE;
BEGIN (*inputalineoftext*)
P := Length(S);
PP := TextWidth(S);
OutTextXY(X,Y,S);
REPEAT
Ch := CursorWait(X+PP,Y,GetColor,Black);
CASE Ch OF
#32..#126 : IF (P < L) AND (Ch IN Legal)
THEN BEGIN
IF Length(S) = L THEN Delete(S,L,1);
Inc(P);
Insert(Ch,S,P);
SStr := Ch;
OutTextXY(X+PP,Y,SStr);
PP := PP + TextWidth(SStr)
END
ELSE Write(Bell);
BS, #127,
LeftKey : IF P > 0
THEN BEGIN
SStr := S[P];
CSave := GetColor;
SetColor(GetBkColor);
PP := PP - TextWidth(SStr);
Delete(S,P,1);
Dec(P);
OutTextXY(X+PP,Y,SStr);
SetColor(CSave);
END
ELSE Write(Bell);
ELSE IF NOT(Ch IN Terms) THEN Write(Bell);
END; {case}
ClearKB;
UNTIL Ch IN Terms;
END; (*inputalineoftext*)
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]