Delphi 5 Professional Object Pascal 2JWELRNNUX4EBUSHSOSQ456MEMWXH3OPHJP3BRY


Trzy cechy programowania zorientowanego obiektowo:

Hermetyczność - oznacza, że struktury danych i kody programowe są połączone w całościową jednostkę programową, zwaną obiektem. Ogólnie dostępne struktury danych w obiekcie nazywa się własnościami, a ogólnie dostępne kody programowe - metodami. Obiekt może posiąść metody i dane innego obiektu, ale metody jednego obiektu nie mają bezpośredniego dostępu do danych innego obiektu!

Dziedziczność - umożliwia programiście definiowanie potomków istniejących obiektów. Ponieważ potomek dziedziczy własności i metody po swoim przodku - programista koncentruje się jedynie na określeniu różnic w odniesieniu do przodka.

Polimorfizm - umożliwia tworzenie w obiektach potomnych metod o takich samych nazwach, jak w obiektach nadrzędnych, ale wykonujących różne czynności, dzięki czemu programista może „nakazać” obiektowi wykonać określoną metodę, bez wnikania w wewnętrzne szczegóły dotyczące rodzaju danego obiektu.

FORMATKA - jest to okienko, na którym w procesie tworzenia programu, można umieszczać różne komponenty ( inne elementy graficzne), związany jest z nią pewien moduł programowy.

KOMPONENT - jest to element łącza użytkownika (widoczny lub nie, w postaci małych piktogramów) umieszczany na formatce (lub z nią powiązany) i jest reprezentowany przez obiekt programowy

KOMPONENTY WIDOCZNE: wyglądają na formatce tak samo w fazie projektowania jak i po uruchomieniu programu

PRZYKŁADY: Button, Edit, Memo

KOMPONENTY NIEWIDOCZNE: są zaznaczone na formatce jedynie przez mały kwadratowy piktogram, który podczas wykonywania programu nie pojawia się, ale można wywołać zdarzenia z nim związane (lub np.: otworzyć jakieś okno).

PRZYKŁADY: OpenDialog, SaveDialog, DataSource.

Program TEKSTOWY i OKIENKOWY w języku Object Pascal - struktura ogólna:

Dyrektywa $APPTYPE służy do określenia jednego z dwu rodzajów programu: tekstowego (za pomocą parametru CONSOLE) lub graficznego (za pomocą parametru GUI - skr. ang. graphical user interface). W przypadku uruchomienia programu określonego jako tekstowy, w środowisku Windows zostanie otwarte symulowane okienko tekstowe, poprzez które użytkownik będzie mógł komunikować się z programem. Drugi parametr (GUI) określa zwykły program okienkowy przeznaczony dla środowiska Windows.

Ustalenie domyślne: {$APPTYPE GUI}

Zakres dyrektywy: globalny

Zastosowanie dyrektywy $APPTYPE jest ograniczone do programów. Nie powinna ona być używana w modułach i bibliotekach łączonych dynamicznie

TYPY

Typy podstawowe - postacie i zakresy wartości typów podstawowych są niezależne od procesora i systemu operacyjnego, co oznacza, że nie zmieniają się one przy różnych implementacjach języka.

Typy ogólne - zależą od procesora i systemu operacyjnego.

Typy standardowe - są predefiniowane i nie wymagają żadnego opisu.

Typy niestandardowe - wymagają opisu przez programistę.

type sekwencja-definicji-typów

przy czym każdy element sekwencji-definicji-typów ma postać

identyfikator-typu = oznaczenie-typu;

gdzie oznaczenie typu jest opisem typu wyliczeniowego, okrojonego, łańcuchowego, tablicowego, rekordowego, zbiorowego, plikowego, klasowego, odwołania do klasy, wskaźnikowego, proceduralnego, łącza programowego lub identyfikatorem typu.

Typy proste - za ich pomocą określamy bardziej złożone struktury danych.

1.Typy porządkowe - z każdą wartością typu porządkowego jest skojarzona liczba porządkowa(0,1,2...) jednoznacznie określająca umiejscowienie wśród wszystkich wartości danego typu.

a. Typy wyliczeniowe - stosuje się zwykle dla zbiorów o niewielkiej liczbie elementów, na których nie wykonuje się operacji arytmetycznych.

type identyfikator-typu = (lista-identyfikatorów);

W liście identyfikatorów specyfikuje się identyfikatory (nazwy), które tworzą zbiór wartości danego typu wyliczeniowego. Należy przy tym pamiętać, że ten sam identyfikator nie może być użyty do oznaczenia wartości w dwu różnych typach wyliczeniowych, których zakresy pokrywają się, oraz że w obrębie danego typu identyfikatory elementów muszą być różne.

Np. type tydzień = (poniedzialek, wtorek, środa, czwartek, piatek, sobota, niedziela);

b. Typy całkowite - są predefiniowane i nie wymagają opisu w programie. Wszystkie typy całkowite są podzbiorem zbioru liczb całkowitych. Liczba porządkowa elementu dowolnego typu całkowitego jest równa wartości tego elementu.

Podstawowe:

Shortint - liczby całkowite z przedziału od -27 do 27-1.

Smallint - od -215 do 215-1.

Longint - od -231 do 231-1

Int64 - od -263 do 263-1

Byte - od 0 do 28-1

Word - od 0 do 216-1

Longword - od 0 do 232-1

Ogólne:

Integer - w obecnej (32 bitowej) implementacji języka Object Pascal równe co do wartości typu Longint.

Cardinal - równy Longword.

c. Typy znakowe - każdy z typów oznacza się za pomocą predefiniowanego identyfikatora.

Podstawowe:

AnsiChar - znaki zajmujące 1 bajt pamięci, uporządkowane zgodnie z tabelą rozszerzonego zestawu znaków ASCII.

WideChar - znaki zajmujące 2 bajty pamięci i są znakami uporządkowanymi zgodnie z zestawem znaków Unicode.

Ogólny:

Char - równy AnsiChar.

c. Typy logiczne - wartości są oznaczone za pomocą dwu predefiniowanych stałych: False i True. Liczbami porządkowymi elementów typu Boolean są 0 (False) i 1 (True). Wartością wyrażeń pozostałych typów jest False, jeśli liczba porządkowa jest równa 0, a gdy różna od zera, przyjmuje się, że jest True.

Boolean - 1 bajt pamięci

ByteBool - 1 bajt pamięci

WordBool - 2 bajty (słowo)

LongBool - 4 bajty (2 słowa)

d. Typy okrojone - służą do ograniczenia zakresów wartości typów porządkowych.

type identyfikator-typu = stała-1 .. stała-2;

