[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]