W języku Object Pascal deklarowanie zmiennych jest wymagane przed blokiem begin..end, w sekcji var. Brak jest udogodnienia znanego z C++, dotyczącego deklarowania zmiennych w dowolnym miejscu kodu. Poprawia to jednak czytelność napisanego kodu, eliminując potrzebę przeszukiwania znacznych fragmentów kodu, gdy szukamy informacji jakiego zmienna jest typu.
Nazwy zmiennych w Object Pascalu są niewrażliwe na wielkość liter, możemy nazwać zmienną z użyciem samych małych liter, a wywoływać ją za pomocą samych dużych. Nazwy : ToJeStNaZwAZmIeNnEj oraz ToJestNazwaZmiennej są tożsame.
Deklaracje zmiennych można ( i trzeba ) skracać w taki sposób, że zmienne jednego typu należy umieszczać po sobie, oddzielone przecinkiem, a następnie po dwukropku umieścić nazwę typu. Czyli deklaracja zmiennych postaci :
var
zmienna1 : byte;
zmienna2 : byte;
jest tożsama z taką deklaracją zmiennych :
var
zmienna1, zmienna2 : byte;
Nadawanie wartości zmiennym może odbywać się w dwojaki sposób. Można nadawać wartość zmiennym w treści programu, w bloku begin...end;. Nadawanie wartości zmiennym odbywa się za pomocą operatora przypisania := :
zmienna1 := 5;
zmienna2 := 10;
Można też nadawania wartości zmiennym już podczas ich deklarowania, za pomocą operatora = :
var
zmienna1 : byte = 5;
zmienna2 : byte = 10;
Sposób ten jest jednak dostępny tylko dla zmiennych globalnych, natomiast nie można go używać dla zmiennych lokalnych, czyli zmiennych deklarowanych w procedurach oraz funkcjach.
Gdy zmiennej nie zostanie przypisana żadna wartość podczas deklaracji, przyjmuje ona wartość zerową, czyli dla zmiennych liczbowych będzie to 0, łańcuchy znaków mają długość 0, natomiast wskaźniki przyjmują wartość nil.
W Object Pascalu wyróżniamy pięć podstawowych grup typów zmiennych :
1. Zmienne całkowitoliczbowe
Istnieją następujące typy zmiennych całkowitoliczbowych :
| Nazwa typu | Zakres | |
| Integer | –2147483648 do 2147483647 |
| Cardinal | 0 do 4294967295 |
| Shortint | –128 do 127 |
| Smallint | –32768 do 32767 |
| Longint | –2147483648 do 2147483647 |
| Int64 | –2^63 do 2^63–1 |
| Byte | 0 do 255 |
| Word | 0 do 65535 |
| Longword | 0 do 4294967295 |
Jak widać, typ Int64 posiada bardzo szeroki zakres przyjmowanych wartości. Należy jednak pamiętać, że aby na przykład dodać zmienną typu Int64 do zmiennej typu Integer, należy wykonać rzutowanie tej pierwszej na typ Int64. Taka konstrukcja nie zwróci prawidłowego wyniku :
var
I: Integer;
J: Int64;
begin
I := High(Integer);
J := I + 1;
showmessage(inttostr(J));
end;
Natomiast taka konstrukcja już zwróci poprawny wynik :
var
I: Integer;
J: Int64;
begin
I := High(Integer);
J := int64(I) + 1;
showmessage(inttostr(I) + #13 + #10 + inttostr(J));
end;
2. Zmienne zmiennoprzecinkowe
W Object Pascalu dostępne są następujące typy zmiennoprzecinkowe :
| Nazwa typu | Zakres | |
| Real48 | 2.9 x 10^–39 do 1.7 x 10^38 |
| Single | 1.5 x 10^–45 do 3.4 x 10^38 |
| Double | 5.0 x 10^–324 do 1.7 x 10^308 |
| Extended | 3.6 x 10^–4951 do 1.1 x 10^4932 |
| Comp | –2^63+1 do 2^63 –1 |
| Real | 5.0 x 10^–324 do 1.7 x 10^308 |
| Currency | –922337203685477.5808 do 922337203685477.5807 |
Typ Currency służy do przechowywania zmiennych, które muszą być bardzo dokładne, dotyczy to głównie kwot pieniężnych. Jego wewnętrzną reprezenatcją jest liczba o 10000 większa niż liczba w rzeczywistości reprezentowana. Specjaliści mówią, że jest to jedyny w Object Pascalu typ rzeczywisty stałoprzecinkowy.
3. Łańcuchy znaków
Wyróżniamy trzy podstawowe typy, dotyczące łańcuchów znaków :
a. ShortString
Jest to łańcuch znaków, nie przekraczający 255 znaków. Deklarując zmienną w ten sposób :
var
zmienna1 : string;
przy dyrektywie kompilatora {$H-}, zmienna1 przyjmuje typ ShortString.
b. AnsiString
Jest to typ łańcuchowy o ilości znaków do ~2^31. Jest to podstawowy typ łańcuchowy w Object Pascalu. Deklarując zmienną w ten sposób :
var
zmienna1 : string;
przy dyrektywie kompilatora {$H+} ( jest to ustawienie domyślne ), zmienna1 będzie typu AnsiString.
c. WideString
Jest to typ łańcuchowy, obsługujący znaki kodowane w standardzie Unicode, o maksymalnej ilości znaków do ~2^30.
4. Typ znakowy
Zmienna typu znakowego to zmienna, która przechowuje tylko i wyłacznie jeden znak. W Object Pascalu istnieją trzy typy reprezentyjące znak :
a. AnsiChar - jest to jednobajtowy znak ANSI;
b. WideChar - jest ot dwubajtowy znak ze zbioru znaków Unicode;
c. Char - Jest to typ taki sam, jak AnsiChar, lecz Borland zastrzegł sobie prawo do zmiany go w przyszłych wersjach Delphi na tożsamy z WideChar.
5. Wskaźniki
Wskaźnik jest to zmienna, która przechowuje adres w pamięci innej zmiennej. W Object Pascalu istnieje wiele typów wskaźnikowych, podczynając od typów wewnątrzjęzykowych, takich jak : PAnsiString, PString, PByteArray, PCurrency, PExtended, POleVariant, PShortString, PTextBuf, PVarRec, PVariant, PWideString, PWordArray, po typy definiowane przez programistę, do których zaliczamy wskaźniki typowane oraz amorficzne.
Wkaźniki typowane definiujemy poprzez operator ^ w połączeniu z typem podstawowym, na który wskazuje wskaźnik. Przykład :
type
PInt : ^Integer;
PByte : ^Byte;
var
I : PInt;
Możemy też definiować wskaźniki na rekordy :
type
TRec = record
Id : integer;
Imie : string;
end;
PRec = ^TRec;
var
Rec : PRec;
Odwołanie do rekordu przez tak stworzony wskaźnik wygląda w następujący sposób :
begin
//Najpierw musimy utworzyć dynamiczny rekord typu TRec. Zmienna Rec będzie zawierać wskazanie na niego
New(Rec);
//do poszczególnych pól rekordu odwołujemy się za pomocą operatora ^
Rec^.Id := 1;
Rec^.Imie := 'Marcin';
//po użyciu wskaźnika musimy zwolnić zajmowaną pamięć
Dispose(Rec);
end;
6. Typ wariantowy
Typ Variant służy do przechowywania dowolnej wartości, oraz zmiany jej typu w zależności od potrzeb programu. Przykład :
var
zmienna1 : variant;
begin
zmienna1 := 'To jest zmienna typu Variant';
showmessage(zmienna1);
zmienna1 := 120;
showmessage(inttostr(zmienna1));
zmienna1 := 3.14;
showmessage(FormatFloat('#.##', zmienna1));
zmienna1 := true;
if zmienna1 then showmessage('Zmienna1 przyjmuje wartosc true');
end;
Zmienne typu Variant wymagają jednak więcej pamięci, a operacje na nich więcej mocy obliczeniowej procesora, niż zmienne przyjmujące wartości konkretnego typu. Dlatego też, o ile to możliwe ( a jest to niemożliwe w niektórych przypadkach, na przykład w przypadku mechanizmu OLE ), należy stosować typy podstawowe.
7. Typ logiczny
Zmienna typu logicznego może przyjmować jedną z dwóch wartości : true lub false. Deklarujemy ją w następujący sposób :
var
zmienna1 : boolean;
8. Typy zdefiniowane przez użytkownika
Do typów definiowanych przez użytkownika, oprócz niektórych wskaźników, zaliczamy :
a. Zbiory
Najprostszym typem, możliwym do zdefiniowania przez programistę, jest zbiór. Definiujemy go za pomocą klauzuli set of :
type
TZbiorChar = set of Char;
Taka definicja definiuje zbiór znaków. Innym przykładem może być zbiór, zawierający nasze własne dane, na przykład :
type
TMiesiace = (Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień );
TZbiorMiesiecy = set of TMiesiace;
Możemy też definiować zbiory, oparte na typie okrojonym. Możemy w nich zamieszczać np tylko wybrane liczby lub znaki, pod warunkiem, że liczba elementów zbioru nie przekroczy 255, zaś numery porządkowe jego elementów nie mogą wykraczać poza przedział od 0 do 255. Zbiór oparty na typie okrojonym definiujemy w następujący sposób :
type
Cyfry = set of 0 .. 9;
Litery = 'a'..'z';
Wartości stałe, które oznaczają zbiory, zapisuje się w nawiasach kwadratowych, np :
type
TMiesiace = (Styczen, Luty, Marzec, Kwiecien, Maj, Czerwiec, Lipiec, Sierpien, Wrzesien, Pazdziernik, Listopad, Grudzien );
TZbiorMiesiecy = set of TMiesiace;
var
Wakacyjne, Szkolne : TZbiorMiesiecy;
begin
Wakacyjne := [Lipiec, Sierpien];
Szkolne := [Styczen, Luty, Marzec, Kwiecien, Maj, Czerwiec, Wrzesien, Pazdziernik, Listopad, Grudzien ];
end;
b. Rekordy
Rekord stanowi zbiór kilku zmiennych różnych lub tych samych typów. Rekord definiujemy w następujący sposób :
type
TRekord = record
Id : integer;
Imie : string;
end;
Odwoływanie się do pól zmiennej typu rekordowego odbywa się poprzez wywołanie nazwy zmiennej, po niej kropki, a po kropce nazwy pola rekordu :
var
Rec = TRekord;
begin
Rec.Id := 1;
Rec.Imie := 'Marcin';
end;
Jeśli rekord zawiera dużo pól, to możemy uniknąć ciągłego wpisywania nazwy zmiennej, stosując instrukcję with :
var
Rec = TRekord;
begin
with Rec do begin
Id := 1;
Imie := 'Marcin';
end;
end;
Ciekawym zagadnieniem dotyczącym rekordów, są rekordy wariantowe. Posiadają one część zmienną. Definiuje się je tak samo jak zwykłe rekordy, jednak wewnątrz nich uzywa się instrukcji warunkowej case :
type
TRekord = record
Id : integer;
Int : Integer;
Case Integer of
0 : (Imie : string[255]);
1 : (Wiek : byte);
end;
c. Obiekty
Obiekty są podobne do rekordów, mogą jednak posiadać procedury i funkcje, zwane metodami. Definicja obiektu wygląda następująco :
type
TKlasa = class
Pole1 : integer;
procedure Metoda1;
function Metoda2 : integer;
end;
Oczywiście potem musimy zdefiniować metody, wchodzące w skład klasy :
procedure TKlasa.Metoda1;
begin
end;
function TKlasa.Metoda2 : integer;
begin
Result := 1;
end;
Jako że obiekty stanowią trzon Object Pascal, zostanie im poświęcony osobny rozdział.
d. Tablice
Tablice stanowią ciąg zmiennych tego samego typu. Elementem tablicy może być dowolny typ, wliczając to także typy zdefiniowane przez programistę, w tym również tablice. Tablice definiujemy w sposób następujący :
type
TTablica = array[0..9] of integer;
var
Tablica : TTablica;
Tablica taka stanowi zbiór 10 liczb typu integer. W rzeczywistości programiści skracają deklarację zmiennej stanowiącej tablicę do postaci :
var
Tablica : array[0..9] of integer;
Taka konstrukcja również jest prawidłowa. Oczywiście nic nie stoi na przeszkodzie, aby numery elementów tablicy były inne niż podane w powyższej deklaracji, na przykład :
var
Tablica : array[5..14] of integer;
Taka tablica również stanowi zbiór 10 liczb typu Integer, lecz pierwszy element tablicy nie ma indeksu 0, lecz 5.
Oddzielnym typem tablic są tablice dynamiczne, definiowane w sposób następujący :
var
Tablica : array of integer;
Takie tablice przyjąć mogą długość ograniczoną jedynie pamięcią komputera. Zmianę długości takiej tablicy dokonujemy przez polecenie SetLength :
begin
SetLength(Tablica, 10);
end;
W ten sposób uzyskaliśmy tablicę dynamiczną dziesięcioelementową, indeksowaną od 0 (tablice dynamiczne zawsze są indeksowane od 0 ).
Odwoływanie się do elementów tablic dokonujemy przez wywołanie nazwy zmiennej, stanowiącej tablicę, oraz oznaczenia w nawiasie kwadratowym indeksu elementu, do którego chcemy się odwołać :
begin
SetLength(Tablica, 10);
Tablica[0] := 1;
Tablica[1] := 123;
Tablica[5] := 324;
end;
Dolną oraz górną wartośc graniczną indeksów tablicy zwracają funkcje Low oraz High. Jeśli chcemy odwołać się do pierwszego lub ostatniego elementu tablicy, możemy to wykonać w ten sposób :
begin
SetLength(Tablica, 10);
Tablica[Low(Tablica)] := 1;//pierwszy element tablicy
Tablica[High(Tablica)] := 123; //ostatni element tablicy
end;
Czasami zdarza się, że potrzebujemy tablic wielowymiarowych. Tablice takie definiujemy w ten sposób :
var
tabl1 : array[0..2, 0..5] of integer; //tablica statyczna dwywymiarowa
tabl2 : array of array of integer; //tablica dynamiczna dwuwymiarowa
Odwołując się do elementu takiej tablicy, w nawiasie kwadratowym podajemy po przecinku numery indeksów w poszczególnych wymiarach tablicy.
Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.