gdzie stała oznacza liczbę całkowitą, literał znakowy, literał logiczny, nazwę literału, identyfikator ze zbioru wartości typu wyliczeniowego lub wyrażenie stałe, przy czym obie stałe muszą być tego samego typu porządkowego, zwanego typem bazowym. Pierwsza z nich podaje ograniczenie dolne i nie może być większa od drugiej - ograniczenia górnego. Pierwsze wyrażenie stałe nie może rozpoczynać się od nawiasu okrągłego otwierającego, tj. od znaku (.

Np. type zakres= 0..98; - zakres stanowi podzbiór typu całkowitego Byte.

2. Typy rzeczywiste - każdy z dostępnych typów rzeczywistych jest dyskretnym i skończonym podzbiorem zbioru liczb rzeczywistych.

Podstawowe:

Real48 - typ rzeczywisty, którego elementy zajmują po 6 bajtów pamięci.

Single - typ rzeczywisty o pojedynczej długości, którego elementy zajmują 4 bajty pamięci każdy.

Double - typ rzeczywisty o podwójnej długości, którego elementy zajmują 8 bajty pamięci każdy.

Extended - typ rzeczywisty o rozszerzonej długości, w którym każdy element zajmuje 10 bajtów pamięci.

Comp - elementy są liczbami całkowitymi z przedziału -263 do 263-1, zajmującymi po 8 bajtów pamięci.

Currency - jest typem danych stałoprzecinkowych przeznaczonych do obliczeń pieniężnych pieniężnych wartościach od -922 337 203 685 477.5808 do 922 337 203 685 477.5807, zajmujących po 8 bajtów.

Ogólny:

Real - Redl bieżącej 32 bitowej implementacji języka, jest równoważny z typem Double.

Typy łańcuchowe

Łańcuchy - służą do reprezentowania ciągu znaków, w tym niewidocznego znaku spacji (odstępu).

1. Typ łańcuchowy krótki - jest predefiniowany w module System. Elementami typu ShortString są łańcuchy krótkie o maksymalnej długości 255 znaków, typ określany przez słowo kluczowe string przy wyłączonej dyrektywie kompilatora $H ( w stanie {$H-} ).

2. Typ łańcuchowy długi - jest predefiniowany w module System, w domyślnym stanie {$H+} typ ten może być ozn. za pomocą słowa kluczowego string, bez względu na stan dyrektywy kompilatora $H - za pomocą predefiniowanego identyfikatora AnsiString. Elementami tego typu są łańcuchy długie (teoretycznie do 2 GB).

3. Łańcuchy znaków dwubajtowych - do reprezentowania łańcuchów złożonych ze znaków zestawu Unicode (łańcuchy znaków 2 bajtowych) służy predefiniowany typ WideString. Zmienne typu WideString zajmują jednak cztery bajty pamięci i zawierają wskaźnik do dynamicznie przydzielonego obszaru pamięci. Wartość takiej zmiennej równa nil oznacza, że łańcuch jest pusty, a wartość różna od nil wskazuje na blok pamięci, począwszy od którego rozpoczyna się łańcuch znaków dwubajtowych zakończony znakiem pustym.

Typy strukturalne - do opisu obiektów złożonych

type identyfikator-typu = opis-typu-strukturalnego

przy czym opis typu strukturalnego może być opisem typu tablicowego, rekordowego, zbiorowego, plikowego, klasowego, odwołanie do klasy lub opisem lub opisem łącza programowego odnośnie do różnych struktur występujących w języku Object Pascal. Opis dowolnego typu strukturalnego może zaczynać się od słowa kluczowego packed. Jego użycie jest wskazówką dla kompilatora, aby wybrał reprezentację danej struktury zajmującą możliwie jak najmniej bajtów pamięci (postać spakowana).

1. Typy tablicowe

Tablica - reprezentuje indeksowany zbiór elementów tego samego typu.

a. Tablica statyczna - składa się z ustalonej liczby elementów tego samego typu, zwanego typem składowym, który może być zarówno typem prostym, łańcuchowym jak i strukturalnym. Za pomocą tablic są reprezentowane regularne układy danych, np. wektory i macierze. Dostęp do poszczególnych elementów tablic uzyskujemy za pomocą indeksowania.

type identyfikator-typu = array [typy-indeksowe] of typ-składowy

gdzie typy indeksowe są opisami typu porządkowego, przy czym poszczególne opisy oddziela się przecinkami. Typ składowy ozn. dowolny typ.

Np. Tablica jednowymiarowa:

type wektor = array [0..50] of Integer

Tablica dwuwymiarowa :

type macierz = array [1..20] of array [1..30] of Extended;

type macierz = array [1..20, 1..30] of Extended;

b. Tablica dynamiczna -opis typu tablicowego (w definicji typu lub deklaracji zmiennej), który nie zawiera określenia typów indeksowych. Deklaracja zmiennej typu tablicy dynamicznej powoduje przydzielenie jej tylko 4 bajtów pamięci. Przydzielenie pamięci tablicy dynamicznej następuje przez wywołanie procedury standardowej SetLength, a zwolnienie przez wywołanie dla niej procedury Finalize.

type identyfikator-typu = array of typ-składow

gdzie typ składowy oznacza dowolny typ.

2. Typy rekordowe

Rekordem - nazywa się złożoną strukturę danych, której pola mogą należeć do różnych typów. Poszczególne pola mogą być same strukturami złożonymi, przy czym liczba pól rekordu jest ustalona.

type identyfikator-typu = record

lista-deklaracji-pól

end;

gdzie każda z deklaracji pól ma postać

lista-nazw-pól : opis typu;

a ostatnia deklaracja może być wariantowa i mieć postać

case deklaracja-pola-wyróżnikowego of wykaz-wariantów;

lub

case identyfikator-typu-porządkowego of wykaz-wariantów;

przy czym deklaracja pola wyróżnikowego wygląda następująco:

identyfikator-pola-wyróżnikowego:identyfikator-typu-porządkowego

a każdy element wykazu-wariantów ma postać

lista-etykiet-wyboru : (lista-deklaracji-pól)

Średniki występujące na końcach powyższych elementów definicji mogą być pominięte, jeśli następnym elementem konstrukcji jest słowo kluczowe end.

Np. type data = record

rok : Smallint;

miesiac: 1..12;

dzien : 1..31

end;

3. Typy zbiorowe - każdy typ zbiorowy jest zbiorem potęgowym danego typu porządkowego.

type identyfikator-typu = set of typ-porządkowy;

Liczba elementów typu porządkowego nie może przekraczać 256, przy czym ich liczby porządkowe muszą należeć do przedziału [0,255]. Oznacza to, że spośród standardowych typów całkowitych jest dozwolone tu wyspecyfikowanie tylko typu Byte. Na ogół typ porządkowy, będący typem bazowym jest określany jako typ wyliczeniowy lub okrojony. Wartości typu zbiorowego zapisuje się przez podanie w nawiasach kwadratowych listy elementów danego zbioru, przy czym poszczególne elementy tej listy oddziela się przecinkami, a zapis [ ] oznacza zbiór pusty. Zapis taki nazywamy konstruktorem zbioru.

Np. type znaki = set of Char

male_litery = set of `a'..`z';

4. Typy plikowe

type identyfikator-typu = file of opis-typu-elementów-pliku;

Typ taki reprezentuje fizyczny zbiór danych o dostępie sekwencyjnym. Opis typu elementów pliku oznacza w ogólności identyfikator typu prostego, opis typu porządkowego, typ łańcuchowy, krótki lub opis typu strukturalnego. Bezpośrednie podanie, w opisie typu elementów pliku, opisu typu tablicy dynamicznej, identyfikatora typu łańcuchowego długiego, identyfikatora typu wskaźnikowego, opisu typu klasowego, opisu typu wariantowego, opisu typu plikowego lub opisu struktury o takich elementach nie jest dozwolone. Opis typu plikowego może składać się z samego słowa kluczowego file (z pominięciem słowa kluczowego of i opisu typu elementów pliku). W takim przypadku przyjmuje się, że dany typ plikowy jest niezdefiniowany. Niezdefiniowane pliki są stosowane głownie w celu dostępu do fizycznych zbiorów dyskowych bez względu na ich wewnętrzny format. Pliki tekstowe posiadają predefiniowany identyfikator Test (jego synonimem jest TextFile).

Np. type dane = file of Longint;

wyniki = file of Extended;

Typy opisujące obiekty

1. Typ klasowy - Struktura składająca się z pól, metod i własności. Definicja pojedynczego typu klasowego ma postać:

type identyfikator-typu = class (przodek)

lista-elementów-klasy

end;

gdzie opcjalny element przodek oznacza identyfikator innego, zdefiniowanego wcześniej typu klasowego. Jeśli w definicji typu klasowego wystąpi ten element, oznacza to, że dany typ klasowy zawiera (dziedziczy) wszystkie elementy podane w definicji typu klasowego o wyspecyfikowanej nazwie. Typem klasowym pierwotnym, nadrzędnym w stosunku do wszystkich typów klasowych, jest typ TObject predefiniowany w module System. Gdy w definicji typu klasowego nie określono przodka, to domyślnie przyjmuje się, że przodkiem jest właśnie ten typ. W typie TObject są zdefiniowane metody, które stosują się do wszystkich klas. Lista elementów klasy składa się z deklaracji pól, deklaracji metod i deklaracji własności.

Deklaracja własności:

property nazwa-własności łącze-własności specyfikatory własności;

lub ( w przypadku pokrywania własności)

property nazwa-własności specyfikatory-własności;

Specyfikatory dostępności:

Published- są generowane informacje o typach obowiązujących podczas wykonywania programu (ang. runtime type information). Informacje te są wykorzystywane m. in. przez środowisko Delphi do dostępu do własności podczas zapisywania i odczytywania zbiorów z graficznymi obrazami formatek (zbiorów DFM), wyświetlania własności w okienku Object Inspector oraz do dostępu do metod obsługujących zdarzenia.

Public- Elementy zdefiniowane w sekcji public nie mają żadnych ograniczeń dostępności (poza ogólnymi regułami dostępności do pól, metod i własności).

Protected- Elementy zdefiniowane w sekcji protected są dostępne tylko w ramach danej klasy i klas z niej wyprowadzonych w bieżącym module. Metody obsługujące wiadomości mogą być deklarowane tylko w sekcji protected.

Private - Elementy zdefiniowane w sekcji private są dostępne tylko w bieżącym module (ale nie tylko w ramach klasy, w której zostały zdefiniowane i w ramach potomków tej klasy).

Automated - powoduje generowanie informacji o typach automatyzacyjnych dla metod i własności. Informacje te umożliwiają tworzenie serwerów automatyzacji OLE.

Np. type klasa = class(TObject)

Polel :integer

Pole2: array[1..20] of string

procedure metoda l (parametr l :word; parametr2:string);

function metoda2 (parametr:integer):Boolean

end;

Typy klasowe można zdefiniować w części opisowej programu, modułu lub bibliotek DLL.

Typy wskaźnikowe

1. Typ standardowy Pointer (typ wskaźnikowy predefiniowany w module System. Elementy tego typu (zmienne) nie wskazują danych żadnego określonego typu, a odwołanie za ich pomocą przy użyciu symbolu ^ powoduje błąd. Są one jednakże zgodne z dowolnym innym typem wskaźnikowym. Elementy typu Pointer są pamiętane w podwójnym słowie jako 32-bitowy adres) lub typ zdefiniowany za pomocą konstrukcji:

type identyfikator-typu = ^identyfikator-typu-bazowego;

gdzie identyfikator typu bazowego określa typ, którego dane będą wskazywane przez zmienne definiowanego typu wskaźnikowego. Identyfikator ten może, ale nie musi, być wcześniej określony. W drugim przypadku konieczne jest jego określenie w tej samej części definiującej typy (w tej samej konstrukcji type), w której występuje definicja odnośnego typu wskaźnikowego.

Np. type Wskaznik = ^zapis;

Zapis = record

naglowek : Char;

tekst : string [50];

liczba : Integer

end;

Definicja ta wiąże typ wskaznik ze zbiorem wskazań danych typu zapis. Jeśli wprowadzimy deklarację

var adres : wskaznik; to zmiennej wskaźnikowej adres mogą być przypisywane adresy pamięci danych typu zapis.

Typy proceduralne

1. Ogólne typy procedurale - definiujemy za pomocą jednej z następujących konstrukcji:

type identyfikator-typu = procedure;

type identyfikator-typu = procedure (lista-parametrów);

type identyfikator-typu = function : typ-wartości-funkcji;

type identyfikator-typu = function (lista-parametrów) : typ-wartości-funkcji;

przy czym dwa pierwsze opisy dotyczą typu proceduralnego, którego elementami są wskaź­niki do punktów wejścia do procedur (bezparametrowe lub z listą parametrów), a dwa ostat­nie - typu proceduralnego, którego elementami są wskaźniki do punktów wejścia do funk­cji. Zmiennym tych typów przypisuje się identyfikatory odpowiednio procedur i funkcji. Każda z powyższych definicji może dodatkowo kończyć się jedną z dyrektyw języka register, pascal, cdecl, stdcall lub safecall, określającą tzw. konwencję wywołania. W przypadku wystąpienia którejś z tych dyrektyw poprzednia część definicji nie musi (ale może) być zakończona średnikiem. Jeśli nic wyspecyfikowano żadnej z dyrektyw konwen­cji wywołania, to domyślnie przyjmuje się dyrektywę register. Konwencie wywołania określają sposób przekazywania parametrów.

2. Obiektowe typy proceduralne - określają metody

W definicji takich typów występują dodatkowo słowa kluczowe of object. Definicja pojedynczego obiektowego typu ma jedną z następujących postaci:

type identyfikator-typu = procedure of object;

type identyfikator-typu = procedure (lista-parametrów) of object;

type identyfikator-typu = function : typ-wartości-funkcji of object;

type identyfikator-typu = function (lista parametrów): typ-wartości-funkcji of object;

Każda z powyższych definicji może być dodatkowo zakończona dyrektywą języka okreś­lającą konwencją wywołania. Elementy obiektowych typów proceduralnych zapamiętane jako dwa wskaźniki: pierw­szy jest wskaźnikiem punktu wejścia do metody, a drugi określa obiekt, do którego dana metoda należy. Zmiennym tych typów przypisuje się desygnatory metod.

Np. type metoda_proc = procedure (parametr: TObject) of object;

metoda_fun = function (parametr: Single) : Boolean of object pascal;

ZMIENNE

Sposób deklaracji parametrów przekazywanych przez stałe nieokreślonego typu:

const lista_parametrów

ZASTOSOWANIE:

Argumenty im odpowiadające mogą być literałami lub zmiennymi dowolnych typów. Parametry te mogą być w treści procedury, funkcji czy metody tylko „odczytywane”.

Sposób deklaracji parametrów przekazywanych przez zmienne nieokreślonego typu:

var lista_parametrów

ZASTOSOWANIE:

Służy do konstrukcji procedur, funkcji i metod przetwarzających struktury danych podobne, ale o różnych rozmiarach. Argumenty im odpowiadające mogą być literałami lub zmiennymi dowolnych typów. Parametry przez nie przekazywane mogą być modyfikowane w dowolny sposób.

Różnice między parametrami przekazywanymi przez stałe i zmienne nieokreślonego typu a parametrami otwartymi:

Argumentami parametrów nieokreślonego typu są stałe lub zmienne dowolnego typu, natomiast argumentami parametrów otwartych są tablice, łańcuchy dowolnej wielkości określonego typu.

Parametry przekazywane przez WARTOśCI: - jest to parametr formalny, o deklaracji:

parametr : typ lub lista_parametrów : typ (w przypadku deklarowania kilku parametrów)

Parametry przekazywane przez STAŁE OKREŚLONEGO TYPU: - jest to parametr formalny, który w treści procedury, metody lub funkcji jest traktowany jako zmienna lokalna, przeznaczona tylko do odczytu. Sposób deklaracji:

const lista_parametrów : typ

ZASTOSOWANIE:

Stosuje się do zaprogramowania elementów przekazywanych z zewnątrz, które w treści procedury nie zmieniają wartości.

Różnice między param.przekazyw.przez WARTOŚĆ i STAŁE OKREŚLONEGO TYPU:

- różnica poza deklaracją jest taka, że parametry przekazywane przez stałą są tylko do odczytu, natomiast parametry przekazywane przez wartość są dostępne.

PARAMETRY OTWARTE:

- umożliwiają przekazywanie do tej samej procedury, funkcji lub metody tablic lub łańcuchów rozmiarach różnych rozmiarach ( parametr otwarty tablicowy lub łańcuchowy).

DEKLARACJA:

var parametr: array of identyfikator_typu

lub

const parametr: array of identyfikator_typu

lub

parametr: array of identyfikator_typu

WYRAŻENIE jest zapisem algorytmu określającego sposób obliczania pewnej wartości i składa się operatorów sensownej kombinacji operatorów i argumentów (=operandów), które same mogą być wyrażeniami. Wyrażenie nie stanowi samoistnej instrukcji języka Object Pascal, a jedynie jest jej częścią składową.

WYRAŻENIE - wyrażenie proste lub połączenie dwóch wyrażeń prostych za pomocą operatora relacyjnego. Służy do obliczenia pewnej wartości.

Wyrażenie proste: składnik lub połączenie większej liczby składników operatorem addytywnym (+,-,or,xor)

Składnik: część wyrażenia, która jest czynnikiem lub połączeniem większej liczby czynników operatorem multiplikatywnym (*,/,div, mod, and, shl, shr, as)

Czynnik: część wyrażenia, która może być:

- odwołaniem do zmiennej;

- odwołaniem do zmiennej poprzedzonej operatorem@;

-nazwą funkcji poprzedzonej@;

-nazwą procedury poprzedzonej@;

-nazwą kwalifikowaną metody poprzedzonej@;

-stałą bez znaku;

-wywołaniem funkcji;

-konstruktorem zbioru lub konstrukcja powodującą zmianę typu wyrażenia.

Czynnikiem są wszystkie powyższe elementy poprzedzone znakiem +(plus) ,- (minus) , not, a także dowolne wyrażenie ujęte w nawiasy okrągłe. Każdy element wyrażenia jest albo samym elementem stopnia niższego ( np.: dla składnika jest to czynnik), albo połączeniem tych elementów odpowiednimi operatorami ( np.: dla składnika jest to operator multiplikacyjny).

Konkatencja:

Do połączenia dwu lub więcej łańcuchów w jeden łańcuch służy operator konkatenacji, zapisywany za pomocą znaku + (plus). Ar­gumenty typu łańcuchowego, znakowego lub upakowanego typu łańcuchowego połączone tym operatorem tworzą wyrażenie konka­tenacji. Wynik jest zgodny z każdym typem łańcuchowym (ale nie z typem Char oraz upakowanym typem łańcuchowym). Typ wyniku zależy przy tym od typu operandów. Jeżeli oba operandy są łańcuchami krótkimi a wynik ich połączenia jest łańcuchem zawierającym więcej niż 255 znaków, to łańcuch wynikowy zo­stanie obcięty po 255 znaku. Jeśli któryś z operandów jest łańcuchem długim, to wynik jest też łańcuchem tego typu. Jeśli jednak jeden z operandów jest łańcu­chem typu WideString, to drugi operand musi być albo łańcuchem tego sa­mego typu lub łańcuchem długim.

Operatory odwołań do klas i obiektów:

IS - służy do sprawdzenia typu zmiennej typu klasowego podczas wykonywania programu ( tzn. określa czy aktualna wartość zmiennej jest obiektem określonego typu klasowego.

POSTAĆ WYRAŻENIA Z OPERATOREM IS:

zmienna_typu_klasowego is odwolanie_do_klasy

Odwołanie do klasy oznacza identyfikator klasy, lub zmienną typu odwołania do klasy. Wartością tego wyrażenia jest wartość logiczna TRUE, jeśli podana zmienna jest typu klasowego, określonego przez odwołanie do klasy lub typu potomnego. W przeciwnym przypadku, wartością wyrażenia jest FALSE (występuje zawsze, gdy wartością zmiennej jest adres pusty).

AS - służy do zmiany typu zmiennej typu klasowego w wyrażeniu.

POSTAĆ WYRAŻENIA Z OPERATOREM AS:

zmienna_typu_klasowego as odwolanie_do_klasy

Odwołanie do klasy oznacza identyfikator klasy lub zmienną typu odwołania do klasy. Wyrażenie to zmienia typ podanej zmiennej na typ określony drugim argumentem, przy czym zmienna ta dalej będzie wskazywała na ten sam obiekt w pamięci. Zmienna powinna wskazywać na obiekt typu zdefiniowanego przez podane odwołanie do klasy, lub na obiekt potomny, lub mieć wartość nil.

Wyrażenie stałe jest to wyrażenie, które może być obli­czone przez kompilator. Wyrażenie takie nie może zawierać zmiennych, literałów zmiennych, wskaźników, wywołań funk­cji (z wyjątkiem funkcji wymienionych poniżej) oraz operatora adresowego @. W wyrażeniach stałych dozwolone jest stosowanie następujących funkcji standardowych:

Abs Exp Length Ord Sqr

Addr Frac Ln Pred Sqrt

ArcTan Hi Lo Round Succ

Chr High Low Sin Swap

Cos Int Odd SizeOf Trunc

Zmiana typu wyrażenia:

Konstrukcja języka postaci:

identyfikator-typu (wyrażenie)

przy czym typ wyrażenia i typ podany za pomocą identyfikatora typu muszą być jednocześnie albo typami porządkowymi, albo typami wskaźnikowymi. W przypadku typów porządkowych wartość wyrażenia jest przekształcana na typ o podanym identyfikatorze, z ewentualnym obcięciem lub rozszerzeniem (przy niezgodnych rozmiarach typu wyrażenia i typu podanego w powyższej konstrukcji). W przypadku rozszerzenia znak wartości jest zawsze zachowywany. Konstrukcja ta nie może występować w odwołaniach do zmiennych oraz z lewej strony w instrukcji przypisania.

Np. Integer('A')

Konstrukcja ta spowoduje zinterpretowanie wewnętrznego przedstawienia znaku A, tj, ciągu

01000001, jako liczby typu Integer. Wartością powyższego wyrażenia będzie zatem 65.

INSTRUKCJE : Element języka opisujący czynności wykonane na danych.

1. Prosta : Rodzaj instrukcji, w których skład nie wchodzą inne instrukcje.

a. Przypisania - służy doi przypisania zmiennej nowej wartości lub do przypisania wartości funkcji. Jej ogólna postać jest następująca:

odwołanie-do-zmiennej:=wyrażenie

nazwa funkcji:=wyrażenie

Result:=wyrażenie

gdzie Result ozn. predefiniowany identyfikator, lokalny w każdej funkcji.

b. Skoku: jej stosowanie nie jest zalecane. Jej używanie zmniejsza bowiem przejrzystość programu, ogranicza optymalizację kodu wynikowego wykonywaną przez kompilator i utrudnia dowodzenie poprawności programu, modułu czy biblioteki DLL. Instrukcja ta może być zawsze zastąpiona instrukcją "dopóki" lub instrukcją "powtarzaj". Instrukcja skoku ma postać

goto etykieta

i powoduje przekazanie sterowania, tj. przejście, do instrukcji programu poprzedzonej podaną etykietą, przy czym instrukcja ta może występować przed lub po odnośnej instrukcji skoku. Obowiązuje przy tym zasada, że instrukcja poprzedzona etykietą musi występować w tym samym bloku, co instrukcja skoku z tą etykietą (nie jest dozwolony skok do wnętrza i na zewnątrz procedury, funkcji lub metody). Ponadto skok do wnętrza instrukcji strukturalnej, choć dozwolony (kompilator nie wykaże błędu), może mieć nieokreślone skutki.

c. Pusta: nie wymaga użycia żadnego symbolu języka i nie powoduje wykonania żadnych czynności. Instrukcję tę stosuje się w tych kontekstach, w których jest wymagane użycie instrukcji, ale chce się uniknąć wykonywania jakichkolwiek czynności.

2. Instrukcje strukturalne - zbudowana na podstawie pewnego schematu strukturalizacji kilku instrukcji.

a. Złożona: jest ciągiem instrukcji poprzedzonym słowem kluczowym begin i zakończonym słowem kluczowym end. Instrukcja ta tworzy z ciągu instrukcji jedną i używana jest w przypadku, gdy składnia języka wymaga użycia jednej instrukcji., a niezbędne jest wykonanie wielu. Instrukcje wchodzące w skład instrukcji złożonej są wykonywane sekwencyjnie. Struktura instrukcji złożonej jest następująca:

begin

instrukcja-1;

instrukcja-2;

...

instrukcja-n

end

Np. begin

a:=1;

b.c:=2;

d[1,2]:=3

end

b) Warunkowa: uzależnia wykonanie innych instrukcji od spełnienia określonego warunku.

Wyróżniamy dwie instrukcje warunkowe:

instrukcję "jeśli" - uzależnia wykonanie innej lub innych instrukcji od spełnienia lub niespełnienia podanego warunku. Ogólną postać instrukcji "jeśli" jest następująca:

if wyrażenie

then instrukcja

lub

if wyrażenie

then instrukcja

else instrukcja

przy czym wartością podanego wyrażenia powinna być wartość logiczna True lub False Instrukcja występująca po słowie kluczowym then lub else może być dowolną instrukcją prostą, strukturalną lub instrukcją asemblerową. Jeśli wartością wyspecyfikowanego wyrażenia jest wartość logiczna True, to zostanie wykonana instrukcja podana po słowie then. W przeciwnym przypadku wykonana będzie następna instrukcja po instrukcji "jeśli" (gdy brak jednostki else) lub instrukcja podana po słowie else. Instrukcje "jeśli" mogą być zagnieżdżone. Z zagnieżdżoną instrukcją "jeśli" mamy do czynienia wówczas, gdy po słowach then lub else występuje znowu instrukcja "jeśli", która z kolei może zawierać następną instrukcję tego typu itd. W zagnieżdżonych instrukcjach "jeśli" obowiązuje zasada, że każda jednostka else jest przyporządkowana najbliższej poprzedzającej ją jednostce then, dla której nie wystąpiła jeszcze jednostka else. Wynika stąd, że jednostkę else można opuszczać tylko w przypadku, gdy jest ona opuszczona dla wszystkich poprzedzających jednostek then. W celu uniknięcia błędnego przyporządkowania jednostek zagnieżdżonej instrukcji "jeśli", zaleca się pisać słowo else pod odpowiadającym mu słowem then.

c. Instrukcję wyboru - wykonanie instrukcji wchodzących w jej skład jest uzależnione od wartości pewnej zmiennej (ogólniej: wyrażenia). Instrukcja wyboru może mieć postać:

case wyrażenie of

sekwencja-instrukcji-wyboru

end

lub

case wyrażenie of

sekwencja-instrukcji-wyboru

else instrukcja

end

gdzie wartość wyrażenia występującego po słowie kluczowym case, zwanego selektorem, musi być typu porządkowego. Sekwencja instrukcji wyboru składa się z instrukcji, przy czym każda z nich jest poprzedzona jedną lub kilkoma stałymi, zwanymi stałymi wyboru, które od instrukcji są oddzielone dwukropkiem. Każda z sekwencji instrukcji wyboru oraz instrukcja występująca po słowie kluczowym else może być dowolną instrukcją prostą, strukturalną lub asemblerową. Jeśli w instrukcji wyboru występuje jednostka else, to ostatnia instrukcja sekwencji instrukcji wyboru musi być zakończona średnikiem.

Działanie instrukcji wyboru jest następujące: najpierw jest obliczana wartość selektora, po czym w sekwencji instrukcji wyboru jest odszukiwana pierwsza instrukcja poprzedzona stałą wyboru równą obliczonej wartości selektora (instrukcji poprzedzonych taką samą stalą wyboru może być więcej - kompilator nie wykaże błędu). Jeśli taka instrukcja znajduje się w sekwencji instrukcji wyboru, to zostanie ona wykonana, a następnie sterowanie zostanie przekazane do instrukcji występującej po słowie end kończącym instrukcję wyboru. Jeśli żadna ze stałych wyboru nie jest równa obliczonej wartości selektora, to zostanie wykonana instrukcja podana po słowie else (gdy instrukcja wyboru zawiera jednostkę else) lub instrukcja pusta, po czym, podobnie jak poprzednio, sterowanie zostanie przekazane do instrukcji następującej po instrukcji wyboru.

c) Iteracyjna: służy do zorganizowania cyklu programowego, tj. wielokrotnego wykonania pewnych sekwencji instrukcji. Istnieją trzy instrukcje iteracyjne:

