[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]
(*
Written by Tom Carroll, Nova 24, 1993 for TP 7.0.
Adapted from the example code posted by Kelly Small in the FidoNet
Pascal echo 11/19/93.
Released to the Public Domain 11/24/93.
Please give credit where credit is due
This Program will execute a program within a text window
and all program scrolling will be maintained within
the window.
This would be better to put inside a unit, but I couldn't get the
interrupt to work within the unit. If you're able to get it to work
inside a unit, I would appreciate you posting the unit so I can see
how it was done.
*)
Program ExecInATextWindow;
USES
Dos, { Used for the Exec call }
Crt; { For the GotoXY calls }
VAR
ExitVal : WORD;
MyProg : STRING;
MyParams : STRING;
OldIntVect : POINTER;
{$F+}
PROCEDURE Int29Handler(AX, BX, CX, DX, SI, DI, DS, ES, BP : WORD);
INTERRUPT;
VAR
Dummy : BYTE;
BEGIN
Write(Chr(Lo(AX))); { Writes each output character to the screen }
Asm Sti; END;
END;
{$F-}
PROCEDURE HookInt29;
BEGIN
GetIntVec($29, OldIntVect); { Save the old vector }
SetIntVec($29, @Int29Handler); { Install interrupt handler }
END;
FUNCTION ExecWin(ProgName, Params : STRING; LeftCol, TopLine,
RightCol, BottomLine : WORD) : WORD;
VAR
A : WORD;
BEGIN
GotoXY(LeftCol, TopLine); { Puts cursor at the top left }
Write(Chr(201)); { hand corner of the window }
{ I use three FOR loops to write the actual window borders to the screen.
NOTE: The window size for the executed program will actually be two
rows and two columns smaller that what you call. This is because
there is no error checking to see if the call will place the
window borders outside the maximum row column range for the
video. }
FOR A := 1 TO (RightCol-LeftCol) - 1 DO
Write(Chr(205));
Write(Chr(187));
FOR A := 1 TO (BottomLine-TopLine) - 1 DO
BEGIN
GotoXY(LeftCol, TopLine + A);
Write(Chr(186));
GotoXY(RightCol,TopLine + A);
Write(Chr(186));
END;
GotoXY(LeftCol, BottomLine);
Write(Chr(200));
FOR A := 1 TO (RightCol-LeftCol) - 1 DO
Write(Chr(205));
Write(Chr(188));
{ Now set the text window so the program will not scroll the outline of
the window off the screen. }
Window(LeftCol + 1, TopLine + 1, RightCol - 1, BottomLine - 1);
GotoXY(1, 1); { Jumps to the upper left hand corner of the window }
HookInt29; { Hooks Interrupt 29 for video output }
{$M 10000, 0, 0} { This works good for Archive utilities }
SwapVectors;
Exec(ProgName, Params);
ExecWin := DOSExitCode; { Return the exit code for error trapping }
SwapVectors;
SetIntVec($29,OldIntVect); { Restore the interrupt }
Window(LeftCol, TopLine, RightCol, BottomLine); { Set the window to the }
ClrScr; { actual size of the }
Window(1, 1, 80, 25); { border so it can be }
END; { cleared properly. }
BEGIN
ClrScr;
{ Modify these two lines to suit your system }
MyProg := 'C:\UTIL\PKUNZIP.EXE';
MyParams := '-t C:\QMPRO\DL\STORE\WAV\SEINWAV1.ZIP';
ExitVal := ExecWin(MyProg, MyParams, 5, 6, 75, 16);
WriteLn('DOS exit code = ', ExitVal);
ReadLn;
END.
{ I would like to modify this code to allow for a screen save feature that
will restore the previous screen for the coordinates passed to the ExecWin
function.
Other nice features would be to add a sideways scrolling effect,
exploding windows for the text window and then make it implode when
the previous video is restored. }
[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]