Sunteți pe pagina 1din 13

Preluare imagini grafice prin intermediul tabelelor

Pentru a ilustra relaţionarea dintre componentele de acces la date şi componentele


de vizualizare a datelor se propune următorul exerciţiu. Se crează o nouă aplicaţie, dacă
Delphi rulează deja. În continuare se vor face următoarele etape:

1. Se va plasa componenta Table pe formă.

2. Pentru această componentă se va localiza proprietatea DatabaseName în


ObjectInspector şi se alege baza de date DBDEMOS.

3. Se va localiza proprietatea TableName şi se va alege tabelul ANIMALS.DBF.

4. În continuare se va pune o componentă DataSource pe formă căreia i se va seta


proprietatea DataSet pe Table1 (se alege Table1 din lista care apare în jos).
Sursa de date este acum conectată cu şirul de date (tabelul).

5. Pe formă se pune o componentă DBGrid şi se schimbă proprietatea DataSource


în DataSource1. Aceasta conectează tabelul cu sursa de date şi, indirect, cu
şirul de date.

6. Acum se spasă componenta Table de pe formă pentru a o selecta. Proprietatea


Active se schimbă în True – activare. În acest moment în tabel (Grid) vor fi
afişate datele preluate din baza de date DEMOS.

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. Se va plasa o componentă DBImage pe formă. Setările pentru această


componentă vor fi: proprietatea DataSource pe DataSource1, iar propritatea
DataField pe BMP (BMP este numele câmpului din tabelul ANIMALS.DBF
care conţine poza unui animal). Un peşte! Se dimensionează DBImage după
doriţă pentru a se potrivi cu dimensiunea imaginii care este afişată în
componentă.

2. Se plasează o componentă DBNavigator pe formă şi se setează proprietatea


DataSource la DataSource1.

3. Se plasează o etichetă cu scopul de a atribui nume formei. În ObjectInspector la


proprietatea Caption se scrie acest titlu (Preluare imagini grafice din fişier).

4. Se va plasa un buton căruia i se atribuie numele EXIT, avînd scopul de a reveni


din execuţia programului la DesignForm. În acest scop la codul porogram se va
scrie instrucţiunea:
Application. Terminate;
Designul formei realizate este conform Fig nr. 1 „Design-ul formei de preluare grafice
dintr-un câmp al fişierului”.

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.

Fig nr. 2 Preluare imagini grafice din fişierul DEMOS


2
Fig nr. 3 Schimbând articolul se schimbă imaginea grafică

Componentele de acces de date sunt folosite pentru a conecta o bază de date cu un


anumit tabel din baza de date. Componenta Table este folosită pentru a accesa tabelul
din baza de date. Acesta este cel mai simplu mod de a accesa datele din tabel.

EDITORUL DE CÂMPURI

Orice derivată a TDataSet (TTable, TQuery sau TStoredProc) acordă acces la


editor Fields Editor în momentul creării. Editorul de câmpuri permite să e selecteze
câmpurile care se doresc să fie incluse în şirul de date.
Pentru a apela editorul de câmpuri, se va executa click dreapta pe o componentă
Table (tabel), Query (interogare) sau StoredProc (proceduri stocate) din forma proiect şi
se alege din meniu opţiunea Fields Editor. Editorul de câmpuri este afişat. La început,
editorul de câmpuri este gol (Fig nr 4. Editorul de câmpuri), permiţând ca toate
câmpurile să fie incluse în şirul de date. Se pot adăuga câte câmpuri se doresc selectând
opţiunea Add Fields din meniul editorului de câmpuri. Acest meniu se obţine executând
click dreapta pe el. De asemenea, se pot crea noi câmpuri pentru tabel, alegând opţiunea
New Field din meniu. Figura nr. 5. „Meniul editorului de câmpuri” arată editorul de
câmpuri aşa cum se prezintă după adăugarea câmpurilor.

