Budowa modułu



Tym razem zajmiemy się doświadczeniami z innej beczki tj. programowaniem. Zaawansowani programiści w Delphi(ego) mogą ten artykuł pominąć gdyż przedsawia on tylko podstawowe pojęcia z tej dziedziny i nie przechodzi do tajników pisania programów... Nie będę się rozpisywał, tylko zacznę od razu.
Chciałbym tu przedstawić budowę modułu w Delphi. Otóż na początek przypnę, że moduł jest plikiem tekstowym (zawiera tekst :) i może być on kompilowany do postaci pliku wykonywalnego EXE. No właśnie, ale co to jest ta kompilacja ? Każdy doświadczony programista odpowie na to pytanie w taki sposób, że kompilacja to proces "tłumaczenia" kodu źródłowego programu (napisanego przez użytkownika) do pliku wykonywalnego EXE. W procesie kompilacji program kompilujący (kompilator) nasz program "zmienia" wszystkie instrukcje napisane przez programistę w język zrozumiały tylko dla procesora tzw. kod maszynowy ( i nie próbujcie otwierać plików exe przez wordpada :). Kompilator najpierw analizuje kod źródłowy (debuguje), jeżeli kod źródłowy zawiera błędy kompilator zatrzymuje proces debugowania i wskazuje błąd. Po analizie kodu źródłowego kompilator zaczyna proces translacji.
Każdy język programowania używa innego kompilatora tj. gdybyście chcieli skopiować kod źródłowy programu napisanego w Delphi do kompilatora C++ wykryłby on w nim błędy i nie skompilowałby kodu. Każda platforma, czasami nawet procesor wymaga innego kodu źródłowego, zwykle więc istnieje kilka kompilatorów dla jednego języka programowania. OK, myślę, że wszyscy już wiedzą co to jest kompilator i jaką pracę wykonuje, teraz przejdziemy do budowy modułu w Delphi. Poniżej przedstawiam nowo utworzony moduł w Delphi. Wygląda on następująco:
unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type 
 TForm1 = class(TForm)
private
  { Private declarations }
public
  { Public declarations }
end;

var
  Form1: TForm1;

implementation

  {$R *.DFM}
 
end.
Kod w języku Delphi zawarty jest w procedurach, zwykle każde zdarzenie ma swoją procedurę np. Jeśli najedziesz na przycisk kursorem myszy wygenerowana zostanie procedura OnMouseEnter jednak jeśli kursor opuści pole przycisku wygenerowana zostanie procedura OnMouseLeave oznaczająca, że kursor myszy znalazł się poza obszarem przycisku. Procedury taki umieszczane są po słowie implementation . Ale zacznijmy analizować od początku, od pierwszego słowa  które zaczyna moduł, mianowicie jego nazwy. Tak, na samym początku zadeklarowana zostaje nazwa modułu. Następnie, po słowie "uses" następuje wypisanie wszystkich modułów wchodzących w skład naszego modułu, czyli jeżeli używamy komponentu Menu w liście uses zostanie dodany moduł Menus, obsługujący ten komponent. Jedziemy w dół i widzimy sekcje type gdzie deklarowane są nazwy wszystkich komponentów które umieszczone są na formularzu np. przyciski, pola tekstowe, etykiety itp. Słowo po lewej to nazwa naszego komponentu. Można ja zmieniać według własnego uznania, zresztą łatwiej to zrobisz w Inspektorze Obiektów, zaznaczając komponenet i w Inspektorze Objektów modyfikując pole Name. Po prawej stronie zawarty jest typ komponentu np. dla przycisku będzie to TButton, dla pola tekstowego TEdit itp. Każdy typ komponentu poprzedzony jest litera "T" np. TEdit, TMemo, TButton itp. Wszystko, co znajduje się po słowie "type" to Klasa. Po słowie "private" i "public" istnieje możliwość wpisywania własnych procedur, zależnie gdzie je wpiszemy będą one dostępne w innych modułach. Istnieje możliwość deklarowania własnych Klas. Następnie, poniżej istnieje słówka "var" w tym miejscu deklarujemy zmienne, które będą widoczne nie w jednej, lecz we wszystkich naszych procedurach w tym module. Jeśli chcemy aby zmienna była obecna tylko w jednej procedurze piszemy coś takiego
procedure Moja_procedura;
var
  x : String;