Instrukcja „dla" (pętlę) - stosuje się zwykle w celu wykonania pewnej grupy instrukcji w przypadku, gdy liczba powtórzeń jest znana w danym miejscu programu. Instrukcja "dla" może mieć jedną z dwu następujących postaci:

for zmienna:=wyrażenie-1 to wyrażenie-2 do

instrukcja

lub

for zmienna:=wyrażenie-1 downto wyrażenie-2 do

instrukcja

Zmienna, zwana zmienną sterującą, musi być identyfikatorem typu porządkowego (bez jakiegokolwiek kwalifikatora) i powinna być lokalna w bloku zawierającym daną instrukcję "dla". Wartości obu wyrażeń powinny być zgodnych typów w sensie przypisania z typem zmiennej sterującej. Instrukcja występująca po słowie kluczowym do może być dowolną instrukcją prostą, strukturalną lub asemblerową.

Instrukcja "dla" jest realizowana następująco:

a) oblicza się wartości obu wyrażeń (dalej będziemy je oznaczać odpowiednio przez w l iw2);

b) sprawdza się, czy wartość w l jest:

- mniejsza lub równa wartości w2, gdy instrukcja "dla" zawiera słowo to;

- większa lub równa wartości w2, gdy instrukcja zawiera słowo downto;

