Contributor: TOM CARROLL { -> 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 }