3
Fig. nr.4. Editorul de câmpuri

Meniul Editorului de
câmpuri

Fig nr. 5. 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)

Selectarea câmpurilor de editare

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

Fig nr 8 Vizualizarea câmpurilor selectate

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.

Tabelul 1. Proprietăţile principale ale TDataSet

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

Tabelul 3. Evenimentele principale TDataSet

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

Componenta Table, reprezentată de clasa TTable, oferă un acces simplu şi rapid la un


tabel. Tabelele sunt mai adecvate pentru majoritatea aplicaţiilor de baze de date simple.
De obicei, se va folosi componenta Table când se lucrează cu baze de date locale iar
componenta Query când se lucrează cu servere de baze de date SQL.

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.

Tabelul 4. Proprietăţile principale ale TTable

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)

Tabelul 5. Metodele principale ale TTable

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.

Se pot accesa proprietăţile lui TField în momentul creerii cu ajutorul


FieldsEditor. După ce s-au adăugat câmpuri, se va putea apăsa pe un câmp în editorul
de câmpuri iar proprietăţile pentru acel câmp vor fi afişate în ObjectInspector. Figura 5
prezintă editorul de câmpuri şi Object Inspector în timpul editării câmpurilor.

Fig nr. 7 Editorul de câmpuri şi Object Inspector

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:

• După numele pointerului său

• După proprietatea Fields a TDataSet

• După metoda FieldByName a TDataSet

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’;

Problema cu această abordare este că nu este necesar de fiecare dată să se adauge


câmpuri folosind editorul de câmpuri.

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;

Problema acestei abordări este, bineînţeles, că trebuie cunoscută ordinea exactă a


câmpurilor.

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. ......

Determinarea şi stabilirea valorilor câmpurilor

După ce s-a obţinut un pointer pentru un anumit câmp, se va putea schimba


valoarea acestuia folosind o proprietate Value sau orice altă proprietate As (prin
proprietate As înţelegând AsString, AsInteger, AsDateTime, AsBoolean etc). Aceste
proprietăţi realizează conversii de la un tip de date la altul. Bineînţeles, nu întotdeauna o
conversie poate fi făcută. De exemplu, dacă se încercă convertirea unui câmp şir de
caractere conţinând textul Popescu într-unul integer, va apărea o excepţie.

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.

Determinarea valorii unui câmp este la fel de uşoară:

Var
AcctNo:Integer;
Begin
AccNo:=Table1.FieldByName(’ACCT_NBR’).Value;
{mai multe linii de cod aici}
end;

Evenimentele TField

Evenimentele TField sunt OnChange şi OnValidate.

Evenimentul OnChange ….incomplet

Evenimentul OnValidate, pe de altă parte, apare doar înainte de a fi postate


datele. Dacă s-a creat un control de date pe o formă asociată cu un câmp, acel control
poate, în mod normal, să valideze datele. Dacă se va stabili valoarea unui câmp prin
intermediul codului, poate se va dori validarea datelor cu administratorul de evenimente
OnValidate. Acest eveniment este într-un fel ciudat, pentru că nu dă un parametru cu
care să se respingă o editare. În schimb, se va putea genera o excepţie dacă validarea dă
greş:

Procedure Tform1.Table1ACCT_NBRValidate(Sender:TField);
Begin
If Sender.AsInteger<3000 then
Raise EDBEditError.Create (‘Bad AccountNumber.’);
End;

Când se generează o excepţie, acţiunea de postare a datelor în baza de date este


întreruptă. Pentru a crea un administrator de evenimente în momentul creerii, trebuie
folosit editorul de câmpuri pentru a adăuga câmpuri în şirul de date. Apoi se se va putea
selecta câmpul în Fields Editor şi se va da dublu-click în Object Inspector lângă numele
evenimentului, la fel cum s-ar proceda pentru orice alt eveniment.

13

S-ar putea să vă placă și