jeżeli warunek ten jest spełniony, to jest wykonywany punkt

c) a w przypadku przeciwnym sterowanie jest przekazywane do instrukcji następującej po instrukcji "dla";

c) wartość w l jest podstawiana pod zmienną sterującą;

d) wykonuje się instrukcję podaną po słowie kluczowym do;

e) sprawdza się, czy aktualna wartość zmiennej sterującej w sensie uporządkowania jest różna od wartości w2 i gdy tak jest, to wykonuje się punkt

i) a w przypadku przeciwnym sterowanie jest przekazywane do instrukcji następującej po instrukcji "dla";

f) zmiennej sterującej przypisuje się:

- następną wartość w danym typie (dla zmiennej typu całkowitego odpowiada to zwiększeniu wartości zmiennej o 1), gdy instrukcja "dla" zawiera słowo to;

- poprzednią wartość w danym typie (dla zmiennej typu całkowitego odpowiada to zmniejszeniu wartości zmiennej o 1), gdy instrukcja "dla" zawiera słowo kluczowe downto;

g)wykonuje się instrukcję występującą po słowie kluczowym do, po czym przechodzi się do wykonania punktu e).

Z powyższego opisu działania instrukcji "dla" wynika, że instrukcja podana po słowie do nie zostanie wykonana ani razu, gdy w wariancie ze słowem to wartość pierwszego wyrażenia jest większa (w sensie uporządkowania) od wartości wyrażenia drugiego, a w wariancie ze słowem downto - wartość wyrażenia pierwszego jest mniejsza od wartości wyrażenia drugiego. Należy także zaznaczyć, że zmiana wartości zmiennej sterującej w instrukcji wchodzącej w skład instrukcji "dla" nie jest dozwolona oraz że po wykonaniu instrukcji "dla" wartość zmiennej sterującej jest nieokreślona.

