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

    unit iface; { INTERFACE, for creating TEXT interfaces. }

    INTERFACE

    uses crt,dos,link,txtwin;
         { NOTE : Link in POINTERS.SWG
                  txtwin in TEXTWNDW.SWG }

    const
      kbnull=#0;
      kbesc=#27;
      kbpgup=#73;
      kbpgdown=#81;
      kbhome=#71;
      kbend=#79;
      kbleft=#75;
      kbright=#77;
      kbup=#72;
      kbdown=#80;
      kbf1=#59;
      kbenter=#13;
      kbdel=#83;
      kbbackspace=#8;
      colseg:word=$b800;
    type
      tchok=set of char;

    function  getkey(const s:string;const chok:tchok):char;
    function  getstring(col,x,y,max:byte;legalch:tchok):string;
    procedure xorbar(x1,x2,y:word;c:byte);
    function  selectbar(xp,yp,x2,num,col,ystart:byte;abort:boolean):byte;
    function  selectfile(wildcard:string;x,y,col:byte;abort:boolean):string;

    IMPLEMENTATION

    var
      dirlink:plink;
      dirinfo:searchrec;

    function getkey(const s:string;const chok:tchok):char;
    var ch:char;
    begin
      write(s);
      repeat
        ch:=readkey;
      until(ch in chok);
      getkey:=ch;
    end;

    function getstring(col,x,y,max:byte;legalch:tchok):string;
    var
      ch:char;
      input,temp:string;
      oldcol,i,xpos,ypos:byte;
      hoejre,venstre:string[23];
    begin
      getstring:='';
      gotoxy(x,y);
      oldcol:=textattr;
      textattr:=col;
      ch:=#0;
      input:=''; hoejre:=''; venstre:='';
      xpos:=x; ypos:=y;
      repeat
        gotoxy(xpos,ypos);
        venstre:=copy(input,1,xpos-13);
        hoejre:=copy(input,xpos-12,36-xpos);
        repeat
          ch:=readkey;
        until(ch in legalch);
        if(ch=kbnull)then
        begin
          ch:=readkey;
          case ch of
            kbhome:xpos:=x;
            kbleft:if(xpos>x)then dec(xpos);
            kbright:if(xpos<ord(input[0])+x)then inc(xpos);
            kbdel:begin
    {                hoejre:=copy(hoejre,2,length(hoejre)-1);
                    input:=venstre+hoejre;}
                    delete(input,(xpos-x)+1,1);
                  end;
            kbend:begin
                    xpos:=ord(input[0])+x;
                  end;
          end;
        end else if(ord(input[0])<max)and(ch<>kbbackspace)and
                   (ch<>kbenter)then
        begin
    {      input:=venstre+ch+hoejre;     (* inds‘t karakter *)}
          temp:=copy(input,1,(xpos-x));
          temp:=temp+ch;
          temp:=temp+copy(input,(xpos-x)+1,length(input));
          input:=temp;
          write(ch);
          inc(xpos);
        end;
        if(ch=kbbackspace)then
        begin
          if(ord(input[0])>0)then
          begin
            if(xpos>x)then dec(xpos);
            delete(venstre,(xpos-x)+1,1);
            gotoxy(xpos,ypos);
            write(' ');
            input:=venstre+hoejre;
          end;
        end;
        gotoxy(x,y); clreol; write(input);
      until(ch=kbenter)or(ch=kbesc);
      if(ch=kbesc)then
      begin
        getstring:='';
        exit;
      end;
      textattr:=oldcol;
      getstring:=input;
    end;

    procedure xorbar(x1,x2,y:word;c:byte); assembler;
    asm
      dec [y]
      push colseg
      pop es
      mov di,[y]
      mov bx,di
      shl di,6
      shl bx,4
      add di,bx
      add di,[x1]
      shl di,1
      dec di
      mov cx,[x2]
      sub cx,[x1]
      inc cx
      @@loop:
        mov al,[c]
        xor es:[di],al
        add di,2
        dec cx
        jnz @@loop
    end;

    function selectbar(xp,yp,x2,num,col,ystart:byte;abort:boolean):byte;
    var
      ch:char;
      y,oy:byte;
      done:boolean;
    begin
      selectbar:=0;
      oy:=255; y:=ystart;
      if(y>num)then exit;
      done:=false;
      repeat
        if(y<>oy)then
        begin
          if(oy<>255)then xorbar(xp,x2,pred(oy+yp),col);
          xorbar(xp,x2,pred(y+yp),col);
          oy:=y;
        end;
        ch:=readkey;
        if(ch=kbnull)then
        begin
          ch:=readkey;
          case ch of
            kbleft,kbup:if(y>1)then dec(y);
            kbright,kbdown:if(y<num)then inc(y);
          end;
        end else
        case ch of
          kbenter:begin selectbar:=succ(y-yp); done:=true; end;
          kbesc:begin if(abort)then done:=true; end;
        end;
      until(done);
    end;

    function selectfile(wildcard:string;x,y,col:byte;abort:boolean):string;
    var
      wx1,wy1,wx2,wy2:byte; { Window dimensions. }
    begin
      inilink(dirlink);
      selectfile:='';
      findfirst(wildcard,archive,dirinfo);
      if(dirinfo.name='')then exit;
      while(doserror=0)do
      begin
        addlink2(dirlink,dirinfo.name);
        findnext(dirinfo);
      end;
      writeln(numlinks(dirlink));
      killink(dirlink);
    end;

    end.

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