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

(*
Write a unit, that assigns an text file to the Graphics Screen and then
assign output with this proc, then use rewrite(output) and you can
use write/writeln in Graphics mode as well. Don't forget
Assign(output,'');rewrite(output) or
CrtAssign(output);rewrite(output) when back in Text Mode!
You can even implement read/readln in graphics mode, but this is more
 complicated.
One difference to text mode: use MoveTo instead of GotoXY!

I've neither my unit nor the TP manual available just now,
but it works like this (output only!):
*)
unit GrpWrite;

interface

uses Graph,Dos,BGIFont,BGIDriv;

procedure GraphAssign(var F:text);

implementation
{$R-,S-}

var
  GraphDriver, GraphMode, Error : integer;
  a : string;

procedure Abort(Msg : string);
begin
  Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
  Halt(1);
end;

{$F+} {DO NOT FORGET}

function GraphFlush(var F:TextRec):integer;
begin
  GraphFlush := 0;
end;

function GraphClose(var F:TextRec):integer;
 begin
   GraphClose := 0;
 end;       {There's nothing to close}


function GraphWrite(var F:TextRec):integer;
 var
  s : string;
  P : word;
 begin
 with F do
 begin
   P := 0;
   while P<BufPos do
   begin
     OutText(BufPtr^[P]);
     Inc(P);
   end;
   BufPos := 0;
 end;
{               (may need more than one OutText...)}
  (*... {Clear buffer}*)
  GraphWrite := 0;
 end;


function GraphOpen(var F:TextRec):integer;
 begin
   { Register all the drivers }
  if RegisterBGIdriver(@CGADriverProc) < 0 then
    Abort('CGA');
  if RegisterBGIdriver(@EGAVGADriverProc) < 0 then
    Abort('EGA/VGA');
  if RegisterBGIdriver(@HercDriverProc) < 0 then
    Abort('Herc');
  if RegisterBGIdriver(@ATTDriverProc) < 0 then
    Abort('AT&T');
  if RegisterBGIdriver(@PC3270DriverProc) < 0 then
    Abort('PC 3270');


  { Register all the fonts }
  if RegisterBGIfont(@GothicFontProc) < 0 then
    Abort('Gothic');
  if RegisterBGIfont(@SansSerifFontProc) < 0 then
    Abort('SansSerif');
  if RegisterBGIfont(@SmallFontProc) < 0 then
    Abort('Small');
  if RegisterBGIfont(@TriplexFontProc) < 0 then
    Abort('Triplex');

  GraphDriver := Detect;                  { autodetect the hardware }
  InitGraph(GraphDriver, GraphMode, '');  { activate graphics }
  if GraphResult <> grOk then             { any errors? }
  begin
    Writeln('Graphics init error: ', GraphErrorMsg(GraphDriver));
    Halt(1);
  end;
  with F do
  begin
  Closefunc:=@GraphClose;
  InOutFunc:=@GraphWrite;
  FlushFunc:=@GraphFlush;
  end;
  GraphOpen := 0;
(*  ... {Initialisations, see your TP manual}*)
 end;
{$F-}
procedure GraphAssign;
 begin
  with TextRec(F) do
   begin
     Mode := fmClosed;
     BufSize := SizeOf(Buffer);
     BufPtr := @Buffer;
     Name[0] := #0;
     OpenFunc:= @GraphOpen;
    {You can make some initialisations already here}
   end
 end;
end.
=================WRTGRTST.PAS follows==================
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
uses Crt,
     Graph,     { library of graphics routines }
     GrWrite;
var
  GraphDriver, GraphMode, Error : integer;
  a : string;
  GrOutput:Text;

procedure Abort(Msg : string);
begin
  Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
  Halt(1);
end;

begin
 GraphAssign(Output);  {Standard output to graphics screen}
 {$I-}
 rewrite(Output); {actually calls GraphOpen}
  {$I+}
 if IoResult <> 0 then halt;

(* ....*)
 MoveTo(65,90);
 a := 'this is a string';
 write('this is an embedded string');   {write to graphics screen}
 MoveTo(65,120);
 write(' and this is the second');
 Close(Output); {nothing shows on the screen until this is executed}
 ReadLn(a);
 CloseGraph;
 {Standard output to text screen}
 Assign(output,'');
 rewrite(output);
 GotoXY(5,20); {THIS WORKS}
 write(a);{nothing happens here}             {write to textscreen}
end.


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