instrukcja „dopóki" - służąca do opisywania iteracji ze sprawdzaniem warunku na początku. Jej postać jest następująca:

while wyrażenie do

instrukcja

Wyrażenie występujące po słowie kluczowym while, które najczęściej jest wyrażeniem porównania, powinno w wyniku dawać wartość logiczną (True lub False), a instrukcja występująca po słowie do może być dowolną instrukcją prostą, strukturalną lub instrukcją asemblerową. Instrukcja ta wykonywana jest tak długo, jak długo wartością podanego wyrażenia jest wartość logiczna True (chyba że nastąpi skok przekazujący sterowanie na zewnątrz instrukcji "dopóki"). Jeśli przed rozpoczęciem wykonywania instrukcji "dopóki" wartością wyrażenia występującego po słowie while jest wartość logiczna False, to instrukcja wewnętrzna nie będzie wykonana ani razu. Jeśli natomiast przed rozpoczęciem wykonywania instrukcji "dopóki" wartością wspomnianego wyrażenia będzie wartość logiczna True, a instrukcja wewnętrzna nie spowoduje zmiany jego wartości, to omawiana instrukcja iteracyjna nie zostanie nigdy zakończona. Przy posługiwaniu się instrukcją "dopóki" należy zatem zwracać szczególną uwagę na właściwe sterowanie występującym w niej wyrażeniem.

Np. while K<10 do

begin

X:= X+K;

K:= K+1

end;

jeśli przed rozpoczęciem powyższej instrukcji zmienna K ma wartość 1, to instrukcja „dopóki” zostanie wykona 9 razy.

instrukcja „powtarzaj" - służąca do opisywania iteracji ze sprawdzaniem pewnego warunku na końcu. Ogólna jej postać jest następująca:

repeat

instrukcja-1;

instrukcja-2;

...

instrukcja-n

until wyrażenie

Wyrażenie podane po słowie kluczowym until powinno dawać w wyniku wartość logiczną, a każda z instrukcji może być dowolną instrukcją prostą, strukturalną lub instrukcją asemblerową. Zauważmy, że dla ujęcia ciągu instrukcji w całość, nie jest konieczne zastosowanie instrukcji złożonej. Zakres instrukcji "powtarzaj" jest bowiem ograniczony słowami kluczowymi repeat i until. Instrukcje pomiędzy tymi słowami są wykonywane co najmniej raz, a zakończenie przetwarzania instrukcji "powtarzaj" następuje, gdy wartością wyrażenia występującego po słowie kluczowym until jest wartość logiczna True. Innymi słowy: instrukcje wewnętrzne wykonywane są dopóty, dopóki wspomniane wyrażenie ma wartość logiczną False (chyba że jedną z instrukcji wewnętrznych jest instrukcja skoku przekazująca sterowanie na zewnątrz instrukcji "powtarzaj").

Np. repeat

K:=I mod J;

I:=J;

J:=K

until J=0;

- liczba wykonań powyższej instrukcji "powtarzaj" zależy od początkowych wartości zmiennych I oraz J (jeśli na przykład zmienne te przed rozpoczęciem wykonywania instrukcji "powtarzaj" będą miały wartości odpowiednio 20 i 3, to warunek J=0 zostanie spełniony po trzykrotnym wykonaniu wewnętrznych instrukcji przypisania).

