Unity, aneb jak neopisovat pořád to samé

Psaní programů se dá rozdělit na tvůrčí práci, kdy programátor vymýšlí něco nového, a na mechanickou hlavoruční dřinu, kdy jen opisuje (z papíru či vlastní paměti) stokrát napsané části. Například: ve většině programů je nějaké menu. Programovat je stále znovu je zdlouhavé. Pravda — dá se odněkud zkopírovat. Ale existuje i jiné, pohodlnější řešení: napsat unit (jednotku), kde budou takové podprogramy připraveny a pak už je jenom používat. Několik takových je v Pascalu připraveno; například CRT pro práci s obrazovkou.

Unit má podobnou strukturu, jako samotný program. Pouze v hlavičce je místo Program napsáno Unit. Dále platí, že jméno souboru musí být stejné, jako prvních osm znaků jména unity. Unit má dvě samostatné části, nadepsané InterfaceImplementation. Vše, co je v části Interface „je vidět” z hlavního programu. Naopak všechno za Implementation je dobře ukryto uvnitř a programu do toho nic není.

Unit Priklad;

Interface
Zprava: String; { Tato proměnná bude vidět v programu }
Procedure Chyba( Txt: String );

Implementation
Procedure Chyba; { Nemusí se opisovat parametry ! }
Begin
WriteLn('!!!! Chyba !!!! ', Txt );
Zprava:= Txt;
End;

End.

V hlavním programu stačí pouze doplnit jméno unity a pak lze používat jak procedury, tak proměnné z Interface.

Program Hlavni_pgm;
Uses Priklad;
Begin
Chyba('Test unity');
WriteLn( Zprava );
End.

Příklad:

Jednoduchá unit, která obsahuje funkci menu. Do funkce vstupuje poloha menu a text, obsahující všechny řádky menu.

Unit Menu_10;
{----------------------------------------------------------------}
 Interface
  Function Menu( X,Y:Integer; Volby:String ): Integer;
 { Volby = Text všech řádků, oddělený znakem '@' }
 { +-------+
   ¦ Jedna ¦ = '@Jedna@Dva'
   ¦ Dva   ¦
   +-------+ }
{----------------------------------------------------------------}

 Implementation

  Uses Crt;

 Procedure WriteXY( X, Y: Integer; S: String );
  Begin
   GotoXY( X, Y );
   Write( S );
  End;

 Function Menu;
  Var
   i: Integer;
   Pocet: Integer;
   Radky: Array[1..32]of String[31];
   Znak : Char;
   ByloX, ByloY: Integer;
  Begin
   ByloX:= WhereX;
   ByloY:= WhereY;
   Pocet:= 0;
   For i:= 1 to 32 do Radky[i]:= '';        { Vymazat }
   For i:=1 to Length( Volby ) do Begin
                                            { Projdi celou definici }
    If Volby[i]='@' then
     Pocet:= Pocet+1                        { Nový řádek }
    else
     Radky[Pocet]:=Radky[Pocet]+Volby[i];   { Přidat písmeno }
   end;
   For i:=1 to Pocet do Begin
    WriteXY( X, Y+i-1, Radky[i] );
   end;
   i:= 1;                                   { Začneme na prvním řádku }
   TextColor( 15 );
   WriteXY( X, Y+i-1, Radky[i] );
   Repeat
    Znak:= ReadKey;
    If Znak=#0 then Begin                   { Funkční klávesy }
     TextColor( 7 );
     WriteXY( X, Y+i-1, Radky[i] );
     Znak:= ReadKey;
     Case Znak of
      #72: If i>1     then i:= i-1;
      #80: If i<Pocet then i:= i+1;
     end;
     TextColor( 15 );
     WriteXY( X, Y+i-1, Radky[i] );
    end;
   Until Znak=#13;                          { [Enter] }
   Menu:= i;
   TextColor( 0 );                          { Smazat menu }
   For i:= 1 to Pocet do WriteXY( X,Y+i-1, Radky[i] );
   TextColor( 7 );                          { Nastavit normální barvu }
   GotoXY( ByloX, ByloY );                  { Vrátit kursor }
  End;
{----------------------------------------------------------------}
End.

K této jednotce je potřeba napsat též testovací program. Např.:

Program Prvni_menu;
{	Testovací program k unitě MENU	}

 Uses
  MENU_10, Crt;                             { MENU_10 = jméno nové unity }

 Var
  i: Integer;
 Begin
  ClrScr;
  i:=Menu(6,3,'@Jedna@Dva@Tři@Čtyři@Pět@Cos to Janku cos to sněd');
  WriteLn( 'Bylo vybráno: ', i );
 End.
Úkoly:

Struktura unity v Pascalu

Unit Jméno;
Interface
Uses
seznam unit;

Const
definice konstant;

Type
definice typů;

Var
definice proměnných;

Procedure Jmeno( prom: typ );
Function JmenoFce( prom: typ ): typ;
...
Implementation
Uses
seznam unit;

Const
definice konstant;

Type
definice typů;

Var
definice proměnných;

Procedure Jmeno( prom: typ );
Begin
End;
...
Function JmenoFce( prom: typ ): typ;
Begin
End;
...
Begin
Programová část
Vykoná se na začátku programu, který používá unitu. Vhodné na počáteční nastavení proměnných a podobně.

End.