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
}