[ Pobierz całość w formacie PDF ]
'Błąd',MB_APPLMODAL);
Wybór indeksu w czasie wykonania programu
W dialektach Xbase do zmiany indeksu w czasie wykonania programu służą
polecenia SET INDEX i SET ORDER. Niektóre dialekty oferują specjalne
931
funkcje, przełączające indeks. Działają one jednak tak samo, jak powyższe
polecenia. Aby zmienić indeks w programie, napisanym w Delphi, należy
zmodyfikować wartość atrybutu IndexName komponentu Table. Atrybut
IndexName powinien zawierać identyfikator (tag) indeksu, zapisany w pliku
MDX, a nie nazwę pliku. BDE zakłada, że nazwa pliku, w którym przechowywany
jest indeks typu MDX, będzie identyczna z nazwą tabeli, na bazie której ten indeks
został zbudowany.
Bloki instrukcji
Bloki instrukcji, w postaci znanej z dialektów Xbase, mogą funkcjonować tylko
w środowisku wyposażonym w interpreter. Aby podobne mechanizmy zastosować
w aplikacjach Delphi, należy odwołać się do zmiennych proceduralnych
i otwartych tablic, dostępnych w języku Object Pascal. Poniższy fragment
programu ilustruje odpowiednią technikę postępowania, pozwalającą na napisanie
dość uniwersalnej procedury Aeval:
type
prPokazNapis = procedure(Napis: string);
const
Kolory : array[1..4] of string = ('Kier', 'Pik', 'Karo',
➥ 'Trefl');
procedure PokazNapis(Napis: string);
begin
Napis:=UpperCase(Napis);
ShowMessage(Napis);
end;
procedure AEval(const Tablica: array of string;
ProcDoPokazywania: prPokazNapis);
Var
Index: Integer;
begin
for Index := Low(Tablica) to High(Tablica) do
ProcDoPokazywania(Tablica[Index]);
end;
procedure PokazJe;
begin
AEval(Kolory, PokazNapis);
end;
Procedura PokazJe przekazuje parametr PokazNapis do procedury AEval.
Wewnątrz AEval procedura, wskazywana przez zmienną PokazNapis
wywoływana jest kolejno dla wszystkich elementów tablicy. Parametrem AEval
932
jest tablica bez podanego zakresu indeksów (np. [1..4]), wymaganego zazwyczaj
w języku Object Pascal. Parametr ten ma bowiem postać tablicy otwartej (ang.
open array), która może mieć dowolną liczbę elementów. Aby już wewnątrz
podprogramu uzyskać informację o rzeczywistej liczbie elementów tablicy należy
skorzystać z funkcji Low i High. W omawianym przykładzie wartości tych funkcji
decydują o liczbie powtórzeń pętli oraz wartościach zmiennej kontrolnej Index.
Rozważmy teraz bardziej złożony przykład, w którym procedura AEval nie tylko
odczytuje, lecz także zmienia elementy tablicy, korzystając z zewnętrznej funkcji.
type
fnDodajVAT = function(Cena: Single) : Single;
const
Ceny : array[1..5] of Single = (4.50, 2.10, 1.31, 3.89,
➥ 5.56);
function DodajVAT(Cena: Single) : Single;
const
Stawka = 0.22;
var
VAT : Single;
begin
VAT:=Cena * Stawka;
Result:=Cena+VAT;
end;
procedure Aeval(var Tablica: array of Single; FunkcDodajVAT:
➥ fnDodajVAT);
Var
Index: Integer;
begin
for Index := Low(Tablica) to High(Tablica) do
Tablica[Index]:=FunkcDodajVAT(Tablica[Index]);
end;
procedure ObliczJe;
begin
AEval(Ceny, DodajVAT);
end;
W nagłówku procedury AEval deklarację otwartej tablicy poprzedza słowo var.
Dzięki temu tablica przekazywana jest przez adres, a nie przez wartość, i jej
elementy mogą być modyfikowane wewnątrz procedury.
933
Funkcje
Pojawienie się w Clipperze funkcji definiowanych przez użytkownika uznawane
było za znaczące ulepszenie tego języka. Inne dialekty Xbase nie pozwalały
w owym czasie na definiowanie własnych funkcji, rozszerzających standardowe
możliwości języka. W przeciwieństwie do dialektów Xbase, Object Pascal od
zawsze - nawet w pierwszej wersji, jeszcze jako Turbo Pascal - pozwalał na
definiowanie funkcji i procedur.
Oto przykładowa funkcja w Object Pascalu:
function DodajVAT(Cena : Single) : Single;
const
Stawka = 0.22;
var
VAT : Single;
begin
VAT:=Cena * Stawka;
Result:=Cena+VAT;
end;
Wynik funkcji zwracany jest za pośrednictwem zmiennej result. W każdej
funkcji, zadeklarowanej w języku Object Pascal, dostępna jest wbudowana
zmienna result, która służy tylko i wyłącznie do przekazania wyniku do
[ Pobierz całość w formacie PDF ]