Documente Academic
Documente Profesional
Documente Cultură
* Borland Delphi 3 *
* ABC-doar *
************************
*********************************
* autor RUSU MIRCEA AUREL VALER *
*********************************
**************************************************
* MOTTO: *
* "Les bons comptes font les bon amis." *
* *
**************************************************
Prezentare generala . . . . . . . . . . . . . . . . 1
Componente Standard . . . . . . . . . . . . . . . . 6
Componente Additional . . . . . . . . . . . . . . 14
Componente Win 32 . . . . . . . . . . . . . . . . 21
Componente System . . . . . . . . . . . . . . . . 31
Componente Internet . . . . . . . . . . . . . . . 33
Componente Dialogs . . . . . . . . . . . . . . . . 97
Grafica . . . . . . . . . . . . . . . . . . . . . 116
Concluzii . . . . . . . . . . . . . . . . . . . . 123
PREZENTARE GENERALA
-2-
Delphi este conceput in intregime pentru a satisface cat mai
eficient
necesitatile programarii orientate spre obiect.Spre deosebire de
Pascal,
tipul de data obiect este definit prin cuvantul cheie "class".Asadar,
obiectele sunt organizate ierarhic sub forma de clase.In rest,toate
caracteristicile obiectelor Windows din Pascal se intalnesc si in
Delphi;
mostenire,incapsulare,polimorfism etc.Un obiect declarat prin class
este
o structura de date in care se pot include campuri de date,metode si
proprietati.Obiectele de tip class pot fi declarate numai in
portiunea
de interfata a programului sau unitatii,in zona de declarare a
tipurilor
de data.Obiectele de tip class nu pot fi declarate in portiunea de
imple-
mentare,in zona de declarare a variabilele si nici in interiorul
functii-
lor sau al procedurilor.Vizibilitatea fiecarui component este
determinata
de specificatorul utilizat (published,public,protected,private sau
auto-
mated).Metodele declarate in obiecte de tip class pot fi
virtuale,dinami-
ce sau de tip mesaj,iar conventia utilizata pentru apelul lor poate
fi
de tip register,pascal,cdecl,stdcall sau safecall (conventia de apel
afecteaza ordinea in care se vor evalua parametrii functiilor).
Dar adevaratul progres,radical,introdus de programul
Delphi,consta
din interfata grafica si uneletele grafice de programare.Utilizand
aceasta
interfata se pot scrie aplicatii intregi,functionale,fara sa
introduceti
manual nici o singura linie de cod (intregul program poate fi generat
automat).Nu este nici practic,nici eficient,sa incercati sa
introduceti
manual toate liniile de cod (desi teoretic este posibil),decat in
cazul
in care este absolut necesar sa definiti noi tipuri de obiecte cu
metode
si proceduri diferite de cele predefinite.
Interfata grafica a programului contine in jur de 150 de obiecte
pre-
definite.Aceste obiecte sunt grupate in functie de utilitatea lor,in
subgrupuri
denumite:Standard,Additional,Win32,System,Internet,DataAccess,
DataControls,Decision Cube,QReport,Dialogs,Win3,1,Samples si ActiveX.
Fiecare obiect predefinit este prezent pe interfata sub forma unei
repre-
zentari grafice.La pornirea programului sunt afisate obiectele din
sub-
grupul Standard:
TMainMenu,TPopupMenu,TLabel,TEdit,TMemo,TButton,TCheckBox
TRadioButton,TListBox,TComboBox,TScrollBar,TGroupBox,TRadioGroup,TPanel.
Pentru a determina semnificatia fiecarui simbol grafic,tineti
indicatorul
mouse pe desenul respectiv,pana cand apare semnificatia acestuia,sau
efectuati deasupra simbolului un click de mouse,cu butonul drept si
apoi
alegeti optiunea Properties.Optiunea Properties va afisa o caseta de
dialog in care sunt incluse toate obiectele predefinite inpreuna cu
denumirea si simbolul grafic.In aceasta caseta,puteti chiar sa
redenumiti
obiectele,sa le stergeti din interfata sau sa adaugati altele
noi,etc.
Aceasta caseta de dialog,poate fi activata si din meniul principal
din
meniul Tools,selectand optiunea Enviroment Options si apoi
Pallette,sau
din meniul Component selectand optiunea Configure Palette.
Aceste obiecte predefinite au o semnificatie deosebita,deoarece
pro-
gramul include unelte de programare cu interfata grafica,capabile sa
asigure configurarea completa a fiecarui obiect precum si realizarea
legaturilor dintre obiecte (link-uri) astfel incat sistemul de mesaje
Windows sa functioneze fara eroare.
Pentru a afisa restul de componente,este suficient sa executati un
click de mouse pe subgrupul dorit(Exemplu: efectuati un click pe
subgru-
pul Data Acces si apoi pe subgrupul Data Controls,apoi pe Standard).
-3-
Restul optiunilor din meniul principal sunt relativ intuitive,sau
identice cu cele din Pascal.
La lansarea programului,pe ecran este afisata o fereastra de tip
Windows(care in Delphi se numeste Form) si un instrument de
programare
denumit Obiect Inspector.Daca deplasati putin fereastra
Form1,observati
o fereastra de editare,denumita Unit1.pas,care contine deja scheletul
pentru viitoarea unitate.In Delphi,toate programele se editeaza sub
forma de unitati.Programul editeaza automat si o fila de tip pascal
care apeleaza unitatea respectiva si respectiv o fila executabila in
care include automat toate componentele necesare.Asadar,programul
contine
inca de la lansare un obiect executabil.Pentru a verifica acest fapt,
din meniul Project,selectati Compile si apoi Run.Observati ca
fereastra
se schimba intr-o fereastra activa,cu butoane functionale.Inchideti
fereastra din butonul marcat cu x.
Cu ajutorul instrumentului denumit Object Inspector,puteti
configura
obiectul realizat dupa bunul plac.De exemplu,selectati proprietatea
Ctl3D si efectuati un click de mouse pe atributul True.Apasati
butonul
de navigare si selectati atributul False.Observati ca fereastra
tridi-
mensionala se transforma in fereastra bidimensionala.Executati Run si
apoi inchideti fereastra si reveniti la Ctl3D True.
Pentru a modifica dimensiunile ferestrei,modificati valorile din
campurile de proprietati denumite ClientHeight si ClientWidth
(Exemplu:
300 si 200).Pentru a modifica culoarea ferestrei,selectati
proprietatea
Color (Click pe campul clBtnFace) si alegeti culoarea dorita,de
exemplu
clAqua si apoi executati Run.Pentru a modifica numele
ferestrei,alegeti
proprietatea Caption,efectuati un click de mouse pe Form1,stergeti
titlul ferstrei si introduceti un nume nou.
In mod similar,se pot reconfigura toate proprietatile obiectului.
Observati ca fila de cod a ramas nemodificata.Toate schimbarile
efectuate
sunt pentru moment salvate doar in memoria de operare in fila alocata
pentru declararea obiectelor.Pentru ca aceste date sa ramana
definitive,
trebuiesc salvate in memoria definitiva.Pentru a forma un prim
proiect
Delphi,alegeti din meniul File optiunea Save As,creati un nou
director
cu ajutorul butonului special(folder-ul fara sageata) si denumiti
directorul cu un nume oarecare,de exemplu Prj1.Deschideti directorul
nou format si salvati fila cu un nume oarecare,de exemplu Test1.Apoi
tot din meniul File,alegeti optiunea Save Project As si salvati
proiectul
cu un nume oarecare,de exemplu Proiect1.Acum fereastra nou creata a
fost
salvata definitiv si va putea fi deschisa oricand cu optiunea Open
din
meniul File.Pentru a va asigura ca programul este complet si corect,
selectati din nou Compile din memiul Project,apoi Build All si apoi
Information.
Pentru a verifica munca efectuata,inchideti programul Delphi si
din
Windows deschideti directorul nou creat(Prj1).Daca totul este corect,
in directorul d-voastra se gasesc nu mai putin decat zece
file.Alegeti
View si Details si observati extensiile si dimensiunile filelor.Fila
executabila contine un icon sub forma de torta si este din tipul
Appli-
cation.In rest observati o fila de tip .pas,o fila de tip Delphi
Pascal
Unit,o fila Delphi Form File,o fila de resurse.Remarcati fila cu
extensia
~DP,care contine fila de tip pas prin care se apeleaza unitatea nou
formata si fila Delphi Form (cu extensia dfm,contine definita
obiectelor).
-4-
Primul proiect Delphi realizat de d-voastra contine deja zece file
fara sa fi fost nevoie sa scrieti o singura linie de cod.Proiectul
este
grupat in module cu functii diferite,astfel incat sa fie cat mai usor
de
depanat,modernizat sau transformat.Principalele file sunt
test1.pas,care
contine definitia unitatii(unit Test1) si respectiv fila
project1.dpr,
care contine fila program cu ajutorul careia se va apela unitatea.
In fila test1.dfm regasiti toate proprietatile obiectelor definite
in
configuratia actuala.Restul filelor contin informatii generate in
cursul
procesului de compilare si respectiv o fila de resurse in care este
arhivat icon-ul principal al aplicatiilor Delphi.Fila tip
Aplicatie,cu
extensia .exe,contine toate datele necesare pentru executie si poate
fi
apelata si executata si din afara programului Delphi.
Pentru a modifica proiectul,deschideti din nou programul Delphi
si
apoi deschideti noul proiect(Prj1) cu optiunea Open din meniul File.
In caseta de dialog vor figura cele doua file esentiale:Project1 si
Test1
(pentru a vedea si restul filelor,modificati in Files of type din
Delphi
file(*.pas,*.dpr) in Any file(*.*) ).Selectati fila Project1 si
efectuati
un dublu click.Fila Project1.dpr va fi deschisa pe ecran,iar
proiectul va
putea fi executat cu Run.Apoi,tot cu Open din meniul File,deschideti
si
fila Test1.pas.Acum fereastra aplicatiei este afisata pe ecran si
poate
fi reconfigurata.In plus,fereastra de dialog din background contine
ambele file de cod(pot fi comparate,evaluate,rescrise etc).
Pentru a modifica putin proiectul,putem sa adaugam un buton
functional.
Pentru a adauga un buton,selectati cu mouse simbolul grafic al
butonului
pe care scrie OK (reprezentat in meniu sub System si
Internet).Executati
un click de mouse pe simbolul grafic,apoi un click de mouse in
fereatra
aplicatiei,in locul in care doriti sa adaugati butonul.Observati ca
in
fereastra apare un buton,iar in Object Inspector apar proprietatile
acestuia.Daca doriti,redimensionati butonul.Pentru a redenumi butonul
modificati campul Caption din Object Inspector.Acum butonul este
prezent,
dar nu executa nici o operatie.Pentru a asocia o procedura cu
butonul,
selectati din Object Inspector meniul Events,apoi efectuati un dublu
click
de mouse in caseta goala denumita On Click.In caseta va aparea numele
procedurii adaugate (Button1Click) iar in fila Unit1.pas se va insera
declaratia procedurii.Acelasi rezultat se poate obtine pur si simplu
efectuand un dublu click pe buton,dar este mai bine sa va obisnuiti
sa
lucrati cu meniul Events,care gestionaeaza toate operatiile efectuate
de
obiectul respectiv.
Procedura adaugata automat va fi scrisa astfel:
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
Pentru a desemna o operatie,sau un grup de operatii asociate cu
apasarea
butonului nu trebuie decat sa introduceti comenzile si instructiunile
in
interiorul buclei begin...end.
Cel mai simplu buton este cel de inchidere a ferestrei.Pentru
asta,
schimbati textul butonului din Button1 in EXIT (in Caption) si apoi
introduceti in procedura TForm1.ButtonClick comanda Close.
Compilati si executati cu Run.Acum fereastra d-voastra contine si
un buton functional,denumit EXIT,care inchide fereastra.
-5-
Fila de tip unit,generata automat,va arata acum astfel:
unit Test1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ButtonClick(Sender:TObject);
begin
Close;
end;
end.
Observati ca fila generata automat contine si toate unitatile
necesare
pentru a putea utiliza oricare dintre componentele predefinite.Pentru
proiectul d-voastra nu sunt necesare toate aceste unitati.Daca dotiti
sa fiti extrem de exact,sau daca doriti sa faceti economie de spatiu,
puteti elimina unitatile care nu sunt necesare.Proiectul va functiona
la fel de bine si cu o linie de genul:
uses Forms,StdCtrls,Controls,Classes;
Aceasta operatie este utila atunci cand genrati sute sau mii de
astfel
de obiecte,caz in care memoria economisita devine semnificativa.
Fila Project1 va arata astfel:
program Project1;
uses
Forms,
Test1 in 'Test1.pas';
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end.
Observati ca metodele obiectului sunt putin diferite fata de
TApplication
din Pascal.In plus,daca scrieti manual cele doua file si le
compilati,
proiectul nu va fi functional.Pentru a fi activ,va trebui sa editati
si
fila de proprietati in care sa configurati toate proprietatile
obiectului
(adica operatiile efectuate automat de catre Object Inspector).
Acum puteti lansa proiectul direct din Windows (selectati
Project1.exe).
-8- Standard -
TMAINMENU
Pentru a edita un meniu,puteti utiliza componentul TMainMenu
(primul
din lista de obiecte Standard).In acest sens,deschideti o noua
fereastra
Form,salvati fereastra intr-un director (Prj4) si apoi salvati
proiectul
(Proiect4).Tastati F9 pentru a verifica daca fereastra este activa.
Inchideti fereastra,selectati TMainMenu cu un click de
mouse,apoi,un
click de mouse in Form.Pentru a edita meniul,executati un dublu click
pe
TMainMenu.Delphi va afisa un instrument de editare denumit
Form1.MainMenu1
sub forma unei ferestre mai mici in care apare un dreptunghi
albastru.
Daca doriti sa editati un meniu Standard,puteti utiliza unul dintre
meniurile predefinite.In acest caz,efectuati un click de mouse cu
butonul
drept in dreptunghiul albastru si apoi selectati Insert From
Template.
Dintre optiunile oferite alegeti MDI Frame Menu si apoi OK.Pentru a
defini procedura asociata fiecarei optiuni,executati un dublu click
pe
optiunea respectiva.De exemplu,executati un dublu click pe EXIT,apoi
introduceti in procedura editata automat Close.Tastati F9,sau
compilati
si construiti cu Build All,apoi executati cu Run.Fereastra d-voastra
va
contine un meniu MDI Standard,in care butonul Exit este deja
functional.
Pentru a edita un meniu personalizat,procedati in mod
similar.Salvati
o fila noua un directorul Prj6,apoi salvati
proiectul,compilati,selectati
si adaugati in Form un obiect TMainMenu,executati un dublu click pe
TMainMenu.In obiectul de editare afisat,executati un click de mouse
in
dreptunghiul albastru,apoi introduceti in Object Inspector,in campul
de-
numit Caption numele meniului dorit: de exemplu Meniu1 si apoi
tastati
Enter.Observati ca apare un nou dreptunghi.Selectati noul dreptunghi
cu
un click de mouse,apoi introduceti in Caption numele noului meniu: de
exemplu Meniu2.Repetati operatia pentru Meniu3 si Meniu4.
Pentru a introduce lista de optiuni a fiecarui meniu,selectati cu
mouse
meniul respectiv :de exemplu Meniu1.Observati ca sub meniu apare un
buton
gol.Selectati butonul cu un click de mouse si introduceti in Caption
nu-
mele optiunii: de exemplu EXIT.Apoi pentru a asocia o procedura cu
optiu-
nea respectiva,efectuati un dublu click pe butonul respectiv.De
exemplu
un dublu click pe butonul EXIT din Meniul1 la care introduceti in
proce-
dura editata automat Close.Apoi Compilati si executati cu Run(sau
F9).
Este extrem de simplu si rapid.Daca nu sunteti hotarat cum anume
doriti
sa arate meniul editat,puteti sa exersati intr-o fereastra de
editare,
fara ca sa salvati proiectul.Programul isi gestioneaza singur
instantele
si codurile de identificare (TAG).Nu trebuie decat sa programati
procedu-
rile si functiile asociate fiecarei optiuni.
Pentru meniurile Popup se procedeaza absolut identic.Se
selecteaza un
obiect de tip TPopup si se defineste la fel ca si un meniu.Meniurile
popup
nu sunt afisate direct.Pentru a putea fi utilizate trebuiesc asociate
cu
un control oarecare si apoi activate cu un click de mouse cu butonul
drept
Exemplu: editati un meniu Popup si adaugati in fereastra si un buton
OK.
Selectati butonul Ok si in Object Inspector alegeti proprietatea
PopupMenu
si setati valoarea acesteia la PopupMenu1.Apoi tastati F9.Pentru a
putea
utiliza meniul popup efectuati un click de mouse cu butonul drept pe
butonul OK.
Efectuati cateva exercitii cu meniuri si meniuri Popup,pana cand
va
familiarizati cu modul de editare (fara sa salvati
proiectele).Meniurile
simple sunt mai usor de implementat si mai sigure.Meniurile popup pot
fi amplasate in orice pozitie si pot fi "ascunse" fata de
utilizatori.
-11- Standard -
TGROUPBOX
Urmatoarele obiecte: TGroupBox,TRadioGroup si TPanel,se utilizeaza
pentru a grupa doua sau mai multe obiecte,de acelasi fel,sau
diferite.
Obiectul care incadreaza obiectele componente poarta numele de
parinte si
adauga un set suplimentar de proprietati si metode,care diversifica
paleta
de optiuni.
Pentru exemplificare,putem utiliza un obiect TGroupBox pentru a
grupa
un buton TCheckBox si un buton TRadioButton,astfel;
Salvati o fila noua si proiectul intr-un director nou (Prj9).
Adaugati in Form1 un obiect de tip TGroupBox si redimensionati
obiectul.
In GroupBox1,adaugati un obiect TCheckBox iar langa el un obiect
TLabel
si sub acestea un obiect TRadioButton,apoi un alt obiect TLabel
astfel
incat obiectele TLabel sa descrie starea butonului.
In Object Inspector redenumiti campurile TLabel in "Neselectat" si
respectiv "Liber".
Apoi selectati butonul ChecBox1 si in Events executati un dublu
click
in On Click.Apoi redeclarati procedura TForm1.FormClick astfel:
procedure TForm1.Click(Sender:TObject);
begin
if CheckBox1.Checked = False then
Label1.Caption:='Neselectat';
if CheckBox1.Checked = True then
Label1.Caption:='SELECTAT';
end;
Tastati F9 si verificati butonul.Selectati si deselectati butonul
dupa
care efectuati un click in fereastra in orice alta pozitie.In mod
normal
campul TLabel1 va afisa starea butonului.
Pentru a activa si cel de al doilea buton,inchideti fereastra
activa,apoi
selectati in Form1 butonul RadioButton1.In Events din ObjectInspector
efectuati un dublu click in OnClick,apoi redeclarati procedura
adaugata
automat astfel:
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if RadioButton1.Checked = False then
Label2.Caption:='Liber';
if RadioButton1.Checked = True then
Label2.Caption:='ACTIVAT';
end;
Tastati F9 si apoi verificati butonul.In mod normal,in momentul in
care
selectati butonul radio,campul Label2 va afisa starea ACTIVAT.
In continuare,explorati restul de proprietati si metode oferite de
obiectul TGroupBox.
De exemplu modificati putin schema de culori.Pentru GroupBox1 alegeti
in
Obiect Inspector culoarea clLime (din Color),pentru CheckBox1 alegeti
culoarea clAqua iar pentru RadioButton1 alegeti culoarea clFuchsia.
In continuare,puteti modifica si culoarea ferestrei Form1 in
clTeal.
Executati cu Run aplicatia,apoi modificati schema de culori dupa
bunul
plac.
Proprietatile si metodele adaugate de TGroupBox sunt de fapt cele
mostenite de la ancestorii:
TCoustomGroupBox,TCustomControl,TWinControl
TControl,TComponent,TPersistent si TObject.Observati cat de flexibila
si
totusi cat de facila este programarea acestor obiecte.
-12- Standard -
TRADIOGROUP
TRadioGroup este un obiect specializat pentru gruparea butoanelor
de
tip radio,care pot functiona asincron in cadrul acestui
obiect.Butoanele
de tip radio incluse in acest tip de obiect vor forma un grup,in care
in momentul selectarii unui buton,restul butoanelor sunt deselectate
automat (proprietatea Checked devine False).Din acest motiv,intr-un
obiect de tip TRadioGroup,doua butoane nu pot fi selectate simultan
ci
doar alternativ.Pentru a adauga butoane se poate utiliza Items din
Object
Inspector iar pentru a determina care dintre butoane este selectat se
poate utiliza ItemIndex.
Un exemplu simplist este urmatorul:
Salvati o fila noua si salvati proiectul (in directorul Prj10).
Introduceti in Form un obiect de tip TRadiogroup si utilizati Height
si
Width pentru a redimensiona obiectul(sau trageti cu butonul mouse
apasat
de patratelele afisate pe marginea obiectului).
Introduceti in RadioGroup1 trei obiecte de tip TRadioButton.Apoi
efec-
tuati un click pe fiecare din cele trei butoane iar in Events din
Object
inspector efectuati un dublu click in OnClick.
Redeclarati cele trei proceduri astfel:
implementation
{$R *.DFM}
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if RadioButton1.Cheched = True then
begin
RadioButton1.Caption:='SELECTAT';
RadioButton2.Caption:='Neselectat';
RadioButton3.Caption:='Neselectat';
end;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
if RadioButton2.Checked = True then
begin
RadioButton2.Caption:='SELECTAT';
RadioButton1.Caption:='Neselectat';
RadioButton3.Caption:='neselectat';
end;
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
if RadioButton3.Checked = True then
begin
RadioButton3.Caption:='SELECTAT';
RadioButton1.Caption:='Neselectat';
RadioButton2.Caption:='Neselectat';
end;
end;
Tastati F9 si apoi selectati alternativ cele trei butoane.Pentru a
schimba
fonturile,alegeti +Font din Object Inspector,clic pe butonul cu trei
puncte si alegeti Bold,size 12,color Red.Tastati F9 si verificati
noua
configuratie.In continuare,puteti selecta toate optiunile dorite.
-15- Additional -
TMASKEDIT
Repetati operatia pentru butonul al doilea si redefiniti procedura:
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
SpeedButton1,Free;
end;
Acest buton va sterge primul buton din aplicatie.
Repetati operatia pentru butonul al treilea (Click in On Click),apoi:
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
SpeedButton2.Free;
SpeedButton4.Show;
end.
Acest buton va sterge butonul al doilea si va reafisa butonul al
patrulea.
In final,activati si butonul al patrulea si redefiniti procedura:
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
Close;
end.
Tastati F9 si rulati aplicatia.Apasati pe rand cele patru butoane.
Daca doriti sa utilizati un buton pentru a introduce butoane
noi,trebuie
sa includeti in program un constructor,care va fi apoi apelat cu
Create.
-22-
EXEMPLU:
Salvati o fila noua si proiectul in Prj22.
Selectati din Win32 si adaugati in Form un obiect de tip
TPageControl.
Ajustati dimensiunile,apoi executati un click de mouse cu butonul
drept,
in mijlocul obiectului si alegeti New Page.Repetati operatia pana
cand
adaugati numarul necesar de obiecte.
Apoi executati un click de mouse pe primul dosar (denumit
TabSheet1)
si apoi in mijlocul dosarului selectat.In Object Inspector se vor
afisa
proprietatile obiectului TabSheet1.Alegeti Caption si redenumiti
dosarul
dupa bunul plac (este bine ca primul dosar sa ramana liber).Apoi
repetati
operatia pentru fiecare dosar si atribuiti un nume (Exemplu:
fila1,fila2,
fila3,fila4 etc.).
Acum puteti atribui cate o operatie pentru fiecare dosar.Pentru
a
putea evidentia operatia executata,adaugati si un obiect de tip
TLabel.
Apoi selectati primul dosar (fila1) si executati un click in
mijlocul
sau.In Object Inspector va fi afisat obiectul TabSheet2.Alegeti
Events
si apoi OnMouseDown si executati un dublu click.Redefiniti
procedura:
procedure TForm1.TabSheet2MouseDown(Sender:
TObject;Button:TMouseButton;
X,Y:
Integer);
begin
Label1.Caption:='fila1';
end;
Selectati al doilea dosar (fila2).In Object Inspector se vor afisa
pro-
prietatile obiectului TabSheet 3.Alegeti Events si apoi dublu click
in
OnMouseDown si redefiniti a doua procedura astfel:
procedure TForm1.TabSheet2MouseDown(Sender:
TObject;Button:TMousebutton;
X,Y:
Integer);
begin
Label1.Caption:='fila2';
end;
Repetati operatia pentru fiecare dosar si redefiniti procedurile.
Tastati F9 si executati aplicatia.
Pentru a observa operatia efectuata,selectati unul dintre dosare
astfel
incat sa fie in prim plan,apoi executati un click de mouse in
mijlocul
dosarului.In mod normal,in TLabel 1 se va afisa numele dosarului
res-
pectiv (cel atribuit prin Label1.Caption:=...).
In mod similar,se poate asocia fiecare dosar din fisier cu o fila
de
tip text,cu un program executabil sau cu o casta de dialog care in
mo-
mentul respectiv nu este vizibila in fereastra dar poate fi activata
cu ajutorul procedurii MouseDown.
Daca doriti sa atribuiti si operatii comune pentru toate dosarele,
selectati obiectul TPageControl (astfel incat in Object Inspector
sa fie afisat PageControl impreuna cu proprietatile sale si apoi
alegeti
din Events OnChange,sau oricare dintre evenimentele asociate acestui
obiect.Redefiniti procedura adaugata automat.Operatiile definite in
aceasta procedura vor fi efectuate la selectia oricaruia dintre
dosarele
din obiectul TPageControl.
La prima vedere pare destul de complicat,dar dupa cateva exercitii
simple exploatarea acestui tip de obiect devine destul de usoara.Nu
cititi textul acestui manual,fara sa executati in paralel si
operatiile
descrise.Acest abecedar se bazeaza pe exemple,si pe inteligenta d-
voastra.
-23- Win32 -
TIMAGELIST
TImageList este un obiect destinat pentru a arhiva imagini de tip
bitmap,icon sau metafile,sub forma de colectii,cu conditia ca aceste
imagini sa fie de dimensiuni identice.Ca rezultat,TImageList va grupa
imagini stocate la adrese diferite,utilizand un singur cod intern
handle.
Imaginile pot fi apoi afisate cu ajutorul unui obiect de tip
TImage,cu
ajutorul numarului de indexare din obiectul TImageList.
EXEMPLU:
Salvati o fila noua si proiectul in Prj23.
Daca doriti,utilizati din meniul Tools,utilitarul Image Editor pentru
a
arhiva in Prj23 cateva imagini Bitmap realizate de d-voastra.
Adaugati in Form un obiect de tip TImageList,redimensionati valorile
Height si Width la 100(valoarea implicita este 16) si apoi efectuati
un
click de mouse cu butonul drept,pe aria obiectului ImageList1.Alegeti
optiunea Image List Editor si utilizati caseta de dialog pentru a
adauga
cateva obiecte(cele realizate de d-voastra,sau Cus1...Cus5 din
Demos/Data)
Pentru a vizualiza imaginile adaugati in Form si un obiect TImage.
Pentru a controla evenimentele,adaugati patru butoane,numerotate
de la
1 la 4 si apoi selectati pentru fiecare buton Events si OnClick.
Redefiniti cele 4 proceduri astfel:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Image1.Picture:=nil;
ImageList1.Draw(Image1.Canvas,1,1,0);
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Image1.Picture:=nil;
ImageList1.Draw(Image1.Canvas,1,1,1);
end;
procedure TForm1.SpeedButton3.Click(Sender: TObject);
begin
Image1.Picture:=nil;
ImageList1.Draw(Image1.Canvas,1,1,2);
end;
procedure TForm1.SpeedButton4.Click(Sender: TObject);
begin
Image1.Picture:=nil;
ImageList1.Draw(Image1.Canvas,1,1,3);
end;
Tastati F9 si executati aplicatia.Fiecare dintre cele patru butoane
va
afisa in TImage o imagine diferita.In mod similar,puteti afisa toate
cele patru imagini simultan.In acest caz,trebuie sa extindeti mult
aria
obiectului TImage si apoi sa utilizati pentru functia Draw coordonate
axiale diferite (Exemplu: 1,110,210 si 310).
Obiectul TImageList poate grupa atat imagini de tip bitmap cat si
icon si metafile,in acelasi obiect.Este foarte usor de utilizat si
determina si o economie semnificativa de memorie.Este foarte util mai
ales atunci cand doriti sa extrageti doar un grup de imagini din mai
multe baze de date continand arhive intregi.
Se poate utiliza si pentru a gestiona icon-urile dintr-o bara de
tip
toolbar sau dintr-un obiect complex de tip TPanel,etc...
-24- Win32 -
TRICHEDIT
TRichEdit este un obiect destinat pentru redactarea unor texte.
Spre deosebire de TMemo,TRichEdit permite utilizarea unor fonturi
diferite
de cele implicite,modificarea dimensiunii,a culorii sau a stilului
etc.
Obiectul detine proprietati si metode proprii specializate pentru
perso-
nalizarea textului editat.Dintre metode,trebuie remarcata procedura
Print
care permite imprimarea instantanee a textului din obiect,fara a mai
fi
necesara salvarea in memorie sau formatarea sub forma de fila,etc.
Se poate utiliza pentru includerea in aplicatii a unei facilitati de
editare si imprimare rapida a textelor.
EXEMPLU:
Salvati o fila noua si proiectul in Prj24.
Adaugati in Form un obiect de tip TRichEdit si alegeti dimensiunile
dorite
apoi adaugati patru butoane.Selectati primul buton,denumiti butonul
Font14
apoi atribuiti acestui buton urmatoarea procedura (OnClick):
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
RichEdit1.Font.Size:=14;
end;
Selectati cel de al doilea buton.Redenumiti butonul in Font18
red,apoi
atribuiti acestui buton evenimentul OnClick:
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
RichEdit1.Font.Size:=18;
RichEdit1.Font.Color:=clRed;
end;
Pentru a putea imprima datele,selectati butonul al treilea,redenumiti
in
Caption butonul cu numele de Imprimare,apoi atribuiti acestui buton
urmatoarea procedura:
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
RichEdit1.Print('Text:');
end;
Pentru cel de al patrulea buton,redenumit Sterge,se poate atribui
urma-
toarea procedura:
procedure TForm1.Speedbutton4Click(Sender: TObject);
begin
RichEdit1.Clear;
end;
Tastati F9 si executati aplicatia.
Aveti de ales dintre trei dimensiuni diferite ale fonturilor si
dintre
cele doua culori (negru sau rosu).In mod similar,puteti introduce
butoane
de setare a caracterelor fonturilor,astfel incat sa corespunda cu
nece-
sitatile sau cu tabieturile d-voastra.
Un astfel de obiect este foarte usor de realizat si asigura o
impor-
tanta economie de memorie atunci cand doriti sa includeti si un
editor de
text in aplicatia produsa.
Puteti utiliza acest obiect si pentru a salva filele
editate,pentru
a arhiva date cu un format fix,pentru a introduce titlul sau antetul
in
file care urmeaza sa fie editate ulterior,etc.
Mai mult,puteti utiliza metoda RegisterConversionFormat pentru a
face
conversii intre formatul original al filelor si cel editat de d-
voastra.
-27- Win32
-TANIMATION,TDATETIMEPICKER
TAnimation este un obiect destinat pentru vizualizarea clipurilor
video
de tip AVI (Audio Video Interleaved).Desi clipurile contin si
sunet,acest
obiect nu poate reda decat componenta video.Clipurile sunt formate
din
imagini de tip bitmap,care se succed cu o anumita frecventa,pentru a
forma un efect de animatie.TAnimation accepta orice clip AVI in care
filele nu sunt comprimate sau au fost comprimate cu RLE(run-length
enco-
ding).Daca s-a utilizat orice alt tip de compresie,clip-urile vor fi
decomprimate inainte de a fi apelate.
EXEMPLU:
Adaugati in Form un obiect de tip TAnimate.Alegeti din Object
Inspector
FileName si selectati Demos/Coolstuf/Cool.Setati apoi Repetitions la
valoarea 10 si Active la valoarea True.Tastati F9 si observati
efectul
de animatie.
Daca doriti un program mai complex,puteti sa adaugati un numar de
bu-
toane prin care sa controlati modul de executie.Atribuiti fiecarui
buton
una dintre proprietatile obiectului TAnimate,astfel incat sa
realizati
un panou de comanda.Pentru a porni sau opri executia,puteti utiliza
proprietatea Active (True sau False) iar pentru a specifica numarul
de
operatii efectuate,puteti utiliza Repetitions.Pentru a redimensiona
auto-
mat dimensiunea obiectului se poate utiliza AutoSize iar pentru a
speci-
fica imaginea de la care incepe si respectiv cea cu care se termina
clipul puteti utiliza StartFrame si StopFrame,etc...(Vezi Prj29).
TDateTimePicker este un obiect specializat pentru preluarea de date
in
format de data calendaristica sau respectiv de tip ora/minut/secunda.
Cu ajutorul acestui obiect puteti selecta,sau puteti seta si reseta
data sau ora si apoi puteti utiliza o metoda a obiectului pentru a
arhiva informatia respectiva.In momentul executiei,obiectul afiseaza
data
curenta.Din Object inspector puteti selecta modul de afisare prin
pro-
prietatea DateMode.Daca doriti sa afisati date de tip orar,selectati
din
Kind tipul dtkTime.Restul proprietatilor sunt pentru configurarea
dimen-
siunilor,culorilor fonturilor etc.
EXEMPLU:
Adaugati in Form un obiect de tip TDateTimePicker.Alegeti pozitia
dorita si setarile preferate (Exemplu fonturi size 18).Tastati F9
si apoi apasati butonul de navigare.Din obiectul afisat,alegeti data
dorita.Daca doriti ca data sa fie afisata in format complet,alegeti
din
DateFormat optiunea dfLong.
Pentru a arhiva datele,puteti utiliza metoda GetTextBuf.In
exemplul
de mai sau,adaugati un buton si un camp TLabel(Standard).Redenumiti
bu-
tonul si atribuiti acestui buton o procedura de genul:
procedure TForm1.Button1Click(Sender: TObject);
var tampon: PChar;
nr:integer;
begin
tampon:=' ';
nr:=DateTimePicker1.GetTextBuf(tampon,24);
Label1.Caption:=tampon;
end.
Tastati F9 si executati proiectul(vezi si Prj30).Datele preluate pot
fi
introduse in textul editat sau pot fi utilizate pentru operatii
matematice.
-33- Internet
Urmatoarea paleta de componente,denumita Internet,contine un grup
de
obiecte specializate pentru facilitarea programarii de
aplicatii,pentru
reteaua Internet.Desi simplifica foarte mult munca de
programare,aceste
obiecte (in versiunea Delphi 3) nu sunt inca complet automatizate si
necesita un minimum de cumostiinte despre protocoalele de comunicatie
specifice muncii in retea.
Daca sunteti conectat la reteaua Internet si aveti o adresa
IP,puteti
sa utilizati adresa proprie pentru a nu deranja pe nimeni din
retea.Daca
nu sunteti conectat,este preferabil sa exersati aceste componente
intr-o
retea locala,special conceputa (fara sa fie conectata la Internet).
Obiectele din aceasta paleta,utilizeaza protocolul de comunicatie
de
tip TCP/IP.Pentru a apela aceste obiecte,este necesar ca acest
protocol
sa fie instalat pe calculator (chiar daca nu sunteti conectati la
retea).
Daca sunteti incepator,este recomandabil sa nu exersati aceste
componente
decat dupa deconectarea de la retea.
Adresele IP sunt formate din patru numere cu valoare cuprinsa
intre
0 si 255 (w,x,y,si z) dispuse astfel: w.x.y.z.Exista un grup destul
de
mare de astfel de adrese,care a fost rezervat special pentru retelele
de
calculatoare care nu vor fi conectate niciodata la Internet.Aceste
adrese
sunt definite prin documentul RFC 1918 si sunt excluse din
principalele
centrale al retelei Internet,astfel incat este exclusa interferenta
accidentala cu retelele reale.
Aceste adrese sunt: de la 10.0.0.0 la 10.255.255.255 (clasa
A)
de la 172.16.0.0 la 172.31.255.255 (clasa
B)
de la 192.168.0.0 la 192.168.255.255(clasa
C)
Pentru scopuri didactice,este indicat sa utilizati o retea
locala,fara
conexiune cu reteaua Internet,in care terminalele utilizeaza adrese
IP
din grupul de mai sus.In acest caz,chiar daca reteaua va fi cuplata
accidental la Internet,se exclud posibilele interferente.
Pentru exemplele din manual,am utilizat o adresa IP fictiva
10.10.10.10
intr-o retea locala,necuplata la Internet.
Obiectele din acest grup au fost inlocuite in versiunile recente
prin
versiuni mai performante,astfel incat utilizarea lor este din ce in
ce
mai rara.In acest manual,vor fi prezentate doar orientativ,la nivel
ele-
mentar.Programul Delphi 3 contine si cateva exemple functionale,in
directorul Demos/Internet.
-34- Internet -
ClientSocket
Puteti utiliza aceste obiecte pentru a programa aplicatii Web,char
daca nu sunteti experti in comunicatii.
TClientSocket asigura conexiunea cu un alt calculator.Pentru a
speci-
fica adresa calculatorului cu care doriti sa va conectati utilizati
pro-
prietatea Address.Daca nu cunoasteti adresa IP,puteti utiliza o
adresa
alias gen www.yahoo.com.In acest caz,utilizati proprietatea
Host.Pentru
ca sa puteti realiza simultan mai mult decat o singura conexiune,este
bine sa specificati si un numar de port,in proprietatea Port.Pentru a
deschide efectiv conexiunea,se va utiliza metoda Open.
Obiectele de tip ClientSocket nu sunt vizibile in timpul executie.
Daca doriti sa reprezentati aceste obiecte,puteti utiliza un obiect
de
tip TImage in care afisati o imagine Bitmap sau un Icon oarecare.
EXEMPLU: ( vezi si Prj41)
Salvati o fila noua si proiectul in Prj41.Utilizati Image editor
pentru
a desena un calculator,sau o imagine simbolica oarecare si adaugati
in
directorul Prj41 fila BitMap respectiva.
Adaugati in Form un obiect TClientSocket si un obiect
TServerSocket.
Sub cele doua obiecte adaugati cate un obiect tip TImage(Additional)
si
utilizati proprietatea Picture pentru a afisa desenul realizat.
Adaugati in Form si un buton si 6 etichete TLabel.
Apoi selectati ClientSocket1 si in Object Inspector adaugati o adresa
IP in Address (Exemplu: 172.25.1.25 ) si o adresa alias in Host
( Exemplu:
www.caseta1.ro) la care adaugati un numar de port (Exemplu: 1024).
Optional,adaugati un numar de port si pentru obiectul
ServerSocket1.
Utilizati primele doua etichete pentru a denumi cele doua obiecte.
Pentru buton alegeti din Events OnClick si scrieti urmatoarea
procedura:
procedure TForm1.Button1Click(Sender: TObject);
begin
Label3.Caption:='Adresa IP= ' + ClientSocket1.Address;
ServerSocket1.Open;
Label5.Caption:='Aplicatia a fost activata !';
Label6.Caption:='Adresa alias= ' + ClientSocket1.Host;
end;
Apoi alegeti ServerSocket1 si adaugati in OnListen din Events
urmatoarea
procedura:
procedure TForm1.ServerSocket1Listen(Sender:TObject;
Socket:TCustomWinSocket);
begin
Label4.Caption:='Serverul asteapta solicitari...';
end.
In acest exemplu,aplicatia este transformata in server.Obiectul
client
nu a fost activat,astfel incat puteti utiliza orice adresa IP
doriti.
Pentru a stabili conexiunea efectiva,trebuie adaugata si metoda
Open:
ClientSocket1.Open dar in acest caz adresa IP trebuie sa fie o
adresa
reala din retea (sau adresa calculatorului d-voastra).Obiectul
server
poate fi activat fara sa fie in conexiune cu o adresa reala.
Exemplul prezinta doar interfata aplicatiei.Pentru a schimba date
efectiv (chat), se pot utiliza metodele: ClientSocket.Socket.Sendtext
si
ClientSocket.Socket.ReceiveText sau respectiv SendBuf si ReceiveBuf.
Acest gen de schimb de date,este rudimentar,dar foarte economicos in
ce
priveste consumul de memorie.
-35- Internet -
ServerSocket
TServerSocket este un obiect destinat pentru a transforma aplicatia
in
server TCP/IP.Obiectul de tip server,daca este activat,trece in stare
de
astepare (listening) si stabileste conexiunea cu clientul in momenul
in
care receptioneaza un mesaj de solicitare (request).
TServerSocket nu are o proprietate pentru adresa,ci doar un numar
de
port.Astfel,o aplicatie poate contine un numar mai mare de obiecte
server
cu ajutorul carora poate stabili conexiuni simultane,cu mai multe
calcu-
latoare din retea,utilizand numere de port diferite.
Pentru a realiza o conexiune completa,aplicatia trebuie sa contina
atat un obiect sever cat si un obiect client.Calculatorul partener de
chat va contine la randul sau un server si un client.Clientul
apeleaza
adresa serverului din aplicatia calculatorului partener,si reciproc.
Aplicatia nu poate fi client si server in acelasi timp si pe
acelasi
port.Pentru a putea comunica,se pot utiliza porturi diferite pentru
transmisie si respectiv pentru receptie,sau se poate utiliza un
singur
port in care operatiile se desfasoara succesiv(client,apoi
server,apoi
din nou client...etc.).
Este bine sa utilizati o reprezentare grafica oarecare,prin care
sa
semnalati daca aplicatia este conectata ca server sau client.In acest
scop,cel mai simplu este sa utilizati doua imagini grafice diferite:
EXEMPLU: (vezi si Prj42)
Salvati o fila noua si proiectul in Prj42.Adaugati si doua
imagini
icon sau Bitmap diferite.Adaugati in Form un obiect de tip
ClientSocket
si un obiect ServerSocket.Adaugati un obiect TImage si utilizati
Picture
din ObjectInspector pentru a selecta prima imagine.Apoi adaugati un
al
doilea obiect TImage,suprapus peste primul si selectati in Picture
cea de
a doua reprezentare grafica.
Selectati ClientSocket si introduceti in Address adresa IP
instalata in
calculatorul d-voastra (sau o adresa reala) si un numar de port.Apoi
alegeti ServerSocket si introduceti numarul de port (acelasi).
Adaugati in Form doua butoane si un camp TLabel si atribuiti celor
doua butoane urmatoarele proceduri:
procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Open;
ClientSocket1.Open;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Label1.Caption:='STAND BY ! ';
Image2.Visible:=False;
Image1.Visible:=True;
Beep;
ServerSocket1.Close;
ClientSocket1.Close;
end;
Primul buton va activa serverul si va deschide conexiunea,iar cel de
al
doilea va inchide conexiunea si serverul.Pentru a deschide o
conexiune
este necesar sa existe un server in stare de asteptare
(listening),motiv
pentru care serverul trebuie activat inainte de a activa clientul.
Pentru a verifica conexiunea,alegeti evenimentul OnConect din
ClientSocket
-36- Internet -
THTML
si adaugati urmatoarea procedura:
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Label1.Caption:='CONECTAT !';
Image1.Visible:=False;
Image2.Visible:=True;
Beep;
end;
Tastati F9 si executati aplicatia.Apasand alternativ cele doua
butoane,
conexiunea va fi inchisa sau deschisa,si se va afisa imaginea grafica
corespunzatoare.
Acest exemplu,realizeaza o conexiune inchisa intre serverul si
clientul
aplicatiei si are scop demonstrativ.Pentru a realiza o bucla reala,
clientul trebuie sa apeleze un server situat pe un alt calculator si
sa
receptioneze prin server mesajele transmise de clientul din acel
calcu-
lator.Evenimentul OnConect se poate utiliza pentru a verifica daca
s-a stabilit conexiunea.
Pentru a verifica alte evenimente,obiectul ServerSocket contine si
evenimente ca: OnClientError,OnClientRead,OnClientWrite,OnGetThread
etc.
Aceste evenimente se pot utiliza fie pentru a semnaliza in timpul
exe-
cutiei fiecare operatie executata (de exemplu se aprinde un led la
fiecare mesaj receptionat sau emis),fie pentru a depana o aplicatie.
In rest,metodele celor doua obiecte (client si server) sunt
similare
si pot fi apelate prin intermediul proprietatii Socket (metodele si
proprietatile obiectului de tip TServerWinSocket).
Aceste obiecte sunt destul de rudimentare si nu prea mai sunt
compati-
bile cu standardele actuale de comunicatie prin Internet.Pentru
comuni-
catii reale in Internet este bine sa utilizati programele comerciale
special destinate acestui scop.Obiectele de tip ClientSocket si
Server-
Socket pot fi utile pentru mici aplicatii care ruleaza in retele
locale,
pentru schimb de date,in retele locale de informare,sau pentru
diverse
aplicatii de actionari si automatizari in retele locale (fara
conexiune
cu reteaua Internet reala).Conexiunile realizate astfel sunt foarte
rapide si necesita putina memorie de operare.In retelele mari de
comuni-
catie,este foarte probabil ca astfel de mesaje sa fie filtrate (pot
fi
interpretate ca potentiali virusi) si sa nu poata patrunde in ciuda
vitezei mari si a dimensiunilor mici.
THTML Active X este probabil cel mai solicitat component din lista
de
obicte destinate pentru aplicatiile Web.Acest component permite
cautarea
in retea si deschiderea automata a unui file de tip HTML(Hypertext
markup
language).O fila de tip HTML este asemanatoare cu o fila de tip text
obisnuita (poate fi redactata si cu NotePad),dar utilizeaza un limbaj
special (o serie de conventii),astfel incat sa permita includerea in
fila
de siruri cu fonturi diferite,imagini BitMap,grafice de tip
GIF,JPEG,BMP,
si XBM etc.Daca navigati in reteaua Internet,puteti observa ca
majoritatea
fielelor de tip text din aplicatiile WEB utilizeaza astfel de file.Nu
este
obligatoriu sa cunoasteti acest limbaj pentru a putea utiliza
componentul
THTML (dar este foarte util).Puteti gasi o descriere completa a
acestui
limbaj la adresa: http://www.w3.org .
-37-
Puteti utiliza un obiect de tip THTML pentru a realiza un browser
de
WEB asemanator cu Google,Internet Explorer sau NetScape Navigator
(dar
mai rudimentar).In afara exercitiului de programare propriu zis,un
astfel
de browser poate fi extrem de util,in diverse situatii:
-operatii in mediu de memorie restrans (depanare)
-doriti sa permiteti deschiderea unui singur site de Web
-nu doriti sa platiti licenta pentru un program comercial
-programati un sistem rapid de comunicatie intre angajatii firmei
-doriti sa evitati filtrele de protectie din programele comerciale
-doriti sa deschideti mai multe file de web cu minimum de memorie
ocupata
-doriti sa imprimati automat doar cateva date selective...etc.
THTML permite si deschiderea directa a unui document de tip
HTML,fara
sa implice si o cautare in retea.In plus,obiectul permite analiza
auto-
mata a datelor preluate si navigarea in interiorul paginei
preluate.In
plus,THTML se poate utiliza si pentru analiza nonvizuala a unui
astfel
de document (documentul este preluat si analizat dar nu este afisat).
Pentru a prelua date cu ajutorul acestui obiect,se pot utiliza mai
multe metode:
1. Metoda explicita-apeland metodele RequestDoc sau RequestSubmit
2.Selectand un link activ-apeland un obiect cu care HTML este linkat
3.Selectand un obiect inclus in componentul HTML (cu
DoRequestEmbedded)
4.Utilizand evenimentul DoRequestSubmit
Prima metoda este cea mai simpla si cea mai clara.Se pot apela si
obiectele HTML incluse in stream-uri,dar acest tip de apel presupune
o
buna intelegere a modului de lucru cu streamuri (file virtuale).
THTML are urmatoarele limitari (deficiente):
-textul selectat nu poate fi copiat in memoria clipboard
-obiectul nu poate fi activat automat
-nu determina si nu apeleaza serverele de tip Proxy Server
-nu deschide listele FTP
-nu deschide documentele multiple (majoritatea site-urilor actuale)
In concluzie,THTML nu este obiectul ideal pentru programarea unor
apli-
catii WEB actuale si nu deschide automat majoritatea site-urilor de
WEB,
dar poate fi utilizat cu succes pentru aplicatii simple,sau pentru a
deschide rapid si economic o fila de tip HTML din retea ( de exemplu
pentru a actualiza rapid si economic o serie de date uzuale,zilnice).
Majoritatea proprietatilor acestui obiect sunt utile pentru a
configura
aspectul datelor preluate.Metodele sunt destinate pentru preluarea si
im-
primarea datelor (puteti realiza aplicatii care preiau si imprima
zilnic
o serie de date din retea).Obiectul este dotat cu un numar mare de
eveni-
mente,destinate pentru procedurile de analiza si sortare a datelor
pre-
luate.Puteti utiliza aceste evenimente,pentru a selecta dintr-o fila
de
tip HTML doar un anumit tip de date,sau doar a anumita variabila care
se modifica zilnic (Exemplu: puteti prelua cursul zilnic al
actiunilor
pentru o singura societate comerciala,dintr-o lista cu sute de astfel
de
societati).
Mai mult,nu este necesar sa afisati datele preluate.Fila HTML
poate fi
analizata in background si dupa preluarea si selectarea datelor
dorite,
acestea pot fi imprimate direct,in timp ce utilizatorul desfasoara o
alta
activitate.Evenimentele pot fi utile si pentru depanarea unor
aplicatii
(Exemplu: ParseComplete verifica daca analiza datelor a fost
completa).
-38-
Cea mai simpla aplicatie,este deschiderea unei file HTML:
EXEMPLU: (vezi si Prj43)
Deschideti o aplicatie noua.Salvati fila si proiectul intr-un
director
(Prj43).Adaugati in fila un obiect Panel si extindeti Panel pentru
toata
fila.Apoi adaugati in coltul de sus un obiect TComboBox si imediat
sub
acesta un obiect de tip THTML.Adaugati si doua butoane,denumite START
si
STOP.
Selectati ComboBox1 si introduceti in Object Inspector,in campul
Text
adresa de WEB a documentului dorit (Exemplu: www.locuridemunca.ro).
In continuare,atribuiti celor doua butoane cate o procedura OnClick:
procedure TForm1.STARTClick(Sender: TObject);
begin
HTML1.RequestDoc(ComboBox1.text);
end;
si procedure TForm1.STOPClick(Sender: TObject);
begin
HTML1.Cancel(0);
end;
Pentru ca fila sa fie activata si deschisa in momentul in care
lansati
aplicatia cu Run,selectati obiectul HTML1 si atribuiti in
Events,pentru
evenimentul OnEnter urmatoarea procedura:
procedure TForm1.HTML1Enter(Sender: TObject);
begin
STARTClick(Sender);
end;
Acum browserul de WEB este gata.Tastati F9 si executati
aplicatia.Pentru
a deschide alta fila,schimbati textul din ComboBox1.Text si lansati
din
nou.
Browserul astfel realizat este extrem de rudimentar.Puteti adauga
o
bara de stare si cateva proceduri auxiliare destinare pentru
evaluarea
si interpretarea datelor.Puteti adauga unul sau mai multe filtre de
date,
astfel incat datele preluate sa nu poata corupe memoria de operare in
caz ca fila preluata contine date ce depasesc capacitatea de
procesare
a hard-ului instalat...etc.
Pentru aplicatiile realizate de d-voastra,care apeleaza la date
din
reteaua Internet,este bine sa respectati normele elementare de
civilizatie
pentru a nu deranja proprietarul site-ului.Este bine sa exersati cu
un document cunoscut,de la o adresa simpla si clara,cat mai apropiata
regional (din aceeasi tara) si pentru care proprietarul si-a dat
acordul
(exista o serie de servere specializate pentru operatii de acest
gen).
Dupa ce browser-ul d-voastra este functional,puteti adauga o serie
de
facilitati noi.De exemplu,fila preluata poate fi schimbata dinamic,in
timpul executiei,etc.
Atunci cand programati si utilizati frecvent sau simultan un numar
mare de astfel de aplicatii,cantariti cu mare atentie fiecare
procedura
si fiecare artificiu de programare adaugat.Fiecare astfel de
artificiu
adauga ceva la memoria consumata (de cele mai multe ori
inutil).Pentru
a preveni supradoparea memoriei de operare este bine sa programati
doar
proceduri care lucreaza efectiv cu datele.Desenele animate,efectele
gra-
fice colorate si clip-urile publicitare sunt apanajul programelor
comer-
ciale,cu care nu are rost sa concurati.
-39- Internet -
HTML
Pentru exercitii cu componentul THTML si pentru a invata limbajul
de
editare al filelor HTML,este bine sa utilizati doar file
locale,arhivate
in calculatorul d-voastra,cu conexiunea de Internet inchisa.
Deschiderea unei file locale se realizeaza identic cu cea pentru
filele
din retea,dar calea de acces la fila se formeaza astfel:
URL = file://<host>/<path>
adica Http://www. se inlocuieste prin
file://
EXEMPLU: pentru fisierul C:\my_pages\home.htm
se va utiliza urmatoarea adresa URL:
file:///C:/my_pages/home.htm
In cazul unei file din reteaua locala,o fila de genul:
\\servername\C_drive\my_pages\home.htm
se va accesa prin urmatoarea adresa URL:
file://servername/C_drive/my_pages/home.htm
Concret,pentru ca munca d-voastra sa fie cat mai simpla este bine sa
rezervati in unitatea C un folder special pentru filele de tip HTML
cu
care lucrati in mod curent,sau pe care le descarcati din reteaua
Internet.
Astfel,calea de acces la fila va fi simpla si clara,si puteti scrie o
serie de proceduri automate care selecteaza singure calea de acces.De
exemplu,adaugati un director denumit HTMLTXT in unitatea C si salvati
in
acest director cateva file de tip HTML (puteti copia HTMLTXT din
Prj44).
Pentru a lucra cu filele locale,puteti scrie un program similar cu
cel
din Prj43,dar putin mai dezvoltat:
EXEMPLU: (vezi si Prj44)
Deschideti fila proiect din Prj43 si salvati atat fila cat si
proiectul
intr-un nou director,denumit Prj44.Copiati directorul HTMLTXT pe
unitatea
C si apoi inlocuiti in Object Inspector proprietatea Text din
ComboBox1
cu urmatorul text: file:///C:/HTMLTXT/text1.htm
Tastati F9 si executati aplicatia.In mod normal in fila HTML se va
afisa
un text exemplificativ.Pentru a putea utiliza in aplicatiile d-
voastra
astfel de file,trebuie sa invatati si limbajul HTML (esentialul poate
fi
parcurs intr-o singura zi -vezi www.w3.org/HTML).
Pentru a dezvolta putin aplicatia,adaugati un nou buton standard,
denumit Button1.Scrieti in Caption TEXT / COD,pentru a desemna
functia
acestui buton,apoi selectati OnClick din Events si adaugati
procedura:
procedure TForm1.Button1Click(Sender: TObject);
begin
HTML1.ViewSource:= not HTML1.ViewSource;
STARTClick(Sender);
end;
Tastati F9 si executati aplicatia.Acum puteti utiliza butonul TEXT /
COD
pentru a afisa alternativ textul documentului sau codul sursa.
Puteti utiliza aceasta aplicatie pentru a invata limbajul de
editare
HTML.Textele HTML pot fi editate in orice editor de text (MS-
DOS,NotePad,
WordPad etc.).Procurati un manual pentru limabjul HTML si exersati cu
documente asemanatoare cu cel intitulat Text1.html.Nu incercati sa
inva-
tati "dupa ureche" deoarece riscati sa produceti suprascrieri
nedorite
ale memoriei sau chiar disfunctionalitati mai grave,sau cel putin sa
va
obisnuiti cu tehnici incomplete sau neadecvate.Pentru a putea utiliza
in
retea documentele de tip HTML,acestea trebuie sa respecte toate
standarde-
le acestui limbaj.
-40-
Daca documentele de tip HTML sunt la alta locatie decat
HTMLTXT,intro-
duceti calea completa de acces.
Browser-ul de internet s-a transformat astfel intr-un obiect
simplu
de afisare a filelor de tip HTML.Acum puteti sa personalizati
documentele,
astfel incat sa satisfaca toate preferintele d-voastra.
Executati un click pe HTML1 si utilizati proprietatie acestui
obiect
pentru a schimba formatul de editare.De exemplu,schimbati ForeColor
in
clRed sau utilizati Font si Heading1Font pentru a schimba culoarea si
dimensiunea sau stilul fonturilor.Pentru a schimba culoarea de fond
se
poate utiliza BackColor,etc...
Dupa ce documentul are aspectul dorit,poate fi imprimat.Pentru a
putea
imprima un document este necesara o procedura auxiliara.In primul
rand
adaugati in unitatea d-voastra,in interfata Uses si unitatea
Printers.
Acum,linia de cod va arata astfel:
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,OleCtrls,isp3,
StdCtrls,Buttons,ExtCtrls,Printers;
Daca doriti sa adaugati si alte functii in browser-ul d-voastra,va
trebui sa adaugati si unitatile necesare pentru implementarea acestor
functii.
Adaugati in Form un alt buton,denumit Button2 si introduceti in
Caption
denumirea acestui buton: IMPRIMA.Apoi,selectati OnClick din Events si
adaugati urmatoarea procedura:
procedure TForm1.Button2Click(Sender: TObject);
var Cursor: TCursor;
begin
Cursor:=Screen.Cursor;
with Printer do begin
BeginDoc;
HTML1.AutoPrint(handle);
Title:=HTML1.URL;
EndDoc;
end;
Screen.Cursor:=Cursor;
end;
Tastati F9 si executati aplicatia.Acum puteti utiliza si butonul
IMPRIMA
pentru a tipari textele redactate (cu conditia ca imprimanta sa fie
pornita,activa,incarcata cu hartie etc.).
Nu utilizati aceasta procedura pentru texte prea mari,sau
simultan cu
alte operatii.Dupa cum observati,este o procedura simpla care
utilizeaza
memoria cursorului pe post de tampon,pentru a prelua textul care
trebuie
expediat la imprimanta.Daca dintr-un motiv oarecare,textul nu poate
fi
imprimat complet,exista riscul de a bloca memoria inainte ca vechiul
cursor sa fie reinstalat (caz in care calculatorul trebuie oprit si
repornit).Puteti utiliza butonul de imprimare pentru documente
scurte,
care nu depasesc cateva pagini.
In continuare,puteti dezvolta acest obiect,adaugand noi butoane
si
functii,pentru a satisface necesitatile d-voastra,sau de ce
nu,pentru
a dezvolta aplicatii profesionale,cu scop comercial.Pentru a
verifica
filele editate,puteti utiliza cu succes programul Internet Explorer.
-41-
Dupa Web Browser,un alt serviciu extrem de utilizat este cel de
chat.
Exista o serie intreaga de programe comerciale,destinate special
acestui
scop.Cu obiectele descrise anterior,puteti realiza o astfel de
aplicatie,
personalizata,care sa va permita conversatia cu colegii din retea.
Obiectele ServerSocket si ClientSocket sunt destul de rudimentare
pentru standardele actuale ale Internet-ului,dar pot fi extrem de
utile
pentru retele locale sau pentru mici aplicatii de automatizare cu
circuit
inchis(doua sau mai multe calculatoare conectate prin TCP/IP).
EXEMPLU: vezi si Prj45
Salvati o fila noua si proiectul.Adaugati un camp TMemo,apoi un
obiect
TServerSocket si unul sau mai multe obiecte TClientSocket.Utilizati
pentru
toate socket-urile acelasi numar de port(de exemplu 3333).Puteti
utiliza
orice port doriti.Traditional,pentru serviciile standardizate se
utilizea-
za urmatoarele porturi: 80 pentru HTTP,21 pentru FTP,110 pentru POP
si
25 pentru SMTP.Este bine sa evitati aceste valori atunci cand alegeti
portul de comunicatie pentru aplicatia d-voastra pentru a nu
interfera cu
eventualele comunicatii din retea.
Pentru a activa toate aceste obiecte puteti selecta Form si apoi
din
Events alegeti OnCreate si atribuiti urmatoarea procedura:
procedure TForm.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=True;
ClientSocket1.Active:=True;
ClientSocket2.Active:=True;
ClientSocket3.Active:=True;
end;
Astfel,in momentul executiei,toate obiectele vor fi activate,iar
serverul
va trece in stare de ascultare si va astepta solicitari.
Similar,pentru a dezactiva toate obiectele se poate utiliza din Form,
evenimentul On Close,cu urmatoarea procedura:
procedure TForm1.FormClose(Sender: TObject;var Action:
TCloseAction);
begin
ServerSocket1.Active:=False;
ClientSocket1.Active:=False;
ClientSocket2.Active:=False;
ClientSocket3.Active:=False;
end;
Acum obiectele se pot utiliza pentru a trimite si/sau receptiona
mesaje.Pentru ca serverul sa receptioneze mesajele primite se va
utiliza
evenimentul OnClientRead din TServerSocket.Pentru un singur client se
poate utiliza functia ServerSocket.Socket.ReceiveText.
In cazul in care serverul utilizat asteapta pe acelasi port,mesaje
de
la mai mult decat un singur client,trebuie dezvoltat un algoriitm
simplu
care sa parcurga la fiecare mesaj receptionat toate conexiunile
active
si sa preia eventualele mesaje.
Pentru afisarea mesajelor primite se poate utiliza orice metoda de
afisare,dar cel mai comod este sa utilizati un obiect TMemo,deoarece
pastreaza cronologic ultimele mesaje receptionate si poate afisa
simultan
mai multe mesaje (in cazul in care comunicati cu mai multe persoane
simultan).Exemplul din Prj45 a fost proiectat pentru trei clienti,dar
se poate adapta la orice alt numar de clienti.
-42-
Pentru doi sau mai multi clienti,se poate utiliza urmatoarea
procedura:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var nr1:integer;
text1:string;
begin
for nr1:=0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
with ServerSocket1.Socket.Connections[nr1] do
begin
text1:=ReceiveText;
if text1 <> '' then
begin
Memo1.Lines.Add(RemoteAddress + ' trimite mesajul:');
Memo1.Lines.Add(text1);
end;
end;
end;
end;
Acum,toate mesajele receptionate de server vor fi afisate in Memo.
Pentru a transmite mesaje cu ajutorul obiectelor ClientSocket se
vor
utiliza cate doua campuri TEdit si cate doua butoane,pentru fiecare
client.Unul dintre capurile TEdit va fi utilizat pentru introducerea
mesajului,iar cel de la doilea pentru specificarea adresei IP.
Adresa IP nu poate fi modificata dinamic decat daca conexiunea este
dezactivata.Pentru schimbarea adresei se va utiliza o procedura de
genul:
procedure TForm1.SpeedButton1Click(Sender:TObject);
begin
ClientSocket1.Active:=False;
ClientSocket1.Address:=Edit2.Text;
ClientSocket1.Active:=True;
end;
Astfel,la apasarea butonului,conexiunea este intrerupta,se modifica
adresa si apoi se restabileste conexiunea cu noua adresa specificata.
Adresa implicita pentru toti clientii este 127.0.0.1.Aceasta
adresa
corespunde cu un terminal neconectat la retea si este acceptabila
pentru
orice utilizator.Pentru a incepe o conversatie reala,trebuie
introdusa
o adresa IP reala,dupa care se apasa butonul de confirmare OK.
Pentru a transmite mesajul propriu zis,pentru fiecare client se va
asocia un buton si o procedura On Click de genul:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.text);
Memo1.Lines.Add('textul expediat: ' + Edit1.Text);
Edit1.Text:=' ';
end;
Este bine ca textul expediat sa fie afisat si in Memo,astfel incat sa
puteti avea o imagine de ansamblu cu intreaga conversatie efectuata.
Dupa expedierea mesajului,TEdit utilizat pentru preluarea datelor
este
sters,pentru a permite preluarea mesajului urmator.
Se atribuie o astfel de procedura,pentru fiecare client.
-43-
In continuare,puteti adauga un buton care sa transmita un anumit
mesaj
la toate adresele IP cu care sunteti conectati prin clienti.De
exemplu,
pentru a transmite textul din TEdit1 la trei clienti diferiti se va
uti-
liza un buton cu urmatoarea procedura:
procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.Text);
ClientSocket2.Socket.Sendtext(Edit1.Text);
ClientSocket3.Socket.SendText(Edit1.Text);
Memo1.Lines.Add('text expediat la toate IP-urile: ');
Memo1.Lines.Add(Edit1.Text);
Edit1.text:=' ';
end;
Daca doriti sa fiti si mai selectivi,puteti adauga pentru fiecare
client
cate un buton TRadioButton sau TCheckBox,cu ajutorul caruia sa puteti
selecta clientii la care doriti sa trimiteti un anumit mesaj.
Facultativ,puteti adauga o procedura suplimentara cu ajutorul
careia,
serverul trimite automat un mesaj de raspuns,atunci cand primeste un
mesaj de solicitare,dar nu doriti sa raspundeti personal ( se va
utiliza
tot un evenimet de tipul On ClientRead).
In cazul in care utilizati frecvent o serie de mesaje
prestabilite,
puteti adauga o serie de butoane,care transmit automat mesajul
respectiv.
Aplicatia poate fi personalizata,in functie de necesitatile d-
voastra.
Principalele avantaje sunt reprezentate de volumul foarte mic de
memorie
utilizata (nu ocupa spatiu din memoria de RAM) si de gradul mare de
maleabilitate.Se pot utiliza cu succes pentru actionari si
automatizari
de procese elementare ( doar pentru cele care nu necesita o precizie
temporala foarte ridicata,deoarece timpul de stabilire a unei
conexiuni
poate fi diferit de la o implementare la alta).
Principala aplicatie,ramane insa conversatia cu colegii,intr-o
retea
locala,sau chiar intr-o retea Intranet (Internet cu acces limitat).
Daca aplicatia d-voastra este specializata pentru receptionarea de
informatii,puteti utiliza mai multe obiecte ServerSocket,setate pe
porturi
diferite,care receptioneaza mesaje de la serii diferite de clienti.
Mesajele receptionate,pot fi arhivate in tabele,pot fi
comparate,pot
fi analizate statistic,pot fi centralizate sau mixate in acceasi
inter-
fata,pot declansa proceduri de raspuns automat etc...etc...
Obiectele de tip TSocket sunt proiectate exclusiv pentru
transferul
de date de tip text.Nu pot fi utilizate pentru semnale audio-video
sau
pentru imagini digitale si date de tip bitmap.Cu putina munca se pot
utiliza pentru a transmite si texte in format HTML,care pot fi apoi
preluate si afisate de un webbrowser,dar nu este nici practic si nici
util.Pentru acest gen de aplicatii,exista obiecte mult mai usor de
utilizat si exploatat(vezi versiunile recente de Delphi).
Desi sunt destul de rudimentare,si cu un numar redus de functii,
obiectele de tip tSocket sunt perfect functionale si in reteaua
Internet.
Din acest motiv,este bine sa verificati cu atentie orice
aplicatie,inainte
de a incerca utilizarea ei in retea.Este prudent sa verificati
aplicatia
intr-o retea locala si apoi sa consultati si un administrator de
retea,
inaite de a incerca exploatarea in reteaua Internet(orice eroare de
conceptie poate produce disfunctionalitati grave).
-44- Internet -
THTTP
Un alt component extrem de util este THTTP (Hypertext Transport
Pro-
tocol).Acest obiect,este destinat pentru transferul de file in format
HTML,atunci cand nu este necesara vizualizarea lor.Se utilizeaza
pentru a
importa(cu GetDoc) sau pentru a exporta(cu SendDoc),file in format
HTML,
care utilizeaza portul HTTP standard (port=80).Poate fi utilizat fie
impreuna cu un browser,fie separat (in cazul in care datele vor fi
proce-
sate fara sa fie necesara vizualizarea lor).In plus,prin
proprietatile si
metodele sale,THTTP poate oferii o serie de informatii utile
referitoare
la datele transferate (numarul de bytes
transferati,portul,adresa,metoda
de transfer,tipul de protocol,codul de raspuns etc.).Clasic,se
utilizeaza
pentru a prelua periodic,o anumita fila,de la o anumita adresa.
Pentru a asocia un obiect HTTP,la un browser,copiati exemplul din
Prj44 intr-un director nou (Prj46).Adaugati in Form un obiect de tip
THTTP,un camp TLabel si un nou buton.Redenumiti butonul HTTP si apoi
atribuiti acestui buton urmatoarea procedura OnClick:
procedure TForm1.Button3Click(Sender: TObject);
begin
HTTP1.URL:='file:///C:/HTMLTXT/Text3.htm';
HTML1.RequestDoc(HTTP1.URL);
HTTP1.GetDoc(HTTP1.RemoteHost+HTTP1.Document,'','');
Label1.Caption:='adresa accesata= '+HTTP1.URL;
end;
Pentru a verifica daca documentul a fost preluat,selectati obiectul
THTTP si din Events alegeti OnDocOutput si adaugati urmatoarea
procedura:
procedure TForm1.HTTPDocOutPut(Sender: TObject;
const DocOutput:
DocOutput);
var b1: variant;
begin
beep;
b1:=HTTP1.BlockResult;
{ Label1.Caption:=b1; }
end;
Acum,in momentul in care documentul solicitat este preluat se va auzi
un
beep.
Pentru a verifica daca nu exista nici o eroare,selectati pentru HTTP
si
evenimentul OnError si adaugati urmatoarea procedura:
procedure: tForm1.HTTP1Error(Sender:TObject;Number:Smallint;
var Description: WideString; Scode: Integer;const Source,
HelpFile:WideString; HelpContext:Integer;var
CancelDisplay:WordBool);
begin
Label1.Caption:=Description;
end;
Compilati si executati programul (F9).In mod normal,se va afisa fila
HTML
din ComboBox.Text.La apasarea butonului HTTP,se va afisa fila
specificata
in procedura OnClick si se va auzi un beep.Datorita faptului ca este
o
fila locala,se va returna un mesaj de eroare de tipul : Error
Connecting
Daca utilizati fila in retea,inlocuiti in HTTP.URL fila Text3.htm
printr-o adresa reala.In acest caz,puteti apela GetDoc,cu HTTP.UTL.
Daca nu se returneaza nici unmesaj de eroare,puteti indeparta
acoladele
din linia { Label1.Caption:=b1 } pentru a afisa rezultatul operatiei
de
preluare a filei.
-45-
HTML(limbaj)
LIMBAJUL HTML (notiuni elementare)
-47-
Pentru a introduce o lista ordonata,se procedeaza identic,dar se
uti-
lizeaza <ol> in loc de <ul>.
Pentru a introduce o lista definita se vor utiliza <dl>,<dt> si
<dd> :
<dl>
<dt> primul element din lista </dt>
<dd> definitia elementului </dd>
<dt> al doilea element din lista</dt>
<dd> definitia elementului </dd>
</dl>
Listele pot fi si intercalate,unele in altele (atentie sa nu va
incurcati
cu prea multe tag-uri).
Pentru a edita tabele se va utiliza tag-ul <table> si </table> la
care se adauga tag-urile <tr>,<th> si <td>.
Pentru a specifica aspectul tabelului se pot utiliza facultativ si
setarile border,width,cellpadding si cellspacing:
EXEMPLU:
<table border="1" cellpadding="10" cellspacing="10 width="80">
<tr><th>Anul</th><th>Clienti</th></tr>
<tr><td>2000</td><td>550</td></tr>
<tr><td>2007</td><td<750</td></tr>
</table>
Daca doriti ca datele din tabel sa fie aliniate in celule la
stanga,la
dreapta sau spre centru,se poate specifica prin left,right sau
center:
EXEMPLU: <tr align="left"> ....datele </tr>
Pentru a schimba culoarea de fond a unei celule se poate utiliza o
expresie hexazecimala sau functia rgb().
EXEMPLU:
<th bgcolor="#CCCC99"> ...datele </th>
Daca tabelul contine un spatiu gol,este bine sa utilizati expresia
(nonbreackable space) in locul spatiului gol,pentru a evita o
eventuala
fragmentare a tabelului.
Exista o serie intreaga de astfel de grupuri care inlocuiesc
caracterele
speciale.Dintre acestea,mai uzuale sunt:
"=" | &=& | <=<, | >=>, | patratul puterii=² |
cubul
puterii=³ | micro=µ | 1/4=¼ | 1/2=½ | 3/4 =
¾ | A=Â | I=Î | a=â | a=ã |
/=÷
Pentru ca o imagine bitmap sa poata fi utilizata ca link spre o
alta
pagina HTML,se poate adauga setarea setarea map (vezi Text2.htm)
EXEMPLU: <p align="center">
<img src="Imagine2.bmp" width="200" height="200"
alt="desen"
usemap="#desen" border="2">
<map name="desen"> <area shape="rect" coords="0,0,200,200"
href="Text1.htm" alt="Pagina HTML"> </map> </p>
unde src precizeaza fila bitmap,usemap este referinta spre element,
border este conturul adaugat imaginii,map specifica ce parte din
imagine
este activa iar area shape specifica tipul de arie activa,care poate
fi:
rect cu coordonetle : "left x,top y,right x, bottom y "
circle cu coordonatele: "center x,center y ,radius"
sau poly cu coordonatele:"x1,y1,x2,y2......xn,yn"
Pentru subliniere si paragraf nou se poate utiliza tag-ul <hr>
...</hr>
Exemplu: <hr width 40%> </hr>
-48-
Fila HTML poate contine si o serie de controale,care permit
preluarea
de date si transferul acestora spre alte file sau aplicatii
Web.Pentru
acest scop se poate utiliza TAG-ul <form> impreuna cu tipul de
control
dorit.
<form> trebuie sa contina metoda (care poate fi GET sau POST),si
adresa
filei spre care se trimit datele,care poate fi orice adresa URL.(vezi
si
fila Text3.htm).Va rezulta o linie de genul:
<form METHOD="POST" ACTION=" ...adresa URI a aplicatiei dorite">
adresa specificata prin URI poate fi numele unei apliocatii WEB (un
brow-
ser),o adresa e-mail,sau o alta fila HTML.Pentru a accesa o adresa de
e-mail,linia va fi de genul:
<form METHOD="POST" ACTION="mailto:Google@Yahoo.com"> unde in loc
de
Google@Yahoo.com specificati adresa de e-mail dorita.
Principalele controale din FORM se introduc cu INPUT TYPE + :
text -se utilizeaza pentru a introduce o linie de text unica
password-este identica cu text,dar mascheaza caracterele introduse
checkbox-introduce o caseta de selectie de tip checkbox
radio -introduce un buton de tip radio
submit -introduce un buton de preluare a datelor(le trimite la
ACTION)
image -introduce un buton grafic de tip submit (personalizat)
reset -introduce un buton de tip reset (reseteaza valorile
implicite)
button -introduce un buton de tip pushbutton
hidden -introduce un control ascuns (datele sunt preluate si din
hidden)
file -asociaza o fila la datele transmise (la adresa din ACTION)
Alte controale posibile sunt:
TEXTAREA -introduce mai multe linii de tip text
LABEL -adauga o eticheta
DISABLED -introduce un control
inactivat(button,input,option,textarea)
READ ONLY-datele pot fi doar citite dar nu pot fi modificate
EXEMPLE:
<p></p>
<form METHOD="POST" ACTION="Text4.htm">
nume: <input type="text" name="text1" value=" " maxlength="10">
prenume: <input type="text" name"text2" value=" " maxlength="10">
<input type="submit" value="TRIMITE">
<input type="reset" value="RESET">
</form>
Pentru exemple complete,consultati un manual,sau bibliografia de pe
Inter-
net.TAG-ul <form> functioneaza ca un program de WEB complet,astfel
incat
datele din controale vor fi expediate la adresa
specificata.Verificati
cu foarte mare atentie fiecare fila editata,la o adresa locala,sau pe
propriul calculator,inainte de a expedia date in retea.Orice eroare
de
editare poate genera disfunctionalitati,la fel ca si cele produse de
"virusii informatici".Ideal,este sa verificati aplicatiile intr-o
retea
locala LAN,inainte de a accesa reteaua propriu-zisa.Pentru ca datele
expediate sa poata fi receptionate,trebuie ca la adresa specificata
sa
existe un server in stare de ascultare (listening),si o aplicatie
care
poate receptiona formatul respectiv (cu GET nu se pot expedia decat
caractere ASCII).
Pentru documente publice,identificarea se face cu un antet de
genul:
<!DOCTYPE HTML PUBLIC"-//IETF//DTD+HTML 2.0//EM"> (conventia de
limbaj)
-49-
Puteti utiliza butonul "submit" si pentru a realiza un link la adresa
respectiva (e-mail,fila HTML etc.).
Pentru imaginea de fond (background) a filei HTML se poate utliza
si
un tipar generat cu ajutorul unei file BitMap,.jpg etc.
EXEMPLU: <body background = "fundal.bmp"> (vezi si Text4.htm)
Pentru a ingrosa evident caracterele se poate utiliza tag-ul
<strong>
EXEMPLU: <strong>Textul accentuat</strong>
Pentru a schimba tipul fontului se poate utiliza <font face=" ">
EXEMPLU: <font face="arial">Textul dorit</font>
Pentru a schimba culoarea fontului se poate utiliza <font color="
">
EXEMPLU: <font color="#00FF00">Culoarea este verde</font>
in expresia hexazecimala care urmeaza dupa caracterul # primele
doua
caractere determina culoarea rosie,urmatoarele culoarea verde,iar
ulti-
mele culoarea verde.Culoarea rezultata va fi cea determinata de
combi-
narea celor trei culori fundamentale (la fel ca functia RGB() ).
Pentru culorile de baza (setul de 16 culori) se poate specifica si
textual numele culorii (color="red" sau color="lime" etc...).
Pentru a schimba dimensiunea fonturilor se poate utiliza <font
size= >
EXEMPLU: <font size="7">Text majorat</font>
Cele trei setari se pot grupa in una singura:
EXEMPLU: <font face="arial" color="red" size="5">Text</font>
Pentru a adauga o cheie de acces (un short-cut) se poate utiliza
accesKey=" ".Cheia de acces va fi apasata impreuna cu tasta Atl(in
sis-
temul Windows).De exemplu pentru a genera un short-cut spre un alt
docu-
ment,se va utiliza un algoritm de genul:
<p>
Cheia de acces este litera s.(Tastati Alt + s)...apoi ENTER !
<A accesKey="s" rel="contents" href="FilaText.htm"></A> </p>
Va realiza un short-cut spre o fila locala.In mod similar,puteti
realiza
un short-cut spre orice adresa de web.
Pentru a adauga comentarii,se va utiliza caracterul <! la
inceputul
tag-ului,apoi comentariile propriu zise vor fi incluse intre grupuri
de
cate doua liniute: --comentariu-- --comentariu2--
EXEMPLU: <!--comentariu inclus in text-->
Pentru a realiza un tag transparent,se va utiliza semnul # imadiat
dupa <.Tag-urile transparente nu sunt afisate de catre browser,dar
pastreaza un spatiu de memorie si o adresa de indexare,care poate fi
utilizata de catre PageProducer pentru a reformata textul respectiv.
EXEMPLU: vezi Text5.htm si Prj50
<html>
<h1>Aplicatie cu un TAG transparent de tip text</h1>
<#text><#/text>
<html>
In exemplul de mai sus,TAG-ul <#text> poate fi utilizat in OnHTMLTag
din
PageProducer pentru a introduce un text oarecare,care va fi trimis
sub
forma de raspuns la solicitarea unui user.
La prima vedere,limbajul HTML pare complex.Nu va
descurajati.Aplicati
pas cu pas,fiecare notiune,pana cand puteti redacta o pagina de WEB
cu
aspectul dorit de d-voastra.Nu utilizati paginile produse decat dupa
o
verificare atenta (este recomandabil sa consultati si un
administrator
de retea (serviciul tehic al retelei Internet de care apartineti).
-50- Internet -
TPageProducer
TPageProducer transforma o pagina HTML intr-un sir de comenzi HTML
care
pot fi interpretate de catre o aplicatie de tip Web browser.Se poate
utiliza pentru a formula raspunsul expediat de catre dispecerul unei
astfel de aplicatii,spre clientul care a formulat solicitarea,sau se
poate utiliza pentru a modifica TAG-urile transparente,cu ajutorul
evenimentului OnHTMLTag.Mai mult,mai multe obiecte de tip
PageProducer
se pot inlantui intr-o anumita ordine,pentru a forma un document nou.
Tag-urile transparente pot fi de tip:
Link,Image,Table,ImageMap,Object,
Embed sau Custom.Ca rezultat,PageProducer poate modifica acest gen de
comenzi in interiorul unui document HTML,pentru a formula un nou tip
de raspuns,personalizat.Astfel,pornind de la acelasi document din
arhiva,
aplicatia Web server poate formula raspunsuri personalizate in
functie
de clientul care a formulat solicitarea.
Pentru a formula raspunsul se va utiliza o procedura de genul:
begin
PageProducer.HTMLFile:='Numele filei sursa.htm';
Response.Content:=PageProducer.Content;
end;
Principalele proprietati ale componentului PageProducer sunt HTMLDoc
si
HTMLFile.
HTMLDoc se poate utiliza pentru a redacta un text in limbaj
HTML,care
poate fi apoi preluat pentru formularea raspunsului catre client.
HTMLFile realizeaza direct link-ul spre o pagina HTML care va fi
expediata catre client sub forma de raspuns.
HTNLDoc si HTMLFile se anuleaza reciproc.Obiectul nu contine decat
un
singur tampon de memorie si nu poate utiliza la un anumit moment
dat,decat
una dintre cele doua proprietati.
Dintre metode,cea mai importanta este Content,care formuleaza
textul
final realizat dupa conversia tag-urilor transparente.Se apeleaza
pentru
a transmite raspunsul in versiunea finala.
Singurul eveniment este OnHTMLTag si se utilizeaza pentru a
preciza
toate schimbarile suferite de documentul de baza.Contine toate
conditiile
necesare pentru conversia tag-urilor transparente.
EXEMPLU: (vezi Prj47)
Salvati o fila si proiectul in Prj47.Adaugati un camp Memo,2 butoane
si
doua obiecte PageProducer.Folositi object inspector pentru a selecta
in
primul obiect PageProducer o fila HTML locala,in proprietatea
HTMLFile,
si apoi atribuiti primului buton procedura:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(PageProducer1.Content);
end;
Apoi,in HTMLDoc din cel de al doilea obiect PageProducer,editati un
text
in limbaj HTML si atribuiti celui de al doilea buton procedura:
procedure TForm1.Button2Click(Sender:tObject);
begin
Memo1.Clear;
Memo1.Lines.Add(PageProducer2.Content);
end;
Tastati F9 si executati aplicatia.Apasati cele doua butoane.
-51-
Atunci cand se utilizeaza mai multe obiecte de tip
PageProducer,pentru
a formula un document complex,sau pentru a distribui diferite
raspunsuri
la solicitari,se poate utiliza un modul de date,de tip TDataModule
care
este special conceput pentru arhivarea obiectelor non-vizuale.In
acest
mod,toate componentele nonvizuale care opereaza asupra datelor pot fi
grupate intr-un modul separat,care va fi mult mai usor de actualizat,
transformat,depanat,etc.In plus,declaratiile si definitiile
obiectelor
nu se amesteca cu procedurile efective din program si nu risca sa fie
corupte in cursul compilarii sau al depanarii datelor.Mai
mult,modulul
de date astfel format,poate fi utilizat in mai multe aplicatii
diferite.
EXEMPLU: (vezi Prj48)
Salvati o fila noua si proiectul in Prj48.Adaugati un camp Memo si un
buton.Apoi selecati din nou meniul File si alegeti New Data Module.In
fereastra mica denumita DataModule1,adaugati un component
TPageProducer
si apoi utilizati object inspector pentru a seta o fila HTML in
HTMLFile
(de exemplu: Text2.htm).Salvati fila in acelasi director,apoi
deschideti
cu Open fila initiala din proiect.Pentru a putea avea acces la datele
din modul,alegeti din meniul File optiunea Use Unit si adaugati
modulul
proaspat salvat,in lista de unitati.
Observati ca in fila de cod,dupa "implementation" a fost inserata
si
comanda "uses Modul" (unde Modul este numele unitatii adaugate).
In continuare,datele din modul pot fi accesate ca si cand ar fi
incluse
in proiect.Selectati butonul si adaugati urmatoarea procedura
OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(DataModule1.PageProducer1.Content);
end;
Tastati F9 si executati aplicatia.Este identica cu cea din Prj47,dar
cu
diferenta ca datele sunt accesate printr-un modul separat.Modulul de
date poate fi copiat si utilizat ca atare in orice alta aplicatie.
Obiectul de tip TDataModul poate fi utilizat pentru a grupa toate
componentele nonvizuale din proiect: TSession,TSessionList,TDataBase,
TTable,TQuery,TStoredProc,TBatchMove,TTimer,TOpenDialog,TImageList,TOle-
Conteiner etc.
Daca se adauga si un obiect de tip TWebDispetcher,TDataModule este
echivalent cu TWebModule si poate fi utilizat pentru proiectarea de
aplicatii de tip WebServer.
Utilizarea de module separate pentru date si pentru comenzi este o
practica din ce in ce mai frecventa,mai ales in cazul aplicatiilor
care
opereaza cu baze de date formatate.Programarea modulara,simplifica
foarte
mult depanarea si modernizarea programelor.Practic,pentru fiecare
versiune
noua,se inlocuieste doar unul dintre module,sau se adauga un modul
nou.
Un obiect de tip PageProducer poate fi utilizat impreuna cu un
browser
pentru a prelua datele de la o anumita adresa:
EXEMPLU: vazi Prj49
Salvati browserul din Prj44 in directorul Prj49.Adaugati un nou buton
denumit TTP si un obiect de tip PageProducer.Utilizati HTMLFile din
Page-
Producer pentru a selecta o fila de tip HTML de la o adresa locala de
pe disc,apoi adaugati butonului TTP o procedura OnClick de genul:
HTML1.RequestDoc('file:///'+PageProducer1.HTMLFile);
Tastati F9.Butonul TTP va putea fi utilizat pentru afisarea filei
locale.
-52-
Atunci cand o fila HTML contine si TAG-uri transparente (cele care
contin semnul # dupa <),se poate utiliza evenimentul OnHTMLTag pentru
a modifica dupa bunul plac continutul acestor TAG-uri.Astfel,pornind
de
la un document initial,se pot formula mai multe tipuri de raspuns
catre
aplicatia client.
EXEMPLU: vezi si Prj50
Salvati o fila noua si proiectul in Prj50.Adaugati un camp Memo,un
buton
si un obiect PageProducer.Selectati in HTMLFile fila Text5.htm din
directorrul HTMLTXT,apoi alegeti Events si adaugati urmatoarea
procedura
OnHTMLTag (dublu click):
procedure TForm1.PageProducer1HTMLTag(Sender: TObject;Tag :TTag;
const TagString:String;TagParams:tStrings;var
Replacetext:String);
begin
if TagString='text' then
ReplaceText:='mesaj adaugat de PageProducer la textul initial !';
end;
Apoi selectati butonul si adaugati procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(PageProducer1.Content);
end;
Tastati F9 si executati aplicatia.Eventual,deschideti fila Text5.htm
si
cu Prj48 sau Prj49 si observati diferenta.Tagul transparent a fost
utilizat pentru adaugarea mesajului personalizat.
In exemple am utilizat un camp memo pentru afisarea textelor HTML.
In aplicatiile reale,mesajul HTML este utilizat de aplicatia
WebServer
pentru a formula raspunsul (Response.Content) ce va fi expediat
aplicatiei
de tip WebBrowser care a solicitat informatia (unde va fi afisata
intr-un
obiect de tip THTML).Aplicatiile in timp real din retea,sunt
interactive
si schimba mesaje de tip Request si Response.Pentru fiecare mesaj de
tip
Request se va trimite unul sau mai multe mesaje de tip
Response.PagePro-
ducer se poate utiliza pentru selectarea si/sau modificarea unui
astfel
de mesaj de raspuns.
Pentru a putea vizualiza rezultatul obtinut,in forma finala,puteti
salva textul produs de PageProducer intr-o fila HTML locala.
Pentru acest scop,adaugati in acelasi director o fila denumita
Fila.htm
si apoi modificati procedura OnClick astfel:
procedure TForm1.Button1Click(Sender : TObject);
var F1: TextFile;
begin
Memo1.Lines.Add(PageProducer1.Content);
AssignFile(F1,'Fila.htm');
Rewrite(F1);
Write(F1,Memo1.Lines.Text);
CloseFile(F1);
end;
In continuare utilizati Internet Explorer pentru a deschide fila
Fila.htm
comparativ cu fila sursa.
Daca utilizati frecvent astfel de file,puteti realiza un browser
spe-
cializat pentru filele locale,care deschide automat fila HTML imediat
dupa ce a fost rescrisa.
-53- Internet-
TQueryTableProducer
TQueryTableProducer este un obiect destinat pentru a transforma
datele
preluate de un obiect TQuery,dintr-o baza de date,in tabel
HTML.Datele
astfel formatate pot fi utilizate de o aplicatie WebServer pentru a
specifica raspunsul trimis catre aplicatia Client.Clientul,care este
un
WebBrowser va receptiona si afisa datele sub forma de tabel HTML.
Pentru selectarea datelor,se utilizeaza un obiect de tip
TQuery,care
utilizeaza instructiuni in limbaj SQL,pentru selectarea si formatarea
datelor extrase dintr-o arhiva,care contine o baza de
date.TQueryYable-
Producer contine proprietatea Query,prin care se desemneaza obiectul
TQuery utilizat pentru preluarea datelor si o serie de proprietati
care
pot fi utilizate pentru formatarea propriu-zisa a datelor selectate.
Aceste proprietati adauga un titul nou (Caption),explicatii care vor
fi
afisate deasupra tabelului(Header) sau sub tabel(Footer),specifica
numarul
maxim de coloane afisate(MaxRows) sau precizeaza aspectul fiecarei
coloane
de date (Columns) sau al fiecarui rand din tabel (RowAttributes).
Dintre metode,cea mai importanta este Content,care returneaza
sirul
de date in format HTML,rezultat dupa procesarea datelor.
Obiectul contine si un set de evenimente
(OnCreatContent,OnFormatCell
si OnGetTableCaption) care pot fi utilizate pentru modificarea
dinamica
a aspectului datelor afisate.
EXEMPLU: (vezi si Prj51)
Salvati o fila noua si proiectul in Prj51.Din Data Access adaugati un
component TDataSource si un component TQuery.Din Data Controls
adaugati un
component TDBGrid.
Selectati DataSource1 si setati proprietatea DataSet la valoarea
Query1
apoi selectati Query1 si setati proprietatea DatabaseName la valoarea
DBDEMOS(proma din lista),apoi selecati proprietatea SQL si adaugati
in
obiectul String list editor urmatorul text: SELECT * FROM Biolife.db
Pentru a vizualiza datele selectate,alegeti proprietatea Active si
setati valoarea TRUE,apoi selectati obiectul TDBGrid si setati
proprie-
tatea DataSource la valoarea DataSource1.
In mod normal,in obiectul TDBGrid se vor afisa datele din baza de
date
solicitata.
Pentru a putea vizualiza si imaginile grafice,adaugati din
DataControls
si un obiect DBImage.Setati pentru DBImage proprietatea DataSource la
valoarea DataSource1 si proprietatea DataField la valoarea Graphic.
Acum,daca deplasati cursorul,pentru fiecare rand din tabelul
afisat
in TDBGrid se va afisa o alta imagine in TDBImage.
Operatiile de pana acum,sunt necesare pentru preluarea datelor
dintr-o
baza de date.Pentru a transforma tabelul afisat,intr-un tabel HTML
care
poate fi deschis de catre un WebBrowser,prin Internet,se va adauga si
un obiect de tip TQueryTableProducer.
Adaugati un astfel de obiect,si un camp de tip TMemo care va fi
utilizat pentru afisarea textului (Delphi 3 nu are un obiect comod
pentru
afisarea datelor de tip HTML incluse in obiecte locale).
Selectati obiectul QueryTableProducer1 si setati proprietatea
Query la
valoarea Query1.
In acest moment,datele din baza de date au fost preluate si in
obiectul
QueryTableProducer si pot fi reformatate.Pentru a vedea tabelul in
format
HTML,executati un dublu click pe proprietatea Columns
(THTMLTableColumns).
Se va afisa o fereastra intitulata: Editing
QueryTableProducer1.Columns
-54-
Pentru a schimba putin aspectul tabelului setati urmatoarele
valori:
Border=3,BgColor=Lime,CellPadding=3,CellSpacing=5.Apoi apasati
butonul
Add All Fields.Acum puteti schimba aspectul pentru fiecare coloana in
parte.De exemplu,alegeti SpeciesNo si selectati proprietatea
BgColor=Red.
In continuare,utilizati fereastra de editare pentru a alege
aspectul
dorit.Tabelul in format HTML va fi preluat de catre InternetExplorer
cu
aspectul setat in aceasta fereastra(preview).
Inchideti fereastra.Daca doriti sa adaugati un titlu si explicatii
suplimentare,puteti utiliza proprietatile Caption,Footer,Header.Apoi
fixati numarul maxim de randuri preluate (De exemplu MaxRows=20).
Pentru a verifica daca obiectul opereaza corect,adaugati un buton
denumit OK si atribuiti acestui buton urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(QueryTableProducer1.Content);
end;
Tastati F9 si executati aplicatia.Observati ca tabelul va fi derulat
pana la valoarea specificata in MaxRows,iar in TMemo se vor afisa
datele
din tabel transcrise in limbaj HTML.
Pentru ca datele din tabel sa poata fi preluate prin
Internet,trebuie
ca aplicatia realizata sa fie inclusa intr-o aplicatie WebServer in
care
va functiona pentru formularea raspunsului trimis spre client:
Response.Content:=QueryTableProducer1.Content
Cu o astfel de aplicatie,se pot prelua direct din retea,date arhivate
intr-o baza de date si se pot afisa aceste date in format HTML.In
plus,
obiectul TQuery va putea utiliza limbajul SQL pentru a extrage datele
cat mai selectiv,iar obiectul QueryTableProducer se va putea utiliza
pentru a asigura un aspect grafic cat mai spectaculos (lizibil).
Observati usurinta cu care se poate manevra pentru a prelua date
dintr-o baza de date.Pentru intreaga aplicatie s-a utilizat o singura
linie de cod.In rest,obiectele vizuale din Delphi,contin proprietati
configurabile,care asigura toate link-urile necesare pentru
efectuarea
unor operatii complexe.Daca se adauga si flexibilitatea limbajului
SQL,
se pot formula solutii extrem de exacte de preluare a datelor din
arhive.
Pentru exploatarea optima a obiectelor care exploateaza
instructiunile
limbajului SQL este necesara cunoastrea completa a acestui limbaj.
Prezentarea exhaustiva a limbajului SQL,necesita un manual
separat,dar
pentru a putea utiliza minimal componentele SQL,este necesara si o
pre-
zentare simplista a notiunilor de baza.
Exista un numar destul de mare de versiuni ale limabjului SQL,cu
particularitati pentru unul sau mai multe dintre programele care
opereaza
cu baze de date formatate.In acest manual se vor prezenta succint
doar
cateva instructiuni simple,comune pentru toate versiunile de limbaj
si
acceptate de catre majoritatea programelor de baze de
date:Oracle,SysBase,
SQL Server,DB2,Access,My SQL etc. cuprinse in standardul ANSI din
1986.
Daca doriti sa utilizati Delphi pentru a scrie aplicatii
specializate
in manipularea bazelor de date,este bine sa obtineti documentatia
completa
atat pentru limbajul SQL cat si pentru programul de baza de date
utilizat.
Pentru aplicatii ocazionale,sau de interes restrans,sunt suficiente
info-
rmatiile prezentate in acest manual.Daca nu aveti un program
specializat,
puteti utiliza si transforma tabelele din directorul Delphi
3/Demos/Data.
-55-
SQL
LIMBAJUL SQL (Structured Query Language) (rezumat)
-56-
Atunci cand creati o baza de date,alegeti cu atentie numele
coloanelor,
astfel incat sa nu se preteze la ambiguitati.De exemplu,in tabelul
Biolife
exista o coloana cu titlul Species Name.Daca doriti sa solicitati cu
SELECT aceasta coloana,formula SELECT Species Name FROM Biolife.db va
returna un mesaj de eroare,deoarece spatiul gol va fi interpretat ca
si
sfarsit al denumirii si se va cauta coloana Species (care nu exista).
Pentru a formula astfel de coloane se va prefera Species_Name sau
orice
alta formula de evitare a ambiguitatilor.
Daca urmariti cu atentie tabelul,in coloana Category puteti
observa
ca exista mai multi pesti din aceeasi categorie(Exemple;
shark,snapper,
Wrasse).Pentru selectarea exclusiva a unui singur element din fiecare
tip se poate utiliza cuvantul cheie DISTINCT.
EXEMPLU: introduceti urmatoarea comanda:
SELECT DISTINCT Category FROM Biolife.db
Observati ca se vor afisa doar 21 de categorii,fata 28 initiale
(toate
repetitiile au fost excluse).
Cu datele de pana acum,putem selecta dintr-o baza de date,una sau
mai multe coloane.Dar,intr-o baza de date reala,aceste coloane pot fi
extrem de lungi (mii de inregistrari).Pentru a realiza o selectie mai
eficienta,se poate adauga o conditie de cautare,care va extrage din
coloana selectata doar acele inregistrari care respecta conditia.
Sintaxa generala este:
SELECT coloana FROM tabelul WHERE coloana OPERATORUL valoarea
deci conditia este formata prin compararea detelor dintr-o coloana
oare-
care (poate fi alta coloana decat cea selectata) cu o valoare de
control.
De exemplu,pentru a extrage denumirea comuna a tuturor speciilor de
rechin din tabelul Biolife se va utiliza o formula de genul:
SELECT Common_Name FROM Biolife.db WHERE Category = 'Shark'
sau pentru a selecta doar denumirile comune care incep cu litera A,B
sau
C se poate utriliza o formula de genul:
SELECT Common_Name FROM Biolife.db WHERE Common_Name < 'D'
SELECT se poate utiliza si cu una dintre functiile SQL,pentru a
produce
o valoare noua.De exemplu,pentru a determina valoarea medie a
lungimii,
pentru toate speciile din tabel,se poate utiliza functia AVG()
astfel:
SELECT AVG(Length_In) FROM Biolife.db (vezi si Functiile SQL)
pentru a returna toate coloanele,dar pentru o singura inregistrare
din
tabel,se va formula o comanda care include in conditie o anumita data
cunoscuta:
SELECT * FROM Biolife.db WHERE Common_Name = 'Firefish'
Cand se cunoaste o anumita data din tabel,se poate utiliza operatorul
IN
Astfel,comanda de mai sus este identica cu:
SELECT * FROM Biolife.db WHERE Common_Name IN('Firefish')
sau pentru a utiliza operatorul LIKE se va edita o comanda de genul:
SELECT * FROM Biolife.db WHERE Category LIKE '%Snapper'
Pentru a selecta un grup de inregistrari,la care una dintre coloane
are
o valoare cuprinsa intre anumite limite,se poate utiliza operatorul
BETWEEN ... AND.
De exemplu,pentru a selecta din tabelul Biolife.db,speciile de
peste cu
lungimea cuprinsa intre 35 si 50 se va edita o comanda de genul:
SELECT * FROM Biolife.db WHERE Length_In BETWEEN 35 AND 50
Incercati exercitii similare,pana cand stapaniti bine comanda SELECT.
-57-
Daca nu mai doriti sa tot activati si dezactivati proprietatea
Active
din Query1,adaugati doua butoane,un camp TEdit si urmatoarele
proceduri
OnClick pentru butoane(Button1=OK si Button2=Executa):
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Active:=False;
Query1.SQL.Text:=Edit1.Text;
Query1.Active:=True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Query1.Active:=False;
Query1.SQL.Text:=Edit1.Text;
Query1.ExecSQL;
end;
Primul buton(denumit OK) va fi utilizat pentru operatiile care nu
modifica
baza de date (de tip SELECT) iar cel de al doilea pentru cele care
modi-
fica baza de date (INSERT INTO,DELETE,UPDATE etc).
Puteti utiliza Edit1 si butonul OK pentru a explora si restul
tabelelor
din DATA:
Animals.dbf,Clients.dbf,Holdings.dbf,Master.dbf,Industry,dbf,
Events,Customer,Items,Orders,Vendors etc.
Pentru a adauga o noua inregistrare,se poate utiliza comanda
INSERT,
care are urmatoarea sintaxa generala (cu Edit1 + butonul Executa)
INSERT INTO tabel VALUES(valoarea1,valoarea2....valoarea"n") sau:
INSERT INTO tabel(coloana1,coloana2....)
VALUES(valoarea1,valoarea2...)
Exemplu,pentru Biolife.db:
INSERT INTO Biolife.db(Category) VALUES('Crap')
Pentru a observa modificarea inchideti si apoi reporniti programul.
Pentru a sterge o inregistrare din tabel se poate utiliza comanda
DELETE,care are urmatoarea sintaxa generala:
DELETE FROM tabel WHERE coloana=valoare
De exemplu,pentru a sterge valoarea Crap introdusa anterior se va
putea
utiliza linia de comanda:
DELETE FROM Biolife.db WHERE Category = 'Crap'
Este bine sa faceti o copie de siguranta a fisierelor,inainte de a
incepe
operatiile de steregere.In caz contrar,riscati sa pierdeti
irecuperabil
o parte din date.Acest principiu este util pentru orice operatie de
actualizare a unei baze de date.Executati initial o copie de
siguranta,
apoi efectuati toate operatiile dorite.Daca rezultatul este
multumitor
puteti sterge copia de siguranta.Daca au intervenit erori de
conceptie,
sau de executie,reinstalati copia de siguranta si repetati procesul.
Pentru a schimba o anumita data,dintr-o singura coloana,puteti
utiliza
comanda UPDATE,care are urmatoarea sintaxa generala:
UPDATE tabel SET coloana=valoare noua WHERE coloana=valoare veche
Exemplu: pentru a schimba in tabelul Biolife denumirea de 'Shark' cu
cea
de 'Rechin' se poate utiliza urmatoarea comanda:
UPDATE Biolife.db SET Category='Rechin' WHERE Category='Shark'
Prj52 este conceput destul de rudimentar si are doar rol
exemplificativ.
Puteti realiza un program cu cate un buton specializat pentru fiecare
operatie,sau cu mai multe campuri de afisare in care datele sa poata
fi
prezentate diferit,etc.
-58-
In afara de selectie,datele din tabel pot fi si ordonate dupa un
anumit criteriu.
Ordonarea de face alfabetic prin adaugarea sufixului:ORDER BY
coloana.
De exemplu,in tabelul Biolife.db se pot ordona alfabetic speciile de
peste
in functie de denumirea lor comuna,cu comanda:
SELECT * FROM Biolife.db ORDER BY Common_Name
Pentru a exploata si alta baza de date,introduceti comanda:
SELECT * FROM Events
Pentru a selecta evenimentele sportive in ordinea datei de incepere:
se poate utiliza comanda:
SELECT * FROM Events ORDER BY Event_Date
Sau pentru a ordona evenimentele alfabetic se poate utiliza comanda:
SELECT * FROM Events ORDER BY Event_Name
iar pentru a ordona evenimentele in functie de ora inceperii:
SELECT * FROM Events ORDER BY Event_Time
Pentru a grupa doua sau mai multe conditii utilizate impreuna cu
WHERE
se pot utiliza operatorii AND si OR
De exemplu,pentru a putea selecta din tabelul Events toate
evenimentele
din data de 6/20/96 care se desfasoara dupa ora 3:00:00 PM se poate
utiliza o comanda de genul:
SELECT *FROM Events WHERE Event_Date='6/20/96' AND
Event_Time>'3:00:00 PM'
Limbajul SQL permite si selectarea de date din doua sau mai multe
tabele
simultan,sau reunirea dintre doua comenzi cu UNION:
SELECT coloana FROM tabel1
UNION
SELECT coloana FROM tabel2
EXEMPLU: extrage codul postal(ZIP) din tabelele Clients.dbf si
Customer
SELECT zip FROM Clients.dbf UNION SELECT zip FROM CUSTOMER
Apasati butonul Executa,apoi butonul OK.
Comanda UNION este asemanatoare cu SELECT DISTINCT,adica sumeaza din
cele
doua comenzi doar rezultatele distincte.Daca doriti sa selectati
toate
datele,inclusiv cele care se repeta,se va utiliza comanda UNION ALL
(care
are sintaxa identica cu UNION).
Pentru a intersecta datele din doua tabele diferite,in functie de
o conditie prestabilita,se poate utiliza comanda JOIN (sau variantele
sale INNER JOIN,LEFT JOIN,RIGHT JOIN):
Pentru JOIN sintaxa generala este:
SELECT tabel1.coloana1,tabel2.coloana2 FROM tabel1,tabel2
WHERE tabel1.coloana3=tabel2.coloana4
Se pot selecta coloane diferite din cele doua tabele,care respecta
con-
ditia specificata prin WHERE...
EXEMPLU: pentru a vedea numele companiilor care sunt localizate in
acelasi stat cu consumatorii se pot utiliza tabelele Vendors si
Customer
si urmatoarea linie de comanda:
SELECT Vendors.City,Customer.Company FROM Vendors,Customer
WHERE Customer.State = Vendors.State
Observati ca am utilizat pentru stabilirea conditiei alta coloana
decat
cele selectate pentru afisare.Apasati butonul Executa si apoi
butonul OK.
Pentru fiecare locatie din tabelul Vendors se va afisa numele
companiei
din Customer care este localizata in acelasi stat.Mai exact,se va
extrage
fiecare coloana ceruta ori de cate ori conditia WHERE este
satisfacuta.
-59-
O comanda asemanatoare este INNER JOIN,care returneaza toate
datele din
ambele tabele,daca satisfac conditia specificata.Sintaxa generala
este:
SELECT Tabel1.coloana1,Tabel2.coloana2 FROM Tabel1 INNER JOIN Tabel2
ON Tabel1.coloana3=Tabel2.coloana4
De exemplu,pentru cele doua tabele de mai sus se poate utiliza:
SELECT Vendors.VendorName FROM Vendors INNER JOIN Customer
ON Vendors.State = Customer.State
Comanda LEFT JOIN este aproape identica,dar returneaza coloana din
primul tabel in intregime,chiar daca nu verifica conditia specificata
(copiaza complet datele din stanga ecuatiei si selectiv cele din
dreapta
ecuatiei):
EXEMPLU:
SELECT Vendors.VendorName,Customer.Zip FROM Vendors LEFT JOIN
Customer
ON Vendors.State = Customer.State
Observati ca in coloana din stanga apar si date care nu au
corespondent
in coloana din dreapata.Pentru datele care respecta conditia,numele
vanzatorului este repetat pentru fiecare cod postal din statul
respectiv.
Comanda RIGHT JOIN este asemanatoare,dar returneaza complet
datele
din coloana solicitata din cel de al doilea tabel si returneaza
selectiv
datele din coloana aleasa din primul tabel,doar daca aceste date
verifica
conditia specificata prin ON:
EXEMPLU:
SELECT Vendors.VendorName,Customer.Zip FROM Vendors RIGHT JOIN
Customer
ON Vendors.State = Customer.State
Observati ca in acest caz,coloana din dreapta (Zip) are mult mai
multe
date decat cea din stanga (VendorName).
Este foarte important ca aceste comenzi sa fie formulate cat mai
clar,
pentru a realiza o selectie cat mai discriminativa.Atunci cand se
inter-
secteaza datele din doua tabele,teoretic se pot obtine un numar
extrem
de mare de combinatii posibile.Arta programatorului este de a
formula
expresia cea mai simpla care returneaza cat mai exact datele dorite.
Daca formula de selectie nu este buna,sau daca nu formulati nici o
con-
ditie de selectie,se vor returna tabele extrem de lungi,practic
imposibil
de evaluat.Este bine sa exersati acest gen de comenzi cu tabele cat
mai
mici,pana cand formulati cat mai exact expresiile de comanda.
Pentru a schimba structura unui tabel,se poate utiliza comanda
ALTER TABLE care va adauga sau va sterge o colana in
intregime.Comanda
are doua variante:
ALTER TABLE tabel ADD coloana tipul de data
si ALTER TABLE tabel DROP COLUMN coloana
De exemplu pentru a adauga o coloana de concluzii,de tip char,la
tabelul
Orders se poate utiliza comanda:
ALTER TABLE Orders ADD Concluzii char
Tastati Executa,apoi inchideti programul,reporniti si utilizati
comanda
SELECT * FROM ORDERS pentru a vedea modificarea efectuata.
Pentru a sterge coloana adaugata se va putea utiliza comanda:
ALTER TABLE Orders DROP COLUMN Concluzii
Tastati Executa,apoi inchideti programul.
Comenzile de modificare a tabelelor cu ALTER TABLE se vor utiliza
cat
mai rar,si cu maxim de discernamant,deoarece reformateaza intrega
baza
de date si introduc un numar mare de spatii goale.
-60-
Nu este recomandabil nici sa eliminati coloane de date dintr-o
baza de
date.O baza de date se construieste greu si se distruge sau sterge
foarte
usoar.Date aparent intutile la prima vedere pot fi extrem de utile
intr-un
viitor apropiat.In general,atunci cand proiectati o baza de
date,alegeti
coloanele si tipul datelor,astfel incat sa nu fie necesar sa fie
modifi-
cate ulterior.Se pot restructura bazele de date,atunci cand vor fi
apli-
cate intr-un alt proiect (mai restrans sau mai amplu).
Pentru a pastra formatul unui tabel si a sterge doar datele din
coloane
se poate utiliza comanda TRUNCATE TABLE tabelul.
Pentru a sterge un tabel si respectiv o baza de date,se pot
utiliza
comenzile DROP TABLE Tabel si DROP DATABASE nume.
FUNCTII SQL
Limbajul SQL include si o serie de functii,care pot fi incluse in
comenzi,pentru a obtine rezultate diferite de cele arhivate in
tabele.
Sintaxa generala pentru apelarea unei functii este:
SELECT functia(coloana) FROM tabel
Functiile care actioneaza asupra unei colectii de date,pentru a
returna
o singura valoare se numesc functii agregate,iar cele actioneaza
asupra
unei singure valori pentru a returna o valoare unica se numesc
scalare.
Functiile agregate sunt:
AVG(coloana) -returneaza valaorea medie a coloanei
COUNT(coloana) -returneaza numarul de linii din coloana
COUNT(*) -returneaza numarul de coloane selectate
FIRST(coloana) -returneaza prima inregistrare din coloana
LAST(coloana) -returneaza ultima inregistrare din coloana
MAX(coloana) -returneaza valaorea cea mai amre din coloana
MIN(coloana) -returneaza valaorea cea mai mica din coloana
SUM(coloana) -returneaza suma valorilor din coloana
Functiile scalare sunt:
UCASE(c) -converteste caracterele la majuscule
LCASE(c) -converteste caracterele la minuscule
MID(c,start[end])-extrage caractere dintr-un text (intre start si
end)
LEN(c) -returneaza lungimea textului
INSTR(c,char) -returneaza pozitia caracterului in text
LEFT(c,nrofchar) -returneaza partea din stanga a textului
(nrofchar)
RIGHT(c,nrofchar)-returneaza partea din dreapta a textului
ROUND(c,decimals)-rotunjeste valoarea numerica
MOD(x,y) -executa operatia modul (restul impartirii)
NOW() -returneaza data curenta
FORMAT(c,format) -schimba formatul datelor
DATE DIFF(d,date1,date2)-calculeaza diferenta datelor
calendaristice
EXEMPLE: pentru a efectua o medie aritmetica:
SELECT AVG(YRL_HIGH),AVG(YRL_LOW) FROM Master.dbf
pentru a aduna toate inregistrarile dintr-o coloana:
SELECT SUM(Shares) FROM Holdings.dbf
pentru a selecta valaorea maxima si valaorea minima din
coloana
SELECT MAX(Shares),MIN(Shares) FROM Holdings.dbf
pentru a afla numarul de inregistrari dintr-un tabel:
SELECT COUNT(Category) FROM Biolife.db
pentru a calcula o suma partiala,in functie de o conditie:
SELECT SUM(CUR_PRICE) FROM Master.dbf WHERE YRL_HIGH > 50
-61-
Functiile agregate se pot utiliza si pentru a realiza calcule
partiale
ale unor date din coloana respectiva,care respecta o anumita conditie
introdusa prin GROUP BY.De exemplu,in tabelul Biolife.db exista trei
specii de cod,doua specii de rechin etc.Pentru a determina care este
lungimea medie,pentru fiecare specie,se poate utiliza formula:
SELECT Category,AVG(Length_In) FROM Biolife.db GROUP BY Category
In continuare,pentru a selecta dintre speciile de peste,doar cele
care
au dimensiunea medie mai mare de 40 de cm,se poate adauga o noua
conditie
Pentru functiile agregate,in loc de WHERE se va utiliza HAVING.
EXEMPLU:
SELECT Category,AVG(Length_In) FROM Biolife.db GROUP BY Category
HAVING AVG(Length_In) > 40
Pentru a copia date dintr-un tabel in altul se utilizeaza comanda
SELECT INTO cu sintaxa generala:
SELECT nume INTO tabel nou(IN-baza de date] FROM sursa
EXEMPLU: SELECT * INTO Angajati FROM Persoane va copia tot
tabelul.
O comanda SQL poate fi utilizata si sub forma de membru al unei
ecuatii,
unde ecuatia respectiva specifica o anumita conditie:
EXEMPLU:
SELECT Co_Name,Yrl_Low FROM Master.dbf
WHERE Yrl_Low < (SELECT AVG(Yrl_Low) FROM Master.dbf)
va selecta din tabel,doar companiile pentru care valoarea minima
anuala
este mai mica decat media valorilor minime anuale (al
pretului/actiune)
Pentru a crea baze de date,puteti utiliza CREATE DATABASE si
CREATE
TABLE,dar este recomandabil sa utilizati un program
specializat(FoxPro).
Principala problema o constitue modul de selectie a datelor din
bazele
de date foarte mari (cu mii si zeci de mii de inregistrari).Un numar
prea
mic de conditii,va returna un numar prea mare de rezultate,iar un
numar
prea mare de conditii poate sa excluda exact rezultatele cautate,sau
cele foarte asemenatoare care prezinta un interes secundar.Este exact
genul de dilema al "internautilor Google".
Atunci cand proiectati si programati o aplicatie Delphi,care
exploa-
teaza o baza de date,este bine sa utilizati butoane sau comenzi care
executa automat comenzile SQL precizate de d-voastra.Nu este
recomandabil
sa lasati formularea acestor comenzi pe seama utilizatorului (este
absolut
impredictibil la ce rezultate vor putea ajunge).
In general,Delphi este proiectat pentru a realiza interfete
vizuale cu
utilizatorul,astfel incat acesta sa nu trebuiasca decat sa apese un
singur
buton.
Atunci cand bazele proiectate vor fi in permanenta
crestere,verificati
comenzile si dinamic.Adauagti progresiv un anumit numar de
inregistrari si
apoi verificati si reverificati comenzile utilizate.
In cazul in care nu puteti formula o comanda ideala,este
preferabil sa
afisati si un numar limitat de date inutile,decat sa pierdeti o parte
dintre datele semnificative.
Pentru bazele de date cu care se lucreaza frecvent,este bine sa
salvati
copii de siguranta,realizate in etape succesive (baza de date de la
debut,
baza de date cu datele esentiale si ultima actualizare a bazei de
date).
In acest mod,pastrati in siguranta atat formatul de baza cat si
datele
esentiale sau recente.In general,bazele de date mici sunt mai
eficiente
decat cele foarte lungi(se prefera organizarea modulara cu baze
multiple).
-62- Internet -
TDataSetTableProducer
TDataSetTableProducer este un obiect care combina facilitatile
oferite
de TPageProducer cu cele oferite de TQueryTable producer.Mai
exact,acest
component permite preluarea datelor de tip tabelar,dintr-o baza de
date
si reeditarea acestora sub forma de text in limbaj HTML.Ca
rezultat,datele
vor putea fi utilizate pentru a realiza file HTML locale sau pentru a
formula raspunsul unei aplicatii WebServer(sub forma de mesaj HTML).
Proprietatile sunt asemenatoare cu cele cele ale obiectului
TQueryTable
Producer si sunt destinate pentru reformatarea datelor
preluate:Columns,
Footer,Header,MaxRows,RowAttributes si TableAttributes.Dintre metode,
cea mai importanta este Content,care returneaza rezultatul conversiei
datelor din text in HTML.Obiectul contine si trei evenimente care pot
fi
utilizate pentru controlul actiunilor executate.Astfel
OnCreateContent
se poate utiliza pentru a returna un raspuns nul,OnFormatCell se
poate
utiliza pentru a schimba formatul unei singure celule(de exemplu
efect
de clipire automata) iar OnTableCaption se poate utiliza pentru a
schimba
dinamic titlul tabelului returnat.
EXEMPLU: vezi Prj53
Salvati o fila noua si proiectul in Prj53.Adaugati din Data Access un
component TDataSource si un component TTable.Apoi adaugati un
component
TDataSetTableProducer iar din Standard adaugati un camp TMemo si un
buton.
Selectati DataSource1 si setati DataSet la valoarea Table1,apoi
alegeti
Table1 si setati DatabaseName la valoarea DBDEMOS,alegeti pentru
TableName
o valoare oarecare(De exemplu: COUNTRY.DB) si apoi setati Active la
va-
loarea TRUE.Apoi selectati DataSetTableProducer1 si setati DataSet la
valoareaTable1.
In acest moment,in Columns trebuie sa fie afisate datele din
tabelul
selectat.Utilizati obiectul Editing DataSetTableProducer1.Columns
pentru
a schimba aspectul datelor dupa bunul plac.Modificati Border,BgColor,
Cellpadding si Cellspacing apoi puteti selecta AddAllFields si puteti
modifica fiecare coloana in parte.
Pentru a vizualiza textul rezultat in urma conversiei,atribuiti
buto-
nului urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(DataSetTableProducer1.Content);
end;
Tastati F9 si executati aplicatia.In Memo1 se va afisa textul
rezultat.
Pentru a salva datele produse intr-o fila locala,adaugati in Prj o
fila
goala denumita Fila1.htm (vezi Prj54).Apoi modificati procedura
OnClick
atribuita butonului astfel:
procedure TForm1,Button1Click(Sender: TObject);
var F1:TextFile;
begin
Memo1.Lines.Add(DataSetTableProducer1.Content);
AssignFile(F1,'Fila1.htm');
Rewrite(F1);
Write(F1,Memo1.Lines.Text);
CloseFile(F1);
end;
Puteti deschide Fila1.htm cu Internet Explorer pentru a vedea
rezultatul.
-63- Internet -
TWebDispatcher
Dupa cum se preconizeaza si din denumire,TWebDispatcer este un
dispe-
cer de comenzi.Este proiectat pentru a selecta un anumit raspuns
posibil,
dintre mai multe raspunsuri alternative,in cadrul unei aplicatii de
Web.
Practic functioneaza ca o mini centrala telefonica,implementata la
nivel
de software.Impreuna cu un obiect de tip DataModule este exchivalent
cu
un obiect TWebModule.Se utilizeaza pentru a transforma o aplicatie
lo-
cala,intr-o aplicatie de tip WebServer(Exemplu: pentru a permite
accesul
din retea la un tabel arhivat intr-o baza de date locala).
Nu poate fi utilizat impreuna cu TWebModule,deoarece o aplicatie
de
tip Web poate avea un singur dispecer(TWebModule are un
TWebDispatcher
inclus).Cele doua componente se exclud reciproc.Dispecerul
administreaza
o colectie intreaga de elemente,care pot avea alocate actiuni
proprii.
Pentru editarea acestor elemente si a procedurilor atribuite lor se
poate
utiliza proprietatea Actions,respectiv editorul Editing
WebDispatcher.
Utilizati butonul Add,apoi alegeti actiunea si utilizati Object
Inspector
pentru a seta proprietatile si evenimentele OnAction.
Un astfel de dispecer poate fi utilizat si in aplicatiile locale,nu
doar
in cele din retea.
EXEMPLU: (vezi si Prj55)
Salvati o fila noua si proiectul in Prj55.Adaugati un camp TMemo si
un
buton.Apoi alegeti din meniul File optiunea New DataModule.Adaugati
in
modulul de date un obiect TWebDispatcher.Selectati dispecerul si
alegeti
din Object Inspector Actions.In fereastra de editare,utilizati
butonul Add
pentru a adauga cinci elemente (Items).Denumiti aceste elemente:
Actiunea 1...Actiunea 5 (selectati elementul si apoi setati
proprietatea
Name la denumirea dorita).Inchideti fereastra de editare si apoi
compilati
unitatea Unit1.Apoi selectati din nou fila initiala (cea care contine
butonul) si alegeti din Meniul File optiunea Use Unit.Utilizati
optiunea
pentru a adauga unitatea in lista de unitati.In acest moment,datele
din
modul si respectiv din componentul TWebDispatcer pot fi accesibile si
din
fila Form1.Selectati butonul si adaugati urmatoarea procedura
OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var nr:integer;
begin
Memo1.Clear;
for nr:=0 to 4 do
Memo1.Lines.Add(DataModule1.WebDispatcher1.Actions.Items[nr].Name);
end;
Tastati F9 si executati aplicatia.
La apasarea butonului,in campul TMemo se va afisa lista elementelor
din
dispecer.In situatia in care un astfel de dispatcher este amplasat in
server-ul WEB,din retea se va putea apela unul dintre aceste
elemente,sau
procedura care este atribuita elementului respectiv (asemanator cu
modul
in care o aplicatie locala poate accesa elementele si procedurile
dispe-
cerului).
Dispecerul poate fi utilizat si pentru a executa selectiv o serie
intreaga de proceduri locale,sau in retea.Se realizeaza astfel un
modul
executabil,care poate fi apelat atat local,cat si din retea.Pentru
acest
scop,se arhiveaza in dispecer un numar oarecare de elemente si apoi
se
atribuie cate o procedura pentru fiecare element.Din retea se va
utiliza
o solicitare de tip Request,iar local se va apela direct procedura.
-64-
EXEMPLU: (vezi Prj56)
Salvati o fila noua si proiectul in Prj56.Adaugati in fila un camp
TMemo
si doua butoane (denumite Actiune 1 si Actiune 2).Apoi adaugati un
modul
de date (cu New DataModule) si adaugati in acest modul un obiect de
tip
TWebDispatcher.Utilizati Actions si adaugati doua elemente denumite
Actiune1 si Actiune2.Selectati pe rand cele doua elemente si
atribuiti
pentru fiecare dintre ele un eveniment OnAction:
procedure TDataModule1.WebDispatcher1Actiune1Action(Sender: TObject;
Request: TWebRequest;Response: TWebResponse; var Handled:
Boolean);
begin
beep;
end;
si respectiv:
procedure TDataModule1.WebDispatcher1Actiune2Action(Sender: TObject;
Request: TWebRequest;response: TWebResponse; var Handled:
Boolean);
begin
beep;
sleep(500);
beep;
end;
Compilati si salvati unitatea,apoi utilizati File si Use Unit pentru
a
adauga acest modul in lista de unitati pentru Form1.Apoi selectati pe
rand cele doua butoane si atribuiti urmatoarele proceduri OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var a1: TWebrequest;
b1: TWebresponse;
c1: boolean;
begin
a1:=DataModule1.WebDispatcher1.Request;
b1:=DataModule1.WebDispatcher1.Response;
Memo1.Clear;
Memo1.Lines.Add('Executa comanda Actiune 1 !');
Memo1.Lines.Add('(beep)');
DataModule1.WebDispatcher1Actiune1Action(Sender,a1,b1,c1);
end;
si respectiv pentru cel de al doilea buton:
procedure TForm1.Button2Click(Sender: TObject);
var a2: TWebRequest;
b2: TWebResponse;
c2: Boolean;
begin
a2:=DataModule1.WebDispatcher1.Request;
b2:=DataModule1.WebDispatcher1.Response;
Memo1.Clear;
Memo1.Lines.Add('Executa comanda Actiune 2 !');
Memo1.Lines.Add('(beep...beep)');
DataModule1.WebDispatcherActiune2Action(Sender,a2,b2,c2);
end;
Tastati F9 si executati aplicatia.Cele doua butoane vor executa
alternativ
cele doua proceduri (un beep sau doua beep-uri).Daca se amplaseaza
apli-
catia intr-un server,cele doua proceduri vor putea fi apelate din
retea.
-65-
Pentru a putea prelua un tabel dintr-o baza de date si a trimite
acest
tabel in retea,sub forma de fila HTML,se va putea realiza o aplicatie
care combina o serie dintre componentele prezentate pana acum:
EXEMPLU: (vezi si Prj57)
Salvati un modul de date si proiectul in Prj57.Adaugati un
TWebDispatcher,
un TDataSetTableProducer si din Data Access adaugati un obiect
DataSource
si un obiect TTable.
Setati proprietatea DataSet din DataSource la valoarea Table1.Apoi
selec-
tati Table1 si setati DatabaseName la valoarea DBDEMOS,respectiv
proprie-
tatea TableName la valoarea EVENTS.DB (sau orice alt tabel din baza
de
date) si apoi proprietatea Active la valoarea True.
Selectati DataSetTableProducer1 si setati proprietatea DataSet la
valoarea
Table1,apoi utilizati Columns pentru a selecta aspectul HTML al
tabelului
preluat (vezi TDataSetTableProducer).
In final,alegeti obiectul WebDispatcher,utilizati Actions pentru a
adauga o proprietate (Exemplu: Evenimente).Selectati elementul si
apoi
setati pentru acest element proprietatea Default la valoarea True.
Adaugati si o cale de acces prin setarea proprietatii PathInfo
(Exemplu
la valoarea "act1").Apoi alegeti Events si atribuiti urmatoarea
procedura
OnAction:
procedure TDataModule1.WebDispatcher1EvenimenteAction(Sender:
TObject;
Request: TWebRequest; Response: TWebResponse; var Handled:
Boolean);
begin
Response.Content:=DataSetTableProducer1.Content;
end;
Compilati aplicatia (modulul nu executa nimic).
In aplicatia realizata,dispecerul are ca metoda implicita(default)
pro-
cedura atribuita elementului "Evenimente",care formuleaza raspunsul
aplicatiei atribuind valoarea returnata de obiectul
TDataSetTableProducer.
Practic,daca aplicatia este arhivata intr-un server,poate fi apelata
din
retea cu o solicitare (Request) in care se va specifica adresa
serverului,
si numele aplicatiei.In cazul in care dispecerul contine mai multe
ele-
mente solicitarea se va face cu o formula de genul:
URL + numele aplicatiei + elementul + calea de acces
( EXEMPLU: URL + Prj56.dll + Evenimente + act1 )
La primirea unei astfel de solicitari,serverul va returna catre
client
un mesaj de raspuns care contine tabelul in format HTML,asa cum poate
fi
vazut in TDataSetTableProducer.Columns.
Teoretic,aceste elemente sunt suficiente pentru a putea crea o
aplicatie
de tip WebServer.Practic,pentru a exclude orice eroare sau
disfunctionali-
tate este bine sa va consultati cu administratorul de retea,inainte
de a
incerca sa realizati si sa aplicati acest gen de aplicatii.Pentru
publi-
carea aplicatiilor de tip WEB,este bine sa utilizati doar servere
specia-
lizate.Bineinteles ca este posibil sa transformati calculatorul
personal
intr-un server WEB,dar acest fapt este nepractic si
nerecomandabil,din
urmatoarele motive:
-serverul WEB trebuie sa functioneze nonstop (cu consum mare de
energie)
-serverul WEB trebuie sa detina mijloace avansate de protectie
impotriva
"hack-erilor" si a "virus-urilor accidentale"
-procesorul este ocupat pentru deservirea retelei (asteapta
solicitari)
-nu va va ridica nimeni,nici un monument (dimpotriva !).
-69- DataAccess -
TTable
TTable este unul dintre obiectele utilizate pentru a accesa o baza
de
date.Se utilizeaza impreuna cu TDataSource,care va prelua datele
accesate
de TTable.Un obiect de tip TTable se poate utiliza pentru a prelua un
singur tabel,dintr-o singura baza de date.TTable permite accesul
direct
la fiecare inregistrare din tabel.Se poate utiliza pentru baze de
date
editate cu unul dintre programele: Paradox,dBASE,Access,FoxPro sau
pentru
a prelua date de la un server din retea de tip
Interbase,Oracle,Sysbase,
Informix sau DB2.
Prin proprietatile si metodele sale,tTable se poate utiliza si
pentru
a prelua doar o parte din date,cu ajutorul unor filtre,care vor
selecta
din tabel doar datele care respecta conditiile specificate.
TTable,impreuna cu celelalte componente nonvizuale,poate fi
arhivat
intr-un modul de tip DataModule.Un astfel de modul poate contine
toate
obiectele necesare pentru a accesa una sau mai multe baze de date.In
cazul in care se vor realiza mai multe aplicatii,care utilizeaza
aceleasi
baze de date,modulul DataModule va putea fi utilizat pentru fiecare
dintre acestea.Astfel un proiect poate contine doua sau mai multe
file
care utilizeaza acelasi modul,pentru a prelua datele din mai multe
tabele.
Pentru a prelua datele din doua sau mai multe tabele,este necesar
cate
un obiect TTable si cate un obiect TDataSource,pentru fiecare tabel:
EXEMPLU: (vezi si Prj60)
Salvati o fila noua si proiectul in Prj60.Adaugati din DataControls
doua
obiecte TDBGrid si doua obiecte TDBNavigator.
Din File,alegeti New Data Module si adaugati in proiect un modul
de
date.Adaugati in DataModule1 doua obiecte TDataSource si doua obiecte
TTable.Apoi selectati fila Form si din meniul File utilizati Use Unit
pentru a introduce modulul de date in lista de unitati a proiectului.
Reveniti in Datamodule1 si setati DataSource1 la DataSet=Table1 si
respectiv DataSource2 la DataSet=Table2.
Alegeti Table1,setati DatabaseName la DBDEMOS,TableName la
MASTER.DBF
si Active=TRUE.Alegeti Table2 si setati DatabaseName la
DBDEMOS,TableName
la HOLDINGS.DBF si Active la valoarea TRUE.
Selectati DBNavigator1 si setati DataSource la
DataModule1.DataSource1.
Selectati DBNavigator2 si setati DataSource la
DataModule1.DataSource2.
Selectati DBGrid1 si setati DataSource la DataModule1.DataSource1.
Selectati DBGrid2 si setati DataSource la DataModule2.DataSource2.
Tastati F9 si executati aplicatia.
In fereastra sunt doua tabele care pot fi accesate separat.Fiecare
tabel
este prelucrat de o pereche de obiecte DataSource + TTable si afisat
de
o pereche de obiecte DBGrid + DBNavigator.
Cele patru obiecte nonvizuale au fost grupate intr-un modul de
date.
In viitor,daca doriti sa utilizati cele doua baze de date,intr-o alta
formula (de exemplu sa preluati doar coloanele care contin
preturile),
este suficient sa adaugati modulul de date (cu Use Unit din File) in
lista de unitati a noii aplicatii,dupa care puteti selecta obiectele
dorite pentru afisarea datelor.
O alta situatie frecventa,este atunci cand mai multi utilizatori
au preferinte diferite pentru afisarea datelor preluate din aceleasi
baze de date.In acest caz,se poate utiliza un modul de date pentru
preluarea datelor si cate o fila de tip Form,pentru fiecare
utilizator
(cu obiectele de prezentare a datelor alese de utilizator).
-70- DataAccess -
TQuery
TTable contine si un numar destul de mare de proprietati si
metode.
Se pot realiza o serie intreaga de filtre de selectie,sau artificii
de
sortare si prezentare a datelor.
Un exemplu simplu: -cautarea unei anumite inregistrari in functie
de
o anumita valoare cunoscuta.
EXEMPLU: (vezi si Prj61)
Salvati o fila si proiectul in Prj61.Adaugati in fila un obiect
TData-
Source,un obiect TTable,un obiect TDBGrid,un obiect TDBImage si un
buton.
Setati DataSet din DataSource1 la valoarea Table1.
Setati Databasename din Table1 la DBDEMOS,TableName la ANIMALS.DBF si
Active la valoarea TRUE.
Setati DataSource din DBGrid1 la DataSource1 si DataSource din
DBImage tot
la valoarea DataSource1.
Acum obiectele sunt linkate si tabelul este afisat in DBGrid.Daca
dorim
sa adaugam o procedura de cautare rapida,putem utiliza butonul pentru
a
introduce si o functie Locate().De exemplu,pentru a cauta prima
inregis-
trare in care animalul are dimensiunea de 5 inchi,se va edita
urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Locate('SIZE','5',[loCaseInsensitive]);
end;
Tastati F9 si executati aplicatia.Apasand butonul OK,cursorul se va
deplasa automat la prima inregistrare care respecta conditia.
Acest procedeu,este util mai ales atunci cand utilizati foarte
frecvent o baza de date,din ce in ce mai mare,din care doriti sa
selectati
doar una sau mai multe inregistrati.Puteti adauga cate un buton de
cautare
rapida pentru fiecare inregistrare dorita.
Atentie la metodele care sterg datele din baza de date.TTable
lucreaza
direct cu baza de date,astfel incat datele sterse nu pot fi
recuperate.
Daca utilizati metode de stegere,este bine ca aceste metode sa fie
in-
cluse in proceduri standardizate,verificate cu atentie.Evitati proce-
durile interactive,in care comenzile sunt introduse in timpul
executiei,
deoarece un moment de neatentie va poate costa multe ore de munca.
-71-
Pentru comenzile care contin o comanda de tip SELECT (comenzi care
nu
modifica baza de date),nu este necesara nici o alta operatie
preliminara.
Se introduce comanda in proprietatea SQL si apoi se activeaza setand
proprietatea Active:=True.
Pentru comenzile care contin INSERT,UPDATE sau DELETE (comenzi
care
altereaza sau modifica baza de date) este necesara o operatie
preliminara
de pregatire a bazei de date.Puteti prepara baza de date cu metoda
Pre-
pare,sau puteti apela metoda ExecSql,care executa si o operatie de
pre-
parare a bazei de date,inainte de a executa comanda propriu-
zisa(continuta
in proprietatea SQL).
Daca nu cunoasteti limbajul SQL,puteti utiliza formula universala:
SELECT * FROM numele bazei de date
care va extrage toate datele din tabelul specificat(vezi si pagina
55).
De exemplu,pentru a selecta si afisa doar doua tipuri de date dintr-
un
tabel complex se poate utiliza un exercitiu de genul:
EXEMPLU: (vezi si Prj62)
Salvati si arhivati o fila noua si proiectul,in Prj62.Adaugati un
obiect
TDataSource si un obiect TQuery,apoi adaugati din DataControls un
obiect
TDBMemo,un obiect TDBImage si un obiect TDBNavigator.
Alegeti DataSource1 si setati DataSet la valoarea Query1.
Alegeti Query1 si setati DatabaseName la valoarea DBDEMOS,apoi
introduceti
in SQL urmatoarea comanda: SELECT Notes,Graphic,Category FROM
Biolife.db
Apoi setati Active la valoarea True.
Alegeti DBNavigator1 si setati DataSet la valoarea DataSource1.
Alegeti DBMemo1 si setati DataSource=DataSource1 si DataField=Notes.
Alegeti DBImage si setati DataSource=DataSource1 si
DataField=Graphic.
Tastati F9 si executati aplicatia.Din tabelul Biolife.db s-au
utilizat
doar doua coloane (cele care contin datele utile).
Pentru a identifica rapid o anumita inregistrare,se poate adauga
un
buton si o procedura Locate,astfel:
Adaugati un buton si atribuiti urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Locate('Category','Shark',[loCaseInsensitive]);
end;
Observati ca am exploatat cea de a treia coloana selectata in comanda
SQL.
Apasand butonul,se va selecta automat inregistrarea solicitata.
Puteti realiza un astfel de exercitiu,pentru un album de familie
sau
un jurnal de calatorie,o lucrare ilustrata etc.
Pentru a realiza o si mai mare flexibilitate,TQuery poate fi cuplat
cu
unul sau mai multe obiecte de tip TUpdateSQL.Obiectele de tip
TUpdateSQL
permit schimbarea unei comenzi SQL cu o alta comanda,stergerea sau
actua-
lizarea comenzii etc.Acest gen de operatie este utila,mai ales atunci
cand
se solicita comenzi de modificare a tabelelor prin operatii de tip
DELETE,
INSERT sau UPDATE.In mod normal,o astfel de operatie necestia o etapa
de
pregatire si apoi necestia o noua comanda de redeschidere a bazei de
date,
dupa ce s-au executat modificarile dorite.Cu ajutorul componentelor
de
tip TUpdateSQL,aceste operatii se pot executa in succesiune,astfel
incat
pentru utilizator apare ca o operatie simpla de modificare a unei
inre-
gistrari.In mod curent,obiectele TQuery si TUpdateSQL necesare pentru
implementarea procedurii se grupeaza intr-un modul de tip DataModule.
-72- DataAccess -
TClientDataSet
TClientDataSet este un obiect destinat tot pentru manipularea
datelor
si poate fi utilizat atat in aplicatii simple cat si in aplicatii in
care
obiectele prezinta mutiple legaturi intre ele (inlantuire multipla).
Poate prelua datele de la un obiect TRemoteServer,caz in care poate
fi
sursa de date,pentru obiectele de tip TDataSource,la fel ca si TTable
sau
TQuery.Practic,reprezinta o solutie alternativa de preluare a datelor
dintr-o baza de date,mai ales atunci cand baza de date este in
conexiune
permanenta cu un obiect de tip TRemoteServer.
Dintre tabelele utilizate pentru exemplificarea componentelor(cele
din
Demo/Data) doar tabelul Employee este in conexiune implicita cu
obiecte-
le TRemoteServer generate local.Pentru a realiza si alte
conexiuni,este
necesara existenta unui server activ.
TClientDataSet,detine un numar foarte mare de metode,care pot fi
uti-
lizate pentru a prelua datele dintr-un tabel,pentru a transfera
datele
intr-o fila locala,pentru a selecta sau identifica o anumita
inregistrare,
pentru a determina numarul sau valoarea inregistrarii curente etc.
O alta utilizare frecventa,este atunci cand o aplicatie solicita
mai
multe instante ale unei baze de date.In acest caz,se poate utiliza un
singur TRemoteServer si cate un obiect TClientDataServer pentru
fiecare
instanta a tebelului pe care doriti sa o generati.
EXEMPLU: (vezi si Prj63)
Salvati o fila noua si proiectul in Prj63.Adaugati un obiect
TDataSource,
un obiect TClientDataSet si un obiect TRemoteServer.
Selectati RemoteServer1 si setati ServerName la valoarea
Serv.EmpServer.
Automat,proprietatea ServerGUID va contine un cod de
identificare(practic
codul de interfata al tabelului Employee din DBDEMOS).Apoi setati
pro-
prietatea Connected la valoarea True.Se va afisa o fereastra denumita
Employee Data Server,care va afisa numarul de clienti si numarul de
solicitari.Din acest moment,aplicatia este in conexiune permanenta cu
tabelul Employee.Daca in calculatorul d-voastra exista un server
instalat,
continand baze de date,puteti alege valoarea ServerName dintr-o
lista
intreaga de optiuni.
In continuare selectati obiectul ClientDataSet1 si setati
proprietatea
RemoteServer la valoarea RemoteServer1.Apoi alegeti proprietatea
ProviderName si setati valoarea EmpQuery si proprietatea Active la
valoa-
rea True.
Alegeti DataSource1 si setati DataSet la valoarea ClientDataSet1.
Apoi adaugati un obiect de tip TDBGrid (din DataControls) si setati
proprietatea DataSource la valoarea DataSource1.
Se vor afisa datele din tabelul Employee.
Tastati F9 si executati aplicatia.
Pentru a adauga o noua instanta a tabelului,adaugati un obiect
TDataSource
si un obiect TClientDataSet.Alegeti TClientDataSet si setati
RemoteServer
la valoarea RemoteServer1 si ProviderName la valoarea EmpQuery.Apoi
setati
proprietatea MasterSource la valoarea DataSource1 si executati un
dublu
click pe MasterFields.Alegeti FirstName din ambele coloane (Detail
Fields
si MasterFields) apoi apasati butonul Add si apoi OK. Setati
Active=True.
In acest moment noua instanta a tabelului Employee este legata de
prima
instanta,doar pentru inregistrarile in care apare acelasi prenume.
Selectati DataSource2 si setati DataSet la valoarea ClientDataSet2.
Selectati TDBGrid si setati DataSource la valoarea DataSource2.
-73-
Cea de a doua instanta a tabelului contine doar doua inregistrari
(cele
pentru care FirstName este identic-adica "Roberto").
Pentru a putea alterna cele doua instante,adaugati doua butoane si
atribuiti cate o procedura OnClick de genul:
DBGrid1.DataSource:=DataSource1 (pentru primul buton)
si respectiv:
DBGrid1.DataSource:=DataSource2 (pentru al doilea
buton)
Pentru a adauga o noua instanta,se procedeaza identic.De
exemplu,pentru
a adauga o instanta a tabelului cu angajatii care au fost incadrati
la
aceeasi data:
Adaugati un obiect TDataSource si un obiect TClientDataSet.
Selectati ClientDataSet3 si setati
RemoteServer=RemoteServer1,ProviderName
la valoarea EmpQuery si MasterSource la valoarea DataSource1.
Executati un dublu click pe MasterFields si alegeti in ambele
coloane
valoarea HireDate,apoi tastati Add si OK.Setati Active=True.
Selectati DataSource3 si setati DataSet la valoarea ClientDataSet3.
Selectati TDBGrid si setati DataSource la valoarea DataSource3.
Pentru a putea alterna instantele in timpul executiei,adaugati un
nou buton si procedura OnClicK:
procedure tForm1.Button3Click(Sender: TObject);
begin
DBGrid1.DataSource:=DataSource3;
end;
Tastati F9 si executati aplicatia.Puteti utiliza butoanele pentru a
selecta alternativ cele trei instante ale tabelului (toate
inregistrarile,
cele cu acelasi prenume si cele din aceeasi data calendaristica).
In mod similar,obiectele de tip TClientDataSet se pot utiliza in
diver-
se combinatii,pentru a realiza legaturi multiple intre doua sau mai
multe
obiecte.Este preferabil totusi sa alegeti intotdeauna solutia cea mai
simpla,sau sa explicati succint modul si rostul legaturilor realizate
(
pentru a simlipica cat mai mult munca celui care va depana
programele).
-76-
Adaugati si cea de a doua procedura (butonul al doilea):
procedure TForm1.Button2Click(Sender: TObject);
begin
Session1.Active:=False;
Session2.Active:=True;
Database1.SessionName:='SES2';
Query1.Active:=False;
Query2.Active:=True;
DataSource1.DataSet:=Query2;
end;
Tastati F9 si executati aplicatia.Fiecare din cele doua butoane va
declansa una dintre cele doua sesiuni,respectiv va executa una dintre
cele doua linii de comanda.Obiectul TDatabase nu este strict
necesar,dar
a fost adaugat exemplificativ,pentru a ilustra modul de conectare la
doua sesiuni diferite.Nici obiectele TSession nu sunt strict
necesare,
deoarece baza de date este locala,dar acesta este modelul de
conectare
in cazul in care se utilizeaza mai multe baze de date sau mai multe
comenzi concurentiale.Modul de interconectare al obiectelor face
deliciul
fiecarui programator.Este bine sa alegeti intotdeauna solutia cea mai
simpla,sau sa adaugati un minimum de explicatii.Nu uitati ca de cele
mai
multe ori,cel care va depana aplicatiile va fi cel care le-a
programat.
Este bine ca si asezarea obiectelor in Form sa respecte modul lor de
conectare,astfel incat depanarea lor sa fie cat mai simpla.Atunci
cand
utilizati un numar mare de obiecte,este bine sa grupati obiectele in
module,astfel incat depanarea programului sa se reduca doar la
depanarea
unui singur modul.Cea mai frecventa situatie care poate afecta un
program
functional,este generata de "supradoparea" unui tampon de memorie.In
aceste situatii,este bine ca obiectul,sau modulul din care face parte
sa poata fi inlocuit cat mai usor (este mult mai usor decat sa
incercati
sa eliberati tamponul de meorie cu sectoare defecte).
Aplicatiile mari,pot sa utilizeze atat baze de date diferite cat
si
comenzi multiple pentru fiecare baza de date.Pentru a simplifica
procesul
de depanare,puteti grupa obiectele care executa aceeasi sesiune,sau
obiectele care opereaza asupra aceleiasi baze de date,in module
separate.
Calitatea programatorului se poate observa de la prima vedere,dupa
modul
de organizare si gestionare a obiectelor si a proceselor aflate in
exe-
cutie la un anumit moment dat.Programele de calitate sunt
simple,clare,
usor de aplicat si usor de depanat sau modernizat.Este bine sa nu
epuizati
toata memoria de operare pentru executarea unei aplicatii.Este bine
sa
lasati intotdeauna loc pentru actualizari si modernizari viitoare.
Programele concepute modular,nu numai ca sunt mult mai usor de
depanat,
dar pot fi separate in elemente componente.Prin cuplarea unor astfel
de
elemente (module) preluate din mai multe programe se poate realiza un
program nou,aproape fara nici un efort.Este bine ca fiecare modul sa
fie conceput cat mai clar si cat mai general,astfel incat sa poata fi
aplicat in programe diferite.In timp,puteti realiza o colectie
proprie
de module specializate,astfel incat sa rezolvati orice problema de
programare prin simpla conectare a unui numar de astfel de module.
Pentru programele care urmeaza sa fie utilizate extensiv,este bine sa
arhivati pe langa copia de siguranta si un numar oarecare de module
pregatite pentru depanarea "de urgenta" a programului.
-77- DataAccess -
TBatchMove
TBatchMove este un obiect conceput special pentru a copia usor
datele
dintr-un tabel in alt tabel.Principala sa utilizare este fie pentru a
copia un tabel dintr-un server de retea la o adresa locala
(download),fie
pentru a incarca un tabel de la o adresa locala intr-un server de
retea
(upload).Intr-o baza locala,poate face o copie de siguranta automata.
TBatchMode se poate utiliza fie pentru a actualiza doar un anumit
grup
de date,fie pentru a copia intregul tabel.
TBatchMode se poate utiliza si in interiorul aceleiasi baze de
date.
In aces caz,se poate utiliza pentru a copia un tabel cu un nume nou,
pentru a sterge o parte dintre inregistrarile unui tabel sau pentru a
adauga un set de inregistrari noi.Tipul de operatie efectuat este
deter-
minat de proprietatea Mode(batAppend,batCopy,batDelete,batUpdate).
Pentru a specifica grupul de coloane si modificarile efectuate se
poate
utiliza proprietatea Mappings.
Tabelul sursa se va specifica in proprietatea Source iar tabelul de
desti-
natie va fi setat in proprietatea Destination.
Pentru executarea efectiva a trensferului de date se va apela
metoda
Execute.Pentru ca transferul sa poata fi efectuat este necesar ca
pro-
prietatile Source,Mode si Destination sa contina valori valide.
Din considerente prectice,este bine sa utilizati pentru
specificarea
sursei si a destinatiei obiecte de tip TTable sau TQuery,la care
proprie-
tatea Active este setata False (in caz contrar linia de acces la baza
de
date va fi identificata ca "busy").
EXEMPLU: (vezi si Prj66)
Salvati o fila noua si proiectul in directorul Prj66.Adaugati un
obiect
TDataSource,2 obiecte TTable si un obiect TBatchMove.
Selectati Table1 si setati DatabaseName la valoarea DBDEMOS si
TableName
la una dintre valorile optionale (de exemplu VENUES.DB).
Selectati Table2 si setati DatabaseName la valoarea DBDEMOS si
TableName
la o valoare oarecare (De exemplu: Tabel2.dbf).Numele introdus va fi
numele bazei de date pe care o realizati copiind tabelul din Table1.
Selectati BatchMove si setati Source=Table1,Destination=Table2 si
Mode
la valoarea batCopy.
Pentru a putea vizualiza operatia efectuata,adaugati si un control de
tip
TDBGrid.Setati DataSource1 la valoarea DataSet=Table2 si apoi setati
in
DBGrid1 DataSource=DataSource1.
Pentru a efectua transferul datelor,adaugati un buton OK si
urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Table2.Active:=False;
BatchMove1.Execute;
Table2.Active:=True;
end;
Tastati F9 si executati aplicatia.La apasarea butonului OK,datele din
Venues.db vor fi copiate in tabelul Tabel2.dbf nou creat.
Un exemplu complet gasiti si in directorul Help/Examples/Batchmv.
-79-
Trebuie remarcat faptul ca modificarile datelor realizate in
obiectul
TDBGrid nu afecteaza baza de date,ci doar tamponul de memorie in care
se
realizeaza reformatarea datelor.Astfel,pentru Tabelul
VENDORS.db,puteti
utiliza din Columns butonul Delete pentru a sterge in intregine
coloana
Address2 (care nu contine date).Modificarea va fi definitiva doar
pentru aplicatia in care este utilizat tabelul DBGrid1,dar nu va
afecta
baza de date originala (daca deschideti tabelul Vendors.db cu un alt
obiect,coloana Address2 este nemodificata).
Ca rezultat,puteti modifica fara frica aspectul tabelelor
prezentate,
deoarece datele nu se vor pierde definitiv si puteti reveni oricand
la
un format anterior.Pentru ca datele sa fie modificate
definitiv,trebuie
fie sa rescrieti fila sursa,fie sa utilizati o comanda SQL.
Alegeti culorile si fonturile preferate.Este bine totusi,ca
tabelele sa
nu fie excesiv de colorate.Prea multe culori distrag atentia si
obosesc
ochiul.Este bine sa marcati cu culori contrastante doar datele asupra
carora doriti sa atrageti atentia.Eventual,puteti utiliza un efect de
clipire,sau un efect de schimbare alternativa a fondului,pentru
datele
pe care doriti sa le evidentiati.
Pentru a prelua din tabel date izolate,puteti utiliza orice
combinatie
de proprietati si metode.De exemplu,pentru a prelua datele din celula
de tabel selectata,se poate utiliza urmatoarea procedura:
EXEMPLU: (vezi si Prj68)
Salvati o fila noua si proiectul in Prj68.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBGrid si un obiect TLabel.
Setati Table1 la valorile: DatabaseName=DBDEMOS,
TableName=COUNTRY.DB si
Active=True.
Setati DataSet din DataSource1 la valoarea Table1.
Setati DataSource din DBGrid1 la valoarea DataSource1.
Apoi alegeti evenimentul OnCellClick si adaugati urmatoarea
procedura:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var text:variant;
begin
text:=DBGrid1.SelectedField.Value;
Label1.Caption:=text;
end;
Selectati Label1 si setati fontul si culoarea dorita,apoi adaugati in
Caption textul: "Textul Selectat: "
Tastati F9 si executati aplicatia.Selectati cateva celule din tabel
si
observati ca obiectul TLabel a preluat datele din celula.
In mod similar,puteti edita proceduri care efectueaza diverse
operatii
asupra datelor preluate din tabel.Datele pot fi preluate pe linii sau
coloane intregi,pot fi preluate izolat sau pot fi preluate aleator de
catre o functie random,etc.
O aplicatie utila este atunci cand,datele citite selectiv sunt
arhi-
vate intr-un tabel sintetic secundar.In acest mod,puteti prelua date
de la un server de retea,dintre care arhivati local doar
inregistrarile
care sunt importante pentru utilizator.
Este bine sa conspectati si proprietatile obiectelor TField,care
ofera
o paleta destul de larga de expresie si permit un numar destul de
mare
de operatii cu datele din fiecare celula a tabelului (mai ales
operatii
de schimbare a formatului).
-80- Data Controls -
TDBNavigator
TDBNavigator este un obiect format din butoane destinate pentru
de-
plasarea cursorului in interiorul bazei de date,sau pentru editarea
dete-
lor.Cu ajutorul acestor butoane,utilizatorul se poate deplasa rapid
la
inregistrarea dorita,sau poate efectua operatii simple asupra
datelor:
adaugarea,actualizarea sau stergerea unei inregistrari.
Butoanele au urmatoarea semnificatie:
First -deplaseaza cursorul la prima inregistrare din tabel
Prior -deplaseaza cursorul la inregistrarea precedenta
Next -deplaseaza cursorul la inregistrarea urmatoare
Last -deplaseaza cursorul la ultima inregistrare din tabel
Insert -insera la pozitia curenta o inregistrare noua
Delete -sterge inregistrarea curenta
Edit -seteaza baza de date in starea Edit(permite scrierea
datelor)
Post -scrie in baza de date modificarile efectuate
Cancel -anuleaza modificarile efectuate
Refresh -anuleaza tamponul actual de memorie si creaza un tampon
nou
(rescrie datele din tabel intr-un tampon de memorie nou)
TDBNavigator se utilizeaza doar impreuna cu alte controale utilizate
pentru prezentarea datelor(TDBGrid,TDBEdit,TDBImage etc.).
Pentru a controla paleta de butoane afisate,se poate utiliza
proprietatea
VisibleButtons.Pentru a exclude un buton setati butonul respectiv
False
(Exemplu : nbPost=False).
Butoanele Edit,Post si Delete permit efectuarea de operatii
definitive
asupra bazei de date.Utilizati cu atentie aceste butoane.Scrierea
datelor
se va efectua doar dupa inchiderea aplicatiei,astfel incat aveti timp
suficient sa reverificati modificarile efectuate.Daca doriti sa
utilizati
DBNavigator doar pentru afisarea datelor,este mai bine sa inactivati
aceste butoane pentru a nu fi apasate din greseala.Atunci cand
efectuati
modificari frecvente,este bine sa aveti in permanenta si o copie de
sigu-
ranta a tabelului initial.
EXEMPLU: (vezi si Prj69)
Salvati o fila noua si proiectul in Prj69.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBGrid si un obiect TDBNavigator.
Selectati TTable si setati Databasename=DBDEMOS,TableName=EMPLOYEE.DB
si
Active=True.Apoi alegeti DataSource1 si setati DataSet=Table1.
Selectati DBGrid1 si setati DataSource=DataSource1.
Selectati TDBNavigator si setati DataSource=DataSource1
Tastati F9 si executati aplicatia.
Utilizati butoanele pentru a va deplasa in tabel pana la litera
numelui
d-voastra,apoi apasati butonul Insert(marcat cu +).In tabel se va
include
o inregistrare noua,libera.Introduceti numele,prenumele si datele
perso-
nale,apoi apasati butonul Post(marcat cu o pipa) si inchideti
aplicatia.
La urmatoarea executie,cu Run,numele d-voastra va figura in
tabel,printre
angajatii firmei.Daca doriti sa stergeti intregistrarea,deplasati
cursor-
ul la pozitia dorita si apasati butonul Delete(maracat cu -).
Obiectul contine si cateva metode si evenimentele BeforeAction si
OnClick,care pot fi utilizate pentru a adauga noi proceduri sau noi
functionalitati initializate de apasarea unui anumit buton.
Pentru efectuarea operatiilor preliminare se utilizeaza tamponul de
memo-
rie din DataSource.Operatia Refresh,nu face decat sa reactualizeze
acest
tampon de memorie.Post si Delete actioneaza direct asupra bazei de
date.
-83- DataControls -
TDBMemo
TDBMemo este un obiect conceput pentru a putea afisa obiecte mari
codi-
ficate binar (BLOB=binary large objects).Se utilizeaza pentru a
prezenta
campurile de date de tip Memo,preluate din baze de date.Este similar
cu
TMemo,dar utilizeaza un obiect DataSource pentru a prelua datele din
baza de date.Se utilizeaza pentru date de tip text,structurate pe mai
multe randuri.TDBMemo permite editarea datelor in timp real.Pentru a
impiedeca editarea datelor se poate seta proprietatea ReadOnly la
valoarea
True.Pentru a adauga bare de scroll,se poate apela proprietatea
ScrollBars
Dintre proprietati se remaca CopyToClipboard,CutToClipboard si
Paste-
FromClipboard care permit copierea datelor in memoria Clipboard si
res-
pectiv copierea datelor din memoria Clipboard la o adresa oarecare.
Pentru a copia datele afisate,se poate utiliza si indicatorul
mouse.
Pur si simplu,tastati butonul drept si selecatati SelectAll,apoi
alegeti
Copy,deschideti fila in care doriti sa copiati datele,apasati din nou
butonul drept si alegeti Paste.Pentru a copia doar o parte din date,
selectati datele dorite(cu butonul mouse stang apasat) si apoi
apasati
butonul drept si alegeti Copy...apoi Paste.Practic,datele se pot
copia
ca dintr-o fereastra Windows oarecare.
Daca nu doriti ca datele preluate sa fie afisate permanent,setati
proprietatea AutoDisplay la valoarea False.In acest caz,pentru a
afisa
datele se va executa in timpul executiei un dublu click pe DBMemo.
De obiecei,TMemo se utilizeaza in combinatie cu TDBGrid,TDBImage
si
cu un obiect de navigare TDBNavigator (pentru a afisa toate datele).
EXEMPLU: (vezi si Prj72)
Salvati o fila noua si proiectul in Prj72.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBGrid,un obiect TDBMemo,un obiect
TDBImage si
un obiect TDBNavogator.
Setati Table1 la:
DataBaseName=DBDEMOS,TableName=VENUES.DB,Active=True.
Setati DataSource1 la: DataSet=Table1.
Setati DBNavigator1 la: DataSource=DataSource1.
Setati DBGrid1 la: DataSource=DataSource1.
Setati DBImage1 la: DataSource=DataSource1 si DataField=Venue_Map.
Setati DBMemo1 la DataSource=DataSource1 si DataField=Remarks.
Puteti utiliza Color si Font pentru a alege combinatia preferata de
culori si dimensiunea fonturilor.
Tastati F9 si executati aplicatia.
Daca doriti sa copiati date,in timpul executiei,selectati datele
dorite(trageti cu butounul mouse apasat deasupra datelor),apoi
utilizati
metoda Copy/Paste (cu butonul drept).
Daca doriti ca datele parcurse sa fie arhivate automat,alegeti
eveni-
mentul dorit (OnEnter,OnClick,OnExit...etc) si scrieti o procedura in
care apelati metodele CopyToClipboard si PasteFromClipboard.
Daca proprietatea ReadOnly este setata False,puteti utiliza campul
TDBMemo pentru a modifica textul dupa bunul plac.Modificarile vor
actua-
liza automat baza de date (raman definitive).
Modificarile se pot efectua si automat.De exemplu,se poate edita o
procedura pentru evenimentul OnEnter,care actualizeaza datele cu
valori
preluate de la un server din retea.Pentru a verifica daca s-au
efectuat
modificari automate,se poate utiliza proprietatea Modified.
Pentru a semnaliza cu mesaje de tip Windows,puteti utiliza metoda
WndProc.
In sinteza,TDBMemo este ideal pentru manipularea textelor mai ample.
-84- DataControls -
TDBImage
TDBImage este un obiect specializat pentru a afisa imagini grafice
de
tip Bitmap,preluate din baze de date care contin campuri de tip BLOB
(BLOB=binary large objects).Pentru preluarea datelor utilizeaza tot
un
obiect de tip DataSource.Datele pot fi copiate in memoria clipboard
sau
pot fi preluate din memoria clipboard,sau pot fi preluate din file
izo-
late si incluse in baza de date (actualizeaza campurile BLOB).
Proprietatile AutoDisplay si ReadOnly sunt la fel ca pentru
TDBText.
DataSource si DataField se utilizeaza pentru a prelua datele iar
Picture
pentru a opera cu imaginea afisata.
Dintre metode,se disting CopyToClipboard si PasteFromClipboard,care
pot fi utilizate fie pentru a relua o imagine de mai multe ori,fie
pentru
a edita activ (a actualiza) campurile de date din tabel.Atentie insa
sa
nu pierdeti definitiv datele importante (datele preluate cu
PasteFromClip-
board se vor scrie direct in baza de date).Faceti copii de siguranta.
EXEMPLU: (vezi si Prj73)
Faceti o copie de siguranta a tabelului ANIMALS.DBF si .DBT din
Demos/Data.
Utilizati Tools si ImageEditor pentru a edita o imagine BitMap de
200/200
si salvati fila respectiva in Prj73 cu numele: BitMap1.bmp.
Salvati o fila noua si proiectul in Prj73.Adaugati un obiect
TDataSource,
un obiect TTable un obiect TDBNavigator si un obiect TDBImage.
Setati TTable la:
DatabaseName=DBDEMOS,TableName=ANIMALS.DBF,Active=True.
Setati DataSource1 la: DataSet=Table1.
Setati DBNavigator1 la: DataSource=DataSource1.
Setati DBImage1 la: DataSource=DataSource1 si DataField=BMP.
Tastati F9 si executati aplicatia.
Daca doriti sa afisati si desenul realizat de d-voastra,adaugati un
buton
si urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
DBImage1.CopyToClipboard;
DBImage1.Picture.Bitmap.LoadFromFile('BitMap1.bmp');
DBImage1.Repaint;
end;
Observati ca imaginea initiala a fost copiata in memoria
clipboard.Pentru
a relua imaginea initiala din memoria clipboard,adaugati inca un
buton si
urmatoarea procedura OnClick:
procedure TForm1.Button2Click(Sender: TObject);
begin
DBImage1.PasteFromClipboard;
DBImage1.Repaint;
end;
Intr-o aplicatie reala,este bine sa adaugati si o procedura prin care
sa
eliberati memoria clipboard.
In mod similar,puteti proiecta o aplicatie cu ajutorul careia sa
puteti
alege imagini din mai multe baze de date si sa le organizati intr-o
alta
baza de date.Pentru acest scop,formati module pentru fiecare baza de
date.
Fiecare modul va contine: un obiect TDataSource,un obiect TTable,un
obiect
TDBNavigator si un obiect TDBImage.Navigati prin tabele si cand
selectati
o imagine,copiati datele in memmoria clipboard,apoi descarcati datele
din
memoria clipboard in tabelul dorit,la pozitia dorita.
Puteti forma astfel albume de fotografii digitale,benzi desenate etc.
-85- DataControls -
TDBListBox
TDBListBox este un obiect de tip lista de elemente,conceput pentru
a
putea actualiza cat mai usor o baza de date.Obiectul TDBListBox este
in
conexiune cu o baza de date,prin intermediul unui obiect de tip
DataSource
si poate fi utilizat pentru editarea campurilor,selectate prin
proprieta-
tea DataField.Selectarea uni element din lista inclusa in
proprietatea
Items,din TDBListBox,va determina actualizarea automata a campului
curent
din DataSource (specificat prin proprietatea DataField).
Practic,utilizatorul se va deplasa in baza de date pana la
elementul
care urmeaza sa fie schimbat si apoi va alege din lista elementul
care va
actualiza baza de date.Cu un simplu click de mouse,elementul din
lista
va inlocui elementul din baza de date:
EXEMPLU: (vezi si Prj74)
Faceti o copie a tabelului Venues.DB din Demos/Data si redenumiti
tabelul
FR2.DBF (pentru a putea reutiliza datele initiale).Salvati copia,tot
in
directorul Data din Demos,impreuna cu celelalte tabele.
Salvati o fila noua si proiectul in Prj74.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBGrid si un obiect TDBListBox.
Setati Table1 la: DatabaseName=DBDEMOS,TableName=FR2.DBF si
Active=True.
Setati DataSource1 la: DataSet=Table1.
Setati DBGrid1 la: DataSource=DataSource1.
Selectati DBListBox1 si setati: DataSource=DataSource1 si
DataField=VENUE.
Apoi executati un dublu click pe Items si adaugati in lista cateva
ele-
mente: Muzeul de Arta,Teatrul comic,Opera etc...Confirmati cu OK.
Tastati F9 si executati aplicatia.
Pentru a modifica una dintre inregistrari,alegeti din obiectul
DBListBox1
unul dintre elemente (De exemplu : Opera) apoi executati un click de
mouse in unul dintre campurile VENUE din obiectul DBGrid1.Observati
ca
valoarea campului respectiv se actualizeaza automat cu valoarea
selectata
din DBListBox.Pentru ca modificarea sa ramana definitiva,executati un
click de mouse pe orice alt camp din DBGrid,sau executati o operatie
oarecare.Ideal este sa utilizati un buton care sa confirme
modificarea.
Pentru a naviga mai usor in baza de date,puteti adauga si un
DBNavigator.
Atentie,modificarile efectuate sunt ireversibile.Faceti o copie se
sigu-
ranta sau verificati cu atentie datele inainte de a le actualiza.
Modificarile se pot observa atunci cand redeschideti baza de date.
Obiectul detine si o serie intrega de proprietati auxiliare,utile
pentru
a modifica aspectul,culorile,fonturile,numarul de elemente din lista
etc.
Dintre metode,Clear sterge toate elementele din lista,ItemAtPos
identifica
un anumit element din lista in functie de coordonatele sale
axiale,Hide
ascunde lista iar Show o reafiseaza,GetTextBuf copiaza textul
selectat
intr-un tampon de memorie,etc...
Lista de evenimente este destul de ampla,astfel incat se pot programa
un
numar foarte mare de proceduri automate.Exemplu: utilizand
evenimentul
OnEnter,se poate scrie o procedura de actualizare automata,in care
toate
elementele dintr-o coloana vor primi valoarea specificata in
DBListBox.
Pentru a modifica inaltimea fiecarui element din lista (astfel incat
sa
puteti utiliza fonturi mai mari) se va seta proprietatea Style la
valoarea
lbOwnerDrawFixed,apoi se va seta proprietatea ItemHeight la valoarea
dorita (Exemplu: 20).In final,alegeti Font si setati valorile dorite:
de exemplu: Size=12 si Color= Red.Puteti personaliza aspectul
interfetei,
atfel incat sa accentuati elementele active,sau semnificative.
-86- DataControls -
TDBComboBox
TDBComboBox este aproape identic cu TDBListBox,cu deosebirea ca
are
inclus si un obiect de tip TEdit.Ca rezultat,utilizatorul poate alege
un
element,dintre cele arhivate in Items,sau poate edita in timp real un
sir de caractere pentru a actualiza o inregistrare din baza de date.
Conectarea la baza de date se face tot prin DataSource iar
proprietatile
metodele si evenimentele sunt identice cu cele ale obiectului
TDBListBox.
EXEMPLU: (vezi Prj75)
Salvati o fila si proiectul in Prj75.Adaugati un obiect
TDataSource,un
obiect TTable,un obiect TDBGrid si un obiect TDBComboBox.
Setati proprietatile obiectelor,la fel ca si in exercitiul
precedent(vezi
si Prj74).
In DBComboBox1,utilizati Items pentru a introduce lista de elemente
cu
care doriti sa actualizati baza de date.
Tastati F9 si executati aplicatia.Spre deosebire de DBListBox,puteti
edita in timpul executiei un text oarecare,apoi executati un click de
mouse in tabelul din DBGrid,pentru a actualiza inregistrarea
respectiva.
Pentru TDBComboBox,proprietatea Style are o serie de
particularitati.
Style permite urmatoarele setari:
csDropDown -setarea implicita -contine lista Items si o caseta de
editare
csSimple - afiseaza doar caseta de editare (fara lista Items)
csDropDownList -afiseaza lista si caseta de editare,dar utilizatorul
nu
poate utiliza decat datele din lista Items
csOwnerDrawFixed -permite ca lista sa contina si elemente care nu
sunt
siruri de caractere (de exemplu arii Bitmap)
csOwnerDrawVariable -idem csOwnerDrawFixed
Proprietatea Sorted se poate utiliza pentru a ordona alfabetic
datele
din lista Items.
-87- DataControls -
TDBRadioGroup
Setati DBCheckBox la: DataSource=DataSource1,DataField=Company si
ValueCheched=Sight Diver.
Setati DBCheckBox la: DataSource=DataSource1,DataField=Company si
ValueChecked=Ocean Paradise.
Tastati F9 si executati aplicatia.Navigati prin baza de date si
observati
ca in momentul in care numele companiei din inregistrarea curenta
cores-
punde cu cel specificat in ValueChecked,caseta de validare respectiva
va
fi activata si bifata.
Pentru ca obiectul sa fie si mai bine exploatat,puteti adauga si o
procedura oarecare,declansata de valoarea True pentru proprietatea
Checked (mostenita de la TCustomCheckBox).
De exemplu,pentru a semnaliza cu un beep sonor inregistrarile care
valideaza una dintre casetele de validare,alegeti pentru DBNavigator
evenimentul OnClick si adaugati urmatoarea procedura:
procedure TForm1.DBNavigator1Click(Sender: TObject;
Button:TNavigateBtn);
begin
if DBCheckBox1.Checked=True then
beep();
if DBCheckBox2.Checked=True then
beep();
if DBCheckBox3.Checked=True then
beep();
end;
In mod similar,se poate edita o procedura care sa arhiveze automat
doar
inregistrarile care valideaza una dintre casetele de validare.
Metodele si evenimentele obiectului TDBCheckBox sunt mostenite de la
ancestori (TWinControl) si nu prezinta particularitati semnificative.
-88- DataControls -
TDBLookupListBox
De exemplu,presupunand ca doriti sa puteti modifica usor data de
desfa-
surare a unei competitii sportive (in functie de conditiile
meteo),puteti
proiecta un exercitiu de genul:
EXEMPLU: (vezi si Prj77)
Salvati o fila noua si proiectul in Prj77.Adaugati un obiect
TDBRadioGroup
un obiect TDBGrid,un obiect TDBNavigator,un obiect TDataSource si un
obiect TTable.
Setati Table1 la: DatabaseName=DBDEMOS,TableName=EVENTS.DB si
Active=True
Setati DataSource1 la: DataSet=Table1.
Setati DBNavigator la: DataSource=DataSource1.
Setati DBGrid1 la: DataSource=DataSource1.
Setati DBRadioGroup la : DataSource=DataSource1 si
DataField=Event_Date,
Columns=4 (pentru a grupa butoanele orizontal) apoi alegeti Items si
in
String list editor intorduceti pe randuri separate valorile dorite:
6/17/96,6/18/96,6/19/96,6/21/96.Valorile astfel introduse vor forma
de-
numirea butoanelor.Daca doriti,puteti utiliza si numele zilei
respective
gen: joi,vineri,sambata si luni.Pentru a atribui valoarea dorita
fiecarui
buton,alegeti Values si introduceti in String list editor valorile
dorite:
6/17/96,6/18/96,6/19/96,6/21/96 (pe randuri separate).Confirmati cu
OK.
Tastati F9 si executati aplicatia.Observati ca daca va deplasati cu
butoanele de navigare,in momentul in care data evenimentului
corespunde cu
valoarea butonului,butonul respectiv va fi selectat.
Pentru a schimba data unui eveniment,deplasati cursorul pana la
eveni-
mentul respectiv si apoi selectati butonul cu data dorita.Modificarea
va
fi observabila doar dupa ce deplasati cursorul la inregistrarea
urmatoare.
-90- DataControls -
TDBCtrlGrid
TDBCtrlGrid este un obiect specializat pentru a putea afisa
simultan
mai multe celule ale unui tabel.Pentru afisarea fiecarui camp de date
se
utilizeaza cate un control separat de tip TDBText,TDBEdit,TDBMemo sau
TDBImage,iar TDBCtrlGrid asigura o interfata comuna,asemanator cu
obiectul
standard TPanel.Pentru preluarea datelor din baza de date,se
utilizeaza
tot un obiect de tip TDataSource.
Obiectul realizeaza o interfata complexa in care datele pot fi
afisate,
sau pot fi editate,pot fi sortate sau pot fi comparate si corelate,in
functie de necesitatile de moment.
Formatul de afisare a datelor ales pentru prima inregistrare va fi
utilizat pentru toate inregistrarile din baza de date.In faza de
design,
plasati obiectele necesare si stabiliti legaturile necesare doar
pentru
prima inregistrare din tabel.TDBCtrlGrid va repeta sablonul pentru
toate
celelalte inregistrari si va prezenta datele sub forma de tabel,in
care
fiecare rand este format din mai multe obiecte de prezentare a
datelor.
EXEMPLU: (vezi si Prj81);
Salvati o fila noua si proiectul in Prj81.Adaugati un obiect
TDBCtrlGrid
si setati proprietatea Align la valoarea alClient.Adaugati un obiect
TDataSource si un obiect TTable.
Setati Table1 la: Databasename=DBDEMOS,TableName=MASTER.DBF si
Active=True
Setati DataSource1 la: DataSet=Table1.
Setati DBCtrlGrid1 la: DataSource=DataSource1.
Adaugati 2 obiecte TDBText in zona nehasurata a obiectului
DBCtrlGrid.
Setati DBText1 la : DataSource=DataSource1,DataField=CO_NAME apoi
setati
Color=clLime si Font Size=14 Color=Red.
Setati DBText2 la : DataSource=DataSource1,DataField=CUR_PRICE apoi
setati
Color=clYellow si Font Size=14 Color=Blue.
Adaugati un obiect TDBEdit si setati DataSource=DataSource1 si
respectiv
DataField=RCMNDATION.
Tastati F9 si executati aplicatia.Puteti utiliza butoanele de scroll,
pentru a afisa toate inregistrarile,sau puteti adauga si un obiect de
tip DBNavigator.
Puteti utiliza orice combinatie de controale de tip
TDBEdit,TDBText,
TDBMemo sau TDBImage (vezi si Prj82).
Obiectul prezinta si o serie de proprietati destinate pentru
adaptarea
modului de prezentare la necesitatile reale.Pentru a permite sau
inter-
zice editarea activa a datelor se poate utiliza proprietatea
EditMode.
Pentru a seta numarul de coloane si de randuri se pot utiliza
proprieta-
tile ColCount si RowCount.Pentru a selecta culoarea inregistrarii
active
(cea pe care se gaseste cursorul),se poate utiliza proprietatea
Selected-
Color.
Dintre metode,se remarca metoda KeyDown care permite executarea
unei
anumite operatii atunci cand tasta specificata este apasata.
Dintre evenimente se remarca OnPaintPanel,care poate fi apelat
atunci
cand utilizati fondul obiectului pentru a adauga o imagine grafica
oare-
care.In acest caz se va apela Canvas cu coordonatele (0,0) pentru
coltul
din stanga sus al obiectului TDBCtrlGrid.
TDBCtrlGrid se recomanda mai ales pentru tabelele cu un numar
relativ
mic de inregistrari,deoarece tabelele mari si numarul prea mare de
con-
troale pot bloca memoria de operare cu date inutile.Proiectati acest
gen de aplicatii in functie de baza de date si de hard-ul instalat.
-91- DataControls -
TDBChart
TBDChart este un obiect specializat pentru prezentarea datelor din
bazele de date sub forma de reprezentari grafice.Pentru acest scop,
obiectul apeleaza la un subprogram intitulat TeeChart version 3 care
este
inclus in pachetul de date Delphi 3.Acest program opereaza in format
de 32
de biti,permite reprezentari 2D si 3D,pentru 11 tipuri de grafice,cu
functii statistice,zoom si design personalizat.
TDBChart este derivat din TChart.Pentru preluarea datelor din baza
de
date utilizeaza un obiect TDataSource si un obiect TTable sau TQuery.
Pentru a seta acest obiect,executati un click de mouse cu butonul
drept,
in interiorul obiectului si alegeti Edit Chart.
EXEMPLU: (vezi si Prj83)
Salvati o fila noua si proiectul in Prj83.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBGrid,un obiect TDBNavigator si un
obiect
TDBChart.
Setati Table1 la:
Databasename=DBDEMOS,TableName=HOLDINGS.DBF,Active=True.
Setati DataSource1 la: DataSet= Table1.
Setati DBGrid1 la: DataSource=DataSource1.
Setati DBNavigator la: DataSource=DataSource1.
In acest moment aplicatia se poate utiliza pentru a prezenta datele
din
tabelul HOLDINGS.DBF.Pentru a reprezenta grafic o parte dintre
date,se
poate utiliza obiectul DBChart1.De exemplu,pentru a reprezenta
numarul de
actiuni al fiecarei companii,sub forma de sector de cerc:
Selectati DBChart1,executati un click de mouse cu butonul drept si
alegeti
EditChart.Din fereastra EditingChart1 alegeti butonul Add,si Pie
dintre
tipurile de grafice afisate.Confirmati cu OK.Apoi alegeti Series si
apoi
DataSource.Din obiectul ComboBox(in care este afisat Random Values),
alegeti optiunea Dataset,apoi in ComboBox Dataset alegeti Table1,in
Labels alegeti: SYMBOL si in Pie alegeti: SHARES.Apoi apasati butonul
Close.Daca doriti sa schimbati titlul graficului,deschideti din nou
fereastra Edit Chart,alegeti Chart,apoi Titles si introduceti in
campul
Memo textul dorit (in loc de TDBChart).
Daca doriti,puteti utiliza si restul de optiuni,pentru a
personaliza
aspectul graficului afisat.
Tastati F9 si executati obiectul.Puteti observa in reprezentarea
grafica
pachetul majoritar de actiuni si apoi utilizati DBNavigator pentru a
identifica inregistrarea respectiva.
Pentru a obtine o alta reprezentare grafica,se poate utiliza
acelasi
obiect.De exemplu,pentru a afisa numarul de actiuni cumparate la o
anumita
data calendaristica (PUR_DATE):
Selectati DBChart1.Deschideti din nou fereastra EditChart.Apasati
butonul
Delete pentru a sterge graficul vechi si Add pentru a adauga un
grafic
nou.Alegeti Line si OK.Apoi Alegeti Series,Data Source si setati
Dataset
la Table1,Labels=PUR_DATE,X:=SHARES si Y:=PUR_DATE.Inchideti cu
Close.
Exista situatii cand se pot reprezenta pe acelasi grafic,doua sau
mai multe situatii.In acest caz,pur si simplu nu stergeti primul
grafic,
ci adaugati unul nou,cu butonul Add.Urmatoarea reprezentare va fi
afi-
sata cu o culoare cat mai contrastanta (puteti alege culoare).
Pentru ca doua sau mai multe seturi de valori sa poata fi
reprezentate
in acelasi grafic,trebuie ca valorile reprezentate sa fie situate
intre
aceleasi limite.Pentru aceste situatii,se va prefera reprezentarea
sub
forma de Lines. (vezi si Prj84)
-92- Decision
Cube
Decision Cube este o paleta de componente destinate pentru
preluarea si
afisarea datelor dintr-o baza de date,atunci cand se utilizeaza o
formula
complexa de selectie a datelor(utilizand o functie de sumatie si un
cri-
teriu de grupare a datelor sumate).Obiectele care formeaza aceasta
paleta
de optiuni sunt:
TDecisionCube,TDecisionQuery,TDecisionSource,TDecision-
Pivot,TDecisionGrid si TDecisionGraph.Cele sase obiecte se utilizeaza
de
obiecei impreuna,dar pot fi combinate si cu alte obiecte.De
exemplu,un
obiect TDecisionQuery poate fi combinat si cu un obiect TDataSource
si
un obiect TDBGrid pentru a afisa datele in forma clasica.
TDecisionQuery este echivalent cu TDBQuery si este utilizat pentru
preluarea datelor cu ajutorul unei comenzi SQL.TDecisionCube este
obiectul
cheie din acest grup si este utilizat pentru a selecta modul de
afisare
pentru datele selectate prin comanda SQL.Acest obiect prelucreaza
formatul
datelor,astfel incat sa fie compatibil de
TDecisionGrid.TDecisionSource
este echivalent cu TDataSource.Are rolul unui tampon de memorie,care
va
fi suportul de memorie pentru unul sau mai multe obiecte de tip
TDecision-
Grid.TDecisionPivot este echivalent cu TDBNavigator si prezinta un
set
de butoane,care permit afisarea rapida a rezultatului dorit.Se
utilizeaza
pentru a afisa una dintre instantele obiectului.TDecisionGrid este
echi-
valent cu TDBGrid si este utilizat pentru afisarea datelor preluate
de
la obiectul TDecisionSource.TDecisionGraph este echivalent cu
TDBChart si
se utilizeaza pentru a prezenta grafic datele selectate.
Aceste obiecte nu ofera functionalitati diferite de cele ale
obiectelor
din DataAccess si Data Controls.Datele si rezultatele afisate cu
aceste
obiecte pot fi afisate si cu obiectele clasice,dar obiectele din
paleta
Decision Cube simplifica foarte mult operatiile de selectie si ofera
o
un aspect grafic superior.Are rost sa utilizati aceste obiecte,atunci
cand se efectueaza un numar destul de mare de operatii,intr-o baza de
date mai extinsa,cu o comanda SQL care include SUM si GROUP BY.
EXEMPLU: (vezi si Prj85)
Salvati o fila noua si proiectul in Prj85.Adaugati cate un obiect din
fiecare tip inclus in paleta DecisionCube.
Setati DecisionQuery1 la: Databasename=DBDEMOS,apoi introduceti
urmatoarea
comanda SQL:
SELECT PaymentMethod,SUM(EmpNo) FROM Orders.db GROUP BY
PaymentMethod
Confirmati cu OK si setati Active=true.
Setati DecisionCube1 la : DataSet=DecisionQuery1.Eventual alegeti si
DimensionMap si in Decision Cube Editor setati Active Type=Active
pentru
ambele campuri de date accesibile (PaymentMethod si SUM OF EmpNo)
apoi
setati MaxCells=50,MaxDimensions=16 si MaxSummaries=50.
Setati DecisionSource1 la: DecisionCube=DecisionCube1.
Setati DecisionPivot1 la: DecisionSource=DecisionSource1.
Setati DecisionGrid1 la: DecisionSource=DecisionSource1 si
DefaultColWidth
la valoarea 50.Eventual modificati culorile si fonturile.
Setati DecisionGraph1 la: DecisionSource=DecisionSource1.
Tastati F9 si executati aplicatia.
DecisionGrid va afisa cele doua coloane solicitate (PaymentMethod si
SUM OF EmpNo iar DecisionGraph1 va afisa reprezentarea grafica a
acelorasi
valori.Daca apasati butonul PaymentMethod se va afisa alternativ suma
totala a tuturor valorilor EmpNo (suma tuturor grupelor).
Puteti personaliza aspectul,utilizand proprietatile obiectelor.
-93-
QReport
Peleta de componente denumita QReport include o serie de obiecte
des-
tinate pentru a realiza documente de sinteza (rapoarte) in care
datele
sunt preluate din diverse surse: locale,din baze de date,din
obiecte,sau
sunt editate in timp real.
Documentele de tip raport (Quick Reports),pot fi subimpartie in
mai
multe benzi de date,asemanator cu o pagina de ziar,astfel incat
datele
de acelasi fel sa fie cat mai usor de identificat in interiorul
paginii.
Principalele benzi care pot fi utilizate se numesc: header
(antet),title
(titlul),detail sets (subtitluri),summaries(rezumate) si
footer(sfarsit).
Pentru preluarea datelor dintr-o baza de date,se utilizeaza
obiecte
de tip DataSource,TTable si TQuery,iar pentru afisarea datelor se
utili-
zeaza obiectele specializate din paleta QReport.
QuickReport este de fapt un program de sine statator,inclus in
Delphi
sub licenta QuSoft AS.Informatii si actualizari se pot solicita pe
site-ul
http://www.qusoft.com.
Obiectele din QReport se pot utiliza pentru a realiza o pagina de
ziar,
un document complex care include text,fotografii si grafice,o fisa de
observatie a unor fenomene complexe (fisa meteorologica,fisa de
productie,
fisa medicala etc.) sau pur si simplu pentru a realiza documente cu
un
aspect personalizat (albume,sonete,felicitari,reviste ilustrate
etc.).
Un document realizat cu QReport este un obiect complex,format
dintr-un
numar oarecare de obiecte componente si ocupa un spatiu destul de
extins
de memorie.Este bine sa tineti cont de memoria de RAM
instalata,atunci
cand proiectati sau operati cu astfel de obiecte.Daca memoria de
operare
este la limita,riscati ca documentul sa nu poata incarca toate
obiectele
de care are nevoie (o parte din date "se pierd pe drum" ) in special
cele
care contin reprezentari grafice.
Documentele realizate,au un aspect grafic deosebit si pot fi
imprimate
sau arhivate extrem de usor(cu un click de mouse).In plus,pentru a
limita
la maximum memoria consumata,exista si posibilitatea de a extrage din
document doar datele de tip text,care pot fi arhivate sub forma de
fila
tip .txt.
In mod obisnuit,acest gen de documente nu se utilizeaza pentru a
arhiva date,ci doar pentru a grupa si sistematiza sub o forma
oarecare
datele arhivate la diverse locatii de memorie.Practic,documentul de
tip
raport,este ca un fel de sablon proiectat pentru a acumula date din
mai
multe surse diferite (Exemplu: pagina principala a site-urilor de
Internet
gen Yahoo,Opera etc.).
Ziarele si site-urile Internet utilizeaza alte programe,dar
realizeaza
acelasi obiectiv.
Un document de tip QuickReport,poate fi utilizat nu numai pentru
a
citi datele din memorie,ci si pentru a actualiza permanent un anumit
numar
de baze de date.Exemplu: un document cu mai multe obiecte de editare,
conectat simultan la mai multe baze de date.
Daca se combina cu obiecte de tip Internet,un astfel de document
poate
opera si cu date preluate din retea (eventual datele din retea pot
fi
initial arhivate local si apoi preluate intr-un document QReport).
In concluzie,un astfel de document se proiecteaza cu scopul de a
inlocui mai multe file simple de tip Form.In loc sa deschideti si sa
inchideti permanent un anumit numar de file,QReport permite accesul
la
toate obiectele necesare,intr-o singura fila.
-94-
Obiectele incluse in aceasta paleta sunt:
QuickRep -este obiectul de baza,utilizat ca suport pentru toate
celelalte
obiecte.Este primul obiect care trebuie adaugat in Form.Optional se
poate
utiliza un obiect TTable si un obiect tip TDataSource,pentru a
conecta
QuickRep la o baza de date.Este un obiect vizual si ia automat
dimensiunea
filei care il contine.Pentru a putea observa rapid rezultatul
operatiilor
preliminare,executati in orice moment un click de mouse cu butonul
drept,
in aria obiectului QuickRep.Din caseta de optiuni,alegeti Preview.
In mod similar,puteti imprima documentul,sau puteti arhiva
rezultatele
partiale (sau finale).Datele pot fi arhivate fie asa cum sant,fie sub
forma de pagina .txt (se extrag doar datele de tip text).
Acest obiect este suportul celorlalte obiecte (la fel ca TPanel).
Daca doriti sa subimpartiti documentul in mai multe benzi,alegeti
Bands
si setati True benzile dorite(HasTitle,HasSummary...etc.).Utilizati
Data-
Set pentru conectarea la o baza de date,Options si Page pentru a seta
aspectul paginilor realizate,sau PrinterSettings pentru a seta
preferinte-
le de imprimare.Pentru un exemplu complet,vezi si Prj86.
QRSubDetail- este obiectul care permite introducerea unei benzi
supli-
mentare in document.Obiectele incluse in aceasta banda vor fi legate
intre ele,asemanator cu cele incluse in acelasi TPanel.Se utilizeaza
pentru a conecta doua sau mai multe obiecte intre ele,sau pentru a
schimba
aspectul general al documentului (alta culoare,alte fonturi etc.).
In plus,QRSubDetail permite conectarea la o alta baza de date,prin
pro-
prietatea DataSet.Mai multe astfel de obiecte,pot fi conectate la
baze
de date diferite.
QRBand- este un obiect destinat tot pentru a introduce o banda
auxiliara,
dar nu are o proprietate DataSet si nu poate fi conectat decat la
baza
de date a obiectului de suport (QuickRep).Banda adaugata se va
comporta
identic cu cele ale obiectului QuickRep.Pentru a alege tipul de
banda,
setati proprietatea BandType (rbTitle,rbPageFooter...etc.).Obiectul
nu
poate fi redimensionat,se va adapta automat la dimensiunea
docunentului.
TQRChildBand- este un obiect similar cu QRBand,dar permite si
utilizarea
componentelor care se extind in momentul utilizarii
(Exemplu:ComboBox).
Acest obiect va fi preferat atunci cand se utilizeaza obiecte
extensibile
sau atunci cand banda este extrem de lunga si se extinde pe mai multe
pagini.Pentru a inlantui mai multe obiecte de acest gen,se utilizeaza
proprietatile HasChild si respectiv ParentBand.Este bine ca fiecare
banda
parinte sa fie legata de o singura banda copil.Daca se leaga mai
multe
benzi de tip copil,la acelasi parinte,in momentul imprimarii se va
tipari
doar una dintre ele.
Benzile de acest tip pot fi activate sau inactivate individual.O
banda
de tip copil activata,va fi imprimata chiar daca banda de tip parinte
la
care este legata a fost inactivata.
Setati proprietatea BandType pentru a alege tipul de banda dorit.
Benzile incluse astfel se vor comporta identic cu cele ale obiectului
QuickRep.
QRGroup-introduce tot o banda de editare auxiliara si se utilizeaza
pentru
a organiza un grup de astfel de benzi.
Pentru ca datele incluse in benzi sa poata fi vizualizate cu
Preview,uti-
lizati un obiect TTable (eventual si TDataSource) pentru a conecta
Quick-
Rep si bensile Subdetail la o baza de date oarecare(setati
DataSet=Table1)
-95-
QRLabel este un obiect asemanator cu TLabel si este destinat pentru a
introduce in pagina,date de tip caracter (in Caption).Datele afisate
sunt
fixe si imprimabile.Restul proprietatilor sunt destinate pentru a
alinia
textul sau pentru a seta automat dimensiunea obiectuilui (AutoSize)
etc.
Pentru exercitiu,adaugati cateva benzi si cateva obiecte QRLabel
in
care utilizati Caption pentru a introduce un text oarecare.Utilizati
un
obiect TTable pentru a conecta QuickRep1 la o baza de date,apoi
apelati la
metoda Preview pentru a observa aspectul final.Metoda poate fi
apelata si
in timpul executiei,cu un buton OK si o procedura:
procedure TForm1.Button1Click(Sender: TObject);
begin
QuickRep1.Preview;
end;
Schimbati benzile,fonturile si culorile pana cand obtineti formatul
dorit.
Pentru antet,titlu si semnatura,puteti utiliza benzile
corespunzatoare.
QRDBText este un obiect asemanator cu QRLabel,dar este conectat la
baza
de date a obiectului QuickRep in care este inclus(adica la baza de
date
conectata la banda in care este inclus).Se utilizeaza pentru a prelua
si
afisa date dintr-o baza de date,cu ajutorul proprietatilor DataSource
si
DataField.Se poate utiliza pentru date de tip sir de caractere,pentru
valori numerice si pentru campuri Memo.Datele afisate pot fi
imprimate.
Adaugati unul sau mai multe obiecte de acest gen,pentru a afisa
datele
preluate dintr-o baza de date.Pentru a prelua datele din baze de date
diferite,grupati obiectele QRDBText in benzi diferite(conectate
diferit).
QREExpr -este un obiect specializat pentru a afisa date preluate
dintr-o
baza de date,prelucrate cu o functie
oarecare(Average,Copy,Count,Date,
Max,Min,Pretty,Sqrt,Sum etc.).Pentru a stabili expresia de prelucrare
a
datelor,alegeti proprietatea Expression si utilizati Expresion
builder:
Exemplu: daca QuicRep este conectata prin Table1 la Biolife.db
alegeti
functia dorita din caseta Available functions (AVERAGE) si apasati
butonul
Add,apoi alegeti campul de date din caseta Field(Length_In) si
apasati
butonul Add si apoi confirmati cu OK.Se poate utiliza doar baza de
date
la care este conectata banda in care se gaseste obiectul.Este foarte
util
pentru a afisa date precalculate sau expresii derivate,conversii etc.
Pentru formarea expresiior se pot utiliza si butoanele cu operatori.
Setul de proprietati permite si o serie de prelucrari
auxiliare:culori,
fonturi,imagine transparenta (se vad componentele situate in planul
infe-
rior),autodimensionare etc.
QRSYSData este un obiect specializat pentru a afisa cateva variante
de
date preluate de la sistemul de operare,cum ar fi:
Data,ora,titlul,numarul
de pagini din raport etc.Pentru alegerea tipului de date afisate se
uti-
lizeaza proprietatea Data(qrsDate,qrsTime etc.).Pentru a adauga un
text
oarecare,se poate seta proprietatea Text,care va adauga textul
respectiv
inaintea datelor preluate de la sistem.
QRMemo-este un obiect similar cu TMemo si este utilizat pentru a
intro-
duce in document texte extensive (care se pot intinde chiar si pe mai
multe pagini imprimabile).Textul propriu zis va fi inclus in
proprietatea
Lines (utilizand String list editor) iar restul proprietatilor se pot
utiliza pentru a seta dimensiunile,culorile,fonturile,transparenta
etc.
Pentru a accesa din Help obiectele QReport,executati un clic drept
in
paleta de optiuni,alegeti Properties,apoi Help,See also,Component
palette
-96-
si apoi selectati paleta QReport components.
QRRichText - este asemanator cu QRMemo si se utilizeaza pentru a
introduce
date de tip text in format RichText.Se utilizeaza pentru texte
extensive
care respecta un anumit format: spatii goale,spatii TAB,tabele etc.
Se utilizeaza proprietatea Lines pentru a edita textul dorit.
QRDBRichText -este similar cu QRRichText dar utilizeaza proprietatile
DataSource si DataField pentru a prelua datele dintr-o baza de date.
Se utilizeaza pentru texte in format RichText (exemplu microtabele
incluse
in campurile de date ale bazei de date).
QRShape -este un obiect destinat pentru a putea adauga figuri
geometrice
dreptunghiulare,cercuri sau linii.Se utilizeaza pentru a putea
reprezenta
grafic datele simple,sau pentru a adauga diverse marcaje de
atentionare
sau de evidentiere a unor fragmente din document.Se utilizeaza la fel
ca
si obiectul TShape ( prin proprietatile Brush si Shape).
QRImage -este specializat pentru includerea imaginilor de tip Bitmap
in
document.
EXEMPLU: utilizati Tools/Image Editor pentru a realiza o fila de tip
bitmap si arhivati fila realizata in acelasi director cu documentul
de
tip QReport.Pentru a introduce imaginea realizata in documentul
QuickRep,
adaugati un obiect QRImage,alegeti proprietatea Picture iar din
Picture
Editor alegeti Load si selectati fila dorita.Se poate utiliza pentru
orice tip de imagine digitala suportat de
TPicture(TBitMap,TIcon,TMeta-
file,TGraphic si toti descendentii sai).Puteti utiliza acest obiect
pentru a introduce in document fotografii,harti,desene,grafice etc.
QRDBImage - este identic cu QRImage,dar utilizeaza proprietatie
DataSource
si DataField pentru a prelua imaginea dintr-o baza de date.Imaginea
pre-
luata nu va fi afisata decat in momentul apelarii metodei
Preview.Pentru
a verifica obiectul in faza de design,executati un click de mouse
drept
si alegeti Preview.
QRCompositeReport -este un obiect destinat pentru a seta
preferintele de
imprimare,cu ajutorul proprietatilor Options si PrinterSettings.Se
uti-
lizeaza pentru a specifica numarul de copii,prima si ultima pagina
etc.
Este util in cazul documentelor formate din mai multe pagini
imprimabile.
QRPreview se poate utiliza pentru a adauga in faza de design obiecte
si
componente care nu se vor afisa sau imprima in faza de Preview (de
exemplu
pentru a salva un obiect anterior,care a fost actualizat (inlocuit cu
altul nou),dar care contine date importante pentru o etapa ulterioara
a
proiectului.Poate fi utilizat ca un fel de Recycle Bin in care se
salveaza
obiectele care nu sunt necesare la un anumit moment dat,dar vor fi
reuti-
lizate intr-o etapa ulterioara.
QRChart - este un obiect specializat pentru prezentarea de
grafice.Este
asemanator cu TChart si se utilizeaza pentru a prezenta grafice cu
date
aleatorii sau preluate dintr-o baza de date.Pentru setarea
obiectului,
executati un click de mouse cu butonul drept,in aria obiectului si
alegeti EditTChart apoi utilizati optiunile obiectului specializat
denumit
Editing QRDBChart.
Cele 18 obiecte din paleta QReport permit elaborarea de documente
complexe,cu aspect personalizat si cu date de tip diferit,preluate
din
surse diferite si prelucrate automat.Documentele pot fi arhivate sau
imprimate extrem de usor.Daca datele prezentate sunt extrem de lungi
si
pot fi fragmentate,este bine sa le reprezentati in rapoarte multiple.
-97- Dialogs -
OpenDialog
Paleta de componente denumita Dialogs contine un grup de obiecte
desti-
nate pentru operatii cu file intregi.Aceste obiecte permit
aplicatiilor
Delphi sa apeleze direct casetele de dialog ale sistemului de operare
Windows,astfel incat selectarea unei anumite file sa se faca extrem
de
facil (prin interfata grafica a sistemului Windows).Aceste obiecte
sunt
foarte utile pentru programarea unor operatii de deschidere,copiere
sau
imprimare a unor anumite file.Pentru fiecare obiect,caseta de dialog
de
tip Windows corespunzatoare acelui obiect poate fi apelata prin
metoda
Execute.Fiecare obiect are si un set propriu de metode destinate
pentru
a modifica aspectul casetelor de dialog in functie de preferinte.
OpenDialog -este obiectul prin care se poate apela caseta de
dialog
OpenFile din Windows.In aceasta caseta de dialog,utilizatorul poate
selecta fila pe care doreste sa o deschida.Pentru a deschide caseta
de
dialog,se apeleaza metoda Execute.Fila selectata va fi deschisa
automat,
iar proprietatea FileName va fi setata automat,astfel incat sa
contina
calea completa de acces la fila.Pentru a prelua datele din fila
deschisa,
trebuie adaugata procedura corespunzatoare cu formatul datelor.Pentru
a
deschide o fila text si pentru a prelua datele intr-un camp
memo,puteti
utiliza un exercitiu de genul:
EXEMPLU: (vezi si Prj87).
Salvati o fila noua si proiectul in Prj87.Adaugati un obiect
TOpenDialog,
un buton,un camp TMemo si unul TLabel.Selectati butonul si adaugati
urma-
toarea procedura OnClick:
procedure TForm1.Button1Click(Sender : TObject);
var rezultat:variant;
F:TextFile;
sir1:string;
begin
rezultat:=OpenDialog1.Execute;
if rezultat = -1 then
Label1.Caption:=OpenDialog1.Filename;
AssignFile(F,OpenDialog1.Filename);
Reset(F);
while not EOF(F) do
begin
Readln(F,sir1);
Memo1.Lines.Add(sir1);
end;
CloseFile(F);
if rezultat = 0 then
begin
Label1.Caption:='fila nu poate fi deschisa !';
Memo1.Clear;
end;
end;
In exercitiul Prj87 am adaugat cateva retete de bucatarie
:compot,olandez
si sushi.Puteti deschide oricare dintre aceste file,sau puteti
utiliza
caseta de dialog pentru a deschide orice fila de tip text din
memorie.
Pentru file care contin alt fel de date,trebuie sa editati alta
procedura
pentru exploatarea datelor (dar fila va fi deschisa indiferent de
format).
Proprietatile Filter si Options permit personalizarea casetei de
dialog.
-98- Dialogs -
TSaveDialog
TSaveDialog este obiectul prin care se poate apela o caseta
Windows de
tip Save dialog box.Apeland metoda execute,se va deschide caseta de
dialog
Windows in care utilizatorul poate alege fila pe care doreste sa o
copieze
in directorul selectat.Numele si calea de acces la fila selectata se
vor
arhiva in proprietatea Filename.Daca doriti ca fila selectata sa fie
salvata cu un anumit nume,introduceti numele respectiv in
proprietatea
FileName in etapa de design.In aces caz,in momentul executiei numele
respectiv va fi afisat in caseta Edit din caseta de dialog.
Pentru ca fila respectiva sa fie salvata,trebuie sa adaugati si o
procedura in care sa apelati functia SaveTo File corespunzatoare cu
formatul datelor(TStrings,TPicture,TOleConteiner,TMetafile,TGraphic,
TDBGrid,TCustomTreeView,TCustomMemoryStream,TClientDataSet,TBlobField).
De exemplu,pentru a salva o fila de tip .BMP cu numele de Fila1.bmp
puteti
utiliza un exercitiu de genul:
EXEMPLU: (vezi si Prj88)
Salvati o fila noua si proiectul in Prj88.Adaugati un obiect
TSaveDialog,
un buton TBitBtn(din Additional) si un obiect TImage.
Selectati obiectul Image1 si utilizati proprietatea Picture pentru a
incarca o fila de tip .BMP oarecare (cu Load).
Selectati butonul si setati Caption la valoarea Save (sau Salveaza).
Pentru a adauga si un desen pe buton,alegeti proprietatea Glyph,apoi
alegeti Load si in caseta de dialog LoadPicture alegeti din
directorul
Delphi 3/Images/Buttons pictograma Filesave,apoi confirmati cu open
si OK.
Apoi alegeti Events si adaugati urmatoarea procedura OnClick:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SaveDialog1.Execute;
Image1.Picture.SaveToFile(SaveDialog1.FileName);
end;
Proprietatile obiectului sunt la fel ca pentru TOpenDialog.Singura
metoda proprie este Execute (celelalte sunt mostenite) iar dintre
evenimente se pot utiliza: OnSelectionChange,OnClose si OnShow.
Observati ca obiectul nu executa operatii propriu zise asupra
datelor ci
doar realizeaza legatura cu caseta de dialog de tip Windows.Orice
ope-
ratie propriu zisa asupra datelor selectate,trebuie specificata prin
proceduri adugate impreuna cu Execute.
Pentru a salva orice tip de date,trebuiesc tratate toate
situatiile
posibile.Este mult mai simplu sa utilizati acest obiect pentru a
salva
doar o anumita fila (cea generata in aplicatia d-voastra).Eventual
puteti
adauga cate un buton si o procedura pentru fiecare tip de date din
aplicatie.Daca generalizati prea mult procedura de salvare,riscati
sa
creati confuzii referitoare la tipul de date,caz in care fila
selectata
va fi salvata dar nu va putea fi utilizata.
Proprietatea Options ofera o paleta foarte larga de optiuni prin
care
puteti organiza modul de interactiune cu utilizatorul.Implicit,toate
aceste optiuni sunt setate False.Pentru a utiliza una dintre
optiuni,
trebuie sa setati valoarea True pentru optiunea respectiva.Exemplu:
ofShowHelp=True va adauga in caseta de dialog si un buton
Help.Puteti
edita o procedura care sa ofere informatii pentru utilizator in
momentul
in care se apasa butonul Help.Proprietatea Filter va permite sa
filtrati
in caseta de dialog doar tipurile de file acceptabile.
-99- Dialogs
-TOpenPictureDialog
TOpenPictureDialog este destinat pentru deschiderea filelor de tip
grafic.Obiectul,prin metoda Execute,apeleaza caseta de dialog de tip
Windows care permite selectarea filei.Este identic cu TOpenDialog
dar,
prezinta si o regiune Preview in care fila selectata poate fi afisata
inainte de a fi deschisa.Daca fila selectata poate fi afisata de un
obiect
TPicture,atunci fila va fi afisata in regiunea Preview,iar in caz
contrar
se va afisa textul "None".Filele acceptate de TPicture sunt:
bitmap(.BMP),
icon(.ICO),Windows metafile(.WMF) si enhanced Windows metafile(.EMF).
Filele neacceptabile returneaza un mesaj de eroare: EInvalidGraphic.
EXEMPLU: (vezi si Prj89)
Salvati o fila noua si proiectul in Prj89.Adaugati un obiect de tip
TOpen-
PictureDialog,un buton si un obiect TImage.
Selectati butonul si adaugati urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: Tobject);
begin
OpenPictureDialog1.Execute;
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
Tastati F9 si executati aplicatia.Alegeti in caseta de dialog una
dintre
filele arhivate in Delphi3/Images/Splash/256color (de exemplu
Handshak) si
apoi confirmati cu Open.
-101- Dialogs -
TPrint[erSetup]Dialog
TPrintDialog este un obiect destinat pentru setarea unor
informatii
care determina: pagina de start si numarul de copii imprimate.Pentru
acest scop,prin metoda Execute,obiectul apeleaza caseta de dialog de
tip
Windows destinata pentru setarea imprimantei.Se utilizeaza pentru a
putea
modifica activ,in timpul executiei,caracteristicile de imprimare.
EXEMPLU: (vezi Prj93)
Salvati o fila noua si proiectul in Prj93.Adaugati un obiect
TPrintDialog,
un obiect TRichEdit si doua butoane.
Pentru primul buton atribuiti procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
PrintDialog1.Execute;
end;
Utilizati Lines din RichEdit1 pentru a introduce un text oarecare in
obiectul RichEdit1 (textul pe care doriti sa-l imprimati).
Atribuiti pentru cel de al doilea buton urmatoarea procedura OnClick:
procedure TForm1.Button2Click(Sender: TObject);
begin
RichEdit1.Print('TEXT EXEMPLIFICATIV');
end;
Tastati F9 si executati aplicatia.Utilizati primul buton pentru a
speci-
fica numarul de copii si cel de al doilea pentru a declanasa
imprimarea.
Proprietatea Collate se utilizeaza pentru a specifica ordinea in
care
vor fi imprimate paginile.De exemplu,daca textul ocupa 3 pagini si
se
executa 2 copii,ordinea de imprimare poate fi: 1,2,3,1,2,3 sau
1,1,2,2,
3,3.Daca se utilizeaza o rola de hartie non stop,se va prefera
primul
tip de ordonare,iar daca se utilizeaza pagini imprimate fata-verso
se
va prefera cel de al doilea tip de ordonare.
Copies specifica numarul de pagini,FromPage specifica prima pagina
impri-
mata,ToPage specifica ultima pagina imprimata,MaxPage si MinPage
speci-
fica numarul maxim sau minim de copii iar Options modifica aspectul
casetei de editare. Setarile sa pot face atat in etapa de design (in
ObjectInspector) cat si in timpul executiei (in caseta Windows).
-102- TFindDialog si
TReplaceDialog
TFindDialog este un obiect utilizat pentru a cauta un sir de
caractere
intr-un obiect de tip text.Pentru acest scop,prin metoda
Execute,obiectul
apeleaza caseta de dialog de tip Windows care permite introducerea
sirului
de caractere cautat.In momentul apasarii butonului de cautare
FindNext,
se declanseaza automat evenimentul OnFind,care trebuie sa contina
pro-
cedura de cautare propriu-zisa (editata de catre programator).
EXEMPLU: (vezi Prj94)
Salvati o fila noua si proiectul in Prj94.Adaugati un obiect
TFindDialog,
un buton,un camp TMemo si doua obiecte TLabel.
Utilizati Lines din Memo1 pentru a introduce un text oarecare (textul
in
care se va executa operatia de cautare).
Selectati butonul si atribuiti urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
FindDialog1.Execute;
end;
Selectati FindDialog1 si adaugati urmatoarea procedura OnFind:
procedure TForm1.FindDialog1Find(Sender: TObject);
var selpos:variant;
begin
selpos:=Pos(FindDialog1.FindText,Memo1.text);
Label1.Caption:='Textul cautat se afla la pozitia: ';
Label2.Caption:=selpos;
end;
Tastati F9 si executati aplicatia.Textul cautat poate fi introdus in
mo-
mentul executiei,sau in etapa de design in proprietatea
FindText.Options
modifica aspectul casetei de dilaog.
-104-
TDriveComboBox este un obiect specializat pentru a afisa unitatile
de
memorie instalate(accesibile in momentul executiei).Prin proprietatea
DirList se poate cupla cu un obiect TDirectoryListBox,pentru a afisa
si dosarele de pe disc.Acelasi rezultat se poate obtine si prin
prprie-
tatea Drive si evenimentul OnChange.
TFilterComboBox este un obiect specializat pentru selectarea unui
anumit tip de file,cu ajutorul unui filtru specializat,programabil.Se
utilizeaza atunci cand interfata aplicatiei trebuie sa permita
accesul
doar la un numar limitat de file,restrictionat prin numele filei sau
prin extensia filelor.Proprietatea Filter permite introducerea unor
expresii formate din "wilde characters" (gen *,?...etc).Prin
proprietatea
FileList poate fi cuplat cu un obiect TFileListBox (in care se va
face
selectia propriu zisa).Restrictia (unica) se poate seta si prin Mask.
EXEMPLU: (vezi Prj95) (pentru cele patru obiecte Win 3.1)
Salvati o fila noua si proiectul in Prj95.Adaugati un obiect
TDriveCombo-
Box,un obiect TFilterComboBox,un obiect TDirectoryListBox,un obiect
de tip
TFileListBox si un obiect TLabel.
Alegeti DriveComboBox1 si setati DirList=DirectoryListBox1.Alegeti
eveni-
mentul OnChange si atribuiti urmatoarea procedura:
procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
DirectoryListBox1.Drive:=DriveComboBox1.Drive;
DirectoryListBox1.Update;
end;
Alegeti FilterComboBox1 si setati FileList=FileListBox1.Apoi alegeti
pro-
prietatea Filter si adaugati cateva optiuni ( *.EXE,*.TXT,*.DLL
etc.).
Alegeti DirectoryListBox1 si setati FileList=FileListBox1.Apoi
alegeti
evenimentul OnChange si atribuiti urmatoarea procedura:
procedure TForm1.DirectoryListBox1Change(Sender: TObject);
begin
FileListBox1.Directory:=DirectoryListBox1.Directory;
FileListBox1.Update;
end;
Alegeti FileListBox1 si atribuiti pentru evenimentul OnClick
urmatoarea
procedura:
procedure TForm1.FileListBox1Click(Sender: TObject);
begin
Label1.Caption:='Fila selectata este: '+ FileListBox1.Filename;
end;
Tastati F9 si executati aplicatia.In obiectul DriveComboBox1 puteti
schimba unitatea de disc (daca este goala returneaza un mesaj de
eroare).
In FilterComboBox1 puteti selecta tipul de file pe care doriti sa le
afisati (pentru a reduce numarul de file afisate).
In DirectoryListBox1 puteti schimba directorul curent.Daca doriti sa
preluati direct numele directorului selectat,puteti adauga un alt
obiect
TLabel si setati proprietatea DirLabel la valoarea Label2.
In obiectul FileListBox1 puteti selecta o anumita fila.Daca doriti ca
fila selectata sa fie preluata direct intr-un obiect TEdit,adaugati
un
obiect TEdit si setati proprietatea FileEdit la valoarea Edit1.
Pentru a personaliza aplicatia,puteti schimba culorile si
fonturile,
puteti activa si inactiva obiectele dinamic...etc.
-105-
Samples
Paleta de componente denumita Samples contine cateva obiecte
persona-
lizate,care au fost adaugate in bara de meniu,pentru a demonstra
modul in
care utilizatorul poate sa-si programeze obiectele necesare (sau sa
le
adauge in bara de meniu).Aceste obiecte nu sunt insotite de
instructiuni
explicative in Help.Pentru a intelege proprietatile si metodele
obiectelor
trebuie sa deschideti fila sursa (localizata in
Delphi3/Source/Samples).
Incercati sa deschideti aceste file si sa realizati aplicatii
simple
care exploateaza acest gen de obiecte.Daca reusiti sa cititi si sa
inter-
pretati filele sursa,cu putin efort suplimentar puteti sa si editati
file
similare in care sa definiti obiectele de care aveti nevoie (Exemplu:
puteti programa un obiect care sa arhiveze si sa calculeze retetele
de
bucatarie).Incercati sa exploatati aceste obiecte,fara ajutorul
exemplelor
din manual.Exemplele care urmeaza sunt doar orientative si nu
exploateaza
complet facilitatile oferite de fiecare obiect.
TGauge este un obiect asemenator cu bara de stare si este
proiectat
pentru a prezenta grafic progresia unui proces aflat in
executie.Obiectul
poate utiliza 5 variante de prezentare grafica,specificate prin
proprie-
tatea TGaugeKind(text,sector de cerc,bara de defilare etc.).Pentru a
putea discrimina cat mai fidel fiecare element al progresiei,se pot
uti-
liza proprietatile MaxValue si MinValue,prin care se stabilesc
limitele
obiectului.Pentru a evidentia procesul dorit,trebuie sa editati o
pro-
cedura in care elementele procesului vor fi conectate la elementele
de
progresie ale obiectului TGauge(TGauge prezinta o progresie liniara).
Exemplu: (vezi si Prj96)
Salvati o fila noua si proiectul in Prj96.Adaugati un obiect TGauge
si
un buton.
Selectati obiectul Gauge1 si setati BackColor,Color si Font dupa
preferin-
te.Apoi alegeti o valoare pentru MaxValue (Exemplu: 200).
Selectati butonul si adaugati urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
begin
Gauge1.Progress:=0;
Gauge1.Kind:=gkPie;
for n:=1 to 20 do
begin
Gauge1.AddProgress(n);
Sleep(300);
end;
end;
Pentru a schimba tipul de afisare puteti utiliza alta varianta pentru
Gauge1.Kind (gkText,gkNeedle,gkHorizontalBar sau
gkVerticalBar).Eventual
puteti atribui cate un buton pentru fiecare tip de grafic.Pentru a
seta
viteza procesului de animatie modificati valoarea pentru Sleep().
Daca observati cu atentie fila sursa (unit Gauges) puteti remarca
proprietatile declarate private.Aceste proceduri sunt utilizate de
obiect
pentru a realiza grafica obiectului.In aplicatiile dezvoltate de d-
voastra
puteti apela direct doar functiile si procedurile declarate "public"
sau
"published".De exemplu,puteti adauga un algoritm prin care culorile
de
reprezentare se schimba aleator la fiecare pas al executiei...etc.
Restul depinde de imaginatia d-voastra.
-106-
TColorGrid1 -este un obiect destinat pentru a putea schimba activ
cu-
lorile unui anumit obiect,in timpul executiei (De exemplu pentru a
putea
evidentia mai bine un text sau un grafic).Obiectul este foarte util
mai
ales atunci cand aplicata citeste reprezentari grafice din mai multe
file.
In cazul in care mai multe grafice utilizeaza aceeasi paleta de
culori,
este posibil ca prin sumatie sa rezulte reprezentari aberante.Pentru
a evita astfel de situatii,se poate utiliza un obiect TColorGrid
pentru
a schimba la nevoie o anumita culoare.
EXEMPLU: (vezi si Prj97)
Salvati o fila noua si proiectul in Prj97.Adaugati un obiect
TColorGrid
si in camp TLabel.
Setati culorile initiale si fonturile pentru Tlabel si introduceti in
Caption un text oarecare.
Apoi selectati ColorGrid1 si adaugati urmatoarea procedura OnChange:
procedure TForm1.ColorGrid1Change(Sender: TObject);
begin
Label1.Color:=ColorGrid1.BackGroundColor;
Label1.Font.Color:=ColorGrid1.ForeGroundColor;
end;
Tastati F9 si executati aplicatia.pentru a schimba culorile executati
in obiectul ColorGrid1 cate un click de mouse cu butonul stang pentru
culoarea fontului sau cu butonul drept pentru culoarea de fond.
Daca doriti ca paleta de culori sa fie afisata doar la un anumit
moment
dat,adaugati doua butoane si cate o procedura prin care se alterneaza
proprietatea ColorGrid1.Visible la valorile True sau False.
-108-
TCalendar este un obiect grafic destinat pentru a selecta o
anumita
data calendaristica,sau pentru a efectua operatii cu date
calendaristice.
Obiectul prezinta o serie de functii interne (declarate "private") cu
ajutorul carora permite afisarea si selectarea unei date
calendaristice
din luna curenta.Pentru date situate in afara acestui interval,se pot
utiliza procedurile NextMonth,NextYear,PrevMonth si PrevYear,care
permit
selectarea unor date situate in in lunile si anii urmatori sau
precedenti.
Preluarea datei selectate se face cu ajutorul proprietatii
CalendarDate
iar afisarea sau ascunderea obiectului se poate seta prin Visible.
EXEMPLU: (vezi si Prj101)
Salvati o fila noua si proiectul in Prj101.Adaugati un obiect
TCalendar,
un camp TMemo si doua butoane.
Selectati Calendar1 si adaugati urmatoarea procedura OnClick:
procedure TForm1.Calendar1Change(Sender: TObject);
var d2:variant;
begin
d2:=Calendar1.CalendarDate;
Label1.Caption:=d2;
end;
Pentru cele doua butoane adaugati cate o procedura OnClick care sa
contina
cele doua proceduri: Calendar1.NextMonth si respectiv
Calendar1.PrevMonth.
Daca doriti sa utilizati doar ziua,luna sau anul,apelati la
proprietatile:
Day,Month si Yaer.Cu datele preluate se pot efectua operatii
aritmetice.
Tastati F9 si executati aplicatia.
-109-
ActiveX
Paleta de componente Activex grupeaza un set de obiecte definite
si
realizate prin tehnologia ActiveX.Acest gen implementare grupeaza un
set
de tehnologii software,prin care obiectele astfel definite pot
comunica
intre ele,inclusiv intr-o retea(network),indiferent de limbajul
utilizat
pentru programarea lor.Astfel,obiectele Delphi pot schimba date in
retea
cu obiecte programate in C++.Aceasta tehnologie a fost construita pe
platforma denumita Component Object Model (COM),care sta si la baza
tehnologiei OLE (Object Link and Emmbadded) dezvoltata de catre
Microsoft.
In esenta,aceasta tehnologie desparte partea de interfata de cea in
care
se realizeaza implementarea.Astfel,interfata cuprinde un set de
pointeri
spre implementare.Ca rezultat,pentru acelasi obiect ActiveX pot
exista mai
multe implementari diferite.COM nu este un limbaj de programare,ci
doar
un standard comun,utilizat pentru aplicatiile care doresc sa
beneficieze
de avantajele acestui standard.Fiecare obiect va fi programat in
limbajul
dorit de programator,dar va contine in interfata si o linie de
legatura
cu celelalte obiecte prin care obiectul va putea fi apelat cu
ajutorul
pointerilor din interfata.Acest gen de obiecte sunt foarte greu de
evaluat
la prima vedere.Pentru a evita "virusii informatici",fiecare obiect
de
acest gen trebuie inregistrat si va avea un cod numeric de
identificare.
Obiectele de acest gen,pot avea mai multe interfete,dar interfata de
baza
este cea denumita IUnknown,care contine metodele
QueryInterface,Addref
si Release(prin care comunica cu celelalte obiecte).Prezentarea
amanuntita
a acestui standard nu face obiectul acestui manual.
Obiectele ActiveX sunt obiecte realizate cu tehnologia ActiveX.Pot
fi
utilizate in file Delphi obisnuite,sau pot fi utilizate pentru a
dezvolta
aplicatii ActiveX (cu ActiveForm,Active X Library,Automation Object
etc).
Pentru a respecta caracterul de abecedar,aceste obiecte vor fi
prezentate
doar ca simple obiecte Delphi.Tehnologia ActiveX necesita un manual
sepa-
rat si notiuni aprofundate de programare structurata in medii de
progra-
mare multisistem(cu limbaje si sisteme de operare multiple).
Obiectele din acest grup au fost dezvoltate de catre companii
diferite
de Borland,astfel incat utilizarea lor poate fi restrictionata prin
diverse conditii,specificate da catre firmele producatoare.Deplhi 3
asigu-
ra doar licenta de utilizare,fara nici un fel de garantii.Pentru
fiecare
obiect se pot obtine relatii suplimentare,cu un click de mouse cu
butonul
drept,in aria obiectului respectiv.
-111-
TF1Book - este un obiect destinat pentru prelucrari complexe a
datelor
in format tabelar (asemanator cu Microsoft Excel).Obiectul contine un
program complex,denumit Formula One,creat de Visual
Components.Formula
One este compatibil cu Excel 5 si poate citi sau scrie filele
redactate
in Excel 5.Programul Formula One contine si un utilitar Help complet.
Pentru informatii detaliate consultati manualul Help(in Workbook
Designer).
Pentru a exploata obiectul TF1Book,executati un click de mouse pe
obiect si alegeti Workbook Designer.In fereastra de dialog denumita
"Formula One Workbook Designer" se va afisa o copie a tabelului
deschis
in F1Book,un memiu complex cu un numar mare de optiuni (inclusiv
Help),
si o bara de instrumente formata din butoane.Aceasta interfata
permite
programarea tuturor operatiilor necesare pentru pregatirea
obiectului.
Tabelul propriu zis este format din celule,dispuse pe randuri si
coloane,la fel ca o baza de date de tip tabelar.Fiecare celula este
echivalenta cu o variabila independenta si poate accepta date,in
orice
fel de format.Celulele pot fi utilizate independent,sau se pot
conecta
doua sau mai multe celule,prin diverse formule,pentru a realiza
operatii
matematice complexe.Numele fiecarei celule este format din numele
coloanei
impreuna cu cel al randului pe care se afla.Coloanele sunt notate de
la
A la IV iar randurile sunt numerotate de la 1 la ...n(n=numar long).
Numele celulelor vor fi asadar: A1,A1,A3....An pana la IVn.
In fiecare celula se pot introduce date numerice sau de tip text,date
logice,functii,sau diverse formule care combina aceste tipuri de
date.
Pentru a executa o operatie simpla,se vor utiliza operatorii si
numele
celulelor implicate.De exemplu pentru a afisa in celula C3 suma
datelor
din A1 si A2 se va introduce in C3 formula: =A1+A2.Fiecare formula va
fi
precedata de semnul =(egal).In formula se pot include operatorii
curenti
si functiile acceptate de program (vezi in utilitarul Help din
Formula One
fila Worksheet Functions din capitolul "Working with
Worksheets"(Contents).
Pentru ca formula sa fie executata,este necesar sa fie scrisa
corect.Nu
se pot utiliza operatorii matenmatici si functiile matematice pentru
date
de tip text.Programul include si functii complexe de analiza
statistica,
functii trigonometrice,medii aritmetice,functii de
concatenare,functii
pentru operatii cu date calendaristice,functii de cautare si selectie
sau
de filtrare a datelor,functii de analiza a datelor,functii care
opereaza
asupra datelor orare(functii de timp) etc.Prezentarea completa a
acestor
functii nu face obiectul acestui manual.
Pe langa facilitatile amintite,programul permite si conectarea la
o
baza de date,din care se pot prelua valori pentru celule,sau care
poate fi
actualizata cu date din tabel.In plus,datele pot fi reprezentate si
grafic
cu ajutorul unui obiect de tip Chart (are un wizard in bara de
Tools).
Un exemplu banal de exploatare a acestui obiect il reprezinta
intocmi-
rea unei liste de plati.
EXEMPLU: (vezi si Prj105)
Salvati o fila noua si proiectul in Prj105.Adaugati un obiect TF1Book
si
executati pe el un click dr.de mouse.Introduceti in celule datele
dorite:
nume,prenume,sume,taxe,impozite,retineri,calcul total,verificare etc.
Pentru operatii utilizati formule de genul: =A3*3% (va calcula cat
reprezinta 3% din valoarea inregistrata in celula A3).
Tastati F9 si executati obiectul.Pentru a imprima datele puteti
utiliza
fie butonul din Designer,fie optiunea Print din meniul File(din
Designer).
-112-
TVtChart - este un alt obiect utilitar conceput de Visual
Components
pentru a facilita reprezentarea grafica a unor serii de valori
numerice.
Pentru exploatarea obiectului,dupa un click de mouse cu butonul drept
puteti utiliza fie Chart Wizard fie Data Grid Editor.
Daca alegeti optiunea Wizard puteti alege tipul de reprezentare
grafica
(sectoare,coloane,linii,arii etc.),stilul si unghiul axelor,sau
puteti
adauga un titlu si o legenda.Tot in wizard puteti apela la utilitarul
Help care ofera informatii detaliate despre obiect.
Daca alegeti Edit Chart Data puteti seta valorile din tabel astfel
incat sa afisati datele dorite.
EXEMPLU: (vezi si Prj106)
Salvati o fila noua si proiectul in Prj106.Adaugati un obiect
TVtChart
si alegeti dimensiunile dorite.
Tastati F9 si executati obiectul.Lansati aplicatia si apoi executati
un
click de mose cu butonul drept.Alegeti wizard si selectati tipul de
reprezentare.Apoi alegeti Edit Data Chart si introduceti datele
dorite.
Daca doriti sa adaugati si o legenda,executati din nou un click de
mouse
(drept) si alegeti Legend,apoi selectati butonul Visible si alegeti
pozitia in care doriti sa afisati legenda.Daca doriti sa asociati si
o
fotografie sau un desen,selectati Backdrop,apoi Browse si alegeti o
fila
de tip .BMP (de exemplu Images/Spalsh/16color/Athena),apoi confirmati
cu
butonul Apply.Daca reprezentarea grafica este corecta,executati din
nou
un click de mouse si alegeti Print.In etapa de design,aceleasi
optiuni
le puteti seta din optiunea Properties.
-113-
assembler
In Delphi se pot utiliza proceduri si functii scrise in
assembler.La
fel ca si in Pascal,procedurile scrise in assembler vor fi incluse
intre
cuvintele cheie "asm...end;" si vor contine doar tipurile de date
accepta-
te de limbajul Assembler.Delphi accepta si setul de instructiuni
80386 si
80387,astfel incat se pot utiliza registrii de 32 de biti
(EAX,EBX...etc.)
Ca rezultat,puterea de calcul este mult mai mare in Delphi decat in
Pascal
iar posibilitatile de conversie a datelor sunt nelimitate.
In Delphi numerele hexazecimale se simbolizeaza prin adaugarea
pre-
fixului $ (in locul sufixului h).Ca rezultat,nu se pot utiliza
procedurile
scrise in assembler care apeleaza la intreruperi de DOS (prin
instructiu-
nea INT).
In general,Delphi este un limbaj inalt structurat,conceput pentru
a
conecta intre ele obiecte vizuale mari,module,baze de date sau chiar
programe intregi.Exista putine situatii in care limbajul assembler
poate
fi util,dar exista si situatii in care este indispensabil (Exemple:
pentru
a conecta doua unitati hardware incompatibile direct,pentru a schimba
dinamic formatul datelor,pentru a prelua date direct din procesor
etc.).
Un exemplu clasic ar fi conectarea de dispozitive care utilizeaza
formate
diferite (16 si 32 de biti).
Procedurile scrise in assembler nu accepta orice format al
datelor(de
exemplu nu accepta tipul "variant").Pentru a utiliza astfel de
date,este
necesara o conversie la un tip de data acceptabil:
EXEMPLU: (vezi si Prj108)
Salvati o fila noua si proiectul in Prj108.Adaugati un buton,trei
campuri
edit si doua TLabel.In primele doua TEdit se vor introduce valori
numerice
iar in cel de al treilea se va afisa rezultatul inmultirii.TLabel se
vor
utiliza pentru semnele X si =.Pentru operatia de inmultire,sa va
atribui
butonului urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x,y,z: variant;
a,b,c: double;
d: integer;
begin
x:=Edit1.Text;
Val(x,a,d);
y:=Edit2.Text;
Val(y,b,d);
asm
FLD a
FMUL b
FST c
end;
z:=c;
Edit3.Text:=z;
end;
Tastati F9 si executati aplicatia.In Delphi,aceeasi operatie se putea
codifica direct z:=x*y.In assembler,procesorul 80387 nu accepta decat
tipul double,astfel incat tipul variant trebuie convertit inainte de
a
fi incarcat in registrul ST.
Se pot utiliza proceduri in assembler pentru a simplifica diverse
operatii matematice (dar atentie maxima la formatul datelor).
-114-
Exista situatii in care datele arhivate intr-o baza de date mai
veche
sunt in format de 16 biti,si doriti sa utilizati aceste date cu un
pro-
gram modern care opereaza pe 32 de biti.Pentru conversia simpla din
word
in dword se poate utiliza instructiunea CWD.
EXEMPLU: (vezi si Prj109)
Salvati o fila noua si proiectul in Prj109.Adaugati un camp TEdit,un
buton
si 3 campuri TLabel.In Label3.Caption introduceti textul:
"Introduceti un
numar mai mare decat 65535"( adaugat deasupra campului TEdit).
Pentru buton atribuiti urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender; tObject);
var a:word;
b:dword;
c,d:string;
nr:variant;
begin
nr:=Edit1.Text;
a:=nr;
asm
MOV AX,a
CWD
MOV b,EAX
end;
Str(a,c);
Str(b,d);
Label1.Caption:=c + ' (in format de 16 biti)';
Label2.Caption:=d + ' (in format de 32 de biti)';
end;
Tastati F9 si executati aplicatia.Formatul de 16 biti accepta tipul
word,
adica numere cuprinse intre 0 si 65535.Pentru numerele cuprinse in
acest
interval,valorile afisate vor fi egale,dar pentru valorile mai mari
de
65535 tipul word va afisa diferenta fata de valoarea maxima.
Trebuie remarcat faptul,ca si atunci cand afiseaza aceeasi
valoare,
cele doua numere a si b nu sunt egale,deoarece a este reprezentat pe
16
biti iar b este reprezentat pe 32 de biti.Ca rezultat,cele doua
numere
nu pot fi superpozabile si nu pot utiliza aceeasi registri (a poate
utili-
za registrul AX in timp ce b trebuie sa utilizeze registrul EAX).
Aceasta deosebire este esentiala atunci cand este implementata la
nivel de hardware (de exemplu centrale telefonice pe 16 sau 32 de
biti).
Se pot utiliza proceduri editate in assembler si pentru a opera
asupra
unor date arhivate in structuri,cu conditia ca datele apelate sa fie
in
format acceptabil.In aceste situatii,se vor utiliza conventiile de
apel
obisnuite (se utilizeaza punctul pentru a apela membrul unei
structuri.
De exemplu,pentru a desena un paralelipiped dreptunghic cu
ajutorul
functiei Rectangle(),coordonatele trebuiesc precizate prin valori de
tip
integer.Pentru arhivarea acestor valori se pot utiliza structuri de
tip
TPoint sau TRect.Valorile din aceste structuri se pot apela direct si
din interiorul unei proceduri editate in assemmbler cu ajutorul unei
expresii de genul: TRect.TPoint.Valoarea
Acest gen de operatii este extrem de util,mai ales atunci cand se
lucreaza cu structuri mari de date de tip matriceal (bi-
tridimensionale),
sau cand se extrage o valoare numerica simpla dintr-o structura
complexa.
-115-
EXEMPLU: (vezi si Prj110)
Salvati o fila noua si proiectul in Prj110.
In portiunea de interfata,adaugati doua tipuri de data de tip
"record"
astfel: ( imediat dupa type TForm1 = class(TForm)...public end; )
type TPoint = record
x,y: Integer;
end;
type TRect = record
a,b: TPoint;
end;
Apoi adaugati urmatoarea variabila (dupa Form1:TForm1) : var R:TRect.
Acum aplicatia va contine o variabila de tip TRect,care este formata
din
doua variabile de tip TPoint.Rezultatul este o structura in care cei
patru membri pot fi referiti prin: R.A.X si R.A.Y / R.B.X si R.B.Y
Pentru a opera cu aceasta structura,adaugati un buton si urmatoarea
pro-
cedura OnClick:
procedure TForm1.Button1Click(Sender: tObject);
var n,m:integer;
begin
Randomize;
for n:=1 to 10 do
begin
R.A.X:=1;
R.A.Y:=1;
m:=n*30;
asm
MOV EAX,E.A.X
ADD EAX,m
MOV R.B.X,EAX
MOV EDX,R.A.Y
ADD EDX,m
MOV R.B.Y,EDX
end;
Form1.Canvas.Brush.Color:=RGB(Random(255),100,Random(255));
Form1.Canvas.Rectangle(R.A.X,R.A.Y,R.B.X,R.B.Y);
sleep(1000);
end;
Exit;
end;
Tastati F9 si executati aplicatia,apoi apasati butonul de cateva ori.
Functia Random() va genera o culoare aleatorie pentru fiecare pas al
buclei,iar procedura in assembler va incrementa valorile coltului din
dreapta jos al patrulaterului.
Exemplul prezinta simplist modul de operare intr-o structura
matriceala
formata din patru elemente.Puteti incerca sa preluati sau sa
actualizati
date numerice in si din structuri complexe,tridimensionale.De
exemplu,
puteti incerca sa realizati un filtru matriceal pentru date preluate
de la o placa I/O (cu ajutorul instructiunilor IN si OUT ).
In rezumat,limbajul assembler poate fi utilizat pentru editarea de
functii noi,sau pentru a executa operatii care nu sunt implementate
prin
functiile Delphi.Se pot edita obiecte cu metode definite in
assembler.
-116-
Grafica
In Delphi exista trei modalitati de a afisa datele sub forma de
repre-
zentari grafice:
1.-se pot utiliza desene si imagini digitale realizate anterior
si
prezentate cu ajutorul unor obiecte specializate
(TImage...etc.)
2.-se pot realiza desene si imagini BitMap in etapa de desing,iar
apoi
se prezinta aceste date in timpul executiei programului.
3.-desenele si graficele se realizeaza direct in timpul executiei
Prima modalitate a fost deja prezentata impreuna cu obiectele
specifice.
Pentru cea de a doua modalitate,se va utiliza din Form proprietatea
Canvas
impreuna cu functiile grafice de tip GDI(Graphic Device
Interface).Canvas
este de fapt un obiect independent,cu proprietati si metode proprii.
Acest obiect prezinta o serie de avantaje: nu mai este necesara
preci-
zarea contextului de dispozitiv grafic si nici codul intern de
manipulare
(handle) a datelor,deoarece Canvas gestioneaza singur atat memoria
cat si
procesarea mesajelor Windows (prin care comunica cu restul obiectelor
din
interfata).
Referitor la realizarea de imagini grafice se utilizeaza doi
termeni:
"drawing" si "painting".Drawing (desenarea) este termenul utilizat
atunci
cand se creaza un element grafic unic(linie,poligon
etc.).Paint(imaginea)
se utilizeaza pentru a descrie intregul obiect grafic,care poate
contine
unul sau mai multe elemente grafice izolate.Actiunea Paint
actualizeaza
datele iar evenimentul OnPaint este apelat ori de cate ori a
intervenit
o actiune de actualizare a datelor din obiect.
Obiectul Canvas are patru proprietati principale: Pen(penita
grafica),
Brush(pensula pentru colorare),Font(caracterele utilizate pentru
editarea
textului) si Pixels(o arie in care imaginea poate fi precizata pixel
cu
pixel).Metodele obiectului Canvas descriu desene si imagini grafice
spe-
cializate(Arc,Ellipse,LineTo,Pie,Polygon,Rectangle..etc.) sau
determina
actiunile si inactiunile
obiectului(Create,Destroy,FillRect,FloodFill,
Lock,Unlock).
EXEMPLU: (vezi si Prj111)
Salvati o fila noua si proiectul in Prj111.Pentru Form1 alegeti din
Events
proprietatea OnMouseMove si adaugati urmatoarea procedura:
procedure TForm1.FormMouseMove(Sender: TObject;Shift: TShiftState;
X,Y:
Integer);
begin
Form1.Canvas.Pen.Color:=clRed;
Form1.Canvas.Pen.Width:=5;
Form1.Canvas.Brush.Color:=clYellow;
Form1.Canvas.Ellipse(X-15,Y-15,X+15,Y+15);
end;
Tastati F9 si executati aplicatia.Deplasati indicatorul mouse in
inte-
riorul ariei Form1 (fara click).
Observati ca din Canvas am utilizat Pen pentru a preciza culoarea
si
grosimea penitei si Brush pentru a specifica o culoare de
umplere.Metoda
Ellipse deseneaza direct obiectul cerut,la pozitia precizata cu
ajutorul
coordonatelor preluate de la dispozitivul mouse.Pentru a realiza
aceleasi
operatii in Pascal,ar fi necesare mult mai multe linii de cod.Daca
doriti
puteti schimba culorile,puteti utiliza patrulatere in loc de cercuri
sau
puteti programa diverse artificii grafice prin care sa semnalati
pozitia
cursorului in interiorul ariei Form1.
-117-
Pozitia indicatorului mouse poate fi semnalizata si cu ajutorul
unei
imagini de tip Bitmap realizata anterior (puteti utiliza o poza
digitala).
EXEMPLU: (vezi si Prj112);
Salvati o fila noua si proiectul in Prj112.Adaugati un obiect TImage
si
utilizati Picture pentru a incarca o imagine .bmp(de exemplu din
Images
alegeti Icons/Earth).Apoi setati proprietatea Visible=False.
Din Form1 alegeti evenimentul OnMouseDown si adaugati urmatoarea
procedura
procedure TForm1.FormMouseDown(Sender: TObject;Button:
TMouseButton;
Shift: TShiftState; X,Y:
Integer);
begin
Image1.Top:=y-Round(Image1.Height/2);
Image1.Left:=x-Round(Image1.Width/2);
Image1.Visible:=True;
end;
Tastati F9 si executati aplicatia.La fiecare click de mouse se va
afisa
imaginea incarcata in Image1.Picture.
Pentru prezentarea imaginilor grafice se pot utiliza toate
nuantele
de culoare,sau se pot utiliza efecte de animatie,realizate prin
operatii
succesive cu interval de executie foarte scurt.O aplicatie de acest
gen
poate prezenta destul de spectaculos domeniul de reprezentare al unor
functii liniare,scheme de distributie a fortelor intr-un sistem
mecanic,
etapele de evolutie ale unui proces dinamic etc.
EXEMPLU: (vezi si Prj113)
Salvati o fila noua si proiectul in Prj113.Adaugati un buton si
urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
for x:=0 to 255 do
begin
Canvas.Pen.Color:=RGB(200,250,x);
Canvas.MoveTo(1,x);
Canvas.LineTo(800,x);
Canvas.Pen.Color:=RGB(x,200,200);
Canvas.MoveTo(x+x*2,x);
Canvas.LineTo(2*x,x);
Canvas.Pen.Color:=RGB(250,x,100);
Canvas.MoveTo(800-2*x,x);
Canvas.LineTo(1,255-x);
Sleep(20);
end;
Tastati F9 si executati aplicatia.Apasati butonul de mai multe ori.
Pentru a edita un text oarecare la pozitia indicatorului
mouse,puteti
utiliza evenimentul OnMouseDown si urmatoarea procedura:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TmouseButton;
Shift: TShiftState; X,Y: Integer);
begin
Canvas.Font.Color:=clBlue;
Canvas.Font.Size:=22;
Canvas.TextOut(x,y,'Text');
end; (vezi si
Prj114).
-118-
Pentru a realiza un efect de animatie,se poate utiliza si obiectul
spe-
cializat TShape.
EXEMPLU: (vezi si Prj115)
Salvati o fila noua si proiectul in Prj115.Adaugati un obiect TShape.
Setati forma,dimensiunea,culorile,apoi adaugati un buton si
urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
for x:=1 to 250 do
begin
Shape1.Top:=x;
Shape1.Left:=x;
Shape1.Repaint;
Sleep(20);
end;
Imaginile realizate cu TShape se pot combina cu cele realizate
prin
Canvas,pentru a obtine diverse efecte grafice:
EXEMPLU: (vezi si Prj116)
Salvati o fila noua si proiectul in Prj16.Adaugati un obietc TShape
si
fixati pozitia (left=136 top=64),dimensiunile,culorile etc.Apoi
adaugati
un buton si urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Color:=clRed;
Canvas.Pen.Width:=7;
Canvas.Brush.Style:=bsClear;
Canvas.Rectangle(100,100,300,200);
end;
Daca se foloseste pentru Brush stilul bsClear,obiectul va fi
transparent.
Pentru a realiza diverse efecte grafice,in anumite situatii este
nece-
sar sa incarcati diferite file de tip BitMap sau .JPG in timpul
executiei.
Cea mai simpla modalitate este sa utilizati functia LoadFromFile:
EXEMPLU: (vezi si Prj117)
Salvati o fila noua si proiectul in Prj117.Adaugati un obiect TImage
si
un buton.Pentru buton atribuiti urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('desen117.bmp');
end;
Pentru ca sa nu aveti dificultati create de interpretarea caii de
acces
la fisier,cel mai simplu este daca fila .BMP care urmeaza sa fie
incarcata
este in acelasi director cu fila .EXE.In general,este bine ca filele
de
resurse sa fie cat mai usor accesibile(filele .JPG pot fi afisate cu
obiectul TJPEGImage,definit in unitatea jpeg).
Exista un numar foarte mare de procedee tehnice prin care se pot
obtine efecte vizuale extrem de complexe(efecte speciale).Pentru
scopuri
banale,este bine sa utilizati fie obiectul dedicat,fie solutia care
ocupa
cea mai putina memorie.Solutiile laborioase incarca procesorul si
unitatea
de memorie cu operatii inutile.Pentru programarea jocurilor exista
pro-
grame specializate (se poate utiliza si Delphi,cu rezultate foarte
bune).
-121- Analiza
datelor
Setarea parametrului Accept din OnDragOver este esentiala atunci
cand
aplicatia d-voastra contine un numar mare de obiecte si doriti sa
limitati
numarul de operatii "drag and drop" posibile (utilizatorul va
descoperii
intotdeauna operatia gresita sau cea care induce o eroare !).
Pentru a executa operatia propriu zisa de deplasare a obiectului
alegeti
evenimentul OnDragDrop si adaugati procedura:
procedure TForm1.FormDragDrop(Sender,Source: TObject;X,Y : Integer);
begin
if Source is TImage then
begin
TImage(Source).Left:=X;
TImage(Source).Top:=Y;
end;
end;
Observati ca procedura verifica daca sursa este corecta.
Tastati F9 si executati aplicatia.
Pentru a deplasa imaginea,mentineti tasta Ctrl apasata si trageti cu
butonul mouse apasat.Observati ca in interiorul imaginii cursorul are
un
aspect iar in exteriorul imaginii are alt aspect(puteti utiliza
DragCursor
pentru a schimba aspectul cursorului).Imaginea se va deplasa doar in
momentul in care eliberati butonul mouse.
Delphi 3 are un set destul de restrans de proceduri specializate
pentru
operatiile de "darg and drop".Programele mai noi au adaugat un set
intreg
de noi facilitati,care permit operatii extrem de complexe.De exemplu
se
poate realiza un program de analiza,in care puteti trage orice tip de
fila,pentru a obtine o analiza semantica completa.
ANALIZA DATELOR
Orice programator este confruntat si cu programe realizate de
confratii
sai.Ca rezultat,orice programator trabuie sa faca si munca de
analiza.
La volumul actual de informatii este imposibil ca programele sa fie
veri-
ficate linie cu linie si caracter cu caracter.Pentru a simplifica
munca
de verificare si depanare a programelor,exista programe specializate
care
citesc fiecare fila si analizeaza continutul token cu token (prin
token
se intelege fiecare element distinct din program).
Este bine sa aveti un numar cat mai mare de astfel de
programe,dar
este si mai bine sa stiti sa le programati.Nici un programator nu va
avea
incredere deplina decat in programele realizate de el.
Exista un numar foarte mare de modalitati de abordare a acestui
subiect
dar,in acest manual nu se vor prezenta decat cateva notiuni
elementare.
Spre deosebire de alte programe,Delphi este axat spre obiecte vizuale
si
programare structurata modular.Ambele caracteristici sunt extrem de
utile
pentru realizarea de programe de analiza.Astfel,in loc sa realizati
un
singur program "mamut" care sa tina cont de toate eventualitatile
posibile
este mult mai practic sa realizati module mici,care executa un numar
redus
de operatii,cu consum minim de memorie si cu risc minim de a genera
erori
suplimentare.Nu trebuie uitat ca programele de analiza si depanare
sunt
rulate de obicei in mediu de memorie defectiv sau "la limita".In
plus,
obiectele vizuale ofera o spatiere suplimentara a datelor,astfel
incat
sa limiteze la maximum memoria consumata pentru prelucrarea datelor
defec-
tive sau eronate.
-122-
Pentru a analiza o fila de cod,sau o fila de text puteti realiza un
modul de genul:
EXEMPLU: (vezi si Prj121)
Salvati o fila noua si proiectul in Prj121.Adaugati 2 campuri TMemo,2
obiecte TEdit,un buton si o serie de campuri TLabel pentru explicatii
sau
pentru afisarea rezultatelor.
Primul obiect TEdit va fi utilizat pentru a incarca fila analizata
(din
directorul curent) iar cel de al doilea obiect va fi utilizat pentru
a
specifica elementul de program cautat.
Atribuiti butonului urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var F1:TextFile;
sir1,sir2:array[0..256] of char;
a,b,c:variant;
begin
a:=0;b:=0;c:=0;
StrPCopy(sir2,Edit2.Text);
AssignFile(F1,Edit1.Text);
Reset(F1);
while not EOF(F1) do
begin
Readln(F1,sir1);
Memo1.Lines.Add(sir1);
if StrPos(sir1,'procedure')<> nil then a:=a+1;
if StrPos(sir1,'function')<> nil then b:=b+1;
if StrPos(sir1,sir2)<> nil then Memo2.Lines.Add(sir1);
c:=c+1;
end;
CloseFile(F1);
Label3.Caption:=b;
Label5.Caption:=a;
Label7.Caption:=c;
end;
Utilizati Label1,Label2,Label4,Label6 si Label8 pentru a afisa
explica-
tiile necesare astfel:
Label1.Caption='Numele Filei: '
Label2.Caption='Functii: '
Label4.Caption='Proceduri: '
Label6.Caption='Siruri analizate: '
Label8.Caption='Elementul cautat: '
Pentru a analiza fila de cod a proiectului curent introduceti numele
filei in Edit1.Text iar in Edit2.Text introduceti o serie oarecare de
caractere (diferita de '').
Tastati F9 si executati aplicatia.Proiectul va numara cate
functii,cate
proceduri si cate siruri contine fila specificata in Edit1 si va
afisa
in Memo2 elementul specificat in Edit2,ori de cate ori apare in
program.
Puteti adauga orice fila de tip .pas sau .text (puteti verifica si
filele
rulada1 sau recover.pas din directorul Prj121) in directorul
curent,apoi
introduceti numele filei in Edit1 (in timpul executiei).
Un program de analiza este cu atat mai valoros cu cat este mai
simplu
si mai exact(orice eroare de interpretare generaza ore de munca
inutila).
-123-
Concluzii
Acest manual contine un set de exercitii elementare,prin care
puteti
lua contact cu principalele facilitati oferite de mediul de
programare
Delphi.Manualul nu epuizeaza resursele programului,ci va faciliteaza
doar
studiul altor carti sau articole de specialitate,care presupun ca
notiu-
nile din acest manual sunt deja insusite.In manualul Help,in
capitolul
VCL Object and Component Reference gasiti lista completa (alfabetica)
a
tuturor obiectelor,functiilor,constantelor si variabilelor din
program.
Prezentarea exhaustiva a acestor componente nu-si are
rostul.Majoritatea
sunt parti componente ale obiectelor descrise,sau pot fi apelate si
explo-
atate la fel ca si cele vizuale (care au fost prezentate in manual).
Daca nu va satisface nici unul dintre componentele
existente,puteti
edita componente noi (mai ales pentru operatii prestabilite cu
aplicatie
intr-un domeniu restrans).Cea mai simpla metoda este sa modificati
unul
dintre obiectele existente prin adaugarea unor proprietati si metode
noi.
Daca obiectul este valoros si va fi utilizat frecvent,puteti adauga
in
lista de componente si obiectul nou editat.Deasemenea,puteti descarca
din
reteaua Internet obiectele Delphi de care credeti ca aveti
nevoie.Daca
doriti sa dezvoltati obiecte noi,care urmeaza sa fie utilizate si de
alte
persoane,trebuie sa respectati toate conventiile de denumire si toate
standardele in vigoare pentru Object Pascal,Delphi,Win32,Internet
etc.
Sursele de documentare referitoare la programul Delphi sunt
extrem de
bogate si de diverse.O arhiva destul de completa (30.000 de articole)
se
gaseste pe site-ul de internet www.3k Delphi Tips.
Delphi este un mediu de programare extrem de
maleabil,adictiv.Puteti
utiliza acest mediu impreuna cu datele si programele dezvoltate
anterior
in Pascal,C++,Assembler,Fox si VisualFox etc.Este preferabil totusi
sa
utilizati acest mediu de programare pentru a dezvolta aplicatii
modulare,
in care conceptul de baza este fundamentat pe obiecte care
interactioneaza
intre ele.Puteti integra programele dezvoltate anterior intr-un
obiect
distinct,astfel incat sa fie extrem de usor de utilizat si de catre
alte
persoane.
Delphi exploateaza rapid si simplu,aproape toate tipurile de baze
de
date si poate fi utilizat in aplicatii de calcul tabelar (inclusiv cu
file de tip Excel).
Delphi este un mediu ideal pentru dezvoltarea de bibiloteci de
functii,
de unitati sau biblioteci cu alocare dinamica (DLL).In cazul in care
dezvoltati biblioteci DLL,trebuie sa acordati o atentie maxima
modului in
care sunt emise si respectiv utilizate mesajele Windows,astfel incat
sa
nu existe interferente intre obiectele care exploateaza acelasi mesaj
(exista riscul ca mesajul exploatat de obiectul d-voastra sa fie
concurat
de un alt obiect care raspunde la acelasi mesaj,iar programul va
stagna).
Pentru a evita acest fenomen,puteti utiliza un tampon de memorie
inclus in
obiect,care pastreaza temporar toate mesajele receptionate.
Pentru dezvoltarea de programe cu linie de executie multifilara
sunt
necesare notiuni de programare mai avansate.Fiacare linie de
execuutie
(thread) trebuie sa fie ordonata intern prin functii declarate
"private",
astfel incat sa nu interfereze cu celelalte linii de executie
(Exemplu:
daca exploateaza acelasi mesaj,va trebui realizata cate o copie
pentru
fiecare linie de executie).
Daca doriti mai multe informatii,Internet-ul va sta la
dispozitie!
- S F A R S I T -