Identyfikatory-• oznaczania programów, stałych, typów, zmiennych, pól w rekordach, procedur i funkcji oraz parametrów formalnych. Powiązanie identyfikatora z oznaczanym przez niego obiektem jest jednoznaczne w obszarze stanowiącym zakres działania identyfikatora.
• mogą być dowolnej długości.
•Pewne identyfikatory służą do oznaczania obiektów standardowych (np. funkcji trygonometrycznych).
•Wyrazy tworzące słowa kluczowe nie mogą być używane jako identyfikatory. Liczby - •Liczby zapisuje się w sposób zbliżony do konwencjonalnej notacji matematycznej, z następującymi różnicami:
-część całkowitą oddzielamy od części ułamkowej kropką, a nie przecinkiem;
-dla liczb o małej liczbie cyfr znaczących i jednocześnie bardzo dużym (lub bardzo małym) module, wprowadzono skrócony zapis korzystając z tzw. mnożnika skalującego.
0.345, 0.345E-5; Etykiety
etykieta = ciąg_cyfr
;
Etykiety służą do wyróżnienia w programie wybranych instrukcji. Etykieta jest ciągiem co najwyżej czterocyfrowym.
Napisy
'4' Separatory: •Między dwa symbole Pascalowe można wstawić dowolną liczbę separatorów.
•Dowolne dwa symbole będące identyfikatorami, liczbami i słowami kluczowymi muszą być rozdzielone co najmniej jednym separatorem.
•Wewnątrz symboli Pascalowych (tzn. pomiędzy elementami alfabetu, z których są one zbudowane) nie wolno umieszczać separatorów. Wyjątkiem jest znak spacji wewnątrz napisu. Definicje stałych: Definicja stałej wprowadza identyfikator będący synonimem stałej.
•Używanie synonimów stałych zwiększa czytelność programu. Jednocześnie czyni rozwiązanie bardziej ogólnym poprzez jego parametryzację (ułatwia modyfikację programu i jego przystosowanie do potrzeb konkretnego użytkownika). Definicje typów: •Każdą zmienną należy w programie zadeklarować , tzn. określić jej nazwę oraz wartości, które może przyjmować. Zbiór tych wartości nazywamy typem zmiennej.
•Typy dzielą się na standardowe i niestandardowe, w zależności od tego, czy odpowiednie zbiory wartości są określone standardowo w języku, czy też są wprowadzone w konkretnym programie tylko na jego doraźny użytek.
•Dla typów standardowych język wzorcowy ustala ich nazwy, sposób oznaczania poszczególnych wartości oraz dopuszczalne operacje. Wprowadzając nowy typ niestandardowy, programista sam określa odpowiedni zbiorów wartości w postaci opisu typu. Opis taki może być używany explicite (np. w deklaracjach zmiennych) bez uprzedniego nadania temu typowi nazwy, albo też może być wprowadzony w definicji typu.
type A = integer; Typy proste(porządkowe) - Podklasa nie zawierająca typu rzeczywistego.
•Na dowolnym typie porządkowym jest określona funkcja ord przekształcająca ten typ w typ całkowity integer. Wartością funkcji ord dla danego elementu typu jest liczba porządkowa elementu w tym typie.
•Na każdym typie porządkowym są określone również funkcje poprzednika pred i następnika succ wyznaczające odpowiednio element poprzedni lub następny do danego. Standardowe typy proste- •Typ logiczny Boolean o wartościach false i true. ord(false)=0; ord(true)=1.
•Typ całkowity integer (podzbiór liczb całkowitych określony stałą standardową maxint <-maxint, ... , maxint> ).
•Typ rzeczywisty real (dyskretny i skończony podzbiór zbioru liczb rzeczywistych). Funkcja ord nie jest określona dla typu real.
Wartości typów integer i real są oznaczane w sposób konwencjonalny.
•Typ znakowy char (zbiór znaków zewnętrznych używanych do komunikacji człowiek-komputer). Wartości typu char oznacza się przez ujęcie znaku w pojedyncze apostrofy.
Istnieje funkcja standardowa chr pozwalająca przekształcić podzbiór liczb całkowitych na zbiór znaków.
Typy wyliczeniowe: Stosowane w przypadku zbiorów o niewielkiej liczbie elementów, na których nie wykonuje się operacji arytmetycznych.
•Porządek w typie jest zgodny z kolejnością wyliczenia w jego definicji. Wartości typu wyliczniowego wymienione kolejno w definicji typu mają liczby porządkowe równe odpowiednio 0, 1, 2 ... itd. Typy wykrojone: •Typ okrojony umożliwia ograniczenie zbioru wartości typu wyliczeniowego.
•Obie stałe muszą być tego samego typu porządkowego, zwanego typem pierwotnym. Pierwsza ze stałych, zwana ograniczeniem dolnym, nie może być większa niż druga stała (ograniczenie górne).
•Zmienna typu okrojonego ma wszystkie własności typu pierwotnego z jednym wyjątkiem - jej wartości należą do przedziału podanego w definicji typu okrojonego. Typy strukturalne: Są używane do opisu obiektów złożonych. Definiuje się je za pomocą istniejących w Pascalu schematów strukturalizacji. Ten sam obiekt (abstrakcyjny) często może być reprezentowany (opisany) w języku na kilka sposobów.
•Typ strukturalny jest definiowany przez podanie typów składowych i metody strukturalizacji, określającej jednocześnie mechanizm dostępu do składowych wartości strukturalnej. Dostęp ten jest realizowany za pomocą selektora.Typy tablice: •Tablica składa się z ustalonej liczby elementów tego samego typu zwanego typem składowym. Oznaczenie typu postaci
•zwana jest tablicą n-wymiarową;
•ma car(T1)*car(T2)*...*car(Tn) elementów typu T;
•wartości i1, i2, ..., in należące odpowiednio do typów indeksowych T1,T2,...,Tn będące selektorami, są zwane indeksami i wyznaczają jeden element tablicy;
•wartości indeksów są obliczane w chwili odwołania do tablicy; Rekordy: •Rekord składa się z ustalonej liczby składowych zwanych polami, które mogą być różnych typów. Definicja typu rekordowego specyfikuje dla każdego pola jego typ i identyfikator. Selektorem wybieranego pola w rekordzie jest identyfikator pola. Zbiory: •Typ zbiorowy jest zbiorem potęgowym typu podstawowego, tzn. jest zbiorem wszystkich podzbiorów. Wartości typu zbiorowego zapisuje się przez podanie listy elementów danego zbioru ujętej w nawiasy kwadratowe.
•Na wszystkich typach zbiorowych są określone operatory: Pliki: •Plik jest strukturą składającą się z ciągu elementów tego samego typu. Liczba elementów, zwana długością pliku, jest zmienna w trakcie wykonywania programu. W dowolnej chwili może być dostępny co najwyżej jeden element pliku. Pozostałe mogą być dostępne po wykonaniu odpowiedniej operacji na pliku. Do dostępnego elementu pliku odwołujemy się za pomocą zmiennej buforowej.
•Plik nie może zawierać innych plików.Typy wskaźnikowe: Typ wskaźnikowy jest zbiorem wartości zwanych wskaźnikami, wskazujących na zmienne typu wskazywanego (identyfikujących zmienne typu wskazywanego). Każdy typ wskaźnikowy zawiera ponadto tzw. wskaźnik pusty, oznaczany za pomocą stałej standardowej nil.
•Zbiór wartości typu wskaźnikowego zmienia się dynamicznie - wskaźniki mogą być tworzone i niszczone w trakcie wykonywania programu. Początkowo typ wskaźnikowy zawiera tylko wskaźnik pusty. Inne elementy tego typu, a także zmienne przez nie wskazywane mogą być utworzone za pomocą standardowej procedury new. Zgodność typów: •Mówimy, że dwa typy są zgodne jeżeli:-jeden z nich jest okrojonym typem drugiego albo oba są okrojonymi typami tego samego typu pierwotnego, lub
-oba są typami zbiorowymi o zgodnych typach podstawowych, lub
-oba sa typami napisowymi o tej samej liczbie składowych. Instrukcje iteracyjne: •Instrukcja iteracyjna powoduje wielokrotne wykonanie pewnej grupy instrukcji. Jeżeli liczba powtórzeń jest znana z góry w danym punkcie programu, to zwykle używa się postaci zwanej instrukcją "dla", a w przeciwnym razie instrukcji "dopóki" (gdy powtarzanie ma przebiegać aż do załamania się pewnego warunku, tj. do chwili gdy warunek osiągnie wartość false) lub instrukcji "powtarzaj" (gdy powtarzanie ma przebiegać aż do osiągnięcia pewnego warunku, tj. do chwili gdy warunek zmieni wartość na true). Procedury i funkcje: •Rozwiązując bardziej złożony problem wyodrębnia się zwykle pewne jego części, dla których formułuje się rozwiązania oddzielnie. Można przy tym albo najpierw rozwiązywać podproblemy, a następnie łączyć je w całości (podejście występujące, zwane też projektowaniem syntetycznym, ang. bottom-up), albo też od-wrotnie, tzn. formułować rozwiązanie całego zagadnienia w terminach nie rozpatrzonych jeszcze dotąd części, a dopiero później schodzić na niższy poziom szczegółowości (podejście zstępujące, zwane też projektowaniem analitycznym, ang. top-down). W programowaniu strukturalnym stosuje się zwykle to drugie podejście.
-Procedura a funkcja (procedury/funkcje standardowe)
-Wywołanie procedury/funkcji
-Parametry formalne i aktualne
-Typy parametrów
Obiekty globalne i lokalne Pliki Delphi: *.pas*.dfm*.dcu*.dpr*.cfg *.dof*.res ; Struktura modułu:Instrukcja unit Sekcja interface *Opisuje co w danym module „widzi” reszta aplikacji *Nie zwiera kodu wykonawczego lecz typy, stałe, zmienne, nagłówki procedur i funkcji, interfejsy klas Sekcja implementation*Fragment kodu wykonawczego całej aplikacji*Zmienne, typy, stałe, procedury i funkcje, klasy o zasięgu lokalnym Implementacje procedur, funkcji i metod klas Klauzula uses:* Informuje kompilator, że powinien dołączyć kod znajdujący się w modułach wymienionych w tej klauzuli *Może występować zarówno w części interfejsu jak i implementacji *Występuje natychmiast za słowami: interface i implementation *Jeśli dwa moduły odwołują się do siebie, to w celu uniknięcia błędu cyklicznych odwołań, M1 powinien odwoływać się do M2 w sekcji interfejsu, natomiast M2 do M1 - w sekcji implementacji Sekcja initialization: * Kod tej sekcji modułu jest uruchamiany przed pozostałą częścią modułu * Innymi słowy, jest on wykonywany w momencie ładowania modułu do pamięci operacyjnej * Typowo służy do inicjalizacji zmiennych (lokalnych, globalnych), w szczególności do tworzenia zmiennych dynamicznych (wskaźnikowych Sekcja finalization: * Zwykle ma sens tylko wtedy, gdy w module występuje również sekcja inicjalizacji * Stosowana do wykonywania kodu „porządkującego”, np. zwalniającego pamięć do przydzieloną do obiektów w sekcji inicjalizacji * Sekcje finalizacji wielu modułów są wykonywane w przeciwnej kolejności niż wcześniej wykonane sekcje finalizacji; Klasa: Klasa (term. nieobiektowa) składa się z danych i procedur Dane = pola Procedury = metody Dane + metody =atrybuty Podkreślenie różnicy między komponentami programu spoza klas Hermetyczność: ukrywanie zbędnych informacji: * Ukrywanie atrybutów, do których dostęp z zewnątrz jest niewskazany - ochrona przed niespodziewanymi efektami ubocznymi * Ułatwia to operowanie na skomplikowanych obiektach, np. kierowcy łatwiej prowadzi się auto, gdy nie zna szczegółów technicznych zapłonu, wspomagania kierownicy itp. Dostęp publiczny Jak terminal na lotnisku: każdy może wejść i wyjść; do samolotów jest jednak dostęp ograniczony * Domyślnie wszystkie atrybuty klasy są publiczne, o ile klasa lub jej przodek nie zostały skompilowane z dyrektywą $M+ * Można jawnie zadeklarować część klasy jako publiczną używając słowa kluczowego public * Atrybuty części publicznej tworzą interfejs (publiczny) klasy * Innymi słowy, w części publicznej - te atrybuty, które chcemy udostępnić innym * Choć pola mogą być publiczne - z różnych powodów nie powinniśmy ich udostępniać (dostęp do pól pośrednio przez metody). Dostęp prywatny: * Wszystkie atrybuty po słowie kluczowym private są chronione przed dostępem (wywołaniem) ; * Prywatne metody są metodami posiłkowymi w definicji innych metod (prywatnych i publicznych) * Metoda prywatna, której nie wywołuje (pośrednio lub bezpośrednio) żadna metoda publiczna nie ma sensu * Część prywatna zwana jest też szczegółami implementacji klasy * Części prywatne i publiczne mogą się przeplatać - wiele słów: public i private w definicji tej samej klasy Dostęp chroniony: Słowo kluczowe protected * W przypadku dostępu z zewnątrz klasy atrybut chroniony zachowuje się jak prywatny * W przypadku dostępu w klasach wywiedzionych atrybut chroniony zachowuje się jak publiczny * Atrybuty chronione udostępniamy innym projektantom w celu łatwej specjalizacji naszych klas, przy zachowaniu hermetyczności; Dostęp opublikowany: Ma sens tylko w przypadku narzędzi klasy RAD * Przypomina nieco dostęp publiczny lecz jest stosowany w przypadku atrybutów, które powinny być dostępne w fazie projektowej * Słowo kluczowe published * Rola specyfikatorów dostępu * Jeśli nie jest podana klasa macierzysta, każda klasa jest podklasą Tobject * Nowa klasa zawiera wszystkie cechy klasy macierzystej; nowe atrybuty dotyczą tylko klasy potomnej * Specyfikatory dostępu w superklasach ograniczają atrybuty, z których podklasy mogą bezpośrednio korzystać * Wyjątek: obydwie klasy zdefiniowane w tym samym module * Atrybuty chronione są dostępne w podklasach niezależnie od tego w jakich modułach występują klasy * Podklasa może przesłaniać metody publiczne i chronione (jeśli w różnych modułach) Przesłanianie a przeciążanie:* Jeśli jest możliwe wczesne wiązanie przez kompilator - wystarcza przesłanianie metod; przykład: Jeśli kompilator musi zastosować późne wiązanie jest konieczne przeciążanie (metody wirtualne); Dziedziczenie wielokrotne: * Delphi (podobnie jak Java) oferuje wyłącznie dziedziczenie pojedyncze * Inaczej jest w C++ i Eiffel
* Problemy z dziedziczeniem wielokrotnym: ten sam atrybut w dwóch superklasach * Delphi dopuszcza symulowanie dziedziczenia wielokrotnego (np. poprzez połączenie dziedziczenia jednokrotnego z kompozycją) Metody statyczne, wirtualne i dynamiczne: * Metody statyczne to takie, które zadeklarowano jako niewirtualne i niedynamiczne (metody statyczne nie mają nic wspólnego z metodami statycznymi - klasowymi - C++) * Metody wirtualne i dynamiczne (słowo kluczowe dynamic) w praktyce są identyczne * Wirtualne w VMT, dynamiczne w DMT * Metody wirtualne są optymalizowane pod kątem szybkości, natomiast dynamiczne - pod kątem rozmiaru Komponenty: * Wszystkie komponenty Delphi wywodzą się z klasy Tpersistent * Klasa opisuje w jaki sposób powinno być realizowane przypisanie obiektu (np.. Przycisku do formy) oraz powoduje, że trwałe obiekty (ang. persistent) mogą odczytywać i zapisywać wzajemnie swoje elementy * Trwałość jest najczęściej odwzorowywana w postaci pliku zasobów Windows Poddrzewo TPersistent: * Metoda GetOwner zwraca odwołanie do obiektu podkalsy TPersistent, który jest uznawany za właściciela obiektu * Aby nazwy komponentów pojawiały się w Object Inspektorze każdy z nich ma zdefiniowaną metodę GetNamePath. Określa ona sposób w jaki jest on reprezentowany w tym oknie i gwarantuje dostępność tego obiektu w fazie projektowania * Istnieją dwie metody wirtualne Assign i AssignTo wskazujące, ze komponent ma cechę przypisywalności * Komponenty najczęściej zawierają wiele właściwości i kilka obiektów * Metoda DefineProperties jest przeznaczona do wykorzystania z obiektem Tfilter i słuzy do odczytywania oraz zapisywania właściwości do i z plików .dfm
* Obejrzenie formularza w postaci tekstu jest możliwe właśnie dzięki tej metodzie Klasa TControl: * Większość komponentów biblioteki VCL jest niewizualna (w czasie wykonywania nie sa widoczne na ekranie; można nimi manipulować w fazie projektowej) * Tcontrol wprowadza atrybuty, którymi można manipulować w czasie wykonania, wpływające na wygląd kontrolek: Cursor, Top, Left, Height, Width * Tcontrol zarządza pewnym prostokąrnym obszarem eklranu, w którym jest umieszczony obraz kontrolki, oraz obszarem klienckim, który może być modyfikowany przez wartości danych (np Klasa Tapplication * Bezpośredni potomek klasy TComponent - każda tradycyjna aplikacja Delphi jest zamknięta (encapsulated) w jednym obiekcie tej klasy, który zawiera główny uchwyt Windows tej aplikacji * Obiekt ten jest tworzony automatycznie* Zawiera on także odwołanie do głównego formularza aplikacji, pliku pomocy oraz tytułu aplikacji * Można tworzyć w pełni funkcjonalną aplikację, która nie obsługuje zdarzeń, jednak w pewnych sytuacjach zdarzenia umożliwiają „dostrojenie” programu