Documente Academic
Documente Profesional
Documente Cultură
Până acum a fost uşor, dar nu este încă gata. Se poate observa însă că se pot folosi bare
de deplasare în tabel chiar şi în timpul creării. Mai sunt doar 4 paşi de făcut:
1
Fig nr. 1 Design-ul formei de preluare grafice dintr-un câmp al fişierului
Acum se rulează programul (Fig nr. 2 Preluare imagini grafice din fişierul DEMOS). Se
va putea apăsa orice buton de pe DBNavigator. Când se apasă pe butonul Next Record
(următoarea înregistrare), indicatorul de înregistrări se schimbă în DBTable şi imaginea
se schimbă în componenta DBImage (Fig nr. 3 Schimbând articolul se schimbă
imagineagrafică). Toate acestea fără a scrie nici o linie de cod.
EDITORUL DE CÂMPURI
3
Fig. nr.4. Editorul de câmpuri
Meniul Editorului de
câmpuri
După ce s-au adăugat câmpurile în şirul de date, se va putea apăsa pe orice câmp pentru
a-i modifica proprietăţile. Proprietăţile apar în Object Inspector, permiţând schimbarea
4
formatului de afişare, restricţiile de integritate, etichetele de afişare, sau alte
caracteristici ale câmpurilor.
Fig nr. 6 Modificarea proprietăţilor câmpurilor (Câmpul SIZE din tabelul activ)
Etape de lucru:
1. Se crează o nouă aplicaţie.
2. În varianta în care se doreşte compararea structurii iniţiale a fişierului selectat cu
o altă structură dorită de utilizator se vor plasa pe formă
componentele:ADOConnection(1), ADOTable(2), DataSource(2), DBGrid(2),
DBNavigator(2), Label(2), Button(1).
3. Se realizează conectările cunoscute.
4. Prin cel de-al doilea ADOTable se va realiza selectarea câmpurilor de editare. În
acest scop se va executa dublu click pe el având ca efect afişarea editorului de
câmpuri. Se deschide meniul editorului şi se selectează cîmpurile ce se doresc a
fi afişate cu opţiune ADD fields.
5. Opţiunea New Field permite adăugarea unui nou câmp prin intermediul ferestrei
New Field (Fig nr 7 Selectarea şi introducerea unui nou câmp cu Editorul de
Câmpuri).
6. În această fază s-a stabilit doar câmpul şi tipul acestuia urmând a fi încărcat
ulterior cu date.
7. Se închide Editorul de cîmpuri. În acest moment ADOTable2 va executa
selectarea doar a câmpurilor precizate în Editor.
8. La setarea proprietăţii Active pe True a lui ADOTabe2, în DBGrid2, dacă a fost
conectat la DataSource2, se vor afişa doar câmpurile selectate cu Editorul de
câmpuri (Fig nr 8 Vizualizarea câmpurilor selectate).
5
Fig nr 7 Selectarea şi introducerea unui nou câmp cu Editorul de Câmpuri
Clasa TDataSet
TDataSet este clasa din care provin şi TTable, TQuery şi TStoredProc. Aşadar,
majoritatea proprietăţilor, metodelor şi evenimentelor pe care aceste clase le folosesc
6
sunt de fapt definite de TDataSet. Deoarece atât de multe caracteristici ale claselor
derivate provin de la TDataSet, vom enumera aici doar cele mai importante proprietăţi,
metode şi evenimente ale TDataSet, iar mai târziu vom enumera proprietăţile, metodele
şi evenimentele particulare pentru fiecare clasă derivată.
Tabelul 1 conţine cele mai des folosite proprietăţi ale clasei TDataSet, tabelul.2
metodele principale şi tabelul 3 – evenimentele principale.
Preprietatea Descrierea
Active Deschide şirul de date când este setată pe True, şi îl închide când este
setată pe False
AutoCalcFields Determină când se calculează câmpurile de calculat
Bof Returnează valoarea True (adevărat) dacă cursorul este pe prima
înregistrare din şirul de date, şi False dacă nu e.
CachedUpdates Când este adevărată – True – actualizările sunt ţinute într-o memorie
cache de pe maşina clientului până când întreaga tranzacţie este
completă. Când este falsă – False – toate schimbările din baza de
date sunt făcute înregistrare după înregistrare.
CanModify Determină dacă utilizatorul poate modifica datele din şirul de date
DataSource Componenta DataSource asociată cu acest şir de date
DatabaseName Numele bazei de date care este folosită în acel moment
Eof Returnează True – adevărat – dacă cursorul este la sfârşitul fişierului
şi False dacă nu e
FieldCount Numărul de câmpuri din şirul de date. Deoarece şirul de date poate fi
dinamic (rezultatul unei interogări, de exemplu), numărul de câmpuri
poate varia de la o cerinţă din şirul de date la alta
Fields Un şir de obiecte TField care conţin informaţii despre câmpurile din
şirul de date
FieldValues Returnează valoarea câmpului specificat pentru înregistrarea curentă.
Valoarea este reprezentată de Variant
Filter O expresie care determină ce înregistrări conţine o bază de date
Filtered Când este True – adevărată – şirul de date este filtrat fie pe baza unei
proprietăţi Filter, fie pe baza unui eveniment OnFilterRecord. Când
este False, se returnează întregul şir de date
FilterOptions Determină modul în care sunt aplicate filtrele
Found Indică dacă o operaţiune de căutare s-a încheiat cu succes
Handle Un cursor BDE pentru şirul de date. Se foloseşte numai atunci când
se fac apelări directe către BDE
Modified Indică dacă înregistrarea curentă a fost modificată
RecNo Numărul înregistrării curente din şirul de date
RecordCount Returnează numărul de înregistrări din şirul de date
State Returnează starea curentă a şirului de date (dsEdit, dsBrowse,
dsInsert etc)
UpdateObject Specifică componenta TupdateObject care trebuie folosită pentru
actualizări de cache
UpdatesPending Când este pe True – adevărată – buffer-ul de actualizări de cache
conţime editări care nu au fost aplicate încă şirului de date
7
Tabelul 2. Metodele principale TDataSet
Metoda Descrierea
Append Crează o înregistrare goală şi o adaugă la sfârşitul şirului de date
AppendRecord Adaugă o înregistrare la sfârşitul şirului de date, cu datele câmpului
dat şi afişează editarea
ApplyUpdates Învaţă baza de date să aplice orice actualizări de cache în aşteptare.
Actualizările nu sunt scrise de fapt până când nu este apelată metoda
CommitUpdates
Cancel Anulează orice editare a înregistrării curente, dacă aceste editări nu au
fost încă afişate
CancelUpdates Anulează orice actualizări de cahce în aşteptare
Close Închide şirul de date
Delete Şterge înregistrarea curentă
DisableControls Dezactivează intrările pentru toate controalele de date asociate cu
şirul de date
Edit Permite editarea înregistrării curente
EnableControls Activează intrările pentru toate controalele de date asociate cu şirul
de date
FetchAll Ia toate înregistrările din şirul de date de la cursor până la sfârşit şi le
stochează local
FieldByName Returnează pointerul TField pentru un nume de câmp
FindFirst Găseşte prima înregistrare care se potriveşte cu criteriile de sortare
curente
FindNext Găseşte următoarea înregistrare care se potriveşte cu criteriile de
sortare curente
FindLast Găseşte ultima înregistrare care se potriveşte cu criteriile de sortare
curente
FindPrior Găseşte precedenta înregistrare care se potriveşte cu criteriile de
sortare curente
First Mută cursorul pe prima înregistrare din şirul de date
FreeBookmark Şterge un indicator plasat anterior cu GetBookmark şi eliberează
memoria alocată pentru indicator
GetBookmark Asociază un indicator înregistrării curente
GetFieldNames Generează o listă cu numele câmpurilor din şirul de date
GotoBookmark Plasează cursorul la înregistrarea indicată de indicatorul specificat
Insert Inserează o înregistrare şi pune şirul de date în mod de editare
InsertRecord Inserează o înregistrare în şirul de date cu datele câmpului date şi
afişează editarea
Last Poziţionează cursorul pe ultima înregistrare din şirul de date
Locate Caută o anumită înregistrare prin şirul de date
Lookup Localizează o înregistrare prin cele mai rapide mijloace posibile şi
returnează datele conţinute în înregistrare
MoveBy Mută cursorul cu un număr specificat de linii
Next Mută cursorul la următoarea înregistrare
Open Deschide şirul de date
Post Scrie datele din înregistrare editate în baza de date sau în bufferul de
actualizări cache
Prior Mută cursorul la înregistrarea precedentă
Refresh Actualizează datele şirului de date din baza de date
RevertRecord Când se folosesc actualizări cache, această metodă anulează
8
schimbările făcute anterior înregistrării, dar care nu au fost încă scrise
în baza de date
SetFields Stabileşte valori pentru toate câmpurile dintr-o înregistrare
UpdateStatus Returnează statutul curent de actualizare când actualizările cache sunt
activate
Evenimentul Descrierea
AfterCancel Generat după ce editările unei înregistrări sunt anulate
AfterClose Generat după ce un şir de date este închis
AfterDelete Generat după ce o înregistrare este ştearsă din baza de date
AfterEdit Generat după editarea unei înregistrări
AfterInsert Generat după inserarea unei înregistrări
AfterOpen Generat după editarea unei înregistrări
AfterPost Generat după ce schimbările unei înregistrări sunt afişate
BeforeCancel Generat înainte de anularea editărilor
BeforeClose Generat înainte de închiderea unui şir de date
BeforeDelete Generat înainte de ştergerea unei înregistrări
BeforeEdit Generat înainte de editarea unei înregistrări
BeforeInsert Generat înainte de inserarea unei înregistrări
BeforeOpen Generat înainte de deschiderea unui şir de date (între momentul în care Active este
setat pe True – este activat – şi momentul în care şirul de date este efectiv deschis)
BeforePost Generat înainte de afişarea editărilor în baza de date (sau actualizărilor cache)
OnCalcFields Generat când se generează calculele pentru câmpurile de calculat
OnDelete Error Generat când apare o eroare la ştergerea unei înregistrări
OnEditError Generat când apare o eroare la editarea unei înregistrări
OnFilterRecord Generat de fiecare dată când este accesată o nouă linie şi filtrul Filter este activat
(True)
OnNewRecord Generat când este adăugată o nouă înregistrare în şirul de date
OnPostError Generat când apare o eroare la afişarea editărilor unei înregistrări
OnUpdateError Generat când apare o eroare în timp ce actualizările de cache sunt scrise în baza de
date
OnUpdateRecord Generat când actualizările de cahce sunt aplicate înregistrării
Componenta Table
Clasa TTable are multe proprietăţi şi metode în plus faţă de clasa din care provine,
TDataSet. Tabelul 4 enumeră proprietăţile principale ale componentei TTable, iar
tabelul 5 metodele principale. De reţinut că, acestea sunt proprietăţi şi metode specifice
componentei TTable şi nu le includ pe cele ale celei din care provine, TDataSet.
În mare parte, proprietăţile şi metodele sunt foarte intuitive. Prin asta înţeleg că
puteţi să vă daţi seama singuri de ce face o proprietate sau metodă doar vazându-i
9
numele. Nu ia mult timp sa-ţi dai seama că metoda LockTable blochează tabelul pentru
folosirea specifică a aplicaţiei şi că UnlockTable deblochează înapoi tabelul. La fel, nu
trebuie să ai un coeficient de inteligenţă de 150 pentru a-ţi da seama ce fac metodele
CreateTable (crează tabel), DeleteTable (şterge tabel) şi RenameTable (redenumeşte
tabel). Având acestea în minte, nu voi acoperi toate aspectele fiecărei proprietăţi şi
metode enumerate mai jos. În schimb, vom vedea câteva aspecte mai interesante ale
componentei Table.
Proprietatea Descrierea
Exclusive Blochează un tabel local astfel încât numai această aplicaţie îl poate
folosi
IndexDefs Conţine informaţii despre indexurile de tabele
IndexFieldCount Numărul câmpurilor care formează cheia curentă
IndexFieldNames Folosit pentru a stabili cheia curentă prin specificarea numelor
câmpurilor de folosit pentru index
IndexFields Folosit pentru a obţine informaţii despre un câmp specific dintr-un
index
IndexName Folosit pentru a specifica un index secundar pentru un tabel
KeyFieldCount Numărul câmpurilor ce vor fi folosite pentru a căuta o cheie parţială
MasterFields Câmpul sau câmpurile care trebuie adăugate tabelelor master sau
detaliu
MasterSource Tabelul care va fi folosit ca tabel master când acest tabel este folosit
ca tabel detaliu
ReadOnly Indică dacă tabelul poate fi doar citit sau şi modificat
TableName Numele tabelului bazei de date
TableType Tipul tabelului (Paradox, dBASE sau ASCII)
Metoda Descrierea
AddIndex Crează un nou index pentru tabel
ApplyRange Aplică un interval şirului de date. Doar înregistrările din acest interval
(determinat de SetRangeStart şi SetRangeEnd) sunt disponibile pentru
vizualizare sau editare
BatchMove Mută înregistrările din şirul de date în tabel
CancelRange Înlătură orice interval activat pentru tabel
CreateTable Re-crează un tabel folosind noi informaţii
DeleteIndex Şterge un index secundar
DeleteTable Şterge un tabel
EmptyTable Şterge toate înregistrările dintr-un tabel
GetIndexName Generează o listă a tuturor indecşilor pentru un tabel
GotoKey Mută cursorul la înregistrarea indicată de cheia curentă
GotoNearest Mută cursorul la înregistrarea care se potriveşte cel mai bine la cheia
curentă
LockTable Blochează un tabel astfel încât alte aplicaţii să nu-l poată accesa
RenameTable Redenumeşte tabelul
SetKey Vă permite să stabiliţi chei pentru şirul de date
SetRange Stabileşte începutul şi sfârşitul intervalului pentru un şir de date şi
10
aplică intervalul. Această metodă realizează aceiaşi acţiune ca şi la
apelarea metodelor SetRangeStart, SetRangeEnd şi ApplyRange
SetRangeEnd Stabileşte sfârşitul întervalului
SetRangeStart Stabileşte începutul intervalului
UnlockTable Deblochează un tabel care a fost blocat iniţial cu LockTable
NOTĂ: După cum s-a văzut deja, proprietatea DatabaseName este folosită pentru a
selecta un alias BDE. Pentru bazele de date locale, mai bine decât să se selecteze un
alias din listă, se va putea introduce un director unde se găsesc fişierele bazei de date.
Proprietatea TableName va conţine atunci o listă de tabele de baze de date în acel
director.
Proprietăţile şi metodele TField sunt atât de numeroase încât nu le voi enumera pe toate
aici. În schimb, vă voi prezenta câteva moduri în care veţi folosi probabil TField şi
clasele sale corespondente.
Accesarea câmpurilor
Înainte de a obţine sau stabili valoarea câmpurilor, trebuie localizate câmpurile. Există
cel puţin trei feluri de a face acest lucru:
11
Accesarea unui câmp după numele pointerului este probabil cea mai puţin utilizată
metodă. Funcţionează doar dacă anterior s-au adăugat câmpuri folosind editorul de
câmpuri Fields Editor. Când se adăugă un câmp, prin internediul editorului de câmpuri,
Delphi crează un pointer pentru fiecare câmp prin combinarea numelui tabelului cu
numele câmpului. Dacă există un tabel numit Table1 şi un câmp şir numit FirstName,
Delphi va crea un pointer TStringField numit Table1FirstName. Se va putea folosi acest
pointer pentru a accesa un câmp:
Table1FirstName.Value:=’Persoana’;
Proprietatea Fields oferă încă un mod de a accesa un câmp după poziţia sa. Dacă se
cunoaşte că, câmpul LastName este primul câmp din tabel, se va putea folosi ceva de
genul următor:
Edit1.Text:=Table1.Fields[0].Value;
Din cele 3 moduri de accesare a câmpurilor, cea mai de încredere şi cea mai folosită este
metoda FieldByName. Folosind FiledByName, trebuie cunoscut numai numele
câmpului pentru a-l accesa:
Table1.FieldByName(’LastName’).AsString:=Edit1.Text;
FieldByName returnează un pointer TField. Pentru a-l face mai pe înţeles, se va sparge
codul următor în mai multe linii:
var
Field:TField;
Begin
Field:=Table1.FieldByName(’LastName’);
Field.AsString:=Edit1.Text;
End;
În cele mai multe cazuri, FieldByName este modalitatea de a merge mai departe. ......
Stabilirea valorii unui câmp este simplă când se cunoaşte secretul lui FieldByName:
12
Table1.Edit;
Table1.FieldByName(’LastName’).AsString:=Edit1.Text;
Table1.Post;
La început, metoda Edit este apelată pentru a pune tabelul în modul de editare.
Dacă nu se reuşeşte apelarea lui Edit, se va obţine o excepţie când se încearcă
modificarea valorii câmpului. După ce tabelul este pus în mod de editare, valoarea
câmpului este setată. În acest caz se va folosi proprietatea AsString în loc de Value.
Pentru un câmp şir, este acelaşi lucru în ambele cazuri. În sfârşit, metoda Post este
apelată pentru a posta editările în baza de date (sau actualizarea cache dacă
CachedUpdates este activată). Asta este tot.
Var
AcctNo:Integer;
Begin
AccNo:=Table1.FieldByName(’ACCT_NBR’).Value;
{mai multe linii de cod aici}
end;
Evenimentele TField
Procedure Tform1.Table1ACCT_NBRValidate(Sender:TField);
Begin
If Sender.AsInteger<3000 then
Raise EDBEditError.Create (‘Bad AccountNumber.’);
End;
13