Wiążąca: pozwalająca na wygodniejsze odwoływanie się do pól rekordów oraz pól obiektów i ich metod. Instrukcja ma postać:

with lista-zmiennych do

instrukcja

przy czym wyspecyfikowana lista zmiennych zawiera oddzielone przecinkami identyfikatory zmiennych rekordowych lub klasowych, a instrukcja występująca po słowie kluczowym do może być dowolną instrukcją prostą lub strukturalną. Umieszczenie zmiennej rekordowej lub klasowej po słowie kluczowym with pozwala wewnątrz instrukcji wiążącej na odwoływanie się do pól za pomocą samych ich identyfikatorów. Identyfikatory te są traktowane w instrukcji wewnętrznej jako zmienne. W przypadku zmiennej klasowej można w instrukcji wiążącej odwołać się do metod związanych z danym obiektem za pomocą samych identyfikatorów metod.

Np. Załóżmy następującą deklarację:

var complex : record

re, im : Extended

end;

Przypisania w instrukcji wiążącej

with complex do

begin

re:=l;

im:=l

end;

są równoważne przypisaniom w instrukcji złożonej

begin

complex.re:=l;

complex.im:=l

end;

Instrukcje obsługi warunków i stanów wyjątkowych

Instrukcja strukturalna za pomocą której jest możliwe obsłużenie wystąpienia błędu lub innego zdarzenia przerywającego normalne wykonywanie programu. Do instrukcji obsługi warunków i stanów wyjątkowych zaliczamy: instrukcję try...except, instrukcję try...finally i instrukcję wywoływania stanów wyjątkowych.

- instrukcja try...exept - Powoduje ona sekwencyjne wykonywanie instrukcji występujących pomiędzy słowami kluczowymi try i except. Jeśli podczas ich wykonywania nie zostanie wywołany żaden warunek, to ciąg instrukcji występujący po słowie except jest ignorowany i sterowanie jest przekazywane do instrukcji występującej bezpośrednio po słowie end, kończącym instrukcję try...except. Zatem w tym przypadku program jest wykonywany tak, jakby rozważanej instrukcji nie było. Ogólna postać instrukcji try...except jest następująca:

try

sekwencja-instrukcji

except

blok-obsługi-warunków

end

gdzie blok obsługi warunków może składać się z sekwencji instrukcji lub z klauzul on. Blok obsługi warunków może być uaktywniony tylko za pomocą instrukcji raise zamieszczonej wśród sekwencji instrukcji poddawanych próbie, tj. wśród instrukcji występujących pomiędzy słowami try i except, albo przez procedure lub funkcję wywołaną z tej sekwencji, albo z chwilą wystąpienia jakiegoś warunku.

- instrukcję try...finally - wykorzystuje się w przypadku, gdy bez względu na wystąpienie jakiegoś warunku należy wykonać pewne instrukcje, przy czym jeśli warunek wystąpi, to należy go ponownie wywołać. Postać tej instrukcji jest następująca:

try

sekwencja-instrukcji

finally

sekwencja-instrukcji

end

Instrukcja ta powoduje wykonywanie instrukcji występujących pomiędzy słowami kluczowymi try i finally w kolejności sekwencyjnej. Jeśli żadna z tych instrukcji nie zainicjuje żadnego warunku lub stanu wyjątkowego, to zostaną wykonane instrukcje znajdujące się po słowie finally, po czym sterowanie zostanie przekazane do instrukcji występującej bezpośrednio po instrukcji try...finally.

Np. Reset (plik); - otwarcie pliku

try

...

finally

CloseFile (plik) - zamknięcie pliku

end;

- instrukcję wywoływania stanów wyjątkowych: służy do wywołania jednego z warunków lub stanów wyjątkowych predefiniowanych w modułach biblioteki RTL lub biblioteki VCL, lub też zdefiniowanych przez programistę. Instrukcja ta może mieć trzy różne postacie:

raise stan-wyjątkowy

raise stan-wyjątkowy at adres

lub

raise stan-wyjątkowy

Stan wyjątkowy oznacza tu obiekt (wyrażenie typu klasowego). Na ogół nie podaje się w tym miejscu zmiennej typu klasowego, lecz wywołuje konstruktor odpowiedniego typu klasowego reprezentującego warunek lub stan wyjątkowy. Wywołanie warunku powoduje utworzenie obiektu-warunku, jego obsługę, a następnie automatyczne usunięcie tego obiektu-warunku za pomocą jego destruktora. Po wykonaniu instrukcji raise występującej wśród instrukcji poddanych próbie, tj. w instrukcji try...except pomiędzy słowami try i except, sterowanie nie jest przekazywane do instrukcji występującej bezpośrednio po niej. Instrukcja raise przekazuje sterowanie do bloku obsługi warunków dotyczącego warunków danej klasy (bloki takie występują po słowie except) i następuje wykonanie instrukcji wchodzących w skład tego bloku. Jeśli instrukcje try...except są zagnieżdżone, to sterowanie zostanie przekazane do bloku obsługi tej instrukcji try...except, do której najpóźniej nastąpiło wejście i której dotychczas nie opuszczono. Gdy instrukcja raise nie wystąpi wśród instrukcji poddanych próbie, tj. zostanie umieszczona poza instrukcją try...except, jej wykonanie polega zwykle na zatrzymaniu programu i wyświetleniu stosownego komunikatu. Wywołanie określonego warunku powoduje też przypisanie zmiennej standardowej ErrorAddr adresu programu, w którym to wywołanie nastąpiło. W bloku obsługi warunku można odwołać się do tego miejsca podając, na przykład, użytkownikowi programu adres miejsca wystąpienia błędu. Jeśli adres ten ma być inny niż miejsce wystąpienia błędu, to można go określić za pomocą klauzuli at adres, w której podany adres oznacza w ogólności wyrażenie adresowe (typu Pointer), a więc np. zmienną typu wskaźnikowego. Trzecia postać instrukcji raise, składająca się z samego słowa kluczowego, śluzy do ponownego wywołania bieżącego warunku i może być użyta tylko w bloku except instrukcji try...except.

Np.

if (liczba<-10) or (liczba>10)

then raise ERangeError.Create ('Wartość zmiennej liczba poza '+' dozwolonym zakresem');

PAKIET - Specjalny rodzaj biblioteki łączonej dynamicznie, używanej albo przez programy okienkowe, albo przez środowisko Delphi, albo przez jedne i drugie. Pakiety przygotowane dla programów nazywa się pakietami wykonawczymi, a pakiety przeznaczone do wykorzystania w środowisku Delphi - pakietami projektowymi.

PROJEKT - program lub biblioteka łączona dynamicznie

Elementy:·

- zbiór programowy (.DPR),

-dla każdego projektu istnieje tylko jeden taki zbiór

-zbiory binarne z graficznymi obrazami formatek (.DFM), jeden projekt może zawierać wiele takich zbiorów

-zbiory z tekstami źródłowymi modułów, o rozszerzeniu nazwy PAS, które są związane z formatkami i zawierają ich kody programowe, a także zbiory z modułami „niezależnymi” od formatek

- opcjonalne zbiory dołączone do programu, za pomocą odpowiednich dyrektyw kompilatora np. zbiory z zasobami, tekstami źródłowymi funkcji i procedur, podprogramy zewnętrzne i inne.

ZDARZENIA - zjawisko wymagające reakcji przez program

Sposób wykonania: - żeby dołączyć kod obsługi zdarzenia komponentu, trzeba wybrać dany komponent, przejść na zakładkę Events (okno Object Inspector) i kliknąć dwukrotnie wybrane zdarzenie. Wtedy w module związanym z daną formatką ( na której jest wybrany komponent ) dodana zostanie metoda - pojawi się jej szkielet, w którym można wpisać kod obsługi zdarzenia. Jeśli zna się parametry przekazywane do obsługi zdarzenia, można wpisać „ręcznie” metodę i później powiązać ją z wybranym zdarzeniem.

KONSTRUKTOR: -specjalna metoda służąca do utworzenia i zainicjowania nowego obiektu, której nagłówek rozpoczyna się od słowa kluczowego constructor. Inicjowanie polega na przekazaniu (poprzez parametry) różnych wartości do konstruktora. W przeciwieństwie do zwykłych metod, które wywołuje się przez odwołanie do obiektu:

zmienna_typu_klasowego.nazwa_konstruktora - tj. za pomocą zmiennej typu klasowego

(var zmienna:identyfikator_typu_klasowego)

Konstruktor może być wywołany zarówno przez odwołanie do obiektu i klasy:

