[fpc-pascal]Text mode windows

Jeff Wormsley daworm at cdc.net
Fri Nov 17 15:11:17 CET 2000


On 11/17/2000 at 8:42 AM James_Wilson at i2.com wrote:

>To me, this seems wrong but I haven't been
>able to determine how to name a window so I can just put calls in the code
>to MainWindow, TimerWindow, etc. Is there a better way to do this??

Can you encapsulate the window functionality in a class?  I am not sure how the window unit works, as I have always done direct screen writes (and the Win32 equivalent).  From what little I remember, you don't get a "handle" to the window, per se, so you can't really store it as a named thing.  Perhaps this would work...

Type
 TTextWindow = Class (TObject)
  private
   FLeft,
   FRight,
   FTop,
   FBottom : Byte;
   FCursorX,
   FCursorY : Byte;
   procedure SaveWindow;
   procedure RestoreWindow;
  public
   constructor Create(Top, Left, Bottom, Right : Byte); override;
   procedure WinWrite(S: String);
   procedure WinWriteXY(S: String);
   procedure WinClrScrn;
   procedure WinGotoXY(X,Y: Byte);
  end;

constructor TTextWindow.Create(Top, Left, Bottom, Right : Byte);
Begin
 inherited Create;
 FTop := Top;
 FLeft := Left;
 FBottom := Bottom;
 FRight := Right;
 Window(FTop, FLeft, FBottom, FRight);
 SaveWindow;
End;

Procedure TTextWindow.SaveWindow;
Begin
 FCursorX := WhereX;
 FCursorY := WhereY;
End;

Procedure TTextWindow.RestoreWindow;
Begin
 Window(FTop, FLeft, FBottom, FRight);
 GotoXY(FCursorX, FCursorY);
End;

procedure TTextWindow.WinWrite(S: String);
Begin
 RestoreWindow;
 Write(S);
 SaveWindow;
End;

procedure TTextWindow.WinWriteln(S: String);
Begin
 RestoreWindow;
 Writeln(S);
 SaveWindow;
End;

procedure TTextWindow.WinClrScrn;
Begin
 RestoreWindow;
 ClrScrn;
 SaveWindow;
End;


procedure TTextWindow.WinGotoXY(X,Y: Byte);
Begin
 RestoreWindow;
 GotoXY(X,Y);
 SaveWindow;
End;

Var
 MyFirstWindow, MySecondWindow : TTextWindow;
 
Begin
 MyFirstWindow := TTextWindow.Create(1,1,10,40); 
 MySecondWindow := TTextWindow.Create(11,1,21,40);
 MyFirstWindow.WinWriteln('Hello'); 
 MySecondWindow.WinWriteln('Hello'); 
 MyFirstWindow.WinWriteln('Hello Again');
 MySecondWindow.WinWriteln('Hello Again'); 
 MyFirstWindow.Free;
 MySecondWindow.Free;
End;


This is totally untested, and obviously you'll want more (like text attributes and so on) but it should be close to what you need.  Just remember that you can't overlap windows with this approach (well, you can, but it would be ugly...)

Hope this helps,
 Jeff.






More information about the fpc-pascal mailing list