17
Wiadomości wstępne – środowisko Delphi
1. Istota programowania obiektowego
Pakiet Delphi jest zintegrowanym środowiskiem (ang. IDE – Integrated Development Environment) programowania zorientowanego obiektowo (autorem jest firma Borland ã). Delphi należy do grupy narzędzi „szybkiego tworzenia aplikacji” (ang. RAD - Rapid Application Development).
Pakiet Delphi podlega ciągłemu rozwojowi, starsze wersje 2.0, 3.0, 4.0 zastąpiło Delphi 5.0, obecnie wkracza kolejna wersja, wykorzystująca poszerzające się możliwości systemu Windows w sieci. Delphi występuje odmianach: Standard, Professional, Client/Server.
W pakiecie Delphi znajduje zastosowanie język Object Pascal – obiektowa odmiana języka programowania Pascal. Podstawowe zasady znanego języka Turbo Pascal (struktura programu, deklaracje i definicje, typy danych, instrukcje: przypisania, warunkowe, iteracyjne itd.) mają swoje niezmienione znaczenie w Delphi.
Programowanie obiektowe pozwala przedstawić problem w postaci logicznie powiązanych ze sobą struktur danych, które wymieniają pomiędzy sobą informacje. Struktury te, nazywane obiektami, odpowiadają zwykle pojęciom z dziedziny problemu, którym zajmuje się aplikacja. Obiekty reprezentują elementy rzeczywistości, które najczęściej są opisane rzeczownikami.
Przykładowymi obiektami mogą być: samochód, pacjent, figura. W Delphi jest dostępnych wiele gotowych obiektów – wizualnych (graficznych) i innych (zwanych komponentami). Istnieje także możliwość tworzenia własnych obiektów.
Komponenty Delphi reprezentują:
· elementy interfejsu użytkownika np. przyciski, przełączniki, ikony i inne,
· proste pojęcia, takie jak: wektor, data, liczba zespolona,
· złożone struktury np. listy dynamiczne, tablice o zmiennym rozmiarze, macierze.
Delphi jest środowiskiem zorientowanym obiektowo, co oznacza, iż dostępne są dla programisty następujące mechanizmy:
A. Tworzenie obiektów poprzez integrowanie powiązanych ze sobą danych i operującego na nich kodu (enkapsulacja).
Typ obiektowy jest to złożona struktura danych o określonej liczbie elementów, które nazywamy składowymi. Składowe te dzielimy na pola i metody.
Pole – zmienna, która może być różnego typu.
Metoda – czynność wykonywana na obiekcie w postaci procedury lub funkcji. Metoda obiektu operuje z reguły na polach (danych) obiektu.
Dodatkowymi składowymi typu obiektowego są właściwości i zdarzenia.
Właściwość (ang. property – l. mn. properties) jest rozwinięciem pola. Umożliwia ona wbudowanie kontroli zmian wartości oraz powiązanie ze sobą metody i pola. Metoda powiązana z właściwością jest automatycznie wykonywana przy odczycie lub zmianie wartości właściwości.
Zdarzenie (ang. event – l. mn. events) jest właściwością, która zawiera wskaźnik (adres) do metody. Po wystąpieniu w systemie zdarzenia, takiego jak np. kliknięcie przycisku myszy, informacja o nim jest wysyłana do odpowiedniego elementu sterującego. Jeśli w tym elemencie zdarzenie OnClick zawiera wskaźnik do metody, to metoda ta jest realizowana. Dzięki zdarzeniom tworzy się metody reagujące na polecenia użytkownika.
B. Tworzenie nowych typów (klas) obiektów na bazie klas już istniejących (dziedziczenie).
Typ bazowy nazywamy przodkiem, a typ tworzony potomkiem. Potomek przejmuje wszystkie składowe przodka, tzn. wszystkie jego pola, właściwości i metody, oraz zawiera nowe, własne składowe.
Dziedziczenie pozwala ustalić więzy między różnymi typami obiektów. Więzy te powinny jak najbardziej modelować rzeczywistość związaną z problemem, którym zajmuje się aplikacja. Przy określaniu powiązań bierze się pod uwagę te obiekty, które mają wspólne cechy.
Jeśli jako przykład weźmiemy obiekt pojazd, to wśród tego typu obiektów można wyróżnić m.in. obiekty: spalinowy i mechaniczny. Następnie wśród obiektów spalinowych wyróżniamy obiekty: ciężarowy, osobowy, autobus i inne. Natomiast wśród obiektów mechanicznych wyróżniamy obiekty: rower, hulajnoga i inne (Rys.1).
Określenie więzów dziedziczenia między obiektami prowadzi do powstania hierarchii obiektów. W naszym przykładzie na szczycie takiej hierarchii znajduje się obiekt pojazd. Dziedziczenie określa przynależność obiektu (np. osobowy) do innej klasy obiektu (np. spalinowy).
Rys.1. Przykład hierarchii obiektów
C. Wykorzystanie wspólnych elementów funkcjonalności klasy macierzystej i pochodnej (polimorfizm).
2. Struktura modułu i projektu aplikacji
Aplikację tworzoną w Delphi nazywamy projektem. Nowy projekt tworzymy za pomocą polecenia File | New Application. Każdy projekt składa się z co najmniej jednego pliku modułu i jednego pliku formatki (Form). Projekt zarządza swoimi składnikami. Tylko w wyniku kompilacji projektu otrzymamy gotową do uruchomienia aplikację.
W projekcie aplikacji znajdują się następujące pliki zawierające kod w języku Object Pascal:
· plik projektu, który zawiera główny blok zaczynający się od słowa kluczowego program,
· pliki modułów, które zaczynają się od słowa kluczowego unit.
2.1. Struktura modułu
W Delphi każdej formatce projektu odpowiada jeden moduł, który zawiera definicje odpowiednich typów, deklaracje zmiennych, definicje procedur obsługi zdarzeń. Wszystkie elementy są umieszczane w odpowiednich częściach modułu. Modułów używamy również do dzielenia projektu aplikacji na logiczne składowe.
Ogólna struktura modułu jest następująca:
unit nazwa_modułu;
interface
{część opisowa }
implementation
{część implementacyjna }
initialization
{część inicjująca – opcjonalna }
finalization
{część kończąca – opcjonalna }
end.
Moduł rozpoczyna się od słowa kluczowego unit, po którym następuje identyfikator będący nazwą modułu. Nazwa ta jest używana do deklaracji danego modułu w innym module. W jednym projekcie wszystkie moduły muszą mieć różne nazwy.
W części opisowej (interface):
· deklarujemy stałe, typy, zmienne, procedury i funkcje, które będą dostępne w innym module,
· deklarujemy inne moduły, jeśli we wszystkich częściach danego modułu chcemy używać elementy zdefiniowane w tych modułach.
W części implementacyjnej (implementation):
· definiujemy procedury i funkcje, które zostały zadeklarowane w części opisowej lub w części implementacyjnej,
· deklarujemy stałe, typy, zmienne, procedury i funkcje, które będą dostępne tylko w tej części modułu (nie będą dostępne w innych modułach zawierających deklaracje danego modułu),
· możemy deklarować inne moduły, jeśli elementy zadeklarowane w tych modułach chcemy używać tylko w części implementacyjnej danego modułu (deklaracja modułów jest taka, jak w części opisowej)
Część inicjująca (initialization) zawiera instrukcje, które będą wykonane w celu zainicjowania modułu. Moduły są inicjowane w takiej kolejności, w jakiej są zadeklarowane w pliku projektu (*.dpr). Część inicjująca jest opcjonalna i nie musi wystąpić.
Część kończąca (finalization) zawiera instrukcje, które będą wykonane przed końcem działania aplikacji w celu zwolnienia zasobów. Części kończące w poszczególnych modułach będą wykonywane w odwrotnej kolejności niż części inicjujące. Część kończąca jest opcjonalna, ale może wystąpić tylko wówczas, jeśli moduł zawiera część inicjującą.
2.2. Struktura projektu
Działanie aplikacji rozpoczyna się od wykonywania instrukcji zawartych w bloku projektu (Project). Blok projektu znajduje się w pliku projektu, który jest automatycznie tworzony przy konstrukcji nowego projektu. Kod bloku głównego projektu obejrzeć możemy przez uaktywnienie opcji menu Project | View Source, zawiera on instrukcje, które są wykonywane po uruchomieniu aplikacji. Blok projektu jest automatycznie tworzony przez Delphi i zawiera instrukcje służące np. do: inicjowania aplikacji, utworzenia okien, uruchomienia działania aplikacji. Bardzo rzadko modyfikujemy jego postać.
Struktura bloku projektu jest następująca:
program nazwa_projektu;
{deklaracje modułów}
{część opisowa}
begin
{blok główny}
Po słowie kluczowym program znajduje się identyfikator będący nazwą projektu aplikacji. Następnie występuje deklaracja modułów wchodzących w skład projektu. Deklaracja ta różni się nieznacznie od deklaracji występującej w module i może być następująca:
uses Modul1 in 'Plik1.pas',
Modul2 in 'Plik2.pas';
Po słowie uses występuje lista nazw modułów zakończona średnikiem. Dla każdego modułu po słowie in może być podany plik, w którym znajduje się kod modułu.
W części opisowej deklarujemy stałe, typy, zmienne, procedury i funkcje, które będą dostępne w bloku głównym. Zwykle w tej części nic się nie znajduje, gdyż własne obiekty deklarujemy w modułach.
Najczęściej część wykonawcza bloku głównego projektu wygląda następująco:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(Tform2, Form2);
Application.Run;
Część inicjująca w modułach jest wykonywana przed blokiem głównym. Część kończąca w modułach jest wykonywana po zakończeniu instrukcji w bloku głównym.
3. Definicja typu obiektowego
Typ obiektowy definiuje się podobnie jak typ rekordowy. W typie obiektowym definiuje się dodatkowo metody.
Typ obiektowy definiuje się w części ...
aneciakurczaczek