Procedury, funkcje i moduły



Zapewne pamiętasz zmienne (rozdział 3). Wykorzystywaliśmy je by nie podawać w paru miejscach tych samych wartości, tekestów itp. Często zachodzi potrzeba wykonania danej czynności w kilku miejscach naszego programu (pętla, rysowanie itp.). Przydałoby się nam coś podobnego do zmiennej. Do tego służą procedury, funkcje i moduły. Stworzymy prostą procedurę by zrozumieć na czym polega jej działanie:

procedure Rysuj(x1, y1, x2, y2: Integer; kolor: TColor);
begin
  Form1.Canvas.Brush.Color := kolor;
  Form1.Canvas.Rectangle(x1, y1, x2, y2);
end;
powyższa procedura rysuje kwadrat o podanym kolorze i w określonym obszarze. Aby wykorzystać procedurę Rysuj potrzebny nam będzie przycisk. Wstaw go na formę i w zdarzeniu OnClick wpisz:

rysuj(10, 10, 50, 50, clGreen);
Uruchom program i kliknij na przycisku. Zapewne zauważyłeś, że na formie został narysowany zielony kwadrat. Spytasz: "I po to są procedury". To jest tylko przykład. Rozpatrzmy taki przypadek: narysuj 100 kwadratów o różnych kolorach i w różnych miejscach. Kod procedury Rysuj zajmuje 2 linijki, a jej wykonanie tylko 1. A co gdyby procedura miała wykonać operacje mieszczące się w 100 linjikach kodu? Jak widać rozbudowany kod możemy sprowadzić do jednej linijki i wykorzystywać go w kazdym miejscu programu.

Podobne do procedur są funkcje. Różnią się tym że deklarujemy jej wynik, tzn. czy ma to być tekst, liczba itp. Najlepiej coś wyjaśnić na przykładzie:

function CzyZero(l1, l2: integer) : string;
begin
  if l1 - l2=0 then
    Result := 'Wynikiem jest zero' 
  else
    Result := 'Wynikiem nie jest zero';
end;
Teraz wstaw na formę Button i dwa Labele. Pod zdarzenie OnClick przycisku wpisz:
Label1.Caption := CzyZero(10,234);
Label2.Caption := CzyZero(10,10);

Jak widać nasza funkcja działa poprawnie. Zwraca ona wyniku odejmowania tylko odpowiedni tekst. Wynik wykonania funkcji podajemy po słowie Result:=. Teraz zajmiemy się modułem. Jest to plik, który zawiera procedury i funkcje. Stworzymy moduł, który zawiera powyższe przykłady. Zamknij wszystkie projekty i utwórz nowy unit (File -> New -> Unit).

Skasuj jego zawartość, wklej poniższy kod i przyjrzyj się mu:

unit test;
interface
{ informujemy moduł, że korzysta on z grafiki } uses Graphics;
{ informujemy moduł jakie zawiera funkcje i procedury } function CzyZero(l1, l2: integer) : string; procedure Rysuj(can: TCanvas; x1, y1, x2, y2: Integer; kolor: TColor);
implementation
{ nasza funkcja} function CzyZero(l1, l2: integer) : string; begin if l1 - l2 = 0 then Result := 'Wynikiem jest zero' else Result := 'Wynikiem nie jest zero'; end; { nasza procedura. Została lekko zmieniona (can: TCanvas). Jako że nie mamy formy, musimy poinformować procedurę na czym ma rysować kwadrat. O Canvasie można poczytać w rozdziale 14}
procedure Rysuj(can: TCanvas; x1, y1, x2, y2: Integer; kolor: TColor); begin can.Brush.Color := kolor; can.Rectangle(x1, y1, x2, y2); end; end.
Zapisz go do jakiegoś katalogu (np c:\test) jako "test". Teraz utwórz nową aplikację (File -> New -> Application) i zapisz ją do tego samego folderu . Na formę wstaw Button i Label. Do deklaracji "uses" programu dodaj test. Teraz w zdarzeniu OnClick przycisku wpisz:

rysuj(Form1.Canvas, 10, 10, 50, 50, clMaroon);
Label1.Caption := CzyZero(100, 50);
Jeżeli wwszystko wykonałeś prawidłowo to ujżysz taki sam efekt jak przy wykonaniu procedury Rysuj i funkcji CzyZero w podanych wcześniej przykładach. Jeżeli mamy wiele funkcji i procedur, z których korzystamy w naszym programie możemy utworzyć moduł. Po co? Zauważ, że kod programu staje się bardziej przejrzysty i estetyczny.





...powrót