A CrtPlus

A Pascal fejlesztői megadták a lehetőséget a felhasználóknak is arra, hogy saját UNIT-okat szerkesszenek. Ennek az a hatalmas előnye, hogy egyszer jól megírt eljárásainkat UNIT-ban tárolva nagyon sokszor és sokáig használhatjuk. Mi a Crt-hez kapcsolódó eljárásainkat és függvényeinket a CrtPlus-ban helyeztük el.

KeyEmpty : eljárás, billentyűzet-puffer ürítő.

Varj : eljárás, vár addig, ameddig meg nem nyomunk egy billentyűt. A billentyűzet puffer üres lesz az eljárás után.

Felre : eljárás, kurzor az aktív képernyő bal alsó sarkába ugrik

Tunj : eljárás, a kurzor eltűnik

Szinek : kétparaméteres eljárás, első paraméter a háttérszín, második a karakterszín

Szinez : ötparaméteres eljárás, a képernyő egy sorában megadható darabszámú képernyőhely színeit állítja be. Paraméterek:

1.     hsz: háttérszín;

2.     ksz: karakterszín;

3.     x koordináta;

4.     y koordináta;

5.     karakterek száma.

Torol : eljárás, a képernyő egy adott helyétől törli a képernyő memórát

Tolt : eljárás, a képernyő egy adott helyétől adott karakterrel tölti a képernyő memóriát

WriteXY : háromparaméteres eljárás, képernyő adott helyére ír. Paraméterek:

1.     x koordináta;

2.     y koordináta;

3.     kiírandó szöveg.

IrXY : eljárás, adott helytől, adott stringet ír a képernyő memóriába

Vvonal : háromparaméteres eljárás, a képernyő adott sorába vízszintes vonalat húz. Paraméterek:

1.     x kezdőhely;

2.     x véghely;

3.     y sor.

Fvonal : háromparaméteres eljárás, a képernyő adott oszlopába függőleges vonalat húz. Paraméterek:

1.     x oszlop;

2.     y kezdőhely;

3.     y véghely.

Keret : négyparaméteres eljárás, a képernyőre egy téglalap alakú keretet rajzol. A négy paraméter a Window standard eljárás paramétereivel teljesen megegyezik. (bfx: bal felső csúcs x koordináta, bfy: bal felső csúcs y koordináta, jax: jobb alsó csúcs x koordináta, jay: jobb alsó csúcs y koordináta)

Racs : hatparaméteres eljárás, a képernyőre egy téglalap elrendezésű rácsot helyez. Paraméterek:

1.     bfx;

2.     bfy;

3.     bx: a rács egy cellája belsejének x irányú mérete;

4.     by: a rács egy cellája belsejének y irányú mérete;

5.     nx: cellák száma vízszintesen;

6.     ny: cellák száma függőlegesen.

Ablak : nyolcparaméteres eljárás, a képernyőre egy színes, keretes, címkés, árnyékos ablakot rajzol. Paraméterek:

1.     hsz;

2.     ksz;

3.     bfx;

4.     bfy;

5.     jax;

6.     jay;

7.     arny: logikai paraméter, ha igaz, akkor van árnyék, ha hamis akkor nincs;

8.     c: az ablak címkéje.

Uzenet : háromparaméteres eljárás, a képernyő közepén egy ablakban egy egysoros üzenetet jelenít meg. Paraméterek:

1.     hsz;

2.     ksz;

3.     sz: a megjelenítendo szöveg, az ablak bármely billentyűre eltűnik.

Kerdezo : háromparaméteres függvény, mely egy eldöntendo kérdést tesz fel, visszatérési értéke logikai. Paraméterek:

1.     hsz;

2.     ksz;

3.     sz: a kérdés, csak igen vagy nem válaszra lép ki a függvényből.

Bevitel : ötparaméteres függvény, amely a képernyő egy helyétől kezdve, legfeljebb a képernyősor végéig egy szerkeszthető beviteli területet ad. A visszaadott érték a bevitt szöveg. Paraméterek:

1.     hsz;

2.     ksz;

3.     x;

4.     y;

5.     sh: a szerkeszthető karakterek száma.

Password : függvény, mely a Bevitel függvénnyel bevitt stringről megállapítja, hogy mint jelszó, helyes-e

Menu : nyolcparaméteres függvény, mely a képernyőn megjelenített menüpontokból a vezérlőbillentyűk segítségével választási lehetőséget biztosít. Visszaadott értéke a kiválasztott menüpont sorszáma. Paraméterek:

1.     hsz;

2.     ksz;

3.     vsz: választósor háttérszine;

4.     bfx;

5.     bfy;

6.     sh: menüsorok hossza;

7.     ss: menüsorok száma;

8.     as: aktuális menüsorszám, egyúttal a visszaadott érték is.

ValidSt : egyparaméteres függvény, mely a paraméterként kapott stringbol eltávolítja a fölösleges Space-szeket és így adja vissza.

Listazo : tízenegy-paraméteres függvény, mely a képernyőn egy string-listát jelenít meg, melyből a vezérlőbillentyuk segítségével választhatunk, visszaadott értéke a kiválasztott string indexe. Paraméterek:

1.     hsz;

2.     ksz;

3.     vsz: választósor háttérszine;

4.     bfx;

5.     bfy;

6.     sh: string-ek hossza;

7.     ss: string-ek száma;

8.     ls: egyszerre látható string-ek száma (az ablak magassága);

9.     as: aktuális string-index, egyuttal a visszaadott érték;

10. arny: logikai érték, a megjelenítő ablaknak legyen-e árnyéka;

11. c: a lista címkéje.

Listara : egyparaméteres függvény, nemlátható elem, lényegében egy rendezett string-listát kezel, mely a globális string-tömbben található, visszaadott értéke a string-lista elemszáma, nem enged meg azonos string-eket a listában, a listára helyezés előtt a string-eket validálja (ValidSt).

Listarol : egyparaméteres függvény, nemlátható elem, lényegében egy rendezett string-listát kezel, arról törli a paraméter stringet, mely a globális string-tömbben található, visszaadott értéke a string-lista elemszáma, ha nem volt a listán, akkor 0-t kapunk. (a paraméter stringet validálja (ValidSt)).

FileKereso : függvény, az aktuális könyvtár, adott kiterjesztésű állományait a Listazo függvény segítségével megmutatja, visszaadott értéke a kiválasztott file neve.

Gomb : eljárás, mely egy feliratos, egérrel kezelhető nyomógomb látványát adja.

GombKereso : függvény, mely megadja az adott helyen található egérrel kezelhető látvány Hot-Key kódját.