Zmienna_typu_klasowego:=typ_klasowy.nazwa_konstruktora.

WYWOŁANIE KONSTRUKTORA:

Inherited nazwa_konstruktora

Destruktor: Specjalny rodzaj metody typu klasowego, której nagłówek zamiast słowa kluczowego function lub procedurę zawiera słowo destructor. Destruktor służy przede wszystkim do zwolnienia pamięci zajętej przez obiekt, przy czym operacja ta jest ostatnią czynnością wykonywaną przez destruktor - wcześniej zostaną wykonane instrukcje podane w jego definicji. Instrukcjami tymi są zazwyczaj zwolnienia pamięci wewnętrznych obiektów i zasobów przydzielonych obiektowi. Ostatnią instrukcją destruktora powinno być wywołanie destruktora nadrzędnego typu klasowego (za pomocą instrukcji dziedziczenia). Dla destruktorów typów klasowych zdefiniowanych w bibliotece RTL i VCL przyjęto jednolitą nazwę Destroy. Bezpośrednie wywoływanie destruktorów Destroy nie jest zalecane. Zwalniając pamięć przydzieloną obiektowi należy raczej posługiwać się metodami Free, których zaletą jest uprzednie sprawdzenie, czy zwalniany obiekt nie jest określony przez

WŁASNOŚĆI:

1* cechy obiektu ( np.: napis na przycisku, kolor obiektu, kolor i krój napisu, tytuł, rozmiar okienka)

2* element klasy, którego wartość jest zwykle przechowywana w polach. Własność określa zwykle jakiś atrybut obiektu danej klasy oraz operacje związane z jego odczytem lub zapisem.

W definicji typu klasowego własność jest określana za pomocą deklaracji własności. Opcjonalny element definicji typu klasowego, który określa nazwę i typ własności oraz operacje związane z jej odczytem i zapisem (poprzez wskazanie na odpowiednie metody). Deklaracja taka ma postać:

property nazwa_wlasnosci specyfikatory_własnosci;

lub

property nazwa_wlasnosci lacze_wlasnosci specyfikatory_własnosci;

gdzie specyfikatory własności m.in. sterują dostępem do wartości własności.

Łącze własności ma postać: [deklaracje_parametrów]: identyfikator_typu

Po nich może jeszcze występować dyrektywa języka index z liczbą całkowitą należącą do przedziału -2 147 483 647 do 2 147 483 647.

ZAPISYWANIE/ODCZYTYWANIE WARTOŚCI WŁASNOŚCI:

Dostęp do zapisu/odczytu wartości własności może być bezpośredni lub pośredni:

BEZPOŚREDNI - po słowie read i write wpisuje się nazwę odpowiedniego pola (miejsce przechowywania wartości własności)

POŚREDNI - po słowie read i write wpisuje się specyfikowane metody dostępu.

SŁOWA KLUCZOWE - to każdy z 65 wyrazów j. angielskiego m.in.

and array as asm begin case class const

else do downto end file for if object

Różnice między słowami kluczowymi a dyrektywami języka:

Słowa kluczowe są zastrzeżone i nie mogą być definiowane jako identyfikatory przez programistę, a dyrektywy nie są zastrzeżone i mogą być definiowane - chociaż się tego nie zaleca

BIBLIOTEKA ŁĄCZONA DYNAMICZNIE

Programowanie bibliotek DLL:

Biblioteka DLL - Wykonywalny moduł zawierający kod programowy lub zasoby.

Podobieństwa DLL do modułów:

- występują funkcje, procedury wykorzystywane przez programy.

Różnice : Sposób dołączania do jednostek programowych (programów, modułów i innych bibliotek DLL); moduły umożliwiają wykorzystanie w programie procedur i funkcji, ale także literałów, typów i zmiennych w nich zdefmiowanych(w części opisowej) a z bibliotek DLL mogą być „eksportowane" tylko procedury i funkcje.

Program (lub moduł) może pobrać procedurę lub funkcję z biblioteki DLL przez:

1.Nazwę - external nazwa biblioteki;

gdzie podana nazwa w ogólności oznacza wyrażenie stałe typu łańcuchowego (najczęściej jest to łańcuch z nazwą biblioteki).

2. Nową nazwę- external nazwa-biblioteki name nazwa-importowa;

gdzie obie podane nazwy w ogólności mogą być wyrażeniami stałymi typu łańcuchowego (najczęściej są to łańcuchy odpowiednio z nazwą biblioteki i nazwą funkcji lub procedury).

3.Liczbę porządkową: Liczba porządkowa funkcji (procedury) w bibliotece jest ustalona za pomocą klauzuli exports. Nagłówek definicji funkcji lub procedury pobieranej z biblioteki przez liczbę porządkową odwołuje się do tej liczby za pomocą dyrektywy języka external postaci

external nazwa bibliotek index liczba-porządkowa;

gdzie wyspecyfikowana nazwa w ogólności oznacza wyrażenie stałe typu łańcuchowego (najczęściej jest to łańcuch z nazwą biblioteki), a liczba porządkowa - wyrażenie stałe typu całkowitego (najczęściej jest to liczba całkowita).

BIBLIOTEKA ŁĄCZONA DYNAMICZNIE - (w skrócie biblioteka DLL) służy do wspólnego używania kodów programowych i zasobów przez różne programy i inne biblioteki DLL. Napisana w jezyku Object Pascal, składa się z nagłówka biblioteki, deklaracji modułów, bloku ( części opisowej i instrukcji złożonej) oraz znaku kropki:

library nazwa_biblioteki

deklaracje_modułów

część_opisowa

begin

ciąg_instrukcji

end.

MODUŁ: Służy przede wszystkim do grupowania stałych, typów danych, zmiennych, funkcji i procedur w większe jednostki programowe.

POSTAć MODUŁóW:

unit nazwa_modułu

część_opisowa_modułu

część_implementacyjna

część_inicjująca_i_finalizująca

end.

KOLEJKA jest strukturą danych składającą się z liniowo uporządkowanych zbiorów składników, do której można dołączyć składnik tylko w jednym końcu (na końcu kolejki), a usunąć tylko w drugim końcu (na początku kolejki).

PROCEDURA TWORZENIA KOLEJKI I DOŁĄCZANIA NA JEJ KOŃCU NOWYCH SKŁADNIKÓW:

procedure DoKolejki (var element : typ_danych;

var koniec_kolejki : wskaznik_kolejki);

var punkt : wskaznik_kolejki;

begin

punkt:=koniec_kolejki;

new (koniec_kolejki);

with koniec_kolejki ^ do

begin

dane:=element;

wskaznik:=nil

end;

if punkt<>nil

then punkt^.wskaznik:=koniec_kolejki

end;

METODY:opcjonalny element typu klasowego, służy do określenia czynności wykonywanych na obiekcie i do dostępu do pól obiektu. Metoda może być funkcją, procedurą, konstruktorem lub destruktorem. Deklaracja metody występuje w definicji typu klasowego.

RODZAJE METOD:

statyczna, dynamiczna, wirtualna, abstrakcyjna.

OPISYWANIE I WYWOŁYWANIE METOD:

nazwa_zmiennej_obiektowej.nazwa_metody

lub

nazwa_zmiennej_obiektowej.nazwa_metody (lista_argumentów)

1.Statyczna: "Zwykła" metoda zadeklarowana w typie klasowym. W typie potomnym można określić metodę o takiej samej nazwie. Powoduje to, że podczas wykonywania programu mogą być dostępne dwie (lub większa liczba) metod o takich samych identyfikatorach, o tym, która metoda ma być wykonana, decyduje zadeklarowany typ klasowy zmiennej obiektowej użytej w wywołaniu metody (a nie typ wyspecyfikowany w instrukcji tworzącej obiekt w pamięci, co charakteryzuje metody wirtualne).

2. Dynamiczna: Metoda zadeklarowana z dyrektywą języka dynamic. Semantycznie jest identyczna z metodą wirtualną, a różni się od niej tylko szybkością wywołania podczas wykonywania programu. Dla metody wirtualnej kompilator generuje kod wynikowy, który jest optymalny z punktu widzenia szybkości, a dla metody dynamicznej - optymalny z uwagi na rozmiar kodu.

