[Back to SCREEN SWAG index]  [Back to Main SWAG index]  [Original]

{
In artice <DE6swr.6CK@postoffice.ptd.net>, NUKE@postoffice.ptd.net wrote:
 > How do I read text from the screen (ascii/ansi) so that I can put it back up
 > later (ex...to display a help menu then replace area where menu was with
 > original text)???    Thanks in advance.

Here it is:

TYPE TScreenBuffer = Array[1..20004] of Byte;
     PScreenBuffer = ^TScreenBuffer;
}

FUNCTION SBASE;
BEGIN
     Sbase:=SegB800;
     IF ScrMode  = 7 THEN sbase:=Segb000;
END;

FUNCTION StoreScrPart(X1,Y1,X2,Y2:Byte):PScreenBuffer;
VAR Hlp  : Word;
    I,J  : Integer;
    Sb   : Word;
    Buff : PScreenBuffer;
BEGIN
     hlp:=4+(((Y2-Y1)+1)*((X2-X1)+1))*2;
     IF ( MaxAvail> hlp ) THEN
     BEGIN
          Getmem(Buff,Hlp);
          Buff^[1]:=X1;
          Buff^[2]:=X2;
          Buff^[3]:=Y1;
          Buff^[4]:=Y2;
          Sb:=Sbase;
          For I := X1 to X2 do
              For J := Y1 to Y2 Do
                  Move(ptr(sb,(I-1)*2+(J-1)*160)^,Buff^[5+((I-X1)+(J-Y1)*(X2-X1+1))*2],2);
          StoreScrPart:=Buff;
     END
     ELSE StoreScrPart:=NIL;
END;

PROCEDURE RestoreScrPart(P:PScreenBuffer);
VAR Hlp         : Word;
    I,J         : Integer;
    x1,y1,x2,y2 : Byte;
    Sb          : Word;
BEGIN
     IF P = NIL THEN EXIT;
     x1:=P^[1];
     X2:=P^[2];
     Y1:=P^[3];
     Y2:=P^[4];
     Hlp:=4+(((Y2-Y1)+1)*((X2-X1)+1))*2;
     Sb:=SBase;
     For I := X1 to X2 do
         For J := Y1 to Y2 Do
             Move(P^[5+((I-X1)+(J-Y1)*(X2-X1+1))*2],Ptr(sb,(I-1)*2+(J-1)*160)^,2);
     FreeMem(P,hlp);
END;

FUNCTION ReadScr:PScreenBuffer;
BEGIN
     ReadScr:=StoreScrPart (1,1,AnzSpalten,AnzZeilen);
END;

PROCEDURE WriteScr(P:PScreenBuffer);
BEGIN
     RestoreScrPart(P);
END;


Now just use
  VAR P: PScreenBuffer;
  BEGIN
       P:=ReadScr;
       ....
       { write back : }
       WriteScr(P);
  END;

[Back to SCREEN SWAG index]  [Back to Main SWAG index]  [Original]