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é Interface a Implementation. 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.
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:
Unit Jméno;
Interface
Implementation
Uses
seznam unit;
Const
definice konstant;
Type
definice typů;
Var
definice proměnných;
Procedure Jmeno( prom: typ );
Function JmenoFce( prom: typ ): typ;
...
Begin
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;
Programová část
Vykoná se na začátku programu, který používá unitu. Vhodné na počáteční nastavení proměnných a podobně.
End.
|
|