ImputLine : függvény, mely címkés beviteli sort kezel, visszaadott értéke a bevitt String.

RadioGomb : eljárás, mely egy egérrel választható, rádiógomb kapcsoló látványát állítja elő.

RadioGombKapcs : függvény, mely rádiógomb választását adja vissza.

Destop : eljárás, mely a Turbo Pascal IDE látványát adja, egérrel kezelhető felületek alapja, Alt-X -re kilép.

Binaris : függvény, mely az átvett Word típusú számnak a kettes számrendszerbeli alakját adja vissza String-ként.

Tizes : függvény, mely az átvett String-ből a szám tízes számrendszerbeli alakját adja vissza.

SetBit : függvény, mely az átvett Word típusú számnak a megadott sorszámú bitjét az adott bitre állítja.

ValtBit : függvény, mely az átvett Word típusú számnak a megadott sorszámú

 

A CrtPlus listája:

 

Unit CrtPlus; 
Interface
Uses NewDelay, Crt, Dos, Drivers;
  Procedure KeyEmpty;
  Procedure Varj;
  Procedure Felre;
  Procedure Tunj;
  Procedure Szinek(HSz,KSz: Byte);
  Procedure Szinez(HSz,KSz,X,Y,Sh: Byte);
  Procedure Torol(X,Y,Sh: Byte);
  Procedure Tolt(X,Y,Sh: Byte; C: Char);
  Function Olvas(X,Y,Sh: Byte): String;
  Procedure WriteXY(X,Y: Byte; Sz: String);
  Procedure IrXY(X,Y: Byte; Sz: String);
  Procedure Vvonal(Xk,Xv,Y: Byte);
  Procedure Fvonal(X,Yk,Yv: Byte);
  Procedure Keret(Bfx,Bfy,Jax,Jay: Byte);
  Procedure Racs(Bfx,Bfy,BX,By,NX,Ny: Byte);
  Procedure Ablak(HSz,KSz,Bfx,Bfy,Jax,Jay: Byte; Arny: Boolean; C: String);
  Procedure Uzenet(HSz,KSz: Byte; Sz: String);
  Procedure Duda;
  Function Kerdezo(HSz,KSz: Byte; Sz: String): Boolean;
  Function Bevitel(HSz,KSz,X,Y,Sh: Byte): String;
  Function PassWord(HSz,KSz,X,Y,Sh: Byte; Pw: String): Boolean;
  Function Menu(HSz,KSz,Vsz,Bfx,Bfy,Sh,Ss,AS: Byte): Byte;
  Function Kmenu(Fmp: Byte): Integer;
  Function Listazo(HSz,KSz,Vsz,Bfx,Bfy,Sh,Ss,Ls,AS: Integer;
                   Arny: Boolean; C: String): Integer;
  Function Combo(X,Y,Sh,KS: Byte; Ss,AS: Integer; C: String): Integer;
  Function ValidSt(S: String): String;
  Function Listara(S: String): Integer;
  Function Listarol(S: String): Integer;
  Function FileKereso(HSz,KSz,Vsz,Dr: Byte; Ext: String): String;
  Procedure Gomb(HSz,KSz,Vsz,X,Y,Sh: Byte; S: String);
  Function GombKereso(X,Y: Byte): Char;
  Function InputLine(Dhsz,Dksz,DVsz,HSz,KSz,X,Y,Sh: Byte; S: String): String;
  Procedure RadioGomb(Dhsz,Dksz,HSz,KSz,Vsz,Bfx,Bfy,Sh,Ss,AS: Byte; S: String);
  Function RadioGombKapcs(HSz,KSz,Bfx,Bfy,Sh,Ss,AS: Byte): Byte;
  Procedure DeskTop;
  Function Binaris(S: Word): String;
  Function Tizes(S: String): Word;
  Function SetBit(W: Word; N,B: Byte): Word;
  Function ValtBit(W: Word; N: Byte): Word;
Const Max=250;
      GtMax=64;
Type Scr=Array[1..25,1..80,1..2] Of Byte;
     GombRec=Record
               Tip: Byte;
               GX,Gy,Gsh: Byte;
               Key: Char;
             End;
     Hang=Record
            Hq: Real;
            Hc,Hcisz,Hd,Hdisz,He,Hf,Hfisz,Hg,Hgisz,Ha,Hbe,Hh: Integer;
          End;
