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

    {
    Heres a little Text User Interface! If you use this program and like it then
    tell me! All it has is four routines: WinD,WindMen,Shade, and Menu. Here it is:
    }

    Unit TUI;
    Interface
    Uses CRT;
    Const Winsets = 1;
          WinComponents = 10;

    Var
        Item     : array[1..23] of String[80];

    Function Menu( NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
                   StartX,StartY:Byte) : Byte;
    Procedure Wind(Y1,X1,Y2,X2,FGCol,BGCol : Integer);
    Function WindMen(NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
                   WinFG,WinBG,StartX,StartY:Byte) : Byte;
    Procedure Shade (FG,BG : Byte;Ch : Char);
    Implementation
    Function Menu( NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
                   StartX,StartY:Byte) : Byte;
    Var MenuStrings : Array[1..25] of String;
        NowX,NowY,LastX,LastY,SaveAttr,SaveX,SaveY : Byte;
        ItemNow,LastItem : Byte;
        InChar : Array[1..5] of Char;
        TmpStr : String;
        Count1,Count2,Count3,Count4  : Byte;
        Done   : Boolean;
        StartItem : Byte;

    Begin
    SaveX:=WhereX;
    SaveY:=WhereY;
    StartItem:=1;
    SaveAttr:=TextAttr;
    NowX:=StartX;
    NowY:=StartY;
    LastX:=NowX;
    LastY:=NowY;
    ItemNow:=StartItem;
    LastItem:=StartItem;
    TextColor(NormalFG);
    TextBackGround(NormalBG);
    For Count2:=1 to NumItems do begin
         GotoXY(StartX,(Count2+StartY)-1);
         Write(Item[Count2]);
                                   End;
    Done:=False;
    Repeat
    GotoXY(LastX,LastY);
    TextColor(NormalFG);
    TextBackGround(NormalBG);
    Write(Item[LastItem]);
    GotoXY(NowX,NowY);
    TextColor(LightBarFG);
    TextBackGround(LightBarBG);
    Write(Item[ItemNow]);
    Repeat
    Until Keypressed;
    Inchar[1]:=ReadKey;
    If Inchar[1]=#0 then begin Inchar[1]:=ReadKey;
    LastX:=NowX;
    LastY:=NowY;
    LastItem:=ItemNow;
     Case InChar[1] of
                     'P' : Begin Inc(NowY); Inc(ItemNow) End;
                     'H' : Begin Dec(NowY); Dec(ItemNow) End;
                     'K' : Begin Dec(NowY); Dec(ItemNow) End;
                     'M' : Begin Inc(NowY); Inc(ItemNow) End;
     End;
    If ItemNow>NumItems then begin ItemNow:=1; NowY:=StartY; End;
    If ItemNow<1 then begin ItemNow:=NumItems; NowY:=NowY+NumItems; End;

                         End;
    If Inchar[1]=#27 then begin Menu:=255; Done:=True; End;
    If Inchar[1]=#13 then begin Menu:=ItemNow; Done:=True; End;

    Until Done;
    TextAttr:=SaveAttr;
    GotoXY(SaveX,SaveY);
    End;

    Procedure Wind(Y1,X1,Y2,X2,FGCol,BGCol : Integer);
    Var
    Count : Array [1..4] of Byte;
    TmpVar : Array [1..10] of Integer;
     WinSet : Array [1..WinSets,1..WinComponents] of Char;

    Begin
              Winset[1,01]:='Û'; {Top left}
              Winset[1,02]:='ß'; {Top}
              Winset[1,03]:='Û'; {Top right}
              Winset[1,04]:='Ý'; {Left side}
              Winset[1,05]:='Þ'; {Right side}
              Winset[1,06]:='Û'; {Bottom Left}
              Winset[1,07]:='Ü'; {Bottom}
              Winset[1,08]:='Û'; {Bottom Right}
              Winset[1,09]:='±'; {Shadow}
    TextColor(FGCol);
    TextBackGround(BGCol);
    GotoXY(X1,Y1);
    Write(WinSet[1,01]);
    For Count[1]:=X1+1 to X2-2 do begin
                       Write(Winset[1,02]);
                       End;
    Write(WinSet[1,03]);
    For Count[1]:=Y1+1 to Y2-1 do begin
          TextColor(FGCol);
          TextBackGround(BGCol);
          GotoXy(X1,Count[1]);
          Write(WinSet[1,04]);
          GotoXy(X2-1,Count[1]);
          Write(WinSet[1,05]);
          If FGCol > 7 then TextColor(FgCol-8) Else TextColor(8);
          TextBackGround(0);
          Write(Winset[1,09]);
          End;
          GotoXY(X1,Y2);
          TextColor(FGCol);
          TextBackGround(BGCol);
                       For Count[1]:=X1 to X2-2 do begin
                       If count[1]<>X1 then Write(Winset[1,07]) else
    write(Winset[1,06]);;                   End;
                       Write(WinSet[1,08]);
          If FGCol > 7 then TextColor(FgCol-8) Else TextColor(8);
          TextBackGround(0);
          Write(Winset[1,09]);
          GotoXY(X1+1,Y2+1);
           For Count[1]:=X1+1 to X2 do begin
           Write(Winset[1,09]);
           End;

    End;

    Function WindMen(NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
                   WinFG,WinBG,StartX,StartY:Byte) : Byte;
    Var SaveX,SaveY,SaveAttr,Selec : Byte;
    Begin
    SaveX:=WhereX;
    SaveY:=WhereY;
    SaveAttr:=TextAttr;
    Wind(StartY-1,StartX-1,(StartY)+NumItems,StartX+Length(Item[1])+1,WinFG,WinBG);
    Selec:=Menu(NumItems,LightbarFG,LightbarBG,NormalFG,NormalBG,StartX,StartY);
    GotoXY(SaveX,SaveY);
    TextAttr:=SaveAttr;
    WindMen:=Selec;
    End;

    Procedure Shade (FG,BG : Byte;Ch : Char);
    Var CNT : Integer;
    Begin
    ClrScr;
    TextColor(FG);
    TextBackGround(BG);
    For CNT:=1 to 125 do write('±±±±±±±±±±±±±±±±');
    End;

    End.

    { Heres a test program for TUI.PAS ... }

    Uses CRT,Tui;

    Var Selected : Byte;
    CNT      : Integer;
    Begin
    Shade(13,0,'±');
    WinD(2,2,4,24,9,0);
    GotoXY(3,3);
    TextColor(10);
    WriteLn('                    ');
    Repeat
    Item[1]:='.ùúÄÄÄÄÄÄ¯>Item 1<®ÄÄÄÄÄÄùú.';
    Item[2]:='.ùúÄÄÄÄÄÄ¯>Item 2<®ÄÄÄÄÄÄùú.';
    Item[3]:='.ùúÄÄÄÄÄÄ¯>Item 3<®ÄÄÄÄÄÄùú.';
    Item[4]:='.ùúÄÄÄÄÄÄ¯>Item 4<®ÄÄÄÄÄÄùú.';
    Selected:=WindMen(4,14,3,15,1,13,1,30,5);
    If Selected<255 then Begin
                               GotoXY(3,3);
                               TextColor(10);
                               WriteLn('You selected item #',Selected)
                               end
                    Else Begin
                               GotoXY(3,3);
                               TextColor(10);
                      Write('       ESC!         ');
                      WinD(20,30,22,50,12,0);
                      TextColor(14+16);
                      GotoXY(31,21);
                      Write(' Press Any Key... ');
                      Break; End;
    Until 1=0;
    Repeat until keypressed;
    ClrScr;
    End.

    {
    Ok heres what this means. The syntax for WinD is :
    WinD(Col1,Row1,Col2,Row2,ForgroundColor,BackGroundColor);
    When you put in the forground color make sure it is atleast 7.. This is because
    when the routine prints the SHADOW it prints it in the low intensity version of
    the color... so make sure when you give a color there it's high intensity.
    Ok now for MENU. This is a function. what you do is load Item[1..23] with a
    string. These should all be equal in length or your menu will look really
    ragged...Ok call menu like this:
    ByteVar:=Menu(NumItems,LightbarFG,LightbarBG,NormalFG,normalBG,StartX,StartY);
    And bytevar will equal item# or 255 if ESC was pressed...
    Or:
    ByteVar:=WindMen(NumItems,LBFG,LBBG,NFG,NBG,WindowFG,WindowBG,StartX,StartY);
    All this is a combination between window and menu. It will draw a window
    around your menu items :)...
    And for the last one:
    Shade(FG,BG,CHAR);
    Just use it like to shade in magenta with a green background <YUCK!> do
    Shade(13,2,'±');

    If you use it please give me credit and maybe a registered version of the
    program?
    }

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