[ Pobierz całość w formacie PDF ]
funkcji w Clipperze. Jednak instrukcja ta jest w istocie zbędna, dzięki właściwościom
typu wariantowego Delphi. Ten sam podprogram można zatem zapisać prościej:
940
{Object Pascal}
Procedure DebugMsg(p1 : variant);
begin
ShowMessage('KOMUNIKAT KONTROLNY='+p1);
end;
DebugMsg(['POCZĄTEK PĘTLI']);
DebugMsg([4]);
VarType
Aby uzyskać informację o rzeczywistym typie zmiennej wariantowej, można
posłużyć się funkcją VarType. W tabeli A.23 zebrano możliwe wartości
wynikowe tej funkcji.
Tabela A.23. Wartości zwracane przez funkcję VarType.
Identyfikator
varEmpty
varNull
varSmallint
varInteger
varSingle
vrDouble
varCurrency
varDate
varOleStr
varDispatch
varError
varBoolean
varVariant
varUnknown
varByte
varString
varTypeMask
varArray
varByRef
Wartość
$0000
$0001
$0002
$0003
$0004
$0005
$0006
$0007
$0008
$0009
$000A
$000B
$000C
$000D
$0011
$0100
$0FFF
$2000
$4000
941
Wyszukiwanie w tabelach poindeksowanych
Odpowiednikiem znanego z Xbase polecenia SEEK jest w Delphi metoda LookUp
komponentu DataSet. Jednym z jej argumentów jest właśnie tablica wariantowa, której
zastosowanie omawiano w poprzednim punkcie. Poniższa przykładowa instrukcja
wyszukuje rekord w poindeksowanej tabeli, skojarzonej z komponentem Table1.
Table1.LookUp(’Nazwisko’,VarArrayOf([’KOWALSKI, JAN’]),
[foCaseInsensitive]);
Wyszukiwanie w tabelach nieindeksowanych
Metody LookUp i Locate, dostępne w Delphi, mogą również wykonywać
najprostszą operację wyszukiwania - w dialektach Xbase realizowaną poleceniem
LOCATE. Podobnie jak LOCATE, wspomniane metody działają niezależnie od
tego, czy tabela jest, czy też nie jest poindeksowana. Jednak w przeciwieństwie do
polecenia Xbase, LookUp i Locate korzystają z indeksu, jeśli jest on dostępny.
Dzięki temu w każdym przypadku można uzyskać maksymalną wydajność
wyszukiwania, nie tracąc przy tym nic z elastyczności.
Filtry
Mechanizm filtrowania bez użycia indeksu, analogiczny do realizowanego przez
SET FILTER TO, dostępny jest w Delphi za pośrednictwem filtrów lokalnych.
Aby uaktywnić filtr należy wpisać odpowiednie wyrażenie do pola atrybutu Filter,
a następnie przypisać wartość True atrybutowi Filtered komponentu DataSet.
Do filtrowania wierszy można też wykorzystać zdarzenie OnFilterRecord,
skojarzone z komponentem DataSet.
Iteracyjne przetwarzanie tabeli
Delphi jest środowiskiem programowania wizualnego, dlatego konieczność
iteracyjnego
przetwarzania
tabeli
zachodzi
tutaj
znacznie
rzadziej,
niż
w programach tworzonych przy użyciu narzędzi Xbase. Jednak w niektórych
sytuacjach nie da się uniknąć przetwarzania danych rekord po rekordzie, dlatego
poniżej porównamy odpowiednie metody postępowania w środowiskach Xbase
i w Object Pascalu.
Aby uzyskiwać dostęp do kolejnych rekordów w tabeli w języku Xbase stosuje się
konstrukcję zbliżoną do następującej:
USE C:\DATA\DELPHI\WORKORD\INVENT INDEX INVENT
SET ORDER TO INVNUM
GO TOP
DO WHILE .NOT. EOF()
SKIP
942
ENDDO
USE
UWAGA:
Najnowsze
wersje
wielu
dialektów
Xbase
oferują
konstrukcję
SCAN...ENDSCAN, która działa podobnie do pętli, przedstawionej powyżej,
i jest ogólnie szybsza.
Iteracyjne przetwarzanie tabeli w Object Pascalu realizuje się tak:
With Table1 do begin
Open; {Zakładamy, że komponent jest przygotowany do
użycia}
While not Eof do Next;
Close;
end;
Program w Delphi jest prostszy, gdyż nawet wówczas, gdy dane przetwarzane są
w programie rekord po rekordzie, większość czynności wstępnych da się
zrealizować w środowisku programowania wizualnego, w oknie Form Designer.
W szczególności można w ten sposób określić położenie katalogu i nazwę pliku
tabeli, identyfikator indeksu, itd. Wcześniejsze nadanie wartości True atrybutowi
Active komponentu Table wyeliminowałoby nawet konieczność otwierania
tabeli w czasie wykonywania programu.
Zapis w pliku tekstowym
Zapis w pliku tekstowym w środowisku Xbase wymaga kilku dodatkowych
zabiegów i odbywa się nie wprost, co ilustruje poniższy przykład:
SET ALTE TO "PLIK.TXT"
[ Pobierz całość w formacie PDF ]