Const AltKod: Array[#42..'Z'] Of Char=
      (#42,#43,#0,#45,#46,#47,
       #129,#120,#121,#122,#123,#124,#125,#126,#127,#128,
       #0,#0,#0,#61,#0,#0,#0,
       #30,#48,#46,#32,#18,#33,#34,#35,#23,#36,#37,#38,#50,
       #49,#24,#25,#16,#19,#31,#20,#22,#47,#17,#45,#21,#44);
Var BKep: Scr Absolute $B800:0;
    KKep: Scr;
    VCh: Char;
    Tomb: Array[1..Max] Of String[80];
    Sztomb: Array[0..25] Of Word;
    Funkcio: Byte;
    BeviteliSor: String[80];
    GombT: Array[1..GtMax] Of GombRec;
    GombIndex: Byte;
    H: Hang;
Type PMRec=^MRec;
     MRec=Record
            Nev: String[32];
            Cmp: Word;
            Key: Word;
            Eng: Boolean;
            Kiv: Boolean;
            HEMut, VEMut, HKMut, VKMut: PMRec;
          End;

Var ElsoMRec, AktMRec, UJMRec: PMRec;
    Esemeny: TEvent;

Implementation

Procedure KeyEmpty;
Begin
  While KeyPressed Do ReadKey;
End;

Procedure Varj;
Begin
  Repeat Until KeyPressed; KeyEmpty
End;

Procedure Felre;
Begin
  GoToXY(1,Hi(WindMax)-Hi(WindMin)+1);
End;

Procedure Tunj;
Var HSz: Byte;
Begin
  HSz:= BKep[Hi(WindMax)+1,Lo(WindMin)+1,2] Div 16;
  Szinez(HSz,HSz,Lo(WindMin)+1,Hi(WindMax)+1,1);
  GoToXY(1,Hi(WindMax)-Hi(WindMin)+1);
End;

Procedure Szinek(HSz,KSz: Byte);
Begin
  TextBackGround(HSz);
  TextColor(KSz);
End;

Procedure Szinez(HSz,KSz,X,Y,Sh: Byte);
Var I: Byte;
Begin
  For I:= X To X+Sh-1 Do BKep[Y,I,2]:= 16*HSz+KSz;
End;

Procedure Torol(X,Y,Sh: Byte);
Var I: Byte;
Begin
  For I:= X To X+Sh-1 Do BKep[Y,I,1]:= 32;
End;

Procedure Tolt(X,Y,Sh: Byte; C: Char);
Var I: Byte;
Begin
  For I:= X To X+Sh-1 Do BKep[Y,I,1]:= Ord(C);
End;

Function Olvas(X,Y,Sh: Byte): String;
Var I: Byte;
    WS: String;
Begin
  WS:= ''; For I:= X To X+Sh-1 Do WS:= Ws+Chr(BKep[Y,I,1]);
  OlvaS:= Ws;
End;

Procedure WriteXY(X,Y: Byte;Sz: String);
Begin
  GoToXY(X,Y);
  Write(Sz);
End;

Procedure IrXY(X,Y: Byte;Sz: String);
Var I: Byte;
Begin
  For I:= 1 To Length(Sz) Do BKep[Y,X+I-1,1]:= Ord(Sz[I]);
End;

Procedure Vvonal(Xk,Xv,Y: Byte);
Var I: Byte;
Begin
  For I:= Xk To Xv Do WriteXY(I,Y,Chr(196));
End;

Procedure Fvonal(X,Yk,Yv: Byte);
Var I: Byte;
Begin
  For I:= Yk To Yv Do WriteXY(X,I,Chr(179));
End;

Procedure Keret(Bfx,Bfy,Jax,Jay: Byte);
Begin
  Vvonal(Bfx+1,Jax-1,Bfy);
  Vvonal(Bfx+1,Jax-1,Jay);
  Fvonal(Bfx,Bfy+1,Jay-1);
  Fvonal(Jax,Bfy+1,Jay-1);
  WriteXY(Bfx,Bfy,Chr(218));
  WriteXY(Jax,Bfy,Chr(191));
  WriteXY(Bfx,Jay,Chr(192));
  WriteXY(Jax,Jay,Chr(217));
End;

Procedure Racs(Bfx,Bfy,BX,By,Nx,Ny: Byte);
Var I,J,SX,Sy: Byte;
Begin
  If Nx*Ny=0 Then Exit;
  Sx:= Bfx+Nx*(BX+1);
  Sy:= Bfy+Ny*(By+1);
  Keret(Bfx,Bfy,Sx,Sy);
  I:= Bfx+Bx+1;
  While I<Sx Do
  Begin
    WriteXY(I,Bfy,Chr(194)); 
    WriteXY(I,Sy,Chr(193));
    Fvonal(I,Bfy+1,Sy-1);
    Inc(I,Bx+1);
  End;
  J:= Bfy+By+1;
  While J<Sy Do
  Begin
    WriteXY(Bfx,J,Chr(195));
    WriteXY(SX,J,Chr(180));
    Vvonal(Bfx+1,Sx-1,J);
    Inc(J,By+1);
  End;
  For I:= 1 To Nx-1 Do For J:= 1 To Ny-1 Do
  WriteXY(Bfx+I*(BX+1),Bfy+J*(By+1),Chr(197));
End;

Procedure Ablak(HSz,KSz,Bfx,Bfy,Jax,Jay: Byte; Arny: Boolean; c: String);
Var I,Px,Py: Byte;
Begin
  If Arny Then
  Begin
    Px:= Jax+2;
    Py:= Jay+1;
    If Px>80 Then Px:= 80; 
    If Py>25 Then Py:= 25;
    For I:= Bfy+1 To Jay+1 Do Szinez(0,8,Bfx+2,I,Jax-Bfx+1);
  End;
  Window(Bfx,Bfy,Jax,Jay);
  Szinek(HSz,KSz);
  ClrScr;
  Window(1,1,80,25);
  Keret(Bfx+1,Bfy,Jax-1,Jay);
  If C<>''Then
  WriteXY(Round(Bfx+(Jax-Bfx-Length(c))/2-1),Bfy,' '+C+' ');
End;

Procedure Uzenet(HSz,KSz: Byte;Sz: String);
Var Bfx,Bfy,Jax,Jay,N: Byte;
Begin
  N:= Length(Sz);
  If n<10 Then N:= 10;
  Bfx:= 40-Round(n/2)-2;
  Bfy:= 11;
  Jax:= 40+Round(n/2)+1;
  Jay:= 13;
  KKep:= BKep;
  Ablak(HSz,KSz,Bfx,Bfy,Jax,Jay,True,'Info');
  WriteXY(40-Round(Length(Sz)/2),12,Sz);
  Tunj;
  Varj;
  BKep:= KKep;
End;

Procedure Duda;
Begin
  Sound(2*h.a);
  Delay(80);
  NoSound;
End;

Function Kerdezo(HSz,KSz: Byte;Sz: String): Boolean;
Var Bfx,Bfy,Jax,Jay,N: Byte;
    Ch: Char;
Begin
  N:= Length(Sz);If n<20 Then N:= 20;
  Bfx:= 40-Round(n/2)-2;Bfy:= 11;Jax:= 40+Round(n/2)+1;Jay:= 13;
  KKep:= BKep;
  Ablak(HSz,KSz,Bfx,Bfy,Jax,Jay,True,'Válaszoljon! (i/n)');
  WriteXY(40-Round(Length(Sz)/2),12,sz);
  Tunj;
  Repeat
    Ch:= ReadKey;
    Ch:= UpCase(Ch);
  Until Ch In ['I','N'];
  Kerdezo:= Ch='I';
  BKep:= KKep;
End;

Function Bevitel(HSz,KSz,X,Y,Sh: Byte): String;
Var Ch: Char;
    I,Ax: Byte;
    Ovw: Boolean;
    Bszov: String;
Begin
  Szinez(HSz,KSz,X,Y,Sh);
  Ax:= X;
  GoToXY(AX,Y);
  Ovw:= False;
  Repeat
    While (Not KeyPressed) And (MouseButtons<>1) Do;
    If MouseButtons<>1 Then Ch:= ReadKey;
    Case Ch Of
      #0:Begin
           Ch:= ReadKey;
           Case Ch Of
             #71: Ax:= X;
             #75: If Ax>x Then Dec(Ax);
             #77: If Ax<X+Sh Then Inc(Ax);
             #79: Begin
                    I:= X+Sh;
                    Repeat
                      Dec(I);
                    Until BKep[Y,I,1]<>32;
                    Ax:= I+1;
                  End;
             #82: Ovw:= Ovw=False;
             #83: If Ax<X+Sh Then
                  Begin
                    For I:= Ax To X+Sh-1 Do
                    BKep[Y,I,1]:= BKep[Y,I+1,1];
                    BKep[Y,X+Sh-1,1]:= 32;
                  End;
           End;
         End;
      #8: If Ax<>x Then
          Begin
            For I:= Ax-1 To X+Sh-1 Do
            BKep[Y,I,1]:= BKep[Y,I+1,1];
            BKep[Y,X+Sh-1,1]:= 32;
            Dec(Ax);
          End;
      #9: 
      #13: 
      #27: 
      Else If MouseButtons<>1 Then
      If Ax<X+Sh Then
      Begin
        If Not Ovw Then
        For I:= X+Sh-1 DownTo AX+1 Do
        BKep[Y,I,1]:= BKep[Y,I-1,1];
        BKep[Y,AX,1]:= Ord(Ch);
        Inc(Ax);
      End;
    End;
    GoToXY(AX,Y);
  Until (Ch In [#13,#27,#9]) Or (MouseButtons=1);
  VCh:= Ch;
  If Ch=#27 Then Bevitel:= '' Else
  Begin
    Bszov:= '';
    I:= X+Sh;
    Repeat
      Dec(I);
    Until (BKep[Y,I,1]<>32) Or (I=X);
    Ax:= I;
    For I:= X To Ax Do Bszov:= Bszov+Chr(BKep[Y,I,1]);
    Bevitel:= Bszov;
  End;
  Tunj;
End;

Function PassWord(HSz,KSz,X,Y,Sh: Byte;Pw: String): Boolean;
Var Ch: Char;
    I,Ax: Byte;
    WS: String;
Begin
  Szinez(HSz,KSz,X,Y,Sh);
  Ax:= X;
  GoToXY(Ax,Y);
  WS:= '';
  Repeat
    While (Not KeyPressed) And (MouseButtons<>1) Do;
    If MouseButtons<>1 Then Ch:= ReadKey;
    Case Ch Of
      #0: Ch:= ReadKey;
      #8: If Ax<>x Then
          Begin
            WS:= Copy(Ws,1,Length(Ws)-1);
            Dec(Ax);
            BKep[Y,AX,1]:= 32;
          End;
      #9: 
      #13: 
      #27: 
      Else If MouseButtons<>1 Then
      If Ax<X+Sh Then
      Begin
        WS:= Ws+Ch;
        BKep[Y,Ax,1]:= Ord('*');
        Inc(Ax);
      End;
    End;
    GoToXY(Ax,Y);
  Until (Ch In [#13,#27,#9]) Or (MouseButtons=1);
  PassWord:= WS=pw;
End;

Function menu(HSz,KSz,Vsz,Bfx,Bfy,Sh,Ss,AS: Byte): Byte;
Var I: Integer;
    Ch: Char;
Begin
  Szinez(Vsz,KSz,Bfx,Bfy+As-1,Sh);
  Repeat
    GetMouseEvent(Esemeny);
    If Esemeny.What=evMouseDown Then With MouseWhere Do
    If (X>Bfx-2) And (X<Bfx+Sh-1) And (Y>Bfy-2) And (Y<Bfy+Ss-1) Then
    Begin
      Szinez(HSz,KSz,Bfx,Bfy+As-1,Sh);
      AS:= Y-Bfy+2;
      Szinez(Vsz,KSz,Bfx,Bfy+As-1,Sh);
      Menu:= As;
      While MouseButtons=1 Do;
      Exit;
    End;
    If KeyPressed Then Ch:= ReadKey;
    If Ch=#0 Then
    Begin
      Ch:= ReadKey;
      If Ch In [#71,#72,#79,#80] Then 
      Szinez(HSz,KSz,Bfx,Bfy+As-1,Sh);
      Case Ch Of
            #71: As:= 1;
            #72: If As>1 Then Dec(AsElse As:= Ss;
            #80: If As<Ss Then Inc(AsElse As:= 1;
            #79: As:= Ss;
      End;
      If Ch In [#71,#72,#79,#80] Then
      Szinez(Vsz,KSz,Bfx,Bfy+As-1,Sh);
    End;
  Until Ch In [#13,#27,#75,#77];
  If Ch In [#13,#75,#77] Then Menu:= As Else Menu:= 0;
  VCh:= Ch;
End;

Function Kmenu(Fmp: Byte): Integer;
label 1;
Var I,J,Lhs,ABfx,AJax: Byte;
    Fmh: Array[1..20] Of Byte;
    FmSz: Byte;
    Ch: Char;
    Nyitva: Boolean;
    Amp: Word;
    Oldmp: Byte;
Begin
  For I:= 1 To 20 Do Fmh[I]:= 0;
  Szinez(7,0,1,1,80);
  Szinez(7,0,1,25,80);
  Szinek(7,0);
  GoToXY(2,1);
  Fmh[1]:= 2;
  Nyitva:= False;
  I:= 1;
  AktMRec:= ElsoMRec;
  While AktMRec<>nil Do with AktMRec^ Do
  Begin
    Write(' ',Nev,' ');
    Fmh[I+1]:= WhereX;
    AktMRec:= AktMRec^.HKMut;
    Inc(I);
  End;
  Tunj;
  KKep:= BKep;
  FmSz:= I-1;
  Fmh[I+1]:= Fmh[I]+Length(AktMRec^.Nev);
  Szinez(green,0,fmh[fmp],1,fmh[fmp+1]-fmh[fmp]);
  Amp:= 0;
  Repeat
    Ch:= ReadKey;
    If (Not Nyitva) And (Ch=#13) Then 
    Begin Nyitva:= True; KeyEmpty End;
    If Ch=#0 Then
    Begin
      Ch:= ReadKey;
      If Ch=#80 Then Nyitva:= True;If Ch In [#75,#77,#80] Then
      Szinez(7,0,Fmh[Fmp],1,Fmh[Fmp+1]-Fmh[Fmp]);
      1:
      Case Ch Of
        #75: If fmp>1 Then Dec(fmp) Else fmp:= fmsz;
        #77: If fmp<fmsz Then Inc(fmp) Else fmp:= 1;
      End;
      If Nyitva And (Ch In [#75,#77,#80]) Then
      Begin
        BKep:= KKep;
        AktMRec:= ElsoMRec;
        For I:= 1 To 25 Do Tomb[I]:= '';
        LhS:= 0;
        Oldmp:= 1;
        For I:= 1 To fmp-1 Do 
        AktMRec:= AktMRec^.HKMut;AktMRec:= AktMRec^.VKMut;
        I:= 0;
        While AktMRec<>nil Do with AktMRec^ Do
        Begin
          Inc(I);
          Tomb[I]:= ' '+Nev+' ';
          If AktMRec^.HKMut<>nil Then Tomb[I]:= Tomb[I]+Chr(16)+' ';
          If Length(Tomb[I])>Lhs Then LhS:= Length(Tomb[I]);
          Sztomb[I]:= cmp;
          If Kiv Then Oldmp:= I;
          UjMRec:= AktMRec;
          AktMRec:= AktMRec^.VKMut
        End;
        If I>0 Then
        Begin
          Szinez(Green,0,Fmh[Fmp],1,Fmh[Fmp+1]-Fmh[Fmp]);
          ABfx:= Fmh[Fmp]-1;
          AJax:= Fmh[Fmp]+Lhs+2;
          While AJax>80 Do Begin Dec(ABfx);Dec(AJax) End;
          Ablak(7,0,ABfx,2,AJax,3+I,True,'');
          For J:= 1 To I Do WriteXY(ABfx+2,J+2,Tomb[J]);
          Felre;
          Amp:= Menu(7,0,Green,ABfx+2,3,Lhs,I,Oldmp);
          Ch:= VCh;
          If (Pos(Chr(16),Tomb[Amp])<>0) And (Ch=#13) Then
          Begin
            AktMRec:= UjMRec;
            While I>Amp Do
            Begin
              Dec(I);
              AktMRec:= AktMRec^.VEMut;
            End;
            For I:= 1 To 25 Do Tomb[I]:= '';lhS:= 0;I:= 0;
            oldmp:= 1;
            AktMRec:= AktMRec^.HKMut;
            While AktMRec<>Nil Do with AktMRec^ Do
            Begin
              Inc(I);
              Tomb[I]:= ' '+Nev+' ';
              If Length(Tomb[I])>Lhs Then LhS:= Length(Tomb[I]);
              Sztomb[I]:= Cmp;
              If Kiv Then Oldmp:= I;
              UjMRec:= AktMRec;
              AktMRec:= AktMRec^.VKMut
            End;
            ABfx:= Fmh[Fmp]+1;
            AJax:= Fmh[Fmp]+Lhs+4;
            While AJax>80 Do Begin Dec(ABfx); Dec(AJax) End;
            Ablak(7,0,ABfx,Amp+3,AJax,Amp+4+I,True,'');
            For J:= 1 To I Do WriteXY(ABfx+2,Amp+J+3,Tomb[J]);
            Felre;
            Amp:= Menu(7,0,Green,ABfx+2,Amp+4,Lhs,I,Oldmp);
            Ch:= VCh;
          End;

          If Ch In [#13,#75,#77] Then
          Begin
            AktMRec:= UjMRec;
            While i>amp Do
            Begin
              Dec(I);
              AktMRec^.Kiv:= False;
              AktMRec:= AktMRec^.VEMut;
            End;
            AktMRec^.Kiv:= True;
            While I>1 Do
            Begin
              Dec(I);
              AktMRec:= AktMRec^.VEMut;
              AktMRec^.Kiv:= False;
            End;
          End;
          If Ch In [#75,#77] Then GoTo 1;
        End;
      End;
      If Ch In [#75,#77] Then
      Szinez(Green,0,Fmh[Fmp],1,Fmh[Fmp+1]-Fmh[Fmp]);
    End;
  Until Ch In [#13,#27];
  If Ch=#13 Then Kmenu:= Sztomb[Amp] Else Kmenu:= 0;
End;

Function Listazo(HSz,KSz,Vsz,Bfx,Bfy,Sh,Ss,Ls,AS: Integer;
                 Arny: Boolean;c: String): Integer;
Var I,Ki,Ai,Vi,AkS: Integer;
    Ch: Char;
  Procedure Kiir;
  Var J,Ay: Integer;
  Begin
    Ki:= Round(As-Ls/2);
    Vi:= Round(As+Ls/2)-1;
    If Ki<=0 Then Inc(Ki,Ss);
    If Vi>Ss Then Dec(Vi,Ss);
    Window(Bfx+2,Bfy+1,Bfx+Sh-2,Bfy+Ls);
    ClrScr;
    If Vi>Ki Then 
    For J:= Ki To Vi Do WriteXY(1,1+j-Ki,Copy(Tomb[J],1,Sh-1))
    Else
    Begin
      If As<=Ss-Ls/2 Then Inc(Ki);
      For J:= Ki To Ss Do WriteXY(1,1+j-Ki,Copy(Tomb[J],1,Sh-1));
      Ay:= WhereY;
      For J:= 1 To Vi Do
      Begin Inc(Ay);WriteXY(1,Ay,Copy(Tomb[J],1,Sh-1)) End;
    End;
    Window(1,1,80,25);
    Tunj
  End;
Begin
  If LS>Ss Then LS:= Ss;If Ls<3 Then LS:= 3;
  If Not Odd(Ls) Then Dec(Ls);
  If LS>21 Then LS:= 21;
  If Bfy+Ls+1>24 Then Repeat Dec(Bfy) Until Bfy+Ls+1<25;
  AkS:= Bfy+Round(Ls/2);
  Ablak(HSz,KSz,Bfx,Bfy,Bfx+Sh,Bfy+Ls+1,Arny,c);
  Kiir;
  Szinez(Vsz,KSz,Bfx+2,Aks,Sh-3);
  Repeat
    Ch:= ReadKey;
    If (Ch=#0) And KeyPressed Then
    Begin
      Ch:= ReadKey;
      If Ch In [#71,#72,#73,#79,#80,#81] Then Szinez(HSz,KSz,Bfx+2,Aks,Sh-3);
      Case Ch Of
        #71: AS:= 1;
        #72: Begin
               Dec(Ki);Dec(As);Dec(Vi);
               If Ki<1 Then Ki:= Ss;
               If As<1 Then AS:= Ss;
               If Vi<1 Then Vi:= Ss;
             End;
        #73: Begin
               Dec(Ki,Ls);Dec(As,Ls);Dec(Vi,Ls);
               If Ki<1 Then Begin If Ki=0 Then Ki:= Ss Else Ki:= KI+Ss+1 End;
               If As<1 Then Begin If AS=0 Then AS:= Ss Else AS:= As+Ss+1 End;
               If Vi<1 Then Begin If Vi=0 Then Vi:= Ss Else Vi:= VI+Ss+1 End;
             End;
        #79: As:= Ss;
        #80: Begin
               Inc(Ki);Inc(As);Inc(Vi);
               If Ki>Ss Then Ki:= 1;
               If AS>Ss Then AS:= 1;
               If Vi>Ss Then Vi:= 1;
             End;
        #81: Begin
               Inc(Ki,Ls);Inc(As,Ls);Inc(Vi,Ls);
               If Ki>Ss Then Ki:= KI-Ss;
               If AS>Ss Then AS:= As-Ss;
               If Vi>Ss Then Vi:= VI-Ss;
             End;
      End;
      If Ch In [#71,#72,#73,#79,#80,#81] Then
      Begin
        Kiir;
        Szinez(Vsz,KSz,Bfx+2,Aks,Sh-3);
      End;
    End;
  Until Ch In [#13,#27];
  If Ch=#27 Then Listazo:= 0 Else Listazo:= As;
  VCh:= Ch;
End;

Function Combo(X,Y,Sh,kS: Byte;Ss,As: Integer;c: String): Integer;
label 1,2,3,4;
Var I,Ik,Iv,Pik,Piv: Byte;
    Ch,Ch1: Char;
    Elso: Boolean;
    Kks,Apos: Byte;
    Ws: String;
  Procedure Kiir;
  Var I: Byte;
  Begin
    Window(1,1,80,25);
    If Elso Then Szinek(2,15) Else Szinek(1,15);
    WriteXY(X,Y,' '+Tomb[As]);
    Window(X+1,Y+2,X+Sh+1,Y+ks+2);
    If Elso Then     Begin
      Ik:= As;
      Iv:= Ss;
      While Iv>As+ks-1 Do Dec(iv);
      Pik:= Ik;
      Piv:= Iv;
      For I:= As To Iv Do
      Begin
        If I=As Then Begin KkS:= WhereY; Szinek(2,15) End Else Szinek(3,0);
        WriteLn(Tomb[I]);
      End;
      GoToXY(X+1,Y+2);
    End
    Else
    Begin
      If As<Pik Then Begin Dec(Pik); If Piv-Pik=Ks Then Dec(Piv) End Else
      If As>Piv Then Begin Inc(Pik); Inc(Piv) End;
      For I:= Pik To Piv Do
      Begin
        If I=As Then Begin KkS:= WhereY; Szinek(2,15) End Else Szinek(3,0);
        WriteLn(Tomb[I]);
      End;
    End;
    Szinek(3,0);
    Window(1,1,80,25);
    Case Apos Of
      1: GoToXY(X+1,Y);
      2: GoToXY(X+1,Kks+6);
    End;
  End;
Begin
  Ablak(7,15,x-5,Y-2,X+Sh+14,Y+ks+3,True,C);
  Szinek(2,0);
  WriteXY(54, 7,' Beszúr ');
  WriteXY(54, 9,' Javít  ');
  WriteXY(54,11,' Töröl  ');
  WriteXY(54,13,' Mégsem ');
  Window(X,Y+2,X+Sh+1,Y+ks+1);
  Szinek(3,0);
  ClrScr;
  Elso:= True; ApoS:= 1;
  Kiir;
  Elso:= False;
  Repeat
    If Ch<>#9 Then Repeat Until KeyPressed; Ch:= ReadKey;
    If Ch=#27 Then GoTo 3;
    1:If Ch=#9 Then Begin Inc(Apos); If ApoS>6 Then ApoS:= 1 End;
      If Ch=#0 Then
      Begin
        Ch:= ReadKey; If Ch=#15 Then
        Begin Dec(Apos); If Apos<1 Then ApoS:= 6 End;
      End;
    Case Apos Of
      1: Begin
           GoToXY(X+1,Y);
           Szinez(2,15,X+1,Y,Sh-2);
           Repeat Until KeyPressed;
           Ch:= ReadKey;
           If Ch In [#13,#0,'0'..'9',' ',
                     'A'..'Z','Á','É','Í','Ó','Ö','Ő','Ú','Ü','Ű',
                     'a'..'z','á','é','í','ó','ö','ő','ú','ü','ű'] Then
           Begin
             If KeyPressed Then
             Begin
               Ch1:= ReadKey;
               If Ch1<>#77 Then GoTo 4;
             End;
             WS:= Bevitel(1,15,X+1,Y,Sh);
             Szinez(1,15,X,Y,Sh+2);
             GoToXY(X+1,Y);
           End;
          4: Szinez(1,15,X,Y,Sh-1);
        End;
      2: Begin
           GoToXY(X+1,kks+6);
           2: Repeat Until KeyPressed;
           Ch:= ReadKey;
           Case Ch Of
             #9:GoTo 1;
             #27:GoTo 3;
           End;
           If (Ch=#0) And KeyPressed Then
           Begin
             Ch:= ReadKey;
             Case Ch Of
               #15: Begin ApoS:= 1; GoTo 1; End;
               #72: If AS>1 Then Dec(As);
               #80: If SS>As Then Inc(As);
             End;
             Kiir;
           End;
           GoTo 2;
         End;
      3: Begin
           Szinez(2,15,54,7,8);
           Tunj;
           Repeat Until KeyPressed;
           Szinez(2,0,54,7,8);
           Ch:= ReadKey;
           If Ch In [#13,#27] Then GoTo 3 Else GoTo 1;
         End;
      4: Begin
           Szinez(2,15,54,9,8);
           Tunj;
           Repeat Until KeyPressed;
           Szinez(2,0,54,9,8);
           Ch:= ReadKey;
           If Ch In [#13,#27] Then GoTo 3 Else GoTo 1;
         End;
      5: Begin
           Szinez(2,15,54,11,8);
           Tunj;
           Repeat Until KeyPressed;
           Szinez(2,0,54,11,8);
           Ch:= ReadKey;
           If Ch In [#13,#27] Then GoTo 3 Else GoTo 1;
         End;
      6: Begin
           Szinez(2,15,54,13,8);
           Tunj;
           Repeat Until KeyPressed;
           Szinez(2,0,54,13,8);
           Ch:= ReadKey;
           If Ch In [#13,#27] Then GoTo 3 Else GoTo 1;
         End;
    End;
  Until (Apos In [3..6]) And (Ch=#13);
  3:If Ch=#27 Then Combo:= 0 Else Combo:= As;
  VCh:= Ch;
  Funkcio:= Apos;
  BeviteliSor:= '';
  For I:= X+1 To X+Sh Do BeviteliSor:= BeviteliSor+Chr(BKep[Y,I,1]);
End;

Function ValidSt(S: String): String;
Var I,N: Byte;
    Ws: String;
    Van: Boolean;
Begin
  N:= Length(s);
  ValidSt:= '';
  If N=0 Then Exit;
  WS:= s;
  While WS[N]=' ' Do
  Begin
    WS:= Copy(Ws,1,N-1);
    Dec(N);
  End;
  If N>0 Then
  While WS[1]=' ' Do
  Begin
    Ws:= Copy(Ws,2,N-1);
    Dec(N);
  End;
  Van:= True;
  If N>3 Then While Van Do
  Begin
    Van:= False;
    N:= Length(Ws);
    For I:= 2 To N-1 Do If (Ws[I]=' ') And (Ws[I+1]=' ') Then
    Begin
      Van:= True;
      Ws:= Copy(Ws,1,i)+Copy(Ws,I+2,N-I-1);
    End;
  End;
  ValidSt:= Ws;
End;

Function Listara(S: String): Integer;
Var I,J,N: Integer;
Begin
  S:= ValidSt(s);
  N:= 0;
  While Tomb[N+1]<>''Do Inc(N);
  If S='' Then Begin Listara:= N; Exit End;
  If n=0 Then Begin Tomb[1]:= S; Listara:= 1; Exit End;
  For I:= 1 To N Do If Tomb[I]=S Then Begin Listara:= n; Exit End;
  I:= 1; While (S>Tomb[I]) And (Tomb[I]<>'') Do Inc(I);
  For J:= N DownTo I Do Tomb[J+1]:= Tomb[J];
  Tomb[I]:= s;
  Listara:= N+1;
End;

Function Listarol(S: String): Integer;
Var I,J,N: Integer;
Begin
  S:= ValidSt(s);
  N:= 0;
  While Tomb[N+1]<>''Do Inc(N);
  If (S='') or (N=0) Then Begin Listarol:= N; Exit End;
  For I:= 1 To N Do If Tomb[I]=S Then
  Begin
    For J:= I To N-1 Do Tomb[J]:= Tomb[J+1];
    Tomb[N]:= '';
    Listarol:= N-1;
    Exit;
  End;
  Listarol:= 0;
End;

Function FileKereso(HSz,KSz,Vsz,dr: Byte;ext: String): String;
Var I,v,Sh: Integer;
    Bejegyzes: SearchRec;
    Katalogus: String;
Begin
  For I:= 0 To Max Do Tomb[I]:= '';GetDir(dr,Katalogus);
  If Katalogus[Length(Katalogus)]<>'\' Then Katalogus:= Katalogus+'\';
  Katalogus:= Katalogus+'*.'+ext;FindFirst(Katalogus,AnyFile,Bejegyzes);
  If Doserror<>0 Then Begin FileKereso:= ''; Exit End;
  I:= 1;
  While Doserror=0 Do
  Begin Tomb[I]:= ' '+Bejegyzes.Name;FindNext(Bejegyzes);Inc(I) End;
  Dec(I);Sh:= Length(Katalogus)+5;If Sh<17 Then Sh:= 17;
  v:= Listazo(HSz,KSz,Vsz,Round(40-Sh/2),6,Sh,I,11,1,True,Katalogus);
  FileKereso:= ValidSt(Tomb[V]);
End;

Procedure Gomb(HSz,KSz,Vsz,X,Y,Sh: Byte;S: String);
Var I,kh: Byte;
Begin
  HideMouse; Kh:= Pos(Chr(126),s);
  If Kh<>0 Then
  Begin
    GoToXY(X+1,Y);
    For I:= 1 To Length(s) Do If S[I]<>Chr(126) Then Write(S[I]);
  End Else WriteXY(X+1,Y,s);
  Szinez(HSz,KSz,X,Y,Sh);
  If kh<>0 Then Szinez(HSz,Vsz,X+kh,Y,1);
  HSz:= BKep[Y,X+Sh,2] Div 16;
  Szinek(HSz,0);
  WriteXY(X+Sh,Y,Chr(220));
  For I:= X+1 To X+Sh Do WriteXY(I,Y+1,Chr(223));
  Inc(GombIndex);
  With GombT[GombIndex] Do
  Begin
    Tip:= 1;
    Gx:= X; Gy:= y; Gsh:= Sh; Key:= #0;
    If Kh<>0 Then Key:= AltKod[UpCase(S[Pos(Chr(126),s)+1])];
  End
  ShowMouse;
End;

Function GombKereso(X,Y: Byte): Char;
Var I,J,HSz: Byte;
Begin
  GombKereso:= #0;
  For I:= 1 To gtMax Do with GombT[I] Do
  If (gy=y) And (gx<=x) And (x<gX+Gsh) Then
  Begin
    GombKereso:= Key;
    If Tip>1 Then
    Begin
      Repeat Until MouseButtons<>1;
      Exit;
    End;
    HideMouse;
    For J:= Gx+1 To Gx+Gsh Do BKep[Gy+1,J,1]:= 32;
    For J:= Gx+Gsh DownTo Gx Do
    Begin
      BKep[Y,J,1]:= BKep[Y,J-1,1];
      BKep[Y,J,2]:= BKep[Y,J-1,2];
    End;
    BKep[Y,Gx,1]:= 32;
    ShowMouse; Repeat Until MouseButtons<>1; HideMouse;
    HSz:= BKep[Y,Gx,2] Div 16;
    For J:= Gx To Gx+Gsh Do
    Begin
      BKep[Y,J,1]:= BKep[Y,J+1,1];
      BKep[Y,J,2]:= BKep[Y,J+1,2];
    End;
    Szinek(HSz,0);WriteXY(gX+Gsh,Y,Chr(220));
    For J:= Gx+1 To Gx+Gsh Do WriteXY(J,Gy+1,Chr(223));
    Tunj;
    ShowMouse; Exit;
  End;
End;

Function InputLine(Dhsz,Dksz,dVsz,HSz,KSz,X,Y,Sh: Byte; S: String): String;
Var I,kh: Byte;
Begin
  HideMouse; Szinek(Dhsz,Dksz);
  Kh:= Pos(Chr(126),s);
  If Kh<>0 Then
  Begin
    GoToXY(X,Y-1);
    For I:= 1 To Length(s) Do If S[I]<>Chr(126) Then Write(S[I]);
  End Else WriteXY(X,Y-1,s);
  If kh<>0 Then Szinez(Dhsz,dVsz,X+kh-1,Y-1,1);
  Szinez(HSz,KSz,X,Y,Sh);
  Inc(GombIndex);
  With GombT[GombIndex] Do
  Begin
    Tip:= 2; Gx:= X; Gy:= y; Gsh:= Sh; Key:= #0;
    If Kh<>0 Then Key:= AltKod[UpCase(S[Pos(Chr(126),S)+1])];
  End; ShowMouse;
End;

Procedure RadioGomb(Dhsz,Dksz,HSz,KSz,Vsz,Bfx,Bfy,Sh,Ss,AS: Byte; S: String);
Var I,J,kh,dy: Integer;
    Ch: Char;
Begin
  HideMouse; Szinek(Dhsz,Dksz);WriteXY(Bfx,Bfy-1,s);
  For I:= 1 To Ss Do Szinez(HSz,KSz,Bfx,Bfy-1+I,Sh);
  Szinek(HSz,KSz);
  For I:= 1 To Ss Do WriteXY(Bfx,Bfy-1+I,' ( )');
  dy:= 0;
  For I:= 1 To Ss Do
  Begin
    Kh:= Pos(Chr(126),Tomb[I]);
    If Kh<>0 Then
    Begin
      GoToXY(Bfx+5,Bfy-1+i);
      For J:= 1 To Length(Tomb[I]) Do
      If Tomb[I][J]<>Chr(126) Then Write(Tomb[I][J]);
    End Else WriteXY(Bfx+6,Bfy-1+I,Tomb[I][J]);
    If kh<>0 Then Szinez(HSz,Vsz,Bfx+5+kh-1,Bfy-1+I,1);
    Inc(GombIndex);
    With GombT[GombIndex] Do
    Begin
      tip:= 3;
      gx:= Bfx;gy:= Bfy+dy;Inc(dy);Gsh:= Sh;Key:= #0;
      If Kh<>0 Then Key:= AltKod[UpCase(Tomb[I][Pos(Chr(126),Tomb[I])+1])];
    End;
  End;
  WriteXY(Bfx+2,Bfy-1+As,Chr(4)); ShowMouse;
End;

Function RadioGombKapcs(HSz,KSz,Bfx,Bfy,Sh,Ss,AS: Byte): Byte;
Var I,Ax,Ay: Integer;
    Ch: Char;
Begin
  Repeat
    Szinek(HSz,KSz);GoToXY(Bfx+2,Bfy-1+As);
    While (Not KeyPressed) And (MouseButtons<>1) Do;
    If KeyPressed Then Ch:= ReadKey;
    If MouseButtons=1 Then With MouseWhere Do
    If (X>Bfx-1) And (X<Bfx+Sh-1) And (Y>Bfy-2) And (Y<Bfy+Ss-1) Then
    Begin 
      For I:= Bfy To Bfy+Ss-1 Do WriteXY(Bfx+2,I,' ');
      As:= Y-Bfy+2;
      WriteXY(Bfx+2,Bfy-1+As,Chr(4));
      GoToXY(WhereX-1,WhereY);
      RadioGombKapcS:= As;
      Exit;
    End;
    If Ch=#0 Then
    Begin
      Ch:= ReadKey;
      If Ch In [#72,#80] Then WriteXY(Bfx+2,Bfy-1+As,' ');
      Case Ch Of
        #72: If AS>1 Then Dec(AsElse AS:= Ss;
        #80: If As<Ss Then Inc(AsElse AS:= 1;
      End;
      If Ch In [#72,#80] Then WriteXY(Bfx+2,Bfy-1+As,Chr(4));
    End
    Else
    Begin
      Ax:= 0; Ay:= 0;
      Ch:= AltKod[UpCase(Ch)];
      For I:= 1 To 16 Do with GombT[I] Do If Key=Ch Then
      Begin
        Ax:= gx; Ay:= gy;
        If Not ((Ax>Bfx-1) And (Ax<Bfx+Sh-1) And
                (Ay>Bfy-1) And (Ay<Bfy+Ss)) Then Ax:= 0; 
      End;
      If Ax*Ay<>0 Then
      Begin
        WriteXY(Bfx+2,Bfy-1+As,' ');
        GoToXY(WhereX-1,WhereY);
        AS:= Ay-Bfy+1;
        WriteXY(Bfx+2,Bfy-1+As,Chr(4));
        GoToXY(WhereX-1,WhereY);
      End;
    End;
  Until Ch In [#9,#13,#27];
  RadioGombkapcS:= As;
  Tunj;
End;

Procedure DeskTop;
Var I: Integer;
Begin
  Szinek(7,1);
  ClrScr;
  For I:= 2 To 24 Do Tolt(1,I,80,Chr(176));
  Szinek(7,0);
  WriteXY(1,25,' Alt-X Exit');
  Tunj;
  Szinez(7,4,2,25,5);
  Inc(GombIndex);
  With GombT[GombIndex] Do
  Begin
    Tip:= 6; Gx:= 2; Gy:= 25; Gsh:= 5; Key:= AltKod['X'];
  End;
  InitEvents; ShowMouse;
End;

Function Binaris(S: Word): String;
Var WS: String;
    B: Word;
Begin
  WS:= '';
  B:= $8000;
  While B<>0 Do
  Begin
    If B And S=0 Then Ws:= Ws+'0' Else Ws:= Ws+'1';
    B:= B Shr 1;
  End;
  Binaris:= Ws;
End;

Function Tizes(S: String): Word;
Var Wn: Word;
    B,I: Byte;
    Kod: Integer;
Begin
  Wn:= 0;
  While Length(S)<16 Do S:= '0'+S;
  For I:= 16 DownTo 1 Do
  Begin
    Val(S[I],B,Kod);
    If B>1 Then
    Begin
      Tizes:= 0;
      Exit;
    End;
    Wn:= Wn+B*Round(Exp((16-i)*Ln(2)));
  End;
  Tizes:= Wn;
End;

Function SetBit(W: Word; N,B: Byte): Word;
Var S,WS: String;
Begin
  If (N=0) Or (N>16) Or (B>1) Then
  Begin
    SetBit:= W;
    Exit;
  End;
  S:= Binaris(W);
  Str(B,Ws);
  S[16-N+1]:= Ws[1];
  SetBit:= Tizes(s);
End;

Function ValtBit(W: Word; N: Byte): Word;
Var S: String;
Begin
  If (N=0) or (N>16) Then
  Begin
    ValtBit:= W;
    Exit;
  End;
  S:= Binaris(W);
  If S[16-N+1]='0' Then S[16-N+1]:= '1' Else S[16-N+1]:= '0';
  ValtBit:= Tizes(s);
End;

Begin
  With H Do
  Begin
    Hq:=   1.059463;
    Ha:=   440;
    Hc:=   Round(a/q/q/q/q/q/q/q/q/q);
    HciSz:= Round(c*q);
    Hd:=   Round(cisz*q);
    HdiSz:= Round(d*q);
    He:=   Round(disz*q);
    Hf:=   Round(e*q);
    HfiSz:= Round(f*q);
    Hg:=   Round(fisz*q);
    HgiSz:= Round(a/q);
    Hbe:=  Round(a*q);
    Hh:=   Round(be*q);
  End;
End.