3. Wirtualna: Metoda, której deklaracja zawiera dyrektywę języka yirtual. Metody, które w typach potomnych pokrywają metodę wirtualną, powinny być zadeklarowane z dyrektywą języka override (metody takie są też metodami wirtualnymi). Podczas wykonywania programu może zatem być dostępnych wiele metod wirtualnych o takich samych nazwach, o tym, która metoda ma być wykonana decyduje aktualny (a nie deklarowany) typ zmiennej obiektowej. Odróżnia to metody wirtualne od metod statycznych.

4. Abstrakcyjna: Metoda wirtualna lub dynamiczna, której definicja nie jest podana dla typu klasowego, w którym została zadeklarowana. W deklaracji takiej metody oprócz dyrektywy języka virtual lub dynamic należy wyspecyfikować dyrektywę abstract. W metodzie pokrywającej metodę abstrakcyjną (w typie potomnym) nie jest dozwolone odwołanie się do niej za pomocą słowa kluczowego inherited (dlatego, że metoda abstrakcyjna jest tylko zadeklarowana i brak jest jej definicji). Próba wywołania metody abstrakcyjnej zakończy się wygenerowaniem warunku błędu.

Metody abstrakcyjne stosuje się podczas konstrukcji dość ogólnego typu klasowego, gdy przewiduje się, że każdy jego typ potomny powinien zawierać pewną metodę wykonującą określone czynności, implementowaną we właściwy dla danej klasy sposób.

STOS - struktura danych składająca się z liniowo uporządkowanych zbiorów składników (elementów), z których tylko „największy” jest w danej chwili dostępny. Miejsce dostępu nazywa się wierzchołkiem stosu.

PROCEDURA USUWAJĄCA SKŁADNIK Z WIERZCHOŁKA STOSU:

procedure ZeStosu (var element : typ_danych;

var wierzchołek : wskaznik_stosu);

var punkt : wskaznik_stosu;

begin

if wierzcholek<>nil

then begin

with wierzcholek^ do

begin

element:=dane;

punkt:=wskaznik;

end;

Dispose (wierzcholek);

wierzcholek:=punkt;

end;

end;

Do czego służy separator? Jakie znasz separatory w języku Borland Pascal?

SEPARATORY - służą do rozdzielania słów kluczowych, dyrektyw języka, identyfikatorów i liczb.

Separatorem są:

Komentarze, odstępy (spacje), wszystkie znaki sterujące ASCII (o kodach od 0 do 31)

LISTA JEDNOKIERUNKOWA - ma podobną organizację do stosu i kolejki. Dla każdego składnika (poza ostatnim) jest określony następny lub dla każdego składnika (poza pierwszym) jest określony poprzedni.

PROCEDURA TWORZENIA LISTY JEDNOKIERUNKOWEJ I DOŁĄCZANIA DO NIEJ NOWYCH SKŁADNIKÓW:

type wskaznik_listy = ^skladnik_listy

skladnik_listy = record

dane : typ_danych;

wskaznik : wskaznik_listy;

end;

LISTA DWUKIERUNKOWA:

LISTA - to liniowo uporządkowany zbiór składników, z którego w dowolnym miejscu można usunąć składnik, jak również dołączyć nowy składnik.

LISTA DWUKIERUNKOWA - to liniowo uporządkowany zbiór składników, w którym dla każdego składnika, poza pierwszym i ostatnim, jest określony składnik poprzedni i następny. Dla ostatniego składnika listy dwukierunkowej jest określony składnik poprzedni, a dla pierwszego - następny.

PROCEDURA TWORZENIA LISTY DWUKIERUNKOWEJ I DOŁĄCZNIA DO NIEJ NOWYCH SKŁADNIKÓW:

type wskaznik_listy=^skladnik_listy;

skladnik_listy = record

wskaznik1 : wskaznik_listy;

dane : typ_danych;

wskaznik2 : wskaznik_listy

end;

INSTRUKCJE WYWOŁANIA STANóW WYJĄTKOWYCH:

- służy do wywoływania jednego z warunków lub stanów wyjątkowych, predefiniowanych w modułach biblioteki RTL lub VCL lub też zdefiniowanych przez programistę. Ma ona postać:

raise stan_wyjątkowy

lub

raise stan_wyjątkowy at adres

albo też samo raise

Wywołanie warunku powoduje utworzenie obiektu-warunku, jego obsługę, a następnie automatyczne usunięcie tego obiektu-warunku, za pomocą jego destruktora. Po wykonaniu instrukcji raise sterowanie jest przekazywane do bloku obsługi warunków, dotyczącego warunków danej klasy (bloki te występują po słowie except) i następuje wykonanie instrukcji wchodzących w skład tego bloku. Wywołanie określonego warunku powoduje również przypisanie zmiennej standardowej ErrorAddr adresu programu, w którym to wywołanie nastąpiło. W bloku obsługi warunku można odwołać się do tego miejsca ( np. podając użytkownikowi adres miejsca wystąpienia błędu). Jeśli ten adres ma być inny niż miejsce wystąpienia błędu, to można go określić za pomocą klauzuli at adres. Instrukcja składająca się z samego słowa kluczowego raise służy do ponownego wywołania bieżącego warunku i może być użyta tylko w bloku except instrukcji try except.

PODSTAWOWE SYMBOLE:

Litery: duże i małe od a do z

Cyfry: od 0 do 1

Znaki specjalne: + - * / = ^ < > ( ) [ ] { } . , : ; ` # $ & @ (odstęp - znak niewidoczny)

Znaki sterujące : znaki o kodach ASCII od 0 do 31

Operatory przypisania: :=

Operatory relacji: <> <= >=

Zakres: ..

Nawiasy kwadratowe: (. .)

Nawiasy klamrowe: (* *)

OPERATORY LOGICZNE:

and - negacja Boolean, Integer

not - koniunkcja Boolean, Integer

or - alternatywa Boolean, Integer

xor - różnica symetryczna Boolean, Integer

shl - przesunięcie w lewo Integer

shr - przesunięcie w prawo Integer

Operatory te służą do wykonywania operacji logicznych na wartościach typów logicznych oraz wartościach całkowitych.

OBIEKT POLIMORFICZNY:- jest to obiekt, w którym metody pokrywają metody z obiektów nadrzędnych.

DYREKTYWY JĘZYKA BORLAND PASCAL:DYREKTYWĄ JĘZYKA B.P. jest 41 wyrazów języka angielskiego. Dyrektywy używane są w kontekstach, w których nie może wystąpić identyfikator zdefiniowany przez programistę. Przykład:

absolute; external; at; dispid; export; far; index; name; read; write

WYRAŻENIA STAŁE:

- są to wyrażenia, które mogą być obliczane przez kompilator ( nie może zawierać : zmiennych, literałów zmiennych, wskaźników, wywołań funkcji i operatora @ ).

Zmiana typu wyrażenia:

identyfikator_typu (wyrażenie)

Typ wyrażenia i typ podany za pomocą identyfikatora typu muszą być jednocześnie albo typami porządkowymi albo wskaźnikowymi. W przypadku typów porządkowych wartość wyrażenia jest przekształcana na typ o podanym identyfikatorze (przy niezgodnych rozmiarach typu wyrażenia i typu podanego może nastąpić obcięcie lub rozszerzenie). W przypadku rozszerzenia znak wartości jest zachowywany. Konstrukcja ta nie może występować w odwołaniach do zmiennych oraz z lewej strony instrukcji przypisania.



Wyszukiwarka

Podobne podstrony:
Sem II Transport, Podstawy Informatyki Wykład XXI Object Pascal Komponenty
ref 2004 04 26 object pascal
3 Wprowadzenie do Object Pascal
Sem II Transport, Podstawy Informatyki Wykład XIV i XV Object Pascal Funkcje i procedury
6 Język Object Pascal
Podstawy Informatyki Wykład XI Object Pascal Podstawy programowania w Object Pascalu
Podstawy Informatyki Wykład XVI Object Pascal Obiekty
Sem II Transport, Podstawy Informatyki Wykład XII Object Pascal Instrukcje sterujące
Podstawy Informatyki Wykład XIII Object Pascal Funkcje i procedury
Object Pascal, Szkoła średnia, Informatyka
Podstawy Informatyki Wykład XVII Object Pascal Komponenty
Podstawy Informatyki Wykład XV Object Pascal Grafika
Sem II Transport, Podstawy Informatyki Wykład XIX i XX Object Pascal Obiekty
Podstawy Informatyki Wykład XII Object Pascal Instrukcje sterujące
Sem II Transport, Podstawy Informatyki Wykład XVIII Object Pascal Grafika

więcej podobnych podstron