begin

end;
Widzicie, teraz gdy spróbujecie się odwołać w innej procedurze do tej zmiennej kompilator wygeneruje błąd. Jeszcze słowo implementation, jak już wspomniałem tu umieszczane są wszystkie procedury.

Procedury
Procedura to wydzielony kod, który wykonuje określoną czynność i w przeciwieństwi do funkcji nie zwraca wyniku. Delphi sam generuje procedury. Nazwa procedury poprzedzona jest słowem "procedure". Następnie nazwa komponentu, którego dotyczy. Później słowo "Click" (lub jakiekolwiek inne zdarzenie np. "OnMouseMove"). Procedura TForm1.ButtonClick zostanie wykonana gdy użytkownik programu klikniecie na przycisk. Gdy na formie programu klikniemy na przycisk treść procedury wpisana zostanie w sekcji "Implementation".

Funkcje
Możliwe też jest deklarowanie własnych funkcji. Dla jasności funkcja różni się od procedury tym, że zwraca rezultat (wynik).
Po słowie private należy zwykle dopisać taką linie oczywiście odpowiednio zmodyfikować trzeba typ zmiennych oraz typ rezyltatu.
Tak przedstawia się deklaracja funkcji:
function Moja_Funkcja(X, Y : Integer) : Integer;
Nazwa funkcji
Wartości funkcji (zmienne i ich typ)
Wynik funkcji (typ)

Słowo "function", mówi kompilatorowi, że ma do czynienia z funkcja. Następnie w nawisanie przedstawiane są dwie zmienne typu "Integer". Można się obyć bez tych zmiennych, lecz do tego przykładu potrzebne nam będą te właśnie zmienne. Na samym końcu typ wyniku, "Integer". Procedura wyglądała by tak:
procedure Moja_Procedura(X, Y : Integer);
Widzicie? Tak, procedura nie zwraca wyniku (rezultatu jej działania).
Aby dodać taką funkcję do sekcji Implementation, najedź na nią kursorem i naciśnij kombinacje klawiszy: Ctrl + Shift + C.
Tu możemy wpisać swój kod:
function TForm1.MojaFunkcja(X, Y: Integer): Integer;
begin
  // rezultat funkcji:
  Result := X + Y;
end;
Tak przedstawia się nasza funkcja. Słowo "Result" śluzy do zwracania wyniku. Rezultatem działania takiej funkcji będzie dodanie do siebie dwóch zmiennych: X i Y (oczywiście typu integer). Teraz napiszemy procedurę któraby eksportowała do funkcji liczby, a następnie importowała by wynik działania funkcji. A więc do dzieła! Utwórz na formularzu etykietę i przycisk i kliknij na niego dwa razy. Zostaniesz przeniesiony do edytora kodu. Teraz odwołaj się do naszej funkcji wpisując w procedurze takie instrukcje:

Label1.Caption := IntToStr(Moja_Funkcja(2, 2));
Funkcja IntToStr konwertuje typ Integer zmiennej na typ String, który można już wyświetlić w etykiecie. Możliwe są jeszcze inne konwersje:
  • IntToStr - konwertuje zmienna "Integer" na "String"
  • StrToInt - "String" na "Integer"
  • StrPCopy - "String" na "PChar"
  • StrPas - "PChar" na "String"
  • FloatToStr - typ zmiennoprzecinkowy (np. 0.3) na "String"
  • StrToCurr - "String" na "Currency" (typ zmiennoprzecinkowy)
  • TimeToStr - zmienna "Time" na "String"
  • DateToStr - zmienna "Date" na "String"
  • StrToDate - "String" na "Date"
  • StrToTime - "String" na "Time"
  • CurrToStr - typ zmiennoprzecinkowy Currency (np. 0.5) na "String"


I na tym skończymy! Uff! Ok, mam nadzieje, że czegoś się nauczyliście. Do neXt art!





...powrót