[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]
{
-> I seen some code posted here a few weeks ago. I meant to save it,
-> but didn't. The code creates a windowed DOS shell. I would like
-> to simply run a .BAT installation file in a window from my pascal
-> program.
Here's some code that I posted. Maybe this is what you were talking
about:
}
(* Written by Tom Carroll, Nov 24, 1993.
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 unit will execute a program within a text window
and all program scrolling will be maintained within
the window.
11-24-93 - Initial release /twc/
11-29-93 - Added code to allow for multiple border styles,
color usage, window titles, and screen save/restore
under the window. /twc/
FUTURE PLANS: To add a check for the video mode and adjust the
window boundary checking accordingly.
*)
UNIT ExecTWin;
INTERFACE
FUNCTION ExecWin(ProgName, Params, Title : STRING;
LeftCol, TopLine, RightCol, BottomLine,
ForeColor, BackColor, ForeBorder, BackBorder,
Border, ForeTitle, BackTitle : WORD) : WORD;
IMPLEMENTATION
USES
Dos,
Crt,
ScrnCopy;
VAR
OldIntVect : POINTER;
{$F+}
PROCEDURE Int29Handler(AX, BX, CX, DX, SI, DI, DS, ES, BP : WORD); INTERRUPT;
VAR
Dummy : BYTE;
BEGIN
Write(Chr(Lo(AX))); {write each character to 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, Title : STRING;
LeftCol, TopLine, RightCol, BottomLine,
ForeColor, BackColor, ForeBorder, BackBorder,
Border, ForeTitle, BackTitle : WORD) : WORD;
{
ProgName = Program name to execute (must includes the full path)
Params = Program parameters passed to child process
Title = Title assigned to the text window (unused if blank)
LeftCol = Left column of the window border
TopLine = Top line of the window border
RightCol = Right column of the window border
BottomLine = Bottom line of the window border
ForeColor = Foreground color of the window
BackColor = Background color of the window
ForeBorder = Foreground color of the window border
BackBorder = Background color of the window border
Border = Border type to use. Where type is:
0 - None used
1 - '+'
2 - '+'
3 - '#'
4 - '+'
ForeTitle = Foreground color of the window title
BackTitle = Background color of the window title
If an error is encountered, the program will return the following
error codes in the ExecWin variable.
97 - Title wider than the window
98 - The left or right screen margins have been exceeded
99 - The top or bottom screen margins have been exceeded
}
LABEL
ExitExec;
VAR
A : WORD;
BEGIN
IF (LeftCol < 1) OR (RightCol > 80) THEN
BEGIN
ExecWin := 98;
GOTO ExitExec;
END;
IF (TopLine < 1) OR (BottomLine > 24) THEN
BEGIN
ExecWin := 99;
GOTO ExitExec;
END;
SaveScrn(0);
TextColor(ForeBorder);
TextBackground(BackBorder);
GotoXY(LeftCol, TopLine);
CASE Border OF
1 : BEGIN
Write('+');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('-');
Write('+');
FOR A := 1 TO (BottomLine - TopLine) - 1 DO
BEGIN
GotoXY(LeftCol, TopLine + A);
Write('|');
GotoXY(RightCol, TopLine + A);
Write('|');
END;
GotoXY(LeftCol, BottomLine);
Write('+');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('-');
Write('+');
IF Ord(Title[0]) > 0 THEN
IF (Ord(Title[0])) <= (RightCol - LeftCol) THEN
BEGIN
A := Ord(Title[0]);
A := RightCol - LeftCol - A;
A := A DIV 2;
GotoXY(A - 2 + LeftCol, TopLine);
Write('+ ');
TextColor(ForeTitle);
TextBackground(BackTitle);
Write(Title);
TextColor(ForeBorder);
TextBackground(BackBorder);
Write(' +');
END
ELSE
BEGIN
ExecWin := 97;
GOTO ExitExec;
END;
END;
2 : BEGIN
Write('+');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('-');
Write('+');
FOR A := 1 TO (BottomLine - TopLine) - 1 DO
BEGIN
GotoXY(LeftCol, TopLine + A);
Write('|');
GotoXY(RightCol, TopLine + A);
Write('|');
END;
GotoXY(LeftCol, BottomLine);
Write('+');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('-');
Write('+');
IF Ord(Title[0]) > 0 THEN
IF (Ord(Title[0])) <= (RightCol - LeftCol) THEN
BEGIN
A := Ord(Title[0]);
A := RightCol - LeftCol - A;
A := A DIV 2;
GotoXY(A - 2 + LeftCol, TopLine);
Write('+ ');
TextColor(ForeTitle);
TextBackground(BackTitle);
Write(Title);
TextColor(ForeBorder);
TextBackground(BackBorder);
Write(' +');
END
ELSE
BEGIN
ExecWin := 97;
GOTO ExitExec;
END;
END;
3 : BEGIN
Write('#');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('#');
Write('#');
FOR A := 1 TO (BottomLine - TopLine) - 1 DO
BEGIN
GotoXY(LeftCol, TopLine + A);
Write('#');
GotoXY(RightCol, TopLine + A);
Write('#');
END;
GotoXY(LeftCol, BottomLine);
Write('#');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('#');
Write('#');
IF Ord(Title[0]) > 0 THEN
IF (Ord(Title[0])) <= (RightCol - LeftCol) THEN
BEGIN
A := Ord(Title[0]);
A := RightCol - LeftCol - A;
A := A DIV 2;
GotoXY(A - 2 + LeftCol, TopLine);
Write('# ');
TextColor(ForeTitle);
TextBackground(BackTitle);
Write(Title);
TextColor(ForeBorder);
TextBackground(BackBorder);
Write(' #');
END
ELSE
BEGIN
ExecWin := 97;
GOTO ExitExec;
END;
END;
4 : BEGIN
Write('+');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('-');
Write('+');
FOR A := 1 TO (BottomLine - TopLine) - 1 DO
BEGIN
GotoXY(LeftCol, TopLine + A);
Write('|');
GotoXY(RightCol, TopLine + A);
Write('|');
END;
GotoXY(LeftCol, BottomLine);
Write('+');
FOR A := 1 TO (RightCol - LeftCol) - 1 DO
Write('-');
Write('+');
IF Ord(Title[0]) > 0 THEN
IF (Ord(Title[0])) <= (RightCol - LeftCol) THEN
BEGIN
A := Ord(Title[0]);
A := RightCol - LeftCol - A;
A := A DIV 2;
GotoXY(A - 2 + LeftCol, TopLine);
Write('| ');
TextColor(ForeTitle);
TextBackground(BackTitle);
Write(Title);
TextColor(ForeBorder);
TextBackground(BackBorder);
Write(' |');
END
ELSE
BEGIN
ExecWin := 97;
GOTO ExitExec;
END;
END;
END;
TextColor(ForeColor);
TextBackground(BackColor);
Window(LeftCol + 1, TopLine + 1, RightCol - 1, BottomLine - 1);
ClrScr;
HookInt29;
SwapVectors;
Exec(ProgName, Params);
SwapVectors;
ExecWin := DOSExitCode;
SetIntVec($29,OldIntVect); { Restore the interrupt }
Window(1, 1, 80, 25);
RestoreScrn(0);
ExitExec:
END;
END.
{
The ScrnCopy unit may be found within the SWAG files or you can make up
your own.
Tom Carroll
Dataware Software
}
[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]