[Back to SCROLL SWAG index] [Back to Main SWAG index] [Original]

    (*
    ===========================================================================
     BBS: Canada Remote Systems
    Date: 06-01-93 (06:21)             Number: 24456
    From: LOU DUCHEZ                   Refer#: NONE
      To: MICHAEL DEAKINS               Recvd: NO
    Subj: ANSI, BATCH FILE EXEC'ING      Conf: (1221) F-PASCAL
    ---------------------------------------------------------------------------
    MD>I have two questions. First, How can I display ANSI files from a Pascal
    MD>program by using the CON driver (read: ANSI.SYS) instead of going to the
    MD>trouble of writing a terminal emulator, and still remain
    MD>window-relative? I used TP5.5's WRITE procedure to write to a file
    MD>assigned to the CON device instead of the CRT unit's standard OutPut,
    MD>but this obliterated my status line at the bottom of the screen when the
    MD>ANSI file scrolled. Is there an easy way to write to the CON device
    MD>while remaining window-relative without having to modify ANSI.SYS or
    MD>write a terminal emulation procedure?
    MD> My second question: How can I call a batch file from within a Pascal
    MD>program and pass %1-%9 parameters to it? I'm aware of the EXEC
    MD>procedure, but doesn't that only work on executables?

    Second question first: you're right about EXEC calling only executables.
    So try calling "COMMAND.COM" as your program, and give it parameters of
    "/C " plus the batch file name plus whatever arguments you intend to pass.
    (That tells the system to run a single command out of DOS.)  Look up
    ParamCount and ParamStr() to see how Pascal uses command-line parameters.

    First question second: you know, I addressed this problem just yesterday
    trying to write a program.  I concluded that, if you're going to bypass
    CRT, you need to do a lot of "manual" work yourself to keep a window
    going.  Let me show you the tools I devised:
    *)

    {---PROCEDURE ATSCROLL: SCROLLS A SCREEN REGION UP OR DOWN (negative or
       positive number in LINESDOWN, respectively) }

    procedure atscroll(x1, y1, x2, y2: byte; linesdown: integer);
    var tmpbyte, intbyte, clearattrib: byte;
    begin
      if linesdown <> 0 then begin
        clearattrib := foxfore + foxback shl 4;
        x1 := x1 - 1;
        y1 := y1 - 1;
        x2 := x2 - 1;
        y2 := y2 - 1;
        if linesdown > 0 then intbyte := $07 else intbyte := $06;
        tmpbyte := abs(linesdown);
        asm
          mov ah, intbyte
          mov al, tmpbyte
          mov bh, clearattrib
          mov ch, y1
          mov cl, x1
          mov dh, y2
          mov dl, x2
          int 10h
          end;
        end;
      end;

    {---FUNCTION YPOS: Returns the line the cursor is on.  I wrote it because
       I don't always trust WHEREY (or WHEREX): they report, for example, the
       cursor position relative to a text window.  So I had it lying around,
       and I opted to use it in my routines.                                 }

    function ypos: byte;
    var tmpbyt: byte;
    begin
      asm
        mov ah, 03h
        mov bh, 0
        int 10h
        mov tmpbyt, dh
        end;
      ypos := tmpbyt + 1;
      end;

    {--- PROCEDURE WRITEANDFIXOVERHANG: I use it in place of WRITELN in my
        program: before writing a line of text, it checks if there's room
        at the bottom of the screen.  If not, it scrolls the screen up
        before writing.  Keep in mind that this program is bent on preserving
        the top three or four screen lines, not the bottom lines. }

    procedure writeandfixoverhang(strin: string);
    const scrollat: byte = 24;
    var overhang: byte;
    begin
      if ypos >= scrollat then begin
        overhang := ypos - scrollat + 1;
        atscroll(0, 4 + overhang, 0, 80, 25, -overhang);
        movecursor(1, ypos - overhang);
        end;
      writeln(strin);
      end;

    {
    So assuming your text lines don't get too long (line longer than 160 chars),
    these routines will keep the top of your screen from getting eaten.  If you
    want to preserve space at the bottom of the screen instead (or both top and
    bottom), change WRITEANDFIXOVERHANG.

    BTW, if there are any compiling problems, let me know.  I took out all the
    stuff that applied specifically to my application -- I might have stupidly
    changed something you need ... }

[Back to SCROLL SWAG index] [Back to Main SWAG index] [Original]