Sunteți pe pagina 1din 192

************************

* Borland Delphi 3 *
* ABC-doar *
************************

*********************************
* autor RUSU MIRCEA AUREL VALER *
*********************************

**************************************************
* MOTTO: *
* "Les bons comptes font les bon amis." *
* *
**************************************************

Doriti un program care scrie singur coduri,uneori chiar file


intregi.Va plac modulele,unitatile,bibliotecile DLL,bazele de
date,aplicatiile grafice,aplicatiile multimedia si Web,doriti
sa utilizati obiecte grafice pentru programarea modulara...?
Daca da...Delphi este programul de care aveti nevoie.
C O N T I N U T

Prezentare generala . . . . . . . . . . . . . . . . 1

Componente Standard . . . . . . . . . . . . . . . . 6

Componente Additional . . . . . . . . . . . . . . 14

Componente Win 32 . . . . . . . . . . . . . . . . 21

Componente System . . . . . . . . . . . . . . . . 31

Componente Internet . . . . . . . . . . . . . . . 33

Limbajul HTML (notiuni elementare) . . . . . . . . 45

Limbajul SQL (rezumat) . . . . . . . . . . . . . . 55

Componente Data Acces . . . . . . . . . . . . . . 67

Componente Data Controls . . . . . . . . . . . . . 78

Componente Decision Cube . . . . . . . . . . . . . 92

Componente Dialogs . . . . . . . . . . . . . . . . 97

Componente Win 3.1 . . . . . . . . . . . . . . . 103

Componente Samples . . . . . . . . . . . . . . . 105

Componente Active X . . . . . . . . . . . . . . . 109

Assembler in Delphi . . . . . . . . . . . . . . . 113

Grafica . . . . . . . . . . . . . . . . . . . . . 116

Drag and Drop . . . . . . . . . . . . . . . . . . 119

Analiza datelor . . . . . . . . . . . . . . . . . 121

Concluzii . . . . . . . . . . . . . . . . . . . . 123
PREZENTARE GENERALA

Programul Delphi este un mediu complex de programare bazat pe


limbajul
Pascal cu obiecte.A fost dezvoltat de catre compania Borland cu
scopul de
a asigura o platforma comoda pentru schimbul de date
formatate.Initiatorul
acestui proiect a fost Andres Heilsberg,care a schitat o interfata
grafica
pentru compilarea si manevrarea comoda a unitatilor si obiectelor
scrise
in limbaj Turbo Pascal.Versiunea initiala a fost comercializata in
1995,
pe un suport de 16 biti compatibil cu sistemul de operare Windows
3.1.
Numele a fost ales de catre Danny Thorpe,prin referire la
oracolul
din Delphi,pentru a atrage atentia asupra faptului ca platforma
accepta
si bazele de date ale programului Oracle.Delphi a fost conceput
tocmai
pentru a permite schimbul usor de date,iar in acel moment,cel mai
agreat
program pentru baze de date formatate purta numele de
"Oracle".Asadar,
...daca doresti sa te adresezi in "Oracle"...trebuie sa mergi la
"Delphi".
Denumirea a facut epoca si a fost pastrata si pentru produsele
urmatoare.
In anul 1996,a aparut Delphi 2,care a fost dezvoltat pe o
platforma
de 32 de biti,pentru a fi perfect compatibil cu Windows 95,proaspat
lansat
pe piata.Cea mai semnificativa dezvoltare o introduce Delphi 3,lansat
in
1997 care adauga printre altele unelte de dezvoltare a bibliotecilor
DLL
si a aplicatiilor Web(pentru Internet).Au urmat apoi Delphi 4 (1998),
Delphi 5 (1999),Delphi 6 (2000),Delphi 7 (2001),Delphi 8,Delphi 2005,
Delphi 2006 si programul este inca in continua dezvoltare.Ultimele
moder-
nizari asigura compatibilitatea cu sistemul Linux,compatibilitatea cu
C#
si cu platforma Microsoft Net,etc.
Delphi nu este un limbaj distinct.Utilizeaza limbajul Pascal
Windows,
dar este compatibil si cu modulele scrise in C++ (tinand cont de
conven-
tiile de apel specifice).Spre deosebire de Pascal,Delphi introduce un
set nou de unitati,un numar extins de functii si formate,dar mai ales
introduce o interfata grafica si faciliteaza programarea modulara cu
obiecte de tip Windows predefinite.Mai mult decat atat,programul
scrie
singur codurile necesare pentru implementarea fiecarui obiect,astfel
incat programatorul nu trebuie sa mai fie atent la detalii ci doar la
structura de ansamblu si la procedurile asociate fiecarui obiect.
In rezumat,Delphi prezinta urmatoarele avantaje:
-aplicatiile pot fi realizate foarte rapid (contine unelte de
programare)
-programul este vizual (ca Visual Basic) si are puterea de calcul
egala
cu cea a limbajului C++ (numere pana la 10 la puterea
4000)
-permite dezvoltarea de aplicatii Web (Internet)
-permite compilarea unui executabil unic
-contine un numar mare de obiecte predefinite,usor de implementat
-permite editarea de coduri in limbaj de asamblare
-acelasi cod editat in Delphi,poate fi compilat pe platforme diferite
-exista o buna compatibilitate intre diferitele versiuni
-permite atat programarea inalt structurata in module,cat si
programarea
la nivel inferior (inclusiv in assembler)
Principalele dezavantaje sunt:
-nu poate fi accesat simultan de pe platforme diferite
-exista relativ putina bibliografie (comparativ cu C++)
-filele executabile sunt relativ mari,raportat la filele si unitatile
sursa (Exemplu: o fereastra cu un buton ocupa 183 Kb)

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

-6- Standard - TEDIT si


TLABEL
COMPONENTE (obiecte predefinite)

Programul Delphi este structurat in jurul obiectelor


predefinite,care
constitue modulele de baza utilizate pentru formarea programelor si
apli-
catiilor.Un program se construieste asemanator unui joc de puzzle,in
care fiecare componenta trebuie sa poata interactiona eficient cu
cele-
lalte.Orice unitate noua,sau biblioteca DLL,trebuie astfel proiectata
incat sa poata fi combinata eficient cu cele
preexistente.Astfel,Delphi
va fi in continua crestere si dezvoltare,acoperind treptat toate
necesi-
tatile de programare.Pentru a facilita munca cu acest program,in
capitolul
acesta vor fi prezentate cateva exercitii simple de asamblare a
acestor
componente,precum si modul de interactiune dintre ele.Utilitarul
Help,in
capitolul "Getting Started" contine un tutorial foarte facil denumit:
"First application-a brief tutorial",care prezinta modul de
constructie
pentru o aplicatie care exploateaza o baza de date.
Pentru inceput,vom realiza un program mai mic,in care vom utiliza
o caseta de editare TEdit,un buton si trei campuri de editare TLabel.
Din meniul File deschideti o noua fila TForm.Salvati fila intr-un
director
nou,de exemplu Prj2 si apoi salvati proiectul cu un nume nou
(Proiect2).
In Object Inspector selectati Name si schimbati Form1 cu Form2.
Apoi efectuati un click de mouse pe simbolul grafic al obiectului
TEdit
(in meniu sub Win32) si apoi un clcik de mouse in fereastra Form2.In
continuare,selectati cu mouse simbolul grafic al etichetelor TLabel
(un
A situat tot sub Win32) si apoi amplasati in fereastra Form2 cele
trei
etichete.In final adaugati in fereatra si un buton OK.Acum fereatra
contine cinci obiecte.Amplasati prima eticheta langa caseta de
editare
si modificati textul afisat pe buton,selectand din Object Inspector
proprietatea Caption,astfel incat eticheta sa contina textul:
"Introduceti
datele: ".Apoi efectuati un click pe eticheta a doua si modificati
textul
astfel incat sa contina: "Afisarea datelor: ".In final,efectuati un
click
pe eticheta a treia(Label3) si stergeti complet textul din
Caption,dar
introduceti un numar oarecare de spatii goale.Pentru ca obiectul sa
fie
activ,selectati cu mouse butonul OK,schimbati textul din Caption in:
"AFISARE" apoi selectati Events si efectuati un dublu click.Delphi va
scrie automat procedura pentru buton,pe care o definitivati astfel:
procedure TForm2.Button1Click(Sender: TObject);
var text1:variant;
begin
text1:=Edit1.text;
Label3.Caption:=text1;
end.
Optional,puteti adauga si un buton de EXIT,la fel ca in exercitiul
pre-
cedent.Compilati,construiti proiectul cu Build All si apoi executati
cu
Run.Daca toate operatiile au fost corecte,in fereastra intitulata
Form2
va aparea o casta de editare si un buton pe care scrie
AFISARE.Introduceti
un text oarecare si apoi apasati butonul.Textul trebuie sa apara in
eticheta notata cu Label3(la nevoie-vezi exemplul din Prj2).
In caz ca nu schimbati numele ferestrei din Form1 in Form2,riscati
ca Delphi sa confunde aplicatia cu fereastra Form1(care este
rezidenta in
memoria de oparare).Este bine sa alegeti nume cat mai discriminative.
Proiectul poate fi compilat si construit si apasand tasta F9.

-7- Standard - TPANEL si


TTABLE
Pentru a face economie de spatiu,nu voi transcrie textul fiecarui
exemplu prezentat.Manualul va fi insotit de un director,care va
contine
toate exemplele prezentate.In caz ca exista nelamuriri,consultati
fila
Unit.pas corespunzatoare (exercitiile vor fi denumite la fel ca in
manual)
Un alt exercitiu simplu,permite formarea unei aplicatii care
citeste
sau scrie date intr-o baza de date.
Deschideti o noua fereastra Form.Salvati fereastra intr-un
director nou
(Prj3),apoi salvati proiectul cu numele de Proiect3.Selectati un
obiect
de tip TPanel (ultimul din seria de obiecte standard).In Object
Inspector
selectati Align si alegeti in loc de alNone optiunea alTop.Apoi
extindeti
suprafata selectand Height si inlocuind valoarea cu 200.
In continuare,efectuati un click pe Data Access si alegeti dintre
obiectele afisate pe primul si efectuati un click in coltul din
dreapta
jos a ferestrei.Apoi alegeti cel de la doilea obiect si efectuati un
click in fereastra,langa obiectul precedent.Fereatra va contine acum
sub TPanel,un obiect TDataSource si un obiect TTable.
In final,executati un click pe Data Controls si alegeti cu un click
mouse primul obiect din noua serie afisata (TDBGrid).Amplasati(click)
noul
obiect in interiorul ariei Panel1(in coltul din stanga sus) si
ajustati
suprafata astfel incat sa ocupe aproape intreaga arie Panel1.Apoi
alegeti
cel de al doilea obiect(TDBNavigator)cu un click,apoi efectuati un
click
in fereastra sub aria Panel1.
Acum,fereastra contine toate obiectele necesare.Pentru a fi
operative,
proprietatile obiectelor trebuiesc reconfigurate astfel:
-selectati cu mouse TDBGrid si alegeti din Object Inspector
proprietatea
Data Source.Efectuati un click in caseta goala si alegeti apoi
optiunea
DataSource1(apasati butonul de navigare)
-selectati cu mouse obiectul TDBNavigator si efectuati aceeasi
operatie
(setati Data Source la DataSource1)
-selectati cu mouse obiectul DataSource1 si setati campul DataSet la
valoarea Table1 (utilizati butonul de navigare)
-in final,selectati cu mouse obiectul TTable si efectuati urmatoarele
operatii: in Object Inspector alegeti DatabaseName si selectati
dintre
optiunile afisate DBDEMOS,apoi alegeti TableName si selectati dintre
optiunile afisate EMPLOYEE.DB.In final reveniti la prima proprietate
a
obiectului denumita Active si selectati optiunea True (in loc de
False).
Daca totul este corect,campul DBGrid se va umple de date,afisate sub
forma de tabel.Daca doriti sa schimbati baza de date,modificati
Active
astfel incat sa redevina False,apoi alegeti in TableName un alt tabel
din
baza de date DBDEMOS si in final resetati Active la valoarea True (nu
se
poate schimba un tabel atat timp cat o baza de date este activa).
In final tastati F9 sau compilati si apoi construiti cu Build All.
Aplicatia poate fi lansata cu Run.Puteti sa utilizati butoanele din
bara de butoane oferita de TDBNavigator pentru a va deplasa in tabel,
pentru a include sau exclude date sau pentru salturi la extremitatile
tabelului si pentru revenire la pozitia anterioara.
O aplicatie de acest gen se poate utiliza pentru a lucra cu baze
de
date de tip Paradox,dBASE,Access,FoxPro,SQL,InterBae,Sysbase sau
SQLServer
In continuare,puteti sa configurati dupa bunul plac
dimensiunile,culorile,
fonturile,pozitia obiectelor etc. astfel incat sa va atraga atentia
asupra elementelor pe care le considerati foarte importante.

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

-9- Standard - TMEMO si


TLISTBOX
Un alt obiect predefinit este TMemo,asemanator cu TEdit.TMemo
permite
introducerea si/sau selectarea unui numar mai mare de randuri de tip
text.
Se utilizeaza pentru introducerea unor informatii mai
ample.Principalele
proprietati si metode sunt mostenite de la ancestorii
sai:TCustomMemo,
TCustomEdit,TWinControl,TControl si TComponent.
Pentru a utiliza un astfel de control,deschideti si salvati o fila
noua (in Prj6) si apoi salvati proiectul.Tastati F9 pentru a activa
fila.
Apoi inchideti fereatra,selectati TMemo si efectuati un click in
Form,
acolo unde doriti sa amplasati campul de editare.In Object Inspector
puteti redimensiona controlul din campurile Height (150) si Width
(300).
Adaugati un obiect TLabel in care scrieti textul: "Introduceti
datele: ",
si un buton OK (TButton).In Caption din Object Inspector scrieti pe
buton "STERGE" si apoi in Events efectuati un dublu click in caseta
OnClick.Definiti procedura TForm1.Button1Click astfel:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
end;
Apoi tastati F9.In caseta de editare puteti introduce texte
intregi,iar
butonul poate fi utilizat pentru a sterge textele.
Un obiect asemanator este TListBox.Se poate utiliza pentru a afisa
o
lista de denumiri,dintre care se poate selecta una singura (De
exemplu
pentru a selecta un nume dintr-o lista de persoane).
Un exercitiu simplu este urmatorul.Salvati o fila noua si proiectul
in
directorul Prj7.Tastati F9 si apoi inchideti fereastra
activa.Selectati
TListBox(sub DataAccess) si efectuati un click in Form.Redimensionati
obiectul cu Height si Width din Object Inspector.Apoi selectati un
obiect TEdit si executati un click in Form.Amplasati TEdit in pozitia
dorita,apoi adaugati un obiect TLabel cu textul explicativ:
"Introduceti
un text: ".Adaugati un buton si scrieti pe buton "OK".Click in Events
din
Object Inspector,apoi definiti procedura TForm1.Button1Click astfel:
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add(Edit1.Text);
end;
Tastati F9.
Acum puteti utiliza TEdit,pentru a introduce o lista de date in
TListBox.
Eventual puteti adauga un buton care sa stearga automat textul din
TEdit,
si/sau un buton care sa stearga automat textul din TListBox.
Observati ca pentru a adauga date in lista nu am utilizat o metoda
ci
o proprietate a obiectului.Explorati restul de proprietati pentru a
personaliza obiectul dupa bunul plac.
De exemplu,proprietatea Style determina daca elementele din lista
pot
fi de inaltimi diferite,sau daca vor fi afisate cu inaltime fixa.Cele
trei
variante posibile sunt:
lbStandard -toate elementele sunt siruri cu aceeasi inaltime
lbOwnerDrawFixed -fiecare element are inaltimea specificata in
Height
lbOwnerDrawVariable -elementele pot avea inaltimi diferite
In mod similar,proprietatea Sorted determina daca elementele din
lista
vor fi sau nu vor fi sortate alfabetic.
Incercati sa preluati date dintr-un obiect ListBox1 in obiectul
ListBox2.

-10- Standard - TCOMBOBOX


Urmatorul obiect predefinit din grupul Standard este
TComboBox,care
combina un obiect de tip TEdit cu un obiect de tip TListBox.Un astfel
de
obiect are o componenta de editare si o lista cu butoane de navigare
si
permite selectarea unui anumit obiect din lista.Se utilizeaza pentru
diverse operatii asupra unor grupuri de date.Un exemplu simplu de
utili-
zare este urmatorul (Prj8).
Adaugati in Form1 un obiect de tip TComboBox,un obiect de tip
TListBox
si doua butoane TButton.In Object Inspector stergeti campul Text din
ComboBox1,apoi adaugati lista de elemente.EXEMPLU: puteti utiliza
primul
buton,in felul urmator: selectati butonul,redenumiti butonul in
Caption,
apoi efectuati un dublu click in OnClick din Events.Redefiniti
procedura
TForm1.Button1Click astfel:
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Items.Add('Mere');
ComboBox1.Items.Add('Pere');
ComboBox1.Items.Add('Struguri');
ComboBox1.Items.Add('Prune');
end;
Tastati F9.In fereastra obtinuta,dupa ce apasati butonul OK,in caseta
de dialog de tip ComboBox selectati butonul de navigare si trebuie sa
regasiti lista elementelor introduse (mere,pere,struguri,prune).
Observati ca elementele din lista se pot introduce tot cu Items,la
care
se adauga una dintre metodele obiectului TStrings (proprietatea Items
accepta ca valoare un obiect de tip TStrings si implicit si toate
meto-
dele si proprietatile obiectului TStrings).In loc de Add se poate
utiliza
Append,sau Insert...etc.
Din lista afisata,puteti selecta si prelua unul dintre
elemente.Pentru
a selecta un anumit element si pentru a copia acest element in lista
din TListBox,puteti proceda in felul urmator:
Selectati cel de al doilea buton.Scrieti pe buton textul
"SELECTEAZA"
(in Caption),apoi selectati Events si efectuati un dublu click in On
Click
dupa care redefiniti procedura TForm1.Button2Click astfel:
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Items.Add(ComboBox1.Text);
end.
Tastati F9.Acum,ambele butoane sunt functionale.Apasati primul buton
si
apoi alegeti din lista unul dintre elemente (de exemplu
struguri).Apoi
apasati butonul SELECTEAZA.Elementul selectat in TComboBox va fi
afisat
in TListBox.In continuare puteti selecta un nou element.
Daca doriti sa salvati aplicatia,salvati fila cu Save as...in
directo-
rul Prj8(nou creat) si apoi salvati in acelasi director si
proiectul,cu
Save Project as...
Este foarte importatnt sa salvati si proiectul,deoarece contine
file
indispensabile pentru executie (de exemplu fila in care sunt salvate
pro-
prietatile obiectului).Daca uitati sa salvati proiectul si salvati
doar
fila,aplicatia va fi nefunctionala si nici nu va putea fi completata
prin
compilare (intregul proiect va trebui reluat complet).
Fila si proiectul se pot salva la inceputul proiectului,pentru a
evita
o eventuala intrerupere prin care puteti pierde toata munca
efectuata.

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

-13- Standard - TPANEL si


TDBIMAGE
Pentru ca doua sau mai multe butoane sa poata fi selectate si
simultan,
utilizati doua sau mai multe obiecte TRadioGroup,astfel incat
butoanele
care trebuie sa fie selectate simultan sa fie amplasate in casete
diferite
In acest mod se poate proiecta orice combinatie posibila.

TPanel este un obiect utilizat pentru a grupa un numar oarecare de


obiecte.TPanel asigura nu numai un cadru in care pot fi amplasate
aceste
controale ci si un numar de proprietati si metode care vor fi
mostenite
de catre toate obiectele pe care le contine.Pentru a prelua datele de
tip text dintr-o baza de date am prezentat deja un exemplu simplu
(Prj3).
In mod similar,se pot prelua si afisa date de tip Bitmap. EXEMPLU:
Salvati o fila si proiectul (in Prj11).
Amplasati in Form un obiect TPanel si ajustati dimensiunile.Apoi
alegeti
din meniul principal DataAccess si adaugati in Form un obiect
TDataSource
si un obiect TTable.Din meniul principal alegeti Data Controls si
selec-
tati un obiect de tip TDBIImage,apoi efectuati un click in
TPanel.Ajus-
tati dimensiunile obiectului TDBIImage.In Continuare selectati un
obiect de tip TDBNavigator si amplasati acest obiect in Form,undeva
sub
TPanel.Acum obiectul final este gata.Pentru a fi
functional,trebuiesc
facute legaturile dintre obiecte.Selectati DataSource1 si setati
campul
DataSet la valoarea Table1.Selectati obiectul TTable(Table1) si apoi
alegeti in DatabaseName DBDEMOS,in TableName EVENTS si apoi setati
campul
Active la valoarea True.Selectati butonul de navigare si setati
campul
DataSource la valoarea DataSource1.In final,selectati DBImage si
setati
campul DataSource la DataSource1 si respectiv DataField la
Event_Photo.
In mod normal,va aparea o imagine digitala in obiectul DBImage.
Tastati F4 si utilizati butonul de navigare pentru a afisa pe rand
toate fotografiile din baza de date.Exemplul utilizeaza o baza de
date
de tip BitMap preexistenta.Puteti utiliza acest tip de aplicatie si
pentru a naviga printre desene sau fotografii efectuate de d-voastra
si
salvate sub forma de baza de date.
Observati in acest exemplu modul in care cinci obiecte
predefinite
coopereaza pentru a executa o sarcina simpla.Legatura dintre obiecte
o realizeaza obiectul DataSource,accesul la baza de date se face
prin
TTable,navigarea in baza de date se face cu TDBNavigator iar
imaginile
sunt afisate intr-un obiect de tip TDBImage care este gazduit de un
obiect de tip TPanel.
Observati ca intreaga aplicatie s-a realizat cu cateva click-uri
de
mouse,fara sa fie nevoie sa scrieti nici o singura linie de cod.In
cazul
in care programul ar fi fost editat in maniera clasica,de exemplu in
Pascal,ar fi trebuit sa programati proceduri destul de complexe
pentru
a realiza legaturile corecte dintre obiecte.Astfel fiecare
obiect,pentru
fiecare operatie efectuata transmite un mesaj de tip Windows,care
poate
fi receptionat de catre celelalte obiecte.Alegerea mesajului
potrivit si
mai ales modul de interpretare a mesajului poate fi insa uneori
destul
de greu de implementat.Delphi executa automat toate aceste
operatii.Nu
este necesar sa stiti ce mesaje si cum anume se folosesc.Pentru a
depana
o astfel de aplicatie,este bine sa salvati intotdeauna o copie de
sigu-
ranta a formei originale.De cele mai multe ori,acest gen de
aplicatii
se pot corupe din cauza navigarii excesive prin diferite baze de
date
cu formate diferite.

-14- Additional - TBITBTN si


TSPEEDBUTTON
In primele exemple am prezentat obiectele predefinite
(componentele)
din grupul de componente denumit Standard.Aceste componente sunt cele
mai
frecvent utilizate si sunt afisate implicit in meniul
principal.Restul
grupurilor de componente,sunt utilizate relativ mai putin
frecvent,dar
sunt cel putin la fel de utile.Pentru a pastra caracterul de
abecedar,
acest manual va prezenta doar exemple simpliste de implementare a
lor,
fara a avea pretentia de a epuiza subiectul.Cei care doresc mai mult
decat
atat,vor depune un mic efort individual,pentru a studia in amanunt
pro-
prietatile si metodele fiecarui obiect,precum si modalitatile de
combi-
nare a componentelor pentru a obtine rezultate maxime.Numarul acestor
combinatii posibile este practic nelimitat.
Al doilea grup de componente,poarta numele Additional si contine o
serie de obiecte asemanatoare cu cele din grupa Standard,dar cu
proprie-
tati si metode noi,sau cu acces la un alt tip de date.
Primul obiect din seria Additional este TBitBtn.Este identic cu
buto-
nele de tip TButton,dar poate include si o imagine de tip BitMap pe
suprafata sa.Imaginile de tip BitMap,se bucura de o serie intreaga de
proprietati aditionale prin care se specifica modul de afisare pe
buton.
Puteti utiliza o imagine realizata de d-voastra sau puteti beneficia
de
un grup de butoane predefinite pentru Ok,Cancel,Help,All,Refresh etc.
Pentru a selecta un astfel de buton,alegeti Kind din Object
Inspector.
EXEMPLU:
Salvati o fila noua si proiectul in Prj12.Selectati si amplasati
in
Form trei butoane de tip TBitBtn.Apoi selectati pe rand fiecare buton
si
alegeti din Kind cate un tip de buton: bkClose,bkHelp si bkOK.
Tastati F9 si executati aplicatia.Observati ca butonul Close este
deja functional,fara sa mai fie nevoie sa scrieti procedura de Click.
Fiecare buton are si o mica imagine grafica prin care sugereaza
operatia
pe care o executa.Daca doriti sa inlocuiti aceasta imagine cu una
reali-
zata de d-voastra,utilizati Glyph (din Object Inspector).
Urmatorul buton din serie este TSpeedButton.Este un buton utilizat
pentru a executa comenzi sau pentru setarea unor proprietati ale
obiecte-
lor.Pentru a specifica actiunea butonului se poate utiliza un text
scris
in Caption sau o imagine grafica inclusa in Glyph.Acest tip de buton
are
cateva proprietati in plus.Astfel,poate fi utilizat pentru a adauga
sau
a sterge un buton din aplicatie,sau poate afisa o imagine grafica
diferita
pentru fiecare stare a butonului (apasat,neapasat,dezactivat etc.).
In plus,butoanele de tip TSpeedButton pot actiona in grup si pot fi
grupate sub forma de paleta de butoane (Taskbar sau Toolbar).Pentru a
grupa mai multe butoane se poate utiliza unul dintre obiectele
descrise
anterior TPanel sau TGroupBox.
EXEMPLU:
Salvati o fila noua si proiectul in Prj13.Apoi adaugati in Form
patru butoane de tip TSpeedButton.Scrieti pe fiecare buton un text
sau
un numar ,de exemplu 1,2,3 si 4 (in Caption).Apoi selecati primul
buton
si executati un dublu click in OnClick din Events.Redefiniti
procedura:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
SpeedButton4.Hide;
end;
La apasarea acestui buton,butonul 4 va fi ascuns automat.

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

Urmatorul component din seria Additional este TMaskEdit.Este


asemanator
cu TEdit,dar utilizeaza un sablon predefinit in care datele pot fi
intro-
duse doar intr-un anumit format.Daca se renunta la acest
sablon,accepta
orice fel de date la fel ca si TEdit.Este foarte util atunci cand
doriti
ca un anumit tip de informatie sa fie introdusa intr-un anumit
format:
Exemplu: o data calendaristica,ora curenta,numarul de telefon,un cod
special de identificare sau de acces etc.
EXEMPLU:
Salvati o fila noua si proiectul in Prj14.Selectati si adaugati in
Form doua obiecte de tip TMaskEdit.Deasupra celor doua componente de
tip
TMaskEdit introduceti doua obiecte de tip TLabel in care scrieti
textele:
"Introduceti data: " si respectiv "Introduceti ora: ".
Apoi selectati primul obiect TMaskEdit si alegeti din Object
Inspector
EditMask.In caseta de dialog afisata puteti introduce codul prin care
specificati sablonul dorit (vezi proprietatea EditMask din Help).Daca
va multumiti cu formatul standard pentru data,alegeti Date si apoi
con-
firmati cu OK.
Selectati cel de al doilea obiect si alegeti din Editmask Short
Time
sau LongTime,apoi confirmati cu OK.
Tastati F9 si executati aplicatia.Observati ca in casetele de
editare
apare un sablon care nu permite decat un anumit format al datelor.
Pentru a intelege si/sau edita definitia sablonului utilizati
tabelul
din Help,de la proprietatea MaskEdit.
Daca utilizati un format mai special,este bine sa afisati cu
TLabel
si un text in care sa explicati ce anume trebuie introdus si cum (cu
exceptia cazurilor in care sunteti singurul utilizator al
aplicatiei).
Acest component se poate utiliza si pentru a solicita o parola,dar
principala sa utilizare este aceea de a forma baze de date
preformatate;
de exemplu formulare tipizate,carte de telefoane,adrese,tabele etc.

-16- Additional - TSTRINGGRID-


TDRAWGRID
Urmatorul component din grupul Additional este TStringGrid.Acest
obiect
este destinat pentru a simplifica operatiile cu date in format
tabelar.
Contine o grila configurabila formata din siruri de caractere dispuse
in
linii si coloane.Acest obiect realizeaza baze de date asemenatoare cu
cele din programul EXCEL.Fiecare element din grila poarta numele de
Cell
(celula) si beneficiaza de o serie de proprietati si metode
specializate
pentru operatii cu si asupra datelor.In plus,TStringGrid permite si
aso-
cierea unui obiect pentru fiecare element din grila.
Elementele bazei de date pot fi editate si cu ajutorul unui obiect
de
tip TMaskEdit,astfel incat fiecare element din grila sa respecte un
anu-
mit format (cel prestabilit prin sablonul din TMaskEdit).
EXEMPLU:
Salvati o fila noua si proiectul,in Prj15.Selectati din grupul
Additio-
nal un obiect de tip TStringGrid si apoi efectuati un click de mouse
in
Form.Daca doriti puteti utiliza proprietatile din Object Inspector
pentru
a reconfigura dimensiunile,culorile,fonturile,numarul de linii si de
coloane,etc.Pentru a putea edita date in StringGrid,este necesar ca
proprietatea EditorMode sa fie setata True iar Options sa includa si
goEditing.Executati un dublu ckick pe +Options,apoi alegeti goEditing
si
setati valoarea True.Selectati Events si efectuati un dublu click in
On Click,apoi redefiniti procedura generata astfel:
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
StringGrid1.Cells[1,0]:='Numele:';
StringGrid1.Cells[2,0]:='Prenumele:';
StringGrid1.Cells[0,1]:='Nr.1';
StringGrid1.Cells[0,2]:='Nr.2';
StringGrid1.EditorMode:=True;
end;
Tastati F9 si executati aplicatia.Executati un click de mouse in
grila
si se vor afisa automat titlurile editate in celulele denumite
fixe.In
plus,puteti edita in celelalte celule orice fel de date doriti.
In continuare puteti sa setati culorile si dimensiunile
fonturilor,etc.
Nu ezitati sa experimentati toate proprietatile si metodele
obiectului,
astfel incat sa puteti configura datele la aspectul dorit.
Daca salvati datele intr-o fila,sub forma de baza de date,acestea
vor
putea fi preluate ulterior cu ajutorul unei aplicatii asemenatoare cu
cea din Prj3.
TDrawGrid este similar cu TStringGrid,dar este utilizat mai ales
pentru
a afisa sub forma de tabel,alt fel de date decat sirurile de
caractere.
Pentru texte se poate utiliza TStringGrid iar pentru date preluate
din
baze de date se va prefera TDBGrid.
Se utilizeaa pentru a ordona niste date arbitrare.Datele pot fi in
orice format(Exemple: Numere,coduri,numere de telefon,adrese etc.).
Proprietatile si metodele acestui obiect sunt specializate pentru a
configura aspectul grilei de prezentare.Se activeaza la fel ca si
YString-
Grid prin selectarea din Options a proprietatii go Edit,urmata de
setarea
EditorMode:=True (vezi exemplul precedent).
Mai mult,grila poate fi utilizata pentru a accepta obiecte de tip
TObject,care pot fi introduse la o anumita locatie cu DragDrop.Astfel
se pot deplasa structuri intregi de date.

-17- Additional - TSHAPE si


TIMAGE
Pentru a desena o imagine grafica oarecare intr-o fereastra se
poate
utiliza TShape.Acest obiect selecteaza automat contextul de
dispozitiv
grafic si creeaza automat pensula si penita grafica.Pentru a desena
un
obiect oarecare este suficient sa selectati dimensiunile si culorile
dorite.Pentru forma se poate alege un cerc,o elipsa,un patrat sau un
dreptunghi cu colturi rotunjite,etc.Functioneaza asemanator cu Paint
din
Windows,dar este putin mai rudimentar.
EXEMPLU:
Salvati o fila noua si proiectul in Prj16.Selectati Form1 si
setati
clWhite in Color.Apoi selectati si adaugati in fereastra un obiect de
tip TShape.Selectati obiectul si alegeti in Shape din Object
Inspector
stEllipse.Redimensionati obiectul din Height si Width (225/350),apoi
executati un dublu click pe +Brush si alegeti Color clLime.Pentru a
adauga un contur expresiv,executati un dublu click pe +Pen si apoi
selectati pentru penita culoarea clPurple si grosimea Width 10.
Tastati F9.In continuare,modificati culorile si aspectul dupa
bunul
plac.Eventual,adaugati mai multe obiecte de tip TShape si realizati
un
desen oarecare sau un grafic.Pentru a adauga valori numerice sau
texte
explicative puteti adauga si obiecte de tip TLabel.
Observati ca nu este necesar sa scrieti nici o singura linie de
cod.
Nu mai este necesar sa definiti si sa selectati contextul de
dispozitiv
grafic.Nu este necesar sa definiti penita si pensula.Delphi a
executat
singur toate aceste operatii.In plus,nu mai este necesr sa tineti
evi-
denta obiectelor create si sa eliberati apoi memoria (toate obiectele
necesare pentru afisarea imaginilor grafice vor fi eliberate automat
in
momentul in care se inchide fereastra.Asadar,programarea GDI este
mult
mai simpla in Delphi decat in Pascal Windows.
Obiectele TShape contin si o serie de rutine de tip Events,care
permit activarea unor proceduri la un click de mouse,la selectarea
sau
deplasarea obiectului etc.
Un alt component destinat pentru imaginile grafice este TImage.Se
poate utiliza pentru a afisa intr-o fereastra orice imagine grafica
(file
de tip bitmap,icon,metafile etc.).Pentru a selecta din memorie fila
care
contine imaginea grafica,sau fotografia digitala,se poate utiliza din
Object Inspector proprietatea Picture.
EXEMPLU:
Salvati o fila noua si proiectul in Prj17.Selectati si adaugati
in
Form un obiect de tip TImage.Alegeti din Object Inspector Picture si
executati un dublu click pe (None).Delphi va afisa un obiect de
selectare
denumit Picture Editor.Apasati butonul Load...si apoi navigati in
Look in
pana gasiti directorul Demos din Delphi3.Deschideti directorul si
alegeti
Data.In Data sunt arhivate cinci fotografii digitale denumite
Cus1...la
Cus5.Alegeti una dintre ele,apoi selectati Open,apoi OK.
Daca doriti,modificati culoarea si dimensiunea ferestrei
principale si
adaugati un text oarecare,editat intr-un obiect TLabel.
Tastati F9 si executati aplicatia.In mod similar,puteti realiza un
album cu fotografii de familie,un jurnal de calatorie,un text
stiintific
sau didactic insotit de imagini grafice si de fotografii etc.
Daca doriti ca imaginile afisate sa fie accesibile si pentru alte
con-
troale,puteti utiliza in loc de TImage,TImageList(din
Win32).Imaginile
pot fi deplasate dupa un algoritm oarecare (efecte de animatie).

-18- Additional -TBEVEL si TSCROLLBOX


TBevel este un component relativ simplu,utilizat pentru a
evidentia
alte componente gen casete de dialog,linii de text etc.
TBevel incadreaza obiectul respectiv si il afiseaza in relief,fie
prin
ingropare fie prin bombare spre exterior.Pentru a sublinia un anumit
obiect,se poate utiliza o linie simpla,un chenar sau o caseta in
relief.
Nu se utilizeaza izolat ci doar impreuna cu un alt obiect.Pentru
confi-
gurarea aspectului se pot utiliza proprietatile Shape si Style din
Object Inspector.
EXEMPLU:
Adaugati un obiect TBevel intr-o fila noua,apoi adaugati un buton in
interiorul acestui obiect.Ajustati dimensiunile si apoi tastati F9
pentru
a observa aspectul final.Modificati culorile,dimensiunile si stilul
sau
forma,pana cand obtineti aspectul dorit.TBevel nu are metode
speciale,ci
doar cele mostenite de la ancestorii sai.Asigura gruparea unor
obiecte,
sau evidentiaza un anumit component dintre celelalte componente.

TScrollBox este un obiect destinat pentru a realiza intr-o


fereastra
suprafete care pot fi deplasata cu ajutorul unor butoane de
navigare.Se
utilizeaza cel mai frecvent,atunci cand fereastra contine un grup mai
mare de componente si nu doriti ca butoanele de navigare sa deplasese
toate aceste componente.De exemplu,daca fereastra contine un meniu si
o bara de unelte (toolbar),se poate utiliza un obiect TScrollBox
inter-
calat intre aceste doua componente,astfel incat deplasarea in
interiorul
campului de date sa nu deplaseze si meniul si bara de unelte.O alta
utilizare pozibila este atunci cand doriti ca o fereastra sa contina
mai
multe campuri mobile care sa poata fi deplasate independent cu
ajutorul
unor butoane de navigare.Un obiect ScrollBox poate contine la randul
sau
alte obiecte incluse: butoane,casete de dialog etc.
EXEMPLU:
Salvati o fila noua si proiectul in Prj18.
Adaugati un obiect de tip TScrollBox si ajustati dimensiunile.In
Object
Inspector selectati AutoScroll si alegeti True.In acest fel,obiectul
se
va autoconfigura si va afisa automat barele de navigare,atunci cand
se
depaseste suprafata afisata.
Alegeti un buton TBitBtn si adaugati un buton de tip Close
(alegeti
bkClose din Kind).Trageti de buton in jos,pana cand depasiti marginea
inferioara si apar automat butoanele de nevigare sus/jos (trageti de
buton tinand apasat butonul mouse).Apoi in coltul din stanga
sus,adaugati
un obiect TLabel si scrieti textul Optiunea 1.In continuare,in coltul
din
dreapta sus,adaugati un alt obiect de tip TLabel si scrieti textul
Optiunea 2.Trageti de obiectul TLabel 2 pana cand depasiti marginea
din
dreapta si apar butoanele de navigare dreapta/stanga.Alegeti
culoarea,
dimensiunile si fonturile dorite.
Acum obiectul este finalizat.Tastati F9 si executati aplicatia.
Observati ca trebuie sa utilizati butoanele de navigare pentru a
putea
avea acces la toate componentele din campul de defilare ScrollBox.In
mod similar,se pot include butoane si controale,astfel incat sa nu
fie
vizibile decat dupa utilizarea butoanelor de navigare.Acest procedeu
este necesar atunci cand doriti sa includeti un numar mare de
componente
intr-o fereastra relativ mica,sau intr-un spatiu de interfata relativ
restrans.
-19- Additional
-TCHECKLISTBOX,TSPLITTER
TCheckListBox este similar cu TListBox dar fiecare element din
lista
are asociata si o caseta in care elementul respectiv poate fi
selectat
sau deselectat.Aceasta caseta are asociata proprietatea Checked cu
aju-
torul careia se poate determina daca un anumit element din lista este
sau nu este selectat in momentul respectiv.Pentru caseta de selectie,
se poate utiliza proprietatea State,care determina daca o caseta de
selectie este selectata sau nu.Cele doua proprietati ofera rezultate
similare,pentru fiecare element din Items.
Pentru a introduce elemente in lista,se poate utiliza Items si
apoi
toate metodele din TStrings,sau se poate utiliza direct proprietatea
Items din Object Inspector.
EXEMPLU:
Salvati o fila si proiectul in Prj19.
Selectati un obiect de tip TCheckListBox si adaugati obiectul in
Form.
Din Object Inspector alegeti Items si executati un dublu click pe
(TStrings).Delphi va afisa o fereastra de dialog denumita String list
editor in care puteti introduce elementele din lista.Exemplu:
Optiunea 1,
Optiunea 2,Optiunea 3 si Optiunea 4.Confirmati cu OK.
Tastati F9 si executati aplicatia.Observati ca puteti sa selectati in
casete o parte dintre elemente.Elementele raman selectate pana cand
sunt
deselectate cu un nou click de mouse.
Pentru a exploata o astfel de caseta ListBox,puteti incerca un
exercitiu
de genul:
Adaugati in Form si un obiect de tip TStaticText(urmatorul din
grup).
Redimensionati campul de editare astfel incat sa cuprinda un text mai
lung
apoi selectati din nou obiectul CheckListBox.Alegeti Events din
Object
Inspector si executati un dublu click pe On Click,apoi redefiniti
proce-
dura astfel:
procedure TForm1.CheckListBox1Click(Sender: TObject);
begin
if CheckListBox1.Checked[0]=True then
StaticText1.Caption:='Optiunea 1 este selectata !';
if CheckListBox1.Checked[0]=False then
StaticText1.Caption:='Optiunea 1 este deselectata !';
end;
Tastati F9 si apoi verificati exemplul selectand si deselectatnd
optiunea.
Daca doriti sa exploatati un alt eveniment,in loc de On Click
puteti
selecta evenimentul OnMouseMove.In acest caz,procedura va fi activata
in
momentul in care indicatorul mouse este plasat in aria in care se
gaseste
obiectul (fara click).
Acest tip de obiect se utilizeaza pentru personalizarea unor
optiuni,
sau pentru a selecta un grup mai mic de elemente din un grup mai
mare.
TStaticText este similar cu TLabel si se utilizeaza pentru a afisa
un
text oarecare in fereastra.Spre deosebire de TLabel,TStaticText este
derivat din TWinControl si are un cod handle propriu la fel ca orice
fe-
reastra,astfel incat poate interactiona direct cu tastatura (poate
avea
o tasta de accelerare).In plus detine si cateva proprietati
aditionale,
cum ar fi BorderStyle,HelpContext,TabOrder si TabStop.
Se utilizeaza pentru a afisa date de tip string (vezi exemplul de
mai
sus). Se va alege preferential fata de TLabel atunci cand obiectul
contine
o tasta de accelerare asociata unui control de tip
fereastra(Ex:Active X).

-20- Additional -TSPLITTER si TCHART


TSplitter este un obiect auxiliar care imparte fereastra in arii
re-
dimensionabile.Are un numar oarecare de proprietati si metode.Se
poate
utiliza cu succes pentru a alinia obiectele din fereastra,mai ales
atunci
cand obiectele respective pot sa-si schimbe dimensiunile in momentul
executiei(Exemple: casete ListBox,ComboBox,TStringGrid etc.).
Exemplu: Adaugati un obiect TSplitter intr-o fereastra Form.Apoi
adaugati
un obiect de tip TCheckListBox si deplasati acest obiect in
fereastra.
Observati ca in momentul in care se suprapune cu TSplitter,acesta se
va
retrage pana cand atinge dimensiunea minima specificata prin
MinSize.Se
poate utiliza aceasta proprietate pentru a proiecta spatiile dintre
obiecte astfel incat cele redimensionabile sa nu se suprapuna in
timpul
executiei peste cele fixe.In plus,indicatorul mouse va avea alt
aspect
in timpul executiei atunci cand este amplasat in aria
TSplitter.Pentru
a specifica aria TSplitter,utilizati Height si Width sau trageti cu
mouse
de patratelele pentru redimensionare.Pentru a vizualiza si mai clar
aria
acestui obiect,puteti utiliza Color,pentru a specifica o alta
culoare.

TChart este un obiect derivat din TPanel,specializat pentru a grupa


grafice si obiecte din biblioteca TeeChart (reprezentari grafice a
datelor
statistice).TChart mosteneste toate proprietatile si metodele
TPanel,la
care adauga o serie intreaga de proprietati specifice.Se utilizeaza
pentru
reprezentari grafice.
EXEMPLU:
Salvati o fila noua si proiectul in Prj20.Selectati si adaugati in
Form un obiect de tip TChart,apoi reajustati dimensiunile.
In meniul principal,utilizati sageata de navigare spre dreapta
pana
cand ajungeti la grupul de obiecte ActiveX.Selectati acest grup si
alegeti
un obiect de tip TVtChart.Adaugati acest obiect in TChart si ajustati
dimensiunile.Obiectul TVtChart contine un grafic tridimensiunal in
care
sunt reprezentate date pe 5 randuri si patru coloane.Pentru a schimba
modul de reprezentare grafica,executati un click de mouse cu butonul
drept
in aria TVtChart,apoi alegeti Wizard.Din caseta de dialog Chart
Wizard,
alegeti tipul dorit (de exemplu Pie) si apoi Finish.
Pentru a schimba valoarea datelor reprezentate,executati un click
de
mouse cu butonul drept,in aria TVtChart,apoi alegeti
EditChartData.Delphi
va afisa o caseta de dialog denumita Data Grid Editor in care este
inclusa
si o grila (tabel) in care sunt incluse valorile
reprezentate.Schimbati
dupa bunul plac numarul de randuri si de coloane (maxim 4 coloane) si
apoi introduceti in casetele respective valorile pe care doriti sa le
reprezentati grafic.Pentru a modifica aspectul reprezentarilor
grafice,
sau pentru a introduce un titlu,executati un click de mouse cu
butonul
drept si apoi alegeti Properties.
Dupa ce eputizati setarile obiectului TVtChart,executati un click
de
mouse cu butonul drept in aria obiectului TChart si alegeti Edit
Chart.
Delphi va afisa o caseta de dilaog denumita Editing Chart1 in care
puteti
selecta optiunile acestui obiect.
Tastati F9 si executati aplicatia.
In continuare,daca doriti sa vedeti datele in alta
reprezentare,selectati
din nou Wizard si alegeti alt tip de reprezentare.Nu se pot
reprezenta
decat datele incluse in grila interna a obiectului TVtChart.Pentru a
reprezenta date dintr-o baza de date,puteti utiliza un obiect
TDBChart.

-21- Win32 - TTABCONTROL si


TPAGECONTROL
Urmatorul grup de obiecte este Win32.A fost denumit astfel
deoarece
include componente in format de 32 biti,compatibile cu sistemul
Windows95.
TTabControl este un obiect destinat pentru a realiza o caseta de
dia-
log de tip fisier.TTabControl este un obiect unic,format din mai
multe
dosare denumite Tab.Selectarea evenimentelor asociate fiecarui dosar
se
face cu ajutorul unei proceduri de tip OnChange.Dosarele unui astfel
de fisier nu pot fi inactivate separat,deoarece TTabControl este un
obiect
unic.Inactivarea obiectului duce la inactivarea tuturor
dosarelor.Pentru
a forma un fisier cu dosare independente puteti utiliza TPageControl.
EXEMPLU:
Salvati o fila si proiectul in Prj21.
Selectati si adaugati in Form un obiect TTabControl si alegeti
dimensiunea
dorita.Pentru a denumi dosarele continute,alegeti Tabs din Object
Inspec-
tor si introduceti in String List Editor lista acestora,apoi
confirmati cu
OK( Exemplu: Fisier1,Fisier2,Fisier3,Fisier4...etc).
Pentru a asocia si o operatie observabila,adaugati in Form si un
obiect
TLabel.Apoi selectati obiectul TTabControl,alegeti Events si
executati un
dublu click in On Change.Redefiniti procedura astfel:
procedure TForm1.TabControl1Change(Sender: TObject);
begin
if TabControl1.TabIndex = 1 then
Label1.Caption:='Fisier 1';
if TabControl1.TabIndex = 2 then
Label1.Caption:='Fisier 2';
if TabControl1.TabIndex = 3 then
Label1.Caption:='Fisier 3';
if TabControl1.TabIndex = 4 then
Label1.Caption:='Fisier 4';
end;
Tastati F9 si executati aplicatia.Este bine ca primul dosar sa fie
lasat
liber (TabIndex = 0),pentru a putea manevra cu usurinta in situatii
ne-
prevazute (pentru a adauga de urgenta niste date temporare).In mod
similar
puteti asocia fiecarui dosar o fila de tip text sau un mic program
exe-
cutabil,astfel incat obiectul sa functioneze ca un meniu de optiuni.

TPageControl este un obiect destinat tot pentru a forma fisiere,dar


este
format din mai multe pagini,care sunt obiecte de tip
TTabSheet.Impreuna
formeaza tot o caseta de dialog de tip fisier,dar spre deosebire de
TTab-
Control,dosarele din TPageControl pot fi activate sau inactivate
indepen-
dent.Pentru operatii asupra obiectului se poate executa un click de
mouse
cu butonul drept,in aria obiectului.Exemplu: pentru a adauga un nou
dosar.
Obiectul realizat poate utiliza atat proprietatile si metodele
mostenite
de la TPageControl cat si proprietatile si metodele mostenite de la
TTab-
Sheet.Pentru a executa operatii in unul dintre dosare se vor utiliza
pro-
prietatile TTabSheet iar pentru operatii comune tuturor dosarelor se
vor
utiliza proprietatile si evenimentele TPageControl.
Acest tip de fisier este mult mai maleabil decat cel realizat cu
aju-
torul componentului de tip TTabControl si se recomanda atunci cand
fisierul realizat trebuie sa contina un numar mare de dosare,dintre
care
doar o parte vor fi active la un anumit moment dar,iar restul vor fi
in-
activate temporar (invizibile).

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

-25- Win32 - TTRACKBAR si


TPROGRESSBAR
TTrackBar este un obiect destinat pentru configurarea unor optiuni
din
aplicatie,in timpul executiei (Exemplul clasic este butonul de
sunet).
Este format din o bara de defilare,o scara gradata si un buton
culisant
cu un indicator spre marcajele din scara gradata.In timpul executiei,
butonul poate culisa fie cu ajutorul sagetilor de la tastatura,fie
prin
tractionare cu butonul mouse.Obiectul prezinta o serie de proprietati
si
metode care permit utilizarea si configurarea obiectului.
EXEMPLU: (vezi Prj25)
Salvati o fila noua si proiectul in dierectorul Prj25.
Adaugati in Form un obiect de tip TTrackBar si un obiect de tip
TLabel.
Utilizati Object Inspector pentru a seta aspectul celor doua obiecte
(
culori,fonturi etc.),apoi alegeti pentru TrackBar1 Events si adaugati
in
OnChange(dublu click) urmatoarea procedura:
procedure TForm1.TrackBar1Change(Sender: TObject);
var pozitie:variant;
begin
pozitie:=TrackBar1.Position;
Label1.Caption:=pozitie;
end;
Tastati F9 si executati aplicatia.Observati ca la deplasarea
butonului
culisant,TLabel afiseaza pozitia.In mod similar,obiectul poate fi
utilizat
pentru a executa o secventa de operatii (Exemplu: la fiecare gradatie
poate afisa o alta imagine de tip BitMap,intr-un obiect de tip
TImageList).

TProgressbar este un obiect destinat pentru a prezenta gradul de


exe-
cutie al unui proces,etapa de executie a unei proceduri sau a unei
functii
sau stadiul de executie al unei aplicatii.Este format dintr-o bara de
de-
filare in interiorul careia se adauga progresiv,un set de
dreptunghiuri
albastre,pana cand intreaga bara de defilare este ocupata.Acest
obiect
afiseaza aproximativ stadiul de executie al procesului respectiv.
EXEMPLU: (vezi Prj26)
Salvati o fila noua si proiectul.
Adaugati in Form un obiect de tip TProgressBar si un buton.Setati din
Object Inspector optiunile preferate pentru cele doua obiecte,apoi in
Events atribuiti butonului urmatoarea procedura OnClick:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ProgressBar1.Position:=ProgressBar1.Position+10;
end;
Tastati F9 si executati aplicatia.La fiecare click pe buton,bara de
defi-
lare se va completa cu cateva dreptunghiuri colorate.Utilizati Min si
Max pentru a determina cursa butonului culisant (valaorea de pornire
si
respectiv cea de oprire),sau modificati valoarea fiecarui pas,astfel
incat
sa satisfaca necesitatile aplicatiei.
Un obiect de acest gen se poate conecta si cu un timer,astfel incat
sa
execute o operatie al un anumit interval de timp,sau sa afiseze
timpul
ramas pana la completarea procesului (atunci cand se cunoaste durata
to-
tala de executie).Pentru exercitiu,puteti incerca sa cuplati obiectul
cu
un ceas al sistemului,astfel incat sa execute o operatie la fiecare
se-
cunda,sau sa afiseze (cu TLabel auxiliar) cate secunde mai sunt pana
la
epuizarea procesului.

-26- Win32 - TUPDOWN si THOTKEY


TUPDOWN este un obiect utilizart pentru incrementarea sau
decrementarea
unei valori.Obiectul este format din doua sageti.Un click de mouse pe
sageata in sus,incrementeaza valoarea iar un click pe sageata in
jos,de-
crementeaza valoarea numerica.Obiectul contine o serie de proprietati
pentru configurarea aspectului si pentru controlul
operatiilor.Astfel,
Min si Max stabilesc domeniul de valori acceptate,iar Position
returneaza
valoarea actuala.TUpDown se utilizeaza pentru ajustarea unei valori.
EXEMPLU:
Salvati o fila noua si proiectul in Prj27.
Adaugati in Form un obiect de tip TUpDown si un obiect de tip TLabel.
Daca doriti,redimensionati obiectul TUpDown,apoi selectati Events si
atribuiti in OnChanging urmatoarea procedura:
procedure TForm1.UpDown1Changing(Sender:TObject;var
AllowChange:Boolean);
var valoare:variant;
begin
valoare:=UpDown1.Position;
Label1.Caption:=valoare;
end;
Tastati F9 si executati aplicatia.Executati click de mouse pe sageata
in
sus.Daca doriti sa modificati valoarea saltului,puteti utiliza din
Object
Inspector proprietatea Increment (De exemplu 5).Pentru a putea
utiliza si
valori negative,trebuie modificata valoarea din Min (Exemplu: -5).
THotKey este un obiect destinat pentru adaugarea sau schimbarea
tastei
de shortcut.Se poate utiliza pentru a schimba in timpul executie
tasta
utilizata pe post de shortcut (tasta pentru executie rapida a
obiectului).
In plus,permite si formarea de combinatii complexe pentru tasta
HotKey.
EXEMPLU:
Salvati o fila noua si proiectul in Prj28.
Adaugati in Form un obiect TMainMenu si executati un dublu click pe
acest
obiect.In Form1.MainMenu1 executati un click cu butonul drept in
drept-
unghiul albastru si selectati Insert From Template,apoi MDI Frame
Menu.
Dupa aparitia meniului executati un click pe Exit si alegeti din
Object
Inspector ShortCut.Fixati o tasta oarecare de shortcut(Exemplu:
E).Apoi
selectati Events si dublu click in OnClick.Introduceti in procedura,
"Close;" .Tastati F9 si executati aplicatia.Observati ca meniul Exit
din
File are doua taste shortcut.Tasta "E" se poate utiliza atunci cand
meniul nu este selectat,iar tasta "x" este shortcut-ul
implicit.Pentru a
verifica shortcut-ul tastati Run,apoi "e".
Adaugati in Form si un obiect THotkey.Alegeti din Object Inspector
proprietatea HotKey si fixati o noua combinatie (Exemplu:
Ctrl+A).Apoi
executati un click pe Events si dublu click in OnEnter si redefiniti
pro-
cedura generata astfel:
procedure TForm1.HotKey1Enter(Sender: TObject);
begin
Exit1.ShortCut:=HotKey1.HotKey;
end;
Tastati din nou F9 si executati aplicatia.Observati ca tasta de
shortcut
"e" a fost inlocuita cu "Ctrl+A".Pentru a iesi direct din
aplicatie,fara
sa mai selectati meniul File,puteti utiliza Ctrl+A.Daca doriti sa
reveniti
la vechea setare,alegeti pentru THotKey proprietatea Visible si
setarea
False.Acum tasta "e" este din nou functionala(reveniti cu
Visible=True).

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

-28- Win32 - TTREEVIEW si


TLISTVIEW
TTreeView este un obiect care afiseaza ierarhic o lista inlantuita
de
elemente,cum sunt titlurile unor documente,directoarele si filele
dintr-o
unitate de disc sau intrarile intr-un tabel indexat,etc.
Obiectul este format din noduri,care asociaza un identificator si
un
numar optional de intrari spre elementele care il formeaza.Fiecare
nod,
poate avea la randul sau o lista intreaga de sub-noduri.La orice
click
de mouse pe un nod,se va afisa lista extinsa a sub-nodurilor sale.Cel
mai cunoscut obiect de acest gen este Windows Commander.
TTreeView se utilizeaza pentru a forma astfel de liste de
elemente.
EXEMPLU: (vezi Prj31)
Salvati o fila si proiectul in Prj31.
Adaugati in Form un obiect de tip TTreeView,un buton si un camp
TLabel.
Din ObjectInspector selectati pentru TreeView1 campul Items si
utilizati
Tree View Items Editor pentru a introduce elementele dorite.In partea
din drepata a obiectului introduceti numele acestuia si numarul de
index-
are (Image Index,Selected Index si State Index).Puteti utiliza Load
pentru
a incarca elemente predefinite.Confirmati cu OK.In continuare puteti
uti-
liza proprietatile si metodele obiectului.Pentru a determina care
dintre
elemente a fost selectat la un moment dat,atribuiti butonului
urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var nod:TTreeNode;
begin
nod:=TreeView1.Selected;
Label1.Caption:=nod.Text;
end;
Tastati F9 si executati obiectul.
TListView este un obiect destinat pentru a afisa o lista de
elemente,
in mai multe feluri(izolate,in coloana,in forma de tabel etc.).Este
ase-
manator cu TTreeView,dar elementele sunt in forma de siruri sau grile
si
pot fi afisate sub forma de coloane (cu butoane de titlu),ordonate
orizon-
tal sau vertical,sau insotite de icon-uri.Obiectul ofera un numar
mare
de proprietati si metode,care simplifica operatiile asupra
elementelor.
EXEMPLU: (vezi Prj32)
Salvati o fila si proiectul in Prj32.Adaugati in Form un obiect de
tip
TListView,un buton si un camp TStaticText1.Pentru a introduce
elemente in
obiectul ListView1,executati un click de mouse cu butonul drept,pe
aria
obiectului si alegeti Columns Editor sau Items Editor (sau alegeti
din
Object Inspector Items si Columns).Pentru a vedea toate elementele
incluse
alegeti din ViewStyle optiunea vsReport iar pentru a afisa o grila
intre
elemente,selectati GridLines True.Alegeti restul optiunilor dupa
bunul
plac (culori,fonturi etc.).Apoi asociati butonului urmatoarea
procedura
OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var index1:variant;
begin
index1:=ListView1.Selected.Caption;
StaticText1.Caption:=index1;
end;
Tastati F9 si executati aplicatia.Selectati un element,apoi apasati
buto-
nul.Nu ezitati sa experimentati si alte metode sau proprietati.

-29- Win32 -THEADERCONTROL si


TSTATUSBAR
THeaderControl este un obiect utilizat pentru a adauga un
antet(titlu).
Obiectul contine un set de suprafate de tip buton,care pot fi
redimensio-
nate in timpul executiei.Fiecare astfel de suprafata este un obiect
de
tip THeaderSection si este inclus sub forma de lista,in proprietatea
Sections.Se poate utiliza pentru a afisa anumite proprietati ale unui
obiect din aplicatie,sau pentru a declansa o procedura.Mai mult,poate
fi
tras ca o cortina,peste obiectele din fereastra (Exemplu:TEdit) care
vor
ramane insa active (in background).
EXEMPLU:
Salvati o fila noua si proiectul in Prj33.Adaugati un obiect
TLabel.
Adaugati in Form un obiect de tip THeaderControl si ajustati
dimensiunile
dupa bunul plac.Executati un click de mouse cu butonul drept,pe aria
acestui obiect si selectati Selections Editor.Acum antetul(titlul)
poate
fi subimpartit in mai multe componente (obiecte
THeaderSection).Scrieti
un text oarecare (Exemplu: Antet1 ) in proprietatea Text.Apoi
selectati
din nou THeaderControl si alegeti din Events OnMouseDown.Atribuiti
urma-
toarea procedura:
procedure TForm1.HeaderControl1MouseDown(Sender:TObject;
Button: TMouseButton; Shift: TShiftState;
X,Y:Integer);
begin
Label1.Caption:='Declanseaza executia unei proceduri !';
end;
Tastati F9 si executati obiectul.Selectati cu mouse Antet1 iar Tlabel
va
afisa textul specificat (Atentie ca THeaderControl sa nu acopere
textul).
Daca doriti sa observati si efectul de cortina,adaugati si alte
obiecte
in Form,la care asociati cate un text de tip TLabel.Apoi asociati si
un
buton care redimensioneaza HeaderControl cu:
HeaderControl1.Height:=300.
TStatusBar este un obiect similar,destinat pentru a realiza o bara
de
stare de tip Windows.Puteti utiliza acest obiect pentru a afisa o
serie
de informatii utile,sau chiar pentru a declansa o procedura oarecare.
Se compune din suprafete plane,in coloane care formeaza o lista de
obiecte arhivata in TStatusPanel.Fiecare dintre aceste suprafete
poate
afisa un anumit text sau mesaj.Obiectul are si o serie de proprietati
si
metode auxiliare,utile pentru a configura obiectul.
EXEMPLU:
Salvati o fila si proiectul in Prj34.Adaugati un obiect de tip
TLabel.
Adaugati un obiect de tip TStatusBar si apoi executati deasupra lui
un
click de mouse cu butonul drept.Selectati Panel Editor si utilizati
caseta de dialog pentru a introduce texte in obiectele de tip
StatusPanel
adaugate automat (cu Add).Configurati bara de status dupa bunul
plac,apoi
alegeti din Events OnClick si adugati o procedura de genul:
procedure TForm1.StatusBar1.Click(Sender:TObject);
begin
Label1.Caption:='Bara de status a fost activata !';
end;
Tastati F9 si executati obiectul.
In mod similar,se poate atribui orice alta procedura,dar acest
obiect
nu este destinat pentru a controla procesele ci doar pentru a afisa
informatii despre un obiect oarecare; pentru a prezenta memoria
libera,
data si ora,sau o alta operatie simpla de acest gen.
Obiectele StatusPanel nu sunt reconfigurabile in timpul executiei.
-30- Win32 -TTOOLBAR si
TCOOLBAR
TToolBar este un obiect destinat pentru a grupa obiecte de tip
buton,
sub forma de "bara de unelte".Spre deosebire de TPanel,acest obiect
aran-
jeaza si dimensioneaza butoanele automat.Butoanele sunt obiecte de
tip
TToolButton si pot oferi suport pentru alte obiecte,astfel incat bara
de
unelete sa contina si alt fel de obiecte(care sunt sustinute de cate
un
buton invizibil).Este un obiect extrem de practic pentru introducerea
de controale si comenzi.
EXEMPLU:
Salvati o fila si proiectul in Prj35.Adaugati un obiect de tip
TLabel
si un obiect de tip TToolBar.Redimensionati bara de unelte si alegeti
culoarea dorita.Pentru a adauga butoane,executati un click de mouse
cu
butonul drept si alegeti New Button,iar apoi alegeti New
Separator,daca
doriti ca butoanele sa fie separate de un spatiu simetric.
Pentru a scrie pe butoane,selectati butonul cu un click,scrieti in
Caption textul dorit,iar apoi selectati din nou TToolBar si alegeti
pentru proprietatea ShowCaptions optiunea True.
Restul butoanelor vor fi dimensionate si spatiate automat.
Pentru a adauga o procedura,selectati pentru buton Events si apoi
alegeti
evenimentul dorit.Exemplu: pentru OnClick scrieti procedura:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
Label1.Caption:='Primul buton a fost selectat !';
end;
Tastati F9 si executati aplicatia.Daca doriti alt tip de obiect,pur
si
simplu adaugati obiectul in ToolBar (Exemplu: TEdit).

TCoolBar este un obiect specializat pentru gruparea ordonata a


unor
controale.Este format din benzi denumite TCoolBand,care pot contine
cate
o colectie de obiecte de tip Windows,sunt mobile si reconfigurabile.
Acest obiect,(la fel ca si TListView) necesita prezenta unei
biblioteci
DLL denumita COMCTL32.DLL.Aplicatiile care utilizeaza acest tip de
obiect
nu vor putea fi executate decat in prezenta acestei biblioteci(care
este
inclusa in mod normal in Windows\System sau in Windows\System32).
Fiecare astfel de banda,va avea un aspect propriu (care poate fi
defi-
nit cu o imagine de tip BitMap) si va contine un grup de obiecte
Windows.
Acest obiect este asemanator cu un meniu,dar poate contine obiecte
dife-
rite si poate avea un aspect personalizat.
EXEMPLU: (vezi si exemplul Prj36)
Salvati o fila noua si proiectul in Prj36.Utilizati din meniul
princi-
pal Tools si Image Editor pentru a desena cateva imagini de tip
BitMap.
Adaugati aceste imagini in directorul Prj36,apoi puteti incepe
proiectarea
obiectului.Adaugati in Form un obiect de tip TCoolBar.Click drept de
mouse
si selectati Bands Editor pentru a adauga cateva benzi TCoolBand.Apoi
selecati fiecare banda si alegeti BitMap.Din Picture Editor alegeti
Load
si incarcati una dintre imaginile BitMap adaugate anterior in Prj36.
Utilizati Text pentru a schimba numele.Apoi adaugati in Form un
obiect de
tip TToolBar.Adaugati in TToolBar cateva butoane,apoi selectati prima
banda din TCoolBar (CoolBar1.Bands[0]) si alegeti din Proprietatea
Control
ToolBar1.Butoanele vor fi activate cu proceduri,la fel ca orice
buton.
Tastati F9 si executati aplicatia.
In mod similar,puteti adauga in benzi orice alt obiect.

-31- System - TTIMER si


TPAINTBOX
Urmatoarea paleta de componente,se numeste System si contine
obiecte
specializate pentru interactiunea cu sistemul de operare.
TTimer este un obiect specializat in repetarea unei operatii,la un
anumit interval de timp.Acest obiect nu este vizibil in fereastra
(este
un component nonvizual) ci este un modul specializat pentru date,asa
cum
sunt si componentele destinate pentru accesarea datelor (TTable
etc.).
TTimer se utilizeaza pentru a declansa o actiune,la intervale
regulate.
Pentru a regla intervalul de repetitie se poate utiliza proprietatea
Interval,iar pentru a declansa actiunea,evenimentul OnTimer.Pentru a
intrerupe timerul se seteaza Enabled la valaorea False.
EXEMPLU: (vezi exemplul Prj37)
Salvati o fila si proiectul in Prj37.Adaugati un obiect TLabel si
trei obiecte TTimer.Selectati fonturile si culorile dorite pentru
TLabel.
Apoi selectati cele trei timere si atribuiti in Events/OnTimer
urmatoa-
rele proceduri (cate una pentru fiecare timer):
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Color:=clYellow;
Label1.Caption:='Primul timer a fost activat !';
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Label1.Color:=clAqua;
Label1.Caption:='Al doilea timer este activ !';
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
Close;
end;
Apoi selectati pe rand cele trei timere si setati proprietatea
Interval,
dupa cum doriti sa se desfasoare evenimentele.Exemplu: Interval=3000
pentru Timer1,5000 pentru Timer2 si 12000 pentru Timer3.
Perioadele de timp setate sunt exprimate in milisecunde.Deci 3000
inseamna 3 secunde.
Tastati F9 si executati aplicatia.Dupa 3 secunde se va afisa primul
mesaj.Dupa alte doua secunde se va afisa cel de al doilea,iar dupa
inca
o secunda (total 6 secunde) primul timer termina cel de al doilea
ciclu
de trei secunde si se va afisa din nou primul mesaj...etc.Dupa 12
secunde
cel de al treilea timer intrerupe aplicatia.Numarul total de timere
utilizat depinde de sistemul de operare si de memoria libera.

TPaintBox este un obiect destinat pentru a adauga un mic desen in


aplicatie,intr-o arie delimitata de suprafata acestui obiect.Pentru a
accesa suprafata grafica se utilizeaza proprietatea Canvas,iar pentru
a
atribui o operatie se utilizeaza evenimentul OnPaint.
EXEMPLU: (vezi si Prj38)
Salvati fila si proiectul in Prj38.Adaugati un obiect TPaintBox si
alegeti culoarea si fontul dorit.Apoi atribuiti in OnPaint o operatie
oarecare.Exemplu: PaintBox1.Canvas.TextOut(5,5,' Textul dorit 1 !
');
Tastati F9 si executati aplicatia.In mod similar puteti introduce
orice
procedura grafica.Pentru obiecte Bitmap este preferabil obiectul
TImage.
-32- Win32 TMEDIAPLAYER si
TOLECONTEINER
TMediaPlayer este un obiect conceput pentru programarea de
aplicatii
destinate sa controleze unitati audio-video,de tip CD-ROM,video-
player etc.
Obiectul contine un set de butoane cu ajutorul carora se pot controla
principalele operatii ale aparatului de inregistrare-redare.Aceste
butoane
pot fi active sau inactive,vizibile sau invizibile,AN sau color in
functie
de optiunile alese din Object Inspector.
TMediaPlayer se poate utiliza impreuna cu aparate care beneficiaza
de
un driver de tip MCI (Media Control Interface),care realizeaza
interfata
digitala dintre controalele electrice si cele digitale.
Pentru a selecta tipul de aparat utilizat se va utiliza
proprietatea
DeviceType,iar pentru a alege fila asupra careia actioneaza se va
utiliza
FileName.
EXEMPLU: pentru un CD-ROM cu muzica in format WAV ( vezi si Prj39)
Salvati o fila noua si proiectul in Prj39.Adaugati in Form un
obiect
de tip TMediaPlayer si alegeti din Object Inspector AutoEnable =
False.
Apoi selectati DeviceType si alegeti tipul de aparat(sau AutoSelect)
iar
in FileName selectati fila de tip .wav dorita (Prj39 contine cateva
file
.WAV cu sunete emise de balene).Selectati AutoOpen si alegeti True.
Tastati F9 si executati aplicatia.
Acest tip de obiect nu recunoaste decat filele de tip .wav,.avi si
.mid.
Pentru file audio-vizuale actuale(MPEG,JPEG etc.) este necesara o
versiune
mai recenta a programului(Dephi 5...etc.).

TOleConteiner este un obiect destinat pentru incorporarea si


interco-
nectarea obiectelor OLE.Tehnologia OLE(Object Link Embaded) permite
acces-
ul la obiecte care sunt active nu doar in programul curent,ci si in
alte
programe,sau sunt definite si activate in alt program.Mai exact,prin
aceasta tehnologie se pot accesa proprietatile si metodele acestor
obiecte
dar nu se pot modifica codurile de definitie.Mai mult decat atat,un
obiect
de tip OLE poate fi utilizat in comun de catre programe care
utilizeaza
limbaje de progrmare diferite (C++,Pascal,Delphi etc.).Aplicatia care
contine obiectul OLE poarta numele de server,iar cea care utilizeaza
obiectul poarta numele de client.Exemplele clasice sunt Word si
Excel.
Pentru a partaja un obiect cu alte aplicatii,puteti utiliza
TOleContei-
ner impreuna cu obiecte de tip ActiveX.
EXEMPLU: (vezi si Prj40)
Salvati o fila noua si proiectul in Prj40.Adaugati un obiect de
tip
TOleConteiner si ajustati dimensiunile.Apoi,din meniul
principal,alegeti
grupul de obiecte ActiveX(cu sageata din dreapta) si selectati un
astfel
de obiect,de exemplu TF1Book(Formula One spreadsheet).
Executati un click cu butonul drept pe TF1Book si alegeti Workbook
Designer.Utilizati acest instrument pentru a introduce datele dorite.
Tabelul realizat,asemanator cu cele din Excel,va putea fi partajat de
catre aplicatii diferite,dar,care utilizeaza tehnologia OLE.
Tastati F9 si executati aplicatia.Observati avantajele acestui obiect
(
datele pot fi selectate in linie,pe coloane etc.).
Celelalte obiecte din System
(TDdeClientConv,TDdeClientItem,TDdeServer-
Conv si TDdeServerItem) sunt destinate pentru tehnologia de
comunicatie
dintre aplicatii denumita DDE (Direct Data Exchange).Tehnologia DDE a
fost scoasa din uz in aplicatiile recente si nu face obiectul acestui
manual(se bazeaza pe conversatii de tip client-server).

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

TClientSocket este un obiect destinat pentru a transforma aplicatia


res-
pectiva in client TCP/IP.Permite specificarea unei adrese de
conectare si
supravegheaza conexiunea cu adresa respectiva.
Prin socket,se intelege in termeni generali un element terminal al
unei
retele(o statie de lucru).In termeni software,este asemenator cu un
folder
(un director) care contine un tampon de memorie,la care se asociaza
auto-
mat si un grup de informatii referitoare la adresa din retea,tipul de
conexiune,etc.Utilizand elemente de tip socket,se poate face schimb
de
date intre doua calculatoare,fara sa fie necesar sa cunoasteti toate
ele-
mentele intime ale retelei,sau ale protocoalelor de comunicatie.De
fapt,
acesta este si principalul lor rost.Utilizatorii nu trebuie sa fie
ingi-
neri de sistem pentru a putea schimba informatii.Socket-urile se
bazeaza
pe protocolul TCP/IP dar sunt suficient de generale pentru a accepta
si
alte protocoale: Xerox NetWork System,Digital's DECnet,Novell IPX/SPX
etc.

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

Limbajul HTML(Hypertext markup language) necesita un manual


separat.
Pentru intelegerea obiectelor si a functiilor care opereaza cu date
de
tip text editate in acest limbaj,sunt necesare totusi un minimum de
no-
tiuni.
Acest limbaj,a fost special conceput pentru filele din aplicatiile
WEB,
cu scopul de a permite utilizarea de formate diferite,pentru date
grupate
in aceeasi fila de text.Astfel,se pot utiliza titluri si
subtitluri,liste
si tabele,imagini sau obiecte incluse,care utilizeaza fonturi
diferite,
cu dimensiuni si culori diferite,sau chiar realizeaza si legatura cu
alte file,sau cu alte date continute in aceeasi fila.
Pentru acest scop,datele dintr-o fila HTML sunt subimpartite in
unitati
de indexare mai mici,denumite TAG-uri.Fiecare TAG,contine un anumit
tip
de date,cu un anumit format,si cu un anumit mod de executie.Pentru
deli-
mitarea unui tag se utilizeaza caracterele < si >.Intre cele doua
carac-
tere se include numele TAG-ului,iar datele se incud intre doua astfel
de
grupuri: EXEMPLU: <html> date </html>
Pentru a specifica terminarea unui tag,se adauga si semnul /.
Pentru a delimita inceputul unei file se utilizeaza <html> iar pentru
a
marca sfarsitul filei se utilizeaza </html>.
O fila HTML,poate fi subimpartita in titluri si date propriu
zise.Pentru
acest scop se utilizeaza tag-urile: <head> ....</head> si
respectiv
<body> ....si </body>.
Ca rezultat,formatul general al unei file este de genul:
<html>
<head>
<h1> <title> Titlul documentului </title> </h1>
.....subtitlurile documentului......
<h2> ..... </h2>
<h3> ..... </h3>
</head>
<body>
....continutul propriu zis al documentului.....
</body>
</html>
Documentele HTML pot fi editate cu orice editor de text,cu conditia
sa
fie arhivate cu extensia .hml.Nu este absolut necesar sa utilizati
toate
aceste TAG-uri,dar este recomandabil,deoarece programele specializate
apeleaza aceste tag-uri pentru a putea analiza si interpreta datele.
Daca doriti ca documentele d-voastra sa poata fi utilizate extensiv
in
retea,trebuie sa respectati standardul complet,astfel incat
documentele
realizate sa poata fi verificate automat.In caz contrar,riscati ca o
parte dintre programele "antivirus" sa excluda documentul din lista
celor
"acceptabile".Daca utilizati documentele doar pentru uz
personal,puteti
sa utilizati orice format acceptat de compilator.Protocoalele care
con-
troleaza activitatea in Internet sunt definite prin documente RFC
(Request
for Comment),care sunt create si actualizate de catre IETF(Internet
Engi-
neering Task Force).Dintre acestea,mai importante sunt RFC C822,RFC
C1521
si RFC 1945.Puteti studia intreaga biblioteca de documente RFC,la
adresa
de WEB : www.ietf.cnri.reston.va.us
-46-
Pentru a introduce un titlu,este suficient ca datele sa fie incluse
intr-un tag <h1> ...</h1>
EXEMPLU: <h1>Titlul Aplicatiei</h1>
Scrieti aceasta linie intr-o pagina text.Salvati pagina cu
extensia .htm
(Fila1.htm) si apoi deschideti fila cu Internet Explorer(daca este
insta-
lat,este suficient sa executati un dublu click pe fila respectiva).
Daca doriti ca titlul respectiv sa conduca automat la un set de date
situat undeva la subsolul filei,se va edita linia de comanda astfel:
(vezi si fila Text1.htm)
<h1><a href="#Titlul aplicatiei">Titlul</a></h1>
Tag-ul <a href> .... </a> contine un index,desemnat prin # plus
numele
indexului,care va fi utilizat ulterior pentru a introduce datele
spre
care se face accesul direct.
Pentru a introduce aceste date,se va utiliza urmatorul TAG:
< a name="Titlul aplicatiei"> dupa care se introduc datele
dorite.
Titlul introdus prin Tag-ul <h1> utilizeaza de obicei fonturile cele
mai
mari (observati in Object Inspector proprietatile obiectului THTML).
Daca doriti sa utilizati si subtitluri,cu alte fonturi,si cu alte
culori,
puteti utiliza si restul de tag-uri <h2>,<h3>,<h4>..etc.In mod
obisnuit,
subtitlurile urmatoare sunt din ce in ce mai putin importante si sunt
scrise cu fonturi din ce in ce mai mici (Exemplu: Titlul Capitolului,
apoi Titlul Subcapitolului...etc).
Pentru a marca un paragraf nou,se utilizeaza tagul <p> ...date...
</p>
Pentru a marca un anumit cuvant,prin utilizarea unui alt font,se
poate
utiliza tag-ul <em>....</em>
EXEMPLU: <p>Acesta este un <em>font special</em></p>
Pentru a introduce o imagine bitmap sau .jpg se utilizeaza tag-ul:
<img src="numele filei.extensia" width="100" height="100">
Pentru a adauga si o explicatie a imaginii,care va fi afisata in
momentul
in care mouse se afla deasupra imaginii,se poate utiliza si
alt="...".
EXEMPLU:
<img src="Imagine1.bmp" width="100" height="100" alt="desen">
unde Imagine1.bmp este realizata cu Image Editor din Delphi si este
sal-
vata in acelasi director ca si fila HTML.
Pentru a realiza un link cu o alta fila din acelasi director se
poate
utiliza un tag de genul:
<a href="fila.hmt">text</a>
Pentru a realiza un link cu o fila situata la un alt site de web
din
retea se va include in href intreaga cale de acces la fila:
<a href="http://www.w3.org/">w3C</a>
Pentru a introduce o lista neordonata,se va utiliza tag-ul <ul>
combi-
nat cu tag-uri <li> pentru fiecare element din lista:
<ul>
<li>Primul element din lista</li>
<li>Al doilea element din lista</li>
.......
<li>Ultimul element din lista</li>
</ul>
Atunci cand utilizati mai multe tag-uri intricate,verificati cu
atentie
unde incepe si unde se termina fiecare tag si nu uitati sa inchideti
toate
tag-urile deschise(in caz contrar rezultatele pot fi imprevizibile).

-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
&nbsp;
(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:
"=&quot; | &=&amp; | <=&lt, | >=&gt, | patratul puterii=&sup2; |
cubul
puterii=&sup3; | micro=&micro; | 1/4=&frac14; | 1/2=&frac12; | 3/4 =
&frac34; | A=&Acirc; | I=&Icirc; | a=&acirc; | a=&atilde; |
/=&divide;
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)

Limbajul SQL a fost dezvoltat de catre compania IBM,in anii '70 si


a fost standardizat de ANSI in 1986.Are ca scop accesarea si
manipularea
datelor din bazele de date formatate.Exista un numar foarte mare de
sisteme de operare,care arhiveaza datele sub forma de baze de
date,dar
toate aceste sisteme au un principiu comun: datele sunt arhivate sub
forma de tabele,formate din coloane si randuri.Formatul intern al
datelor,
poate fi extrem de diferit,dar,pentru datele de interes public se
utili-
zeaza doar formate acceptate de sistemele de operare comerciale.
Pentru operatii cu acest fel de date,se disting doua categorii de
in-
structiuni: instructiuni pentru manipularea datelor (DML=Data
Manipulation
Language) cum sunt: SELECT,UPDATE,DELETE,INSERT INTO si instructiuni
pentru definirea datelor (DDL=Data Definition Language) cum sunt:
CREATE TABLE,ALTER TABLE,DROP TABLE,CREATE INDEX,DROP INDEX.
Limbajul propriu zis,mai contine si o serie de cuvinte de legatura
si
un grup de operatori: = pentru egal,<> pentru diferit de,> pentru mai
mare,< pentru mai mic,<= pentru mai mic sau egal,>= pentru mai mare
sau
egal,BETWEEN ... AND pentru cuprins intre,LIKE pentru asemenea si IN
pentru identic cu.
Datele din tabele pot fi in formatul curent al datelor: CHAR adica
date
de tip caracter,FLOAT adica date numerice in virgula mobila,DATE
adica
date calendaristice sau LOGICAL adica date booleene(true/false).
Pentru prezentarea si exemplificarea acestui limbaj,se poate
utiliza
o aplicatie Delphi elementara.
EXEMPLU: vezi si Prj52
Salvati o fila si proiectul in Prj52.Adaugati un control
TDataSource,
unul de tip TQuery si un obiect TDBGrid.
Setati DataSet din DataSource1 la valoarea Query1.Setati
DatabaseName
din Query1 la valoarea DBDEMOS si DataSource din DBGrid1 la valoarea
DataSource1.
Din acest moment,aplicatia poate accepta comenzi SQL.
Alegeti SQL din Query1 si adaugati comanda:
SELECT * FROM Biolife.db apoi alegeti proprietatea Active si setati
TRUE.
Puteti complia si executa obiectul cu F9.
In acest moment,obiectul DBGrid afiseaza toate datele din baza de
date.
In comanda,caracterul * inlocuieste orice coloana de date din baza de
date.Pentru a formula o comanda mai selectiva,alegeti una dintre
coloane
(de exemplu Common_Name).Schimbati Active la valoarea False,apoi
selectati
SQL si introduceti urmatoarea comanda:
SELECT Common_Name FROM Biolife.db
apoi setati din nou Active la valaorea TRUE.
Observati ca in DBGrid au fost selectate doar datele din coloana care
contine numele comun al speciilor de peste.
Asadar,o comanda de tip SELECT trebuie sa specifice numele coloanei
dorite
si numele bazei de date din care se extrag datele.
Daca doriti sa extrageti datele din doua sau mai multe coloane,se va
introduce lista acestora,separate prin virgula:
SELECT Common_name,Category,Length_In FROM Biolife.db
Pentru schimbarea comenzii,proprietatea Active trebuie dezactivata si
apoi
reactivata din nou.

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

-66- Web Server Application


Pentru a realiza o aplicatie de tip Web Server,exista si un
component
specializat.Acest obiect,nu este localizat impreuna cu celelalte
obiecte
din paleta Internet,ci este localizat in meniul File|New.Pentru a
utiliza
un astfel de modul,alegeti File,apoi New si selectati Web Server
Applica-
tion.Apoi alegeti una dintre cele trei variante posibile (ISAPI/NSAPI
DLL,
CGI Stand-alone sau Win-CGI Stand-alone) si confirmati cu OK.In locul
ferestrei Form1 se va afisa un modul denumit WebModule1.Acest obiect
este
practic format din: DataModule + WebDispatcher.Se poate utiliza atat
pentru a grupa componentele nonvizuale,necesare pentru implementarea
apli-
catiei,cat si pe post de dispecer (la fel ca si WebDispatcher).
Mai mult decat atat,WebModule1 se poate utiliza pentru a crea un
link
spre orice alta fila executabila.Se poate realiza astfel un short-cut
spre
fila respectiva,sau se poate utiliza pentru ca fila respectiva sa
poata
deveni vizibila in retea.
EXEMPLU: (vezi si Prj58)
Deschideti o aplicatie Web Server Application (din File +
New).Selectati
modulul WebModule1,apoi alegeti din meniul principal optiunea
Run,apoi
Parameters iar in fereastra Run parameters utilizati butonul Browse
pentru a selecta o aplicatie "Host application".De exemplu alegeti
fila
Proiect40.exe din Prj40.Confirmati cu OK,apoi tastati F9.Observati ca
aplicatia d-voastra va lansa direct programul din Prj40.Salvati fila
si
proiectul in directorul Prj58.In continuare,daca arhivati Prj58 in
Server
Prj40 va putea fi executat si din retea (va fi vizibil in retea).
In rest,WebModule este identic cu DataModule+WebDispatcher.Puteti
uti-
liza Actions pentru a transforma obiectul in dispecer.
In general,o aplicatie WEB Server este utilizata pentru a realiza
un
schimb de date intre doua unitati de lucru din retea.Schimbul de date
se
realizeaza sub forma de solicitare (Web Request) si raspunsul
selectat
(Web Response).In momentul in care dispecerul primeste un mesaj de
soli-
citare,alege din lista sa de elemente,pe cel care corespunde cu
datele
de identificare din mesajul de solicitare.In continuare,elementul
ales
(Action Item) va apela procedura asociata,pentru a formula raspunsul
aplicatiei.Dupa formulare,raspunsul (Web Response) va fi expediat
catre
clientul solicitant.Cu cat dispecerul contine mai multe elemente
distincte
cu atat raspunsul formulat va fi mai nuantat.Daca nici unul dintre
ele-
mente nu corespunde cu datele solicitate,se va returna raspunsul
selectat
cu proprietatea Default=True (se va returna raspunsul implicit).
Acest gen de aplicatii nu poate fi activat pe un calculator
izolat,ci
doar pe un server de retea (care are instalat un software special de
tip
Personal Server,Windows NT etc.).Nu este recomandabil sa invatati
acest
tip de aplicatii pe cont propriu (este preferabil sa urmati un curs
specializat).Aplicatiile de retea,pot afecta un numar nedeterminat de
utilizatori ai retelei si orice eroare mica se transforma in
tragedie.
Cele trei tipuri de file realizate,sunt fie de tip DLL,fie de
tip .exe
si prezinta unele particularitati.Alegeti tipul de fila dorit,in
functie
de tipul de server care va deservi aplicatia si in functie de tipul
de
clienti care vor solicita aplicatia.
Pentru aplicatiile de Web,s-a impus tot mai mult standardul
"ActiveX
technology" care utilizeaza obiecte de tip OLE si respectiv limbajul
HTML
pentru editarea datelor de tip text.Documentele non-HTML si
executabilele
in format binar,risca sa fie identificate ca "potentiali virusi".

-67- Data Access -


DataSource
Restul obiectelor din paleta Internet(FTP,HTTP,NNTP,POP,SMTP si
TCP),
sunt controale invizibile de tip ActiveX,destinate pentru a facilita
schimbul de date,prin protocoale specializate.Fiecare obiect este
destinat
pentru un anumit tip de protocol de comunicatie.TCP si UDP,contin
cate
un WinSocket atat pentru server cat si pentru client,astfel incat pot
fi utilizate atat pe post de server cat si pe post de
client(asincron).
Aceste obiecte au o utilitate mai redusa si prezentarea lor
detaliata
nu face obiectul acestui manual.Cei interesati,pot prelua de pe
Internet
documentele RFC care descriu fiecare dintre aceste protocoale de
comuni-
catie.Pentru activitatile banale si pentru programarea unor
aplicatii,
sunt suficiente obiectele descrise anterior.Directorul Demos/Internet
contine cateva exemple functionale.Dintre acestea FTP,poate fi
utilizat
cu succes pentru preluarea de file non-HTML,de la un server FTP.

Urmatoarea paleta de obiecte,denumita DataAccess contine


componente
special concepute pentru a facilita accesul la datele arhivate in
baze
de date sub forma de tabele(grid).Aceste obiecte nu functioneaza
inde-
pendent ci doar in sinergism cu obiectele din paleta
DataControls,care
vor afisa datele preluate.Doua sau mai multe astfel de obiecte,pot
realiza diverse variante de selectie si prezentare a datelor extrase
din
baza de date.Pentru bazele de date mici (tabele izolate) se vor
utiliza
obiecte care afiseaza tabelele integral (toate randurile si toate
coloane-
le).Pentru baze de date mari si foarte mari,se pot realiza diverse
combi-
natii de obiecte si proprietati,astfel incat datele extrase sa
reflecte
cat mai fidel necesitatile utilizatorului.Aplicatiile de acest gen,se
proiecteaza astfel incat utilizatorul sa poata controla cat mai usor,
atat modul de selectie,cat si formatul de afisare a datelor preluate.
TDataSource -este componentul care va fi utilizat ca sursa de
date,pentru
restul componentelor care prelucreaza datele.Practic este echivalent
cu
un tampon de memorie RAM in care datele preluate din baza de date
sunt
stocate temporar,inainte de a fi prelucrate de celelalte
componente.In
acest tampon de memorie,datele pot fi editare,reformatate
etc.TDataSource
nu poate fi utilizat decat impreuna cu un obiect care preia datele
din
baza de date cum sunt: TTable sau TQuery,etc. Obiectul contine si
cateva
proprietati si metode,destinate pentru editarea sau actualizarea
datelor.
Dupa preluarea datelor in DataSource,toate obiectele linkate de acest
obiect opereaza asupra datelor din DataSource (in loc sa opereze
asupra
datelor din baza de date).Acest fapt prezinta o serie de
avantaje,dintre
care cel mai important este faptul ca datele pot fi prelucrate in
diverse
moduri,fara ca sursa de date sa fie modificata de loc.Astfel,intr-o
retea,
un numar oarecare de utilizatori pot prelucra aceeasi baza de date,cu
rezultate complet diferite,fara ca baza de date sa sufere modificari.
Fiecare utilizator,va arhiva in calculatorul sau rezultatul
obtinut,fara
sa modifice baza de date (Exemplu: analiza actiunilor bancare dintr-o
bursa de actiuni structurata electronic: RASDAQ etc.).
Este importatnt de inteles rolul acestui component,deoarece detine
un
rol cheie in executie.In eventualitatea unui volum excesiv de
date,este
posibil ca acest obiect sa fie suprasaturat cu informatii.Pentru
depanarea
rapida a unei astfel de aplicatii,este suficient sa inlocuiti
obiectul
DataSource supradopat,cu un obiect DataSource nou (in cazul in care
apli-
catia a functionat un timp oarecare,apoi s-a blocat).
-68-
De exemplu,pentru a prelua si afisa cateva imagini dintr-o baza de
date,este necesar un obiect DataSource(tamponul local),un obiect
TTable
(asigura accesul la date) si un obiect TDBImage(afiseaza
datele).Optional
se poate adauga si un obiect TDBNavigator(pentru a facilita
deplasarea
in baza de date).
EXEMPLU: (vezi si Prj59)
Salvati o fila noua si proiectul in Prj59.Adaugati din DataAccess un
obiect TDataSource si un obiect TTable,apoi adaugati din DataControls
un
obiect TDBImage si un obiect TDBNavigator.
Alegeti DataSource1 si setati proprietatea DataSet la valoarea
Table1.
Apoi alegeti DBNavigator si setati proprietatea DataSource la
valoarea
DataSource1.Selectati Table1 si setati proprietatea DatabaseName la
va-
loarea DBDEMOS,apoi proprietatea TableName la valoarea EVENTS.DB si
in
final proprietatea Active la valoarea TRUE.In final,selectati
obiectul
DBImage1 si setati proprietatea DataSource la valoarea DataSource1 si
proprietatea DataField la valoarea Event_Photo.In acest moment in
obiectul
DBImage va fi afisata o imagine.Tastati F9 si utilizati bara de
navigatie
pentru a naviga in baza de date.
Pentru a evita stergerea din greseala a unor inregistrari,puteti
selecta obiectul DBNavigator,executati un dublu click pe proprietatea
VisibleButtons si setati False butoanele:
nbInsert,nbDelete,nbEdit,nbPost
si nbCancel.
Daca analizati putin exercitiul,observati ca DataSource utilizeaza
obiectul TTable pentru a prelua datele din baza de date iar
DBNavigator
si DBImage preiau datele din DataSource1(care este noua sursa de
date).
Eventualele modificari efectuate,vor avea efect doar asupra datelor
din
DataSource1.Pentru ca modificarile sa devina definitive,este necesara
o
alta procedura care sa actualizeze baza de date cu cele din
DataSource1.
Pentru a intelege si mai bine mecanismul,puteti sa adaugati si un
obiect TDBGrid (tot din DataControls).Apoi setati prporietatea
DataSource
la valoarea DataSource1 si tastati F9.Observati deplasarea in
tabel,la
fiecare apasare a butoanelor din DBNavigator.
Deplasati bara de scrol din DBGrid astfel incat sa puteti observa
denumirea fiecarei probe,sau data desfasurarii,pretul biletului,etc.
La nevoie,redimensionati cele doua obiecte,astfel incat sa aveti o
imagine
de ansamblu.
Daca optiunea de editare nu este inactivata,selectati una dintre
valo-
rile din tabel si introduceti o valoare noua (de exemplu schimbati
data
desfasurarii,apoi navigati in tabel si reveniti la valoarea
actualizata).
Valoarea se mentine atat timp cat exercitiul este in executie.Daca
inchideti fereastra si relansati programul,datele vor fi afisate cu
valoarea initiala (modificarile au fost temporare si au avut efect
doar
asupra tamponului de memorie din DataSource1).
Modificarile din DataSource1 nu pot fi transferate direct asupra
bazei de date.Pentru o astfel de operatie,datele trebuiesc salvate
intr-un tampon de memorie,sau intr-o fila temporara,dupa care se va
utiliza tamponul sau fila temporara pentru a rescrie baza de
date.Daca
sunteti incepator,nu este recomandabil sa modificati nici o baza de
date
(nici macar cele personale).Pentru inceput,este bine sa exersati cat
mai multe metode de preluare si prelucrare a datelor.Calitatea
programa-
torului se reflecta direct asupra modului de selectie a datelor.

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

TQuery -este asemanator cu TTable,dar utilizeaza o comanda in limbaj


SQL,
pentru accesarea si selectarea datelor dintr-o baza de date.Mai mult
decat
atat,comanda SQL permite ca datele sa fie preluate din doua sau mai
multe
tabele si sa fie centralizate intr-un obiect de prezentare.Exemple
simple
au fost prezentate impreuna cu limbajul SQL(vezi pagina 55) si Prj52.
Formularea comenzii in limbaj SQL,permite o mult mai mare
maleabilitate
si selectivitate.Se poate extrage o singura coloana de date,sau chiar
o
singura inregistrare,in loc de a afisa intregul tabel.In plus,datele
din
doua tabele pot fi combinate,pentru a realiza un tabel
comparativ,etc.
TQuery,nu numai ca permite accesara datelor,dar permite si
transmiterea
de date,de la component catre baza de date,astfel incat bazele de
date
pot fi modificate,actualizate,completate sau chiar sterse definitiv
din
memorie.
Obiectul contine si un numar mare de proprietati,metode si
evenimente,
care extind si mai mult posibilitatile acestui obiect.Alegeti acest
obiect ori de cate ori este necesara prelucrarea datelor(fie si
minimala).

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

TRemoteServer este un obiect destinat pentru a mentine o conexiune


fixa
cu o baza de date,in cadrul unei aplicatii cu legaturi interne
multiple.
Singurul RemoteServer implicit este cel care conecteaza tabelul
Employee.
Pentru a realiza si alte legaturi fixe,trebuie sa cunoasteti codul de
identificare al interfeetei respective si sa specificati acest cod in
proprietatea ServerGUID (GUID=globally unique identifier).
Codul GUID are o structura de forma:
'{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}' unde x este hexazecimal
TRemoteServer se poate utiliza pentru:
-a realiza o legatura fixa cu o baza de date
-a mentine o lista de obiecte Provider accesibile prin aceasta
conexiune
-a obtine o interfata IProvider
-a mentine o lista,ce contine bazele de date accesibile prin
RemoteServer
-a intrerupe conexiunea actuala (desface legatura fiza)
Un TRemoteServer poate fi utilizat impreuna cu un numar nelimitat de
obiecte TClientDataSet,pentru a realiza instante diferite ale unui
tabel
din baza de date (vezi mai sus exemplul Prj 63).
Metodele se pot utiliza pentru a stabili sau intrerupe conexiunea
(DoConnect si DoDisconnect),etc. Pentru exemplificare vezi Prj63.

-74- DataAccess - TDataBase si


TSession
TDatabase este un obiect conceput pentru a realiza o conexiune
fixa cu
o baza de date,in special pentru conexiunile cu o baza de date
situata
intr-un server de retea,care necesita o parola de acces si un cod de
identificare a utilizatorului.
TDatabase permite controlul conexiunii cu o singura baza de
date.Daca
aplicatia utilizeaza mai multe baze de date,este necesar cate un
obiect
de tip TDatabase pentru fiecare dintre acestea.Controlul exercitat
asupra
conexiunii include utilizarea unei denumiri alias,specificarea unui
anumit
driver pentru realizarea conexiunii,control asupra schimburilor de
date
(tranzactiilor).In situatiile in care nu se declara in mod explicit
un
astfel de obiect,programul va crea un obiect temporar de tip
TDatabase,
care va fi utilizat doar in timpul executiei cu un set de proprietati
implicite,suficiente pentru executarea aplicatiei.Puteti declara
explicit
un astfel de obiect,ori de cate ori doriti sa alegeti driver-ul de
conexiune sau doriti sa utilizati o denumire alias pentru baza de
date.
EXEMPLU: (vezi si Prj64)
Salvati o fila noua si proiectul in Prj64.Adaugati un obiect de tip
TDataSource,un obiect TDatabase,un obiect TTable si un control
TDBGrid.
Selectati obiectul TDatabase si setati DatabaseName la valoarea
Reservat.db,apoi AliasName la valoarea DBDEMOS.In final setati
proprieta-
tea Connected la valoarea True.
Selectati obiectul Table1 si alegeti DatabaseName.Observati ca in
lista
de optiuni a aparut si Reservat.db.Selectati optiunea
Reservat.db.Apoi
setati si TableName la valoarea Reservat.db si Active la valoarea
True.
Selectati DataSource1 si setati DataSet la valoarea Table1.
Selectati DBGrid1 si setati DataSource la valoarea DataSource1.
Tastati F9 si executati aplicatia.
In situatia in care doriti sa utilizati TDatabase pentru o conexiune
cu
un tabel situat intr-un server,de exemplu un tabel de tip FoxPro,va
fi
necesar sa setati si proprietatea DriverName,care va solicita numele
uti-
lizatorului si parola de acces.Pentru tabele locale,este mai simplu
sa
mutati tabelul in directorul Demos/Data.
Observati ca pentru a intrerupe conexiunea se poate utiliza atat
pro-
prietatea Active din Table1 cat si proprietatea Connected din
Database1.
In plus,obiectul TDatabase contine si proprietatea
SessionName.Aceasta
proprietate se poate utiliza impreuna cu obiecte de tip TSession
pentru
a crea mai multe instante ale bazei de base.Fiecare instanta va fi
reali-
zata cu ajutorul unui obiect de tip TSession.Astfel,baza de date cu
care
se realizeaza conexiunea fixa,va putea fi deschisa si redeschisa,in
mod
repetat in timpul executiei,utilizand un singur obiect de tip
TDatabase.
Fiecare instanta va putea utiliza o comanda SQL diferita (vezi mai
jos).

TSession este un obiect destinat pentru a gestiona o linie de


executie,
in cadrul aplicatiilor cu comanda multipla (mai multe linii de
executie,
sau mai multe instante ale unui obiect).Pentru fiecare aplicatie
Delphi
se creaza automat si un obiect TSession implicit.Nu este necesar sa
definiti explicit un astfel de obiect,decat atunci cand proiectati
apli-
catii care au mai mult decat o linie de comanda (comenzi pe port
paralel,
sau instante multiple).Un obiect de tip TSession exercita un control
global asupra tuturor obiectelor de tip TDatabase conectate la acest
obiect.
-75-
De exemplu,daca doriti sa utilizati mai multe formule de comanda
SQL
pentru a deschide o baza de date,aceste comenzi nu vor putea fi
executate
concurential.Puteti utiliza cate un obiect TQuery pentru fiecare
comanda
si cate un obiect TSession pentru fiecare executie.
O alta situatie posibila este atunci cand utilizati mai multe baze
de
date,situate la locatii diferite,pentru a centraliza datele intr-un
singur
tabel.In acest caz,puteti utiliza cate un obiect de tip TDatabase
pentru
fiecare conexiune si un obiect TSession pentru a lega intre ele
obiectele
TDatabase utilizate pentru fiecare comanda.Se pot realiza astfel
legaturi
de tip arborescent,care pot gestiona orice situatie logica.
TSession se utilizeaza pentru a conecta intre ele mai multe
obiecte
care vor fi utilizate intr-o anumita linie de comanda.Exista trei
tipuri
distincte de aplicatii care utilizeaza TSession: standard,multifila
si
multicomanda.
Aplicatia standard este cea implicita si se implementeaza automat
pentru
orice aplicatie Delphi.
Aplicatia multifila se realizeaza atunci cand sunt necesare mai
multe
file,situate la adrese diferite in retea,pentru a centraliza datele
intr-o
singura fila locala.
Aplicatia multicomanda se realizeaza atunci cand sunt necesare mai
multe comenzi (uneori simultane) pentru a centraliza datele intr-un
singur tabel local.In acest caz,aplicatia va realiza mai multe
conexiuni
paralele cu aceeasi baza de date si va executa comenzile in sesiuni
dife-
rite.
EXEMPLU: (vezi si Prj65)
Salvati o fila noua si proiectul in Prj65.Adaugati un obiect
TDataSource,
un obiect TDatabase,2 obiecte TSession si 2 obiecte TQuery.
Selectati obiectul Database1 si setati DatabaseName la valoarea
Biolife.db
si AliasName la valoarea DBDEMOS.
Selectati Session1 si setati SessionName la valoarea Ses1 si apoi
alegeti
Session2 si setati SessionName la valoarea Ses2.
Selectati Query1 si setati DatabaseName la valoarea
Biolife.db,SessionName
la valoarea Ses1 si SQL la valoarea: SELECT Category FROM
Biolife.db
Selectati Query2 si setati DatabaseName la valoarea
Biolife.db,SessionName
la valoarea Ses2 si SQL la valoarea: SELECT * FROM Biolife.db
Apoi adaugati doua butoane,denumite Sesiunea 1 si Sesiunea 2 si
atribuiti
urmatoarele proceduri OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Session2.Active:=False;
Session1.Active:=True;
Database1.SessionName:='Ses1';
Query2.Active:=False;
Query1.Active:=True;
DataSource1.DataSet:=Query1;
end;
Observati ca una dintre liniile de comanda trebuie sa fie inactivata
in
timp ce cea de a doua linie de comanda va fi activata.Daca ambele
linii
de comanda raman activate in acelasi moment,se creaza o comanda
concuren-
tiala care returneaza un mesaj de eroare (una dintre comenzi gaseste
conexiunea "busy" deoarece este ocupata de catre cealalta comanda).

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

Obiectele de tip TStoredProc si TProvider necesita prezenta unui


server
instalat si nu vor face obiectul acestui manual.Sunt destinate pentru
a
prelua datele,sau comenzile(proceduri fixe), dintr-un server de
retea.

-78- Data Controls -


TDBGrid
Paleta de obiecte incluse sub numele de DataControls este formata
din
obiecte specializate pentru afisarea datelor (preluate dintr-o baza
de
date cu ajutorul obiectelor descrise la paleta DataAccess).Legatura
dintre
obiecte,se realizeaza de obicei cu ajutorul unui obiect de tip
DataSource.
Obiectele din acest grup,sunt obiecte vizuale si formeaza interfata
gra-
fica dintre program si utilizator.In functie de experienta si in
functie
de necesitatile de moment,programatorul va alege unul sau mai multe
astfel
de obiecte,pentru a prezenta datele,intr-un anumit fel.Pentru
tabelele
mici,cu putine date,se vor prefera obiectele care afiseaza intregul
tabel.
In cazul tabelelor mari,cu multe coloane si mii de inregistrari,se
vor
prefera obiectele care afiseaza cat mai selectiv datele dorite.
TDBGrid este obiectul care permite afisarea si editarea datelor
sub
forma de tabel.Este obiectul cel mai frecvent utilizat pentru
prezentarea
integrala a tabelelor.Datele sunt preluate de obicei de catre un
obiect
TTable sau TQuery si sunt mediate de un obiect TDataSource.
TDBGrid poate fi utilizat si pentru manipularea sau editarea
datelor,
sau pentru schimbarea aspectului (culori,fonturi etc.).Prin
proprietatea
Fields se poate accesa fiecare obiect de tip TField care formeaza
inre-
gistrarile din tabel si implicit si toate proprietatile obiectelor de
tip TField.Prin combinarea acestora,cu proprietatile specifice
obiectului
TDBGrid (destul de multe),se obtine o paleta foarte larga de
optiuni,care
permit programatorului sa personalizeze modul de prezentare a
datelor.
EXEMPLU: (vezi si Prj67)
Salvati o fila noua si proiectul in Prj67.Adaugati un obiect
TDataSource,
un obiect TTable si un obiect TDBGrid.
Selectati TTable si setati proprietatea DatabaseName la valoarea
DBDEMOS,
TableName la valoarea VENDORS.DB si Active la valoarea True.
Selectati TDataSource si setati DataSet la valoarea Table1.
Selectati TDBGrid si setati DataSource la valoarea DataSource1.
Redimensionati obiectul DBGrid1 astfel incat sa fie la
dimensiunile
dorite.Daca doriti sa umple intreaga pagina,pur si simplu setati
proprie-
tatea Align la valoarea alClient.
Pentru a schimba aspectul coloanelor,selectati proprietatea
Columns
(dublu click) si in fereastra Editing DBGrid1.Columns alegeti butonul
AddAllFields.Apoi selectati pe rand fiecare element(coloana) si
utilizati
din ObjectInspector proprietatile Color si Font pentru a selecta
paleta
de culori si de fonturi preferate.
Pentru a schimba culoarea cadrului general al tabelului puteti
utiliza
proprietatea FixedColor,iar pentru a schimba culoarea paginei in care
se
va afisa tabelul puteti utiliza proprietatea Color.
Un set suplimentar de optiuni poate fi accesat executand un dublu
click pe semnul + situat in fata proprietatii Options.
Daca doriti ca tabelul sa fie afisat doar dupa apasarea unui
buton,
setati proprietatea Visible la valoarea False si apoi adaugati o
procedura
OnClick care seteaza Visible:=True.In acest mod,un set intreg de
tabele
poate fi afisat succesiv in aceeasi fereastra de tip utilizator.
Metodele obiectului nu sunt extrem de numeroase,in schimb sunt
imple-
mentate un numar destul de mare de evenimente,care permit
transmiterea de
mesaje informative despre toate operatiile efectuate in obiect.Cele
mai
frecvent utilizate sunt OnCellClick,OnColEnter,OnColExit si
OnTitleClick.
Navigarea in tabel poate fi facilitata de un obiect de tip
TNavigator.

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

-81- Data Controls -


TDBText
TDBText este un obiect special conceput pentru prezentarea unei
singure
celule din tabel(DataField).Este similar cu un obiect TLabel
standard,dar
dar utilizeaza un component de tip DataSource pentru preluarea
datelor.
Datele afisate nu pot fi modificate (interfata ideala cu
utilizatorul).
Datele afisate sunt cele situate la pozitia actuala a cursorului
din
DataSource,pentru coloana specificata prin proprietatea
DataField.Datele
afisate se modifica o data cu deplasarea cursorului in
DataSource.Pentru
deplasare in baza de date,se poate utiliza un TDBNavigator legat de
DataSource.
Obiectele din acest tip se utilizeaza fie pentru a economisi
spatiu in
interfata cu utilizatorul,fie pentru a prezenta date din alt tabel
decat
cel prezentat in restul obiectelor din interfata (De
exemplu,utilizatorul
introduce adresa intr-un tabel de clienti,iar un obiect TDBText
afiseaza
simultan,din alta baza de date,codul postal pentru adresa
respectiva).
Se pot utiliza astfel de obiecte si pentru a afisa comparativ
datele
similare preluate din mai multe tabele (Exemplu: pretul unui produs
in
diverse oferte electronice din retea).
Dintre proprietati,pe langa DataSource si DataField,utilizate
pentru
preluarea datelor,puteti utiliza proprietatea AutoSize in cazul in
care
obiectul va prelua succesiv date cu fonturi diferite.In acest
caz,daca
AutoSize este True,obiectul se va redimensiona automat in functie de
atributele datelor preluate.
Metodele nu prezinta facilitati deosebite,in schimb TDBText este
proiectat cu un numar destul de mare de evenimente,care permit o gama
larga de aplicatii: efecte de clipire sau de schimbare a
culorii,schim-
barea fonturilor,preluarea automata a datelor,compararea automata a
datelor cu un sablon fix,filtrarea datelor,reformatarea datelor etc.
Cea mai simpla aplicatie,afiseaza selectiv un anumit tip de data:
EXEMPLU: (vezi si Prj70)
Salvati o fila noua si proiectul in Prj70.Adaugati un obiect
DataSource
un obiect TTable,un obiect TDBNavigator si 3 obiecte TDBText.
Selectati Table1 si setati Databasename=DBDEMOS,TableName=PARTS.DB si
Active=True.Selectati DataSource1 si setati DataSet=Table1.
Selectati DBNavigator1 si setati DataSource=DataSource1.
Selectati DBText1: -setati DataSource=DataSource1 si
DataField=Description
Utilizati Color si Font pentru a obtine aspectul grafic dorit.
Selectati DBText2: -setati DataSource=DataSource1 si DataField=Cost
Alegeti culoarea si fontul dorit.
Selectati DBtext3: -setati DataSource=DataSource1 si
DataField=VendorNo
Alegeti Color si Font in functie de preferinte.
Eventual,adaugati cate un camp TLabel care explica ce contine fiecare
obiect DBText.Tastati F9 si executati obiectul.
Din DBNavigator nu sunt utile decat butoanele pentru deplasare.Nu se
pot edita campurile dar se pot utiliza butoanele Insert si
Delete.Pentru
a evita stergerea nedorita a unor inregistrari,este mai bine sa
inactivati
ultimele patru butoane.
Daca datele sunt preluate dintr-o baza de date mai mare,puteti
utiliza
in loc de TTable un obiect TQuery si o formula de comanda SQL cat mai
restrictiva.De exemplu,puteti realiza un filtru care sa excluda toate
inregistrarile mai vechi de o luna.Similar,puteti realiza un filtru
care
mascheaza toate datele care nu respecta un anumit format,etc...
-82- Data Controls -
TDBEdit
TDBEdit este un obiect similar cu TDBText,dar permite si editarea
datelor afisate.Este conceput pentru aplicatii in care exista o
inter-
actiune intre utilizator si baza de date.Se utilizeaza mai ales
pentru
a actualiza anumite campuri de date,dintr-un tabel.La fel ca TDBText,
utilizeaza un obiect de tip DataSource pentru a prelua datele si
afiseaza
pozitia curenta a cursorului din DataSource,pentru coloana
specificata
prin DataField.Navigarea in baza de date se poate face cu
TDBNavigator.
TDBEdit afiseaza o singura linie de text,din tabelul selectat in
Data-
Source.La fel ca si TMaskEdit,TDBEdit poate utiliza un sablon (o
masca)
pentru a forta editarea datelor dupa un anumit format predefinit.
Pe langa proprietatile DataSource si DataField utilizate pentru
pre-
luarea datelor,TDBEdit contine si proprietatea ReadOnly care permite
sau
interzice editarea datelor afisate.Daca setati proprietatea ReadOnly
la
valoarea True,TDBEdit va fi echivalent cu un obiect TDBText.
Metodele (in principal mostenite) si evenimentele nu ofera
functio-
nalitati deosebite fata de TDBText.Practic,toate metodele proprii
sunt
implicite si nu pot fi apelate direct.
Se prefera acest tip de obiect,atunci cand doriti ca utilizatorul
sa
poata efectua modificari asupra datelor din tabel.
EXEMPLU: (vezi si Prj71)
Salvati o fila noua si proiectul in Prj71.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBNavigator si 3 obiecte TDBEdit.
Selectati Table1 si setati:
DatabaseName=DBDEMOS,Tablename=CUSTOMER.DB si
Active=True.Selectati DataSource1 si setati DataSet=Table1.
Selectati DBNavigator1 si setati DataSource=DataSource1.
Selectati DBEdit1 si setati: DataSource=DataSource1 si
DataField=Company.
Alegeti Color si Font dupa preferintele personale.
Selectati DBEdit2 si setati: DataSource=DataSource1 si
DataField=Addr1.
Setati preferintele pentru fonturi si culori.
Selectati DBEdit3 si setati DataSource=DataSource1 si
DataField=Phone.
Alegeti culorile si fonturile dorite.
Tastati F9 si executati aplicatia.Puteti utiliza butoanele pentru a
naviga in baza de date.Puteti utiliza campurile DBEdit pentru a
modifica
dupa bunul plac,datele din tabel.
Daca doriti sa preluati si sa sintetizati intr-o fila separata
doar o
parte dintre datele afisate,sau daca doriti sa arhivati modificarile
efec-
tuate,adaugati un camp TMemo si un buton cu urmatoarea procedura
OnClick:
Memo1.Lines.Add(DBEdit1.Text);
Memo1.Lines.Add(DBEdit2.Text);
Memo1.Lines.Add(DBEdit3.Text);
Memo1.Lines.Add(' *** ');
Pentru a arhiva datele,adaugati Fila1.htm in Prj71,si un buton cu
urma-
toarea procedura OnClick:
procedure TForm1.Button2Click(Sender: TObject);
var F1:TextFile;
begin
AssignFile(F1,'Fila1.htm');
Rewrite(F1);
Write(F1,Memo1.Lines.Text);
CloseFile(F1);
end;

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

TDBCheckBox este un obiect destinat pentru a compara valoarea unei


inregistrari cu o valoare fixa.Daca valoarea corespunde cu cea
comparata,
caseta va fi bifata,iar in caz contrar,caseta va fi inactivata.Este
util
mai ales in cazul coloanelor care contin date de tip boolean,unde
valoarea
inregistrarii poate fi True sau False,dar poate fi utilizat pentru
orice
tip de inregistrare.Pentru comparatie se utilizeaza cele doua
proprietati
ValueChecked si ValueUnchecked.Daca valoarea inregistrarii corespunde
cu
valoarea ValueChecked,caseta va fi bifata(activa) iar daca valoarea
inre-
gistrarii corespunde cu cea din ValueUnchecked caseta va fi inactiva.
Implicit,cele doua proprietati au valoarea True si False,dar pot fi
setate
la orice valoare de tip string.
EXEMPLU: (vezi si Prj76)
Salvati o fila noua si proiectul in Prj76.Adaugati un obiect
TDataSource,
un obiect TQuery,un obiect TDBGrid,un obiect TDBNavigator si 3
obiecte
TDBCheckBox.
Selectati Query1 si setati DatabaseName=DBDEMOS,apoi introduceti in
SQL
urmatoarea comanda: SELECT Addr1,Company FROM CUSTOMER.DB
Setati DataSource1 la: DataSet=Query1.
Setati DBGrid1 la: DataSource=DataSource1.
Setati DBNavigator la: DataSource=DataSource1.
Setati DBCheckBox1 la: DataSource=DataSource1 si DataField=Company,
si
ValueChecked=Unisco.
Eventual schimbati culoarea si fontul cu Color si Font.

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

TDBRadioGroup este un obiect care grupeaza mai multe butoane de


tip
radio,pentru a permite actualizarea rapida a unei baze de
date.Fiecare
buton radio are setata o anumita valoare constanta.TDBRadioGroup este
in
conexiune permanenta cu o baza de date,prin intermediul unui obiect
de tip
TDataSource.In momentul in care unul dintre butoane este setat
Checked,
valoarea acestui buton va actualiza automat inregistrarea curenta din
baza de date.Reciproc,atunci cand valoarea din inregistrarea curenta
este
identica cu valoarea butonului,butonul va fi afisat
Checked(selectat).
Pentru a introduce butoanele radio se utilizeaza proprietatea Items
iar
pentru a introduce valoarea atribuita fiecarui buton se utilizeaza
pro-
prietatea Values.Pentru ca butoanele sa fie afisate intr-o singura
coloana
sau in mai multe coloane se va utiliza proprietatea Columns.
Butoanele grupate in obiect sunt interconectate,astfel incat
atunci
cand unul dintre butoane este selectat,restul butoanelor vor fi
deselecta-
te automat.Pentru a respecta aceasta caracteristica a obiectului nu
atri-
buiti aceeasi valoare pentru doua sau mai multe butoane.Fiecare buton
trebuie sa aiba o valoare distincta.
Acest gen de obiect este foarte util,mai ales atunci cand exista
un
numar limitat de variante,pentru datele ce urmeaza sa fie introduse
intr-un tabel,sau atunci cand se utilizeaza pentru actualizarea
datelor
doar doua sau mai multe valori constante (Exemplu: se actualizeaza
data
calendaristica limita,pentru o anumita inregistrare din tabel).Se
poate
realiza un modul separat,destinat special pentru actualizarea
datelor.

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

TDBLookupListBox este un obiect asemanator cu TDBListBox,dar


pentru
popularea listei de optinui utilizeaza un obiect DataSource secundar
cu
care preia datele dintr-o baza de date.Astfel,TDBLookupListBox este
in
conexiune cu doua baze de date: una in care scrie datele si una din
care
preia valorile din lista de optiuni.Pentru popularea listei de
optiuni se
utilizeaza proprietatile ListSource,KeyField si ListField.In
rest,proprie-
tatile,metodele si evenimentele sunt identice cu cele ale obiectului
TDB-
ListBox.Se utilizeaza pentru a actualiza o baza de date cu ajutorul
unei
alte baze de date.
EXEMPLU: (vezi Prj78)
Se va utiliza copia de siguranta a tabelului Venues.db (FR2.DBF).
Salvati o fila noua si proiectul in Prj78.Adaugati 2 obiecte
TDataSource,
2 obiecte TTable,un obiect TDBGrid si un obiect TDBLookupListBox.
Setati Table1 la:
DataBaseName=DBDEMOS,TableName=FR2.DBF,Active=True.
Setati DataSource1 la: DataSet=Table1.
Setati DBGrid1 la: DataSource=DataSource1.
Setati Table2 la:
DatabaseName=DBDEMOS,TableName=VENUES.DB,Active=True.
Setati DataSource2 la: DataSet=Table2.
Setati BDLookupListBox la: DataField=Venue,DataSource=DataSource1,
KeyField=Venue,ListSource=DataSource2.
Tastati F9 si executati aplicatia.In DbLookupListBox se vor afisa
valorile
din coloana Venue din baza de date VENUES.DB.
Alegeti valoarea din Venues.db care corespunde cu restul
inregistrarii
si executati un click de mouse.Repetati operatia,pana cand datele din
FR2.DBF(modificate anterior) corespund cu cele din VENUES.DB.
-89- TDBLookupComboBox si
TDBRichEdit
TDBLookupComboBox este asemanator cu TDBLookupListBox,dar
utilizeaza
un obiect ComboBox pentru afisarea listei de optiuni.Ca
rezultat,ocupa
mai putin loc intr-o interfata grafica si este preferat atunci cand
uti-
lizati mai multe astfel de obiecte (cate unul pentru fiecare
coloana),
pentru a actualiza o baza de date.Se pot utiliza mai multe obiecte de
acest gen si pentru a actualiza o baza de date cu date preluate din
mai
multe tabele.Fiecare obiect TDBLookupComboBox va face conexiunea
intre
cele doua baze de date.Se utilizeaza la fel ca si TDBLookupListBox.
Exemplu: (vezi Prj79)
Exemplul este identic cu Prj78,dar se apeleaza la un obiect de tip
TDB-
LookupComboBox in loc de TDBLookupListBox.Incercati sa editati un
exer-
citiu in care sa utilizati doua sau mai multe astfel de
obiecte,pentru
a actualiza o baza de date cu informatii preluate din 3-4 tabele.

TDBRichEdit este un obiect asemanator cu TDBMemo si este destinat


pentru a afisa date de tip caracter,in format mare,cu mai multe
randuri
si cu un anumit format al paginei (spatii goale,paragrafe etc.).Se
utilizeaza impreuna cu baze de date care contin campuri de tip BLOB,
(BLOB=Binary large objects).Spre deosebire de TDBMemo,datele afisate
vor
respecta formatul initial al textului si atunci cand exista spatii
goale,
paragrafe,spatii tab,minitabele etc.
Proprietatile ReadOnly,WantTabs,AutoDisplay etc. sunt la fel ca
pentru
TDBMemo.Obiectul nu prezinta alte particularitati
semnificative.Metodele
mostenite da la ancestorul TCustomRichEdit permit operatii asupra
textului
(Clear,FindText.GetSelTextBuf) sau permit imprimarea textului
(Print).
EXEMPLU: (vezi si Prj80)
Salvati o fila noua si proiectul in Prj80.Adaugati un obiect
TDataSource,
un obiect TTable,un obiect TDBRichEdit si un obiect TDBImage.
Setati Table1 la:
DatabaseName=DBDEMOS,TableName=BIOLIFE.DB,Active=True.
Setati DataSource1 la: DataSet=Table1.
Setati DBRichEdit1 la: DataSource=DataSource1 si DataField=Notes.
Setati DBImage1 la: DataSource=DataSource1 si DataField=Graphic.
Pentru a putea naviga in baza de date,adaugati si un obiect
DBNavigator
si setati proprietatea DataSource la valoarea DataSource1.
Redimensionati obiectele astfel incat sa asigure o vizibilitate
completa
a datelor prezentate.Eventual inactivati butoanele inutile din
obiectul
DBNavigator.Obiectele nonvizuale (DataSource1 si Table1 se pot
suprapune
peste cele vizuale).Tastati F9 si executati aplicatia.
Daca doriti sa adaugati si o procedura de cautare a unui anumit
fragment
de text,adaugati un obiect TEdit,un buton si urmatoarea procedura
OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var tip1:TSearchTypes;
rezultat:variant;
begin
rezultat:=DBRichEdit1.FindText(Edit1.Text,0,2000,tip1);
Edit1.Text:=rezultat;
end;
Introduceti un text oarecare in Edit1 si apasati butonul.Daca textul
se
regaseste in obiectul DBRichEdit,Edit1 va afisa pozitia la care
incepe
textul cautat,iar in caz contrar va afisa -1.
Puteti utiliza TDBRichEdit pentru a edita bazele de date,in timp
real.

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

TSavePictureDialog este un obiect destinat pentru alegerea si


salvarea
filelor de tip grafic.Obiectul apeleaza prin metoda Execute,caseta de
dialog de tip Windows.Este identic cu TSaveDialog,dar prezinta si un
camp
Preview in care fila selectata poate fi afisata inainte de a fi
deschisa
si/sau salvata.Se utilizeaza la fel ca TSaveDialog.In cazul in care
doriti
sa salvati o fila din proiect,utilizati obiectul ca atare.In cazul in
care
doriti sa navigati prin memorie,sa alegeti o anumita fila si apoi sa
sal-
vati fila in directorul initial,alegeti Options si setati
ofNoChangeDir la
valoarea TRUE.
EXEMPLU: (vezi si Prj90)
Salvati o fila noua si proiectul in Prj90.Adaugati un obiect
TSavePicture-
Dialog,un buton si un camp TImage.
Alegeti SavePictureDialog1 si setati Options/ofNoChangeDir=True.
Alegeti butonul si adaugati urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var rez:variant;
begin
rez:=SavePictureDialog1.Execute;
if rez = -1 then
begin
Image1.Picture.LoadFromFile(SavePictureDialog1.FileName);
Image1.Picture.SaveToFile('Desen1.bmp');
end;
end;
Tastati F9 si executati aplicatia.Alegeti orice fila de tip .BMP si
apoi
apasati butonul Save.Fila selectata va fi salvata in directorul Prj90
cu
numele de Desen1.bmp,deoarece proprietatea NoChangeDir=True forteaza
revenirea la directorul initial,imediat dupa apasarea butonului Save.
Puteti utiliza Filter pentru a modifica tipurile acceptabile.

-100- Dialogs -TFontDialog-


TColorDialog
TFontDialog este un obiect destinat pentru schimbarea fonturilor
in
timpul executiei unui program.Apeleaza prin metoda Execute,caseta de
dia-
log de tip Windows in care se poate alege tipul,stilul si dimensiunea
fonturilor utilizate.Fontul ales va fi salvat in proprietatea Font si
va
putea fi transferat la orice alt font din aplicatie.
EXEMPLU: (vezi si Prj91)
Salvati o fila noua si proiectul in Prj91.Adaugati un obiect
TFontColor,
un buton si un camp TLabel.
Setati Label1.Caption=Textul initial.
Selectati butonul si adaugati urmatoarea procedura OnClick:
peocedure TForm1.Button1Click(Sender: TObject);
begin
FontDialog1.Execute;
Label1.Font:=FontDialog1.Font;
Label1.Caption:='Text editat cu fontul ales !';
end;
Tastati F9 si executati aplicatia.Alegeti un font oarecare.In mod
similar,
fontul selectat poate fi transferat la orice alt font din obiectele
inclu-
se in aplicatie(TMemo,TEdit...etc.).
Proprietatile Device,Font,MaxFontSize si MinFontSize se pot utiliza
pentru
a alege tipurile de fonturi accesibile.Proprietatea Options modifica
modul de afisare si comportamentul casetei de dialog.

TColorDialog este un obiect destinat pentru selectarea


culorii.Prin
metoda Execute,obiectul apeleaza caseta de dialog de tip Windows in
care
se poate selecta culoarea dorita.Culoarea selectata se va arhiva
automat
in proprietatea Color,de unde va putea fi transferata la orice alt
obiect
din aplicatie.
EXEMPLU: (vezi si Prj92)
Salvati o fila noua si proiectul in Prj92.Adaugati un buton si un
obiect
de tip TColorDialog.Selectati butonul si adaugati urmatoarea
procedura
OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
ColorDialog1.Execute;
Form1.Color:=ColorDialog1.Color;
end;
Tastati F9 si executati aplicatia.Alegeti una dintre culorile
definite in
paleta Basic colors si apoi apasati butonul OK.Fereastra Form1 va fi
colorata in culoarea selectata.In mod similar,puteti transfera
culoarea
la orice obiect de tip TColor din aplicatie.
Daca doriti sa utilizati o nuanta oarecare,apasati butonul Define
Cus-
tom Colors,apoi setati valorile numerice sau deplasati sageata neagra
si
indicatorul mouse pana cand obtineti nuanta dorita (care va fi
afisata in
campul Color|Solid),apoi apasati butonul Add to Custom colors si
alegeti
din paleta Custom colors nuanta respectiva.
Nuantele pot fi adaugate si in ObjectInspector,prin setarea
proprieta-
tii CustomColors (un sir de forma Color = valoarea hexazecimala).
Exemplu: ColorA=808022.
Proprietatea Options personalizeaza caseta de dialog (Exemplu:
cdPrevent-
FullOpen blocheaza paleta pentru nuantele nou definite ).

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

TPrinterSetupDialog este un obiect destinat pentru modificarea


unor
caracteristici de imprimare in timpul executiei.Prin metoda Execute,
obiectul apeleaza caseta de dialog de tip Windows in care se poate
seta
dimensiunea si formatul paginei editate sau se poate alege imprimata
care
va executa operatia (daca exista mai multe imprimante in stare de
astep-
tare,adica pornite si incarcate cu hartie).
EXEMPLU: (vezi Prj93)
Deschideti proiectul Prj93 (vezi mai sus).Adaugati un buton si un
obiect
TPrinterSetupDialog.Atribuiti butonului urmatoarea procedura OnClick:
procedure TForm1.Button3Click(Sender : TObject);
begin
PrinterSetupDialog1.Execute;
end;
Tastati F9 si executati aplicatia.Butonul adaugat (denumit Setup) va
permite sa modificati dimensiunea si formatul paginei,astfel incat
textul
redactat in RichEdit1 sa fie cat mai bine incadrat si aspectat.
Obiectul nu are alte proprietati sau metode deosebit de utile.

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

TReplaceDialog este un obiect destinat pentru actualizarea


textelor.
Practic,selecteaza un anumit sir de caractere,la fel ca TFindText si
apoi
inlocuieste sirul respectiv (FindText) cu cel specificat de
utilizator in
ReplaceText.Pentru acest scop,prin metoda Execute,obiectul apeleaza o
caseta de dialog de tip Windows in care se pot seta ambele
proprietati:
FindText si ReplaceText.Apasand butoanele Replace sau ReplaceAll,se
va
apela evenimentul OnReplace,care trebuie sa contina procedura
propriu-zisa
de inlocuire a textului specificat(puteti edita proceduri complexe).
EXEMPLU: (vezi Prj94)
Deschideti Prj94(vezi mai sus) si adaugati un obiect TReplaceDialog
si
un buton.Atribuiti butonului urmatoarea procedura OnClick:
procedure TForm1.Button2Click(Sender: TObject);
begin
ReplaceDialog1.Execute;
end;
Selectati ReplaceDialog1 si adaugati urmatoarea procedura OnReplace:
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
var reppos:variant;
begin
reppos:=Pos(ReplaceDialog1.Findtext,Memo1.Text);
Memo1.SelStart:=reppos-1;
Memo1.SelText:=ReplaceDialog1.ReplaceText;
end;
-103- Win
3.1
Paleta de componente denumita Win3.1 contine obiecte preluate de
la
versiunile Delphi anterioare.Aceste obiecte au fost mentinute doar
pentru
a pastra compatibilitatea cu programele mai vechi care contin astfel
de
obiecte.Majoritatea lor au fost inlocuite in Win32 cu obiecte mai
noi,mai
perfectionate.Pentru editarea de programe noi,este recomandabil sa
utili-
zati obiectele actualizate din Win32:

Obiectul Win 3.1 Obiectul actual Paleta de obiecte

DBLookupList DBLookupListBox Data Controls


DBLookupCombo DBLookupComboBox Data Controls
TabSet TabControl Win32
Outline TreeView Win32
Header HeaderControl Win32
NoteBook PageControl Win32
TabbedNoteBook PageControl Win32

Win 3.1 contine si patru obiecte care nu au fost modificate,dar


pot fi
utilizate pentru a prelua informatii despre unitatile de
memorie,dosare si
file impreuna cu calea de acces la fila.Puteti utiliza aceste obiecte
pentru a realiza o interfata in care utilizatorul poate selecta orice
fila de pe disc (vezi Prj95).
TFileListBox - este un obiect specializat care afiseaza toate
filele
din directorul curent.Numele si calea de acces la fila selectata se
va
arhiva automat in proprietatea Filename.Pentru a selecta doar un
anumit
tip de file,obiectul poate fi conectat la un obiect de tip
TFilterComboBox
care va permite afisarea,doar pentru filele specificate in
proprietatea
Filter.Conectarea se face in obiectul FilterComboBox cu ajutorul
prprie-
tatii FileList.Pentru a putea afisa filele din alt director decat cel
curent,obiectul TFileListBox se poate cupla cu un obiect
TDirectoryListBox
prin proprietatea Directory si evenimentul OnChange (vezi
Prj95).Pentru
a putea schimba in timpul executiei si unitatea de memorie din care
se
citesc filele afisate,se poate adauga si un obiect de tip
TDriveComboBox
iar conectarea se va face prin proprietatea Drive si evenimentul
OnChange.
Cele patru obiecte se utilizeaza de obicei impreuna,pentru a
realiza
o interfata completa.Limitarea filelor afisate se poate face si prin
pro-
prietatea Mask,care este setata implicit la *.*.Inlocuiti aceasta
expresie
cu orice expresie valida (Exemple: *.EXE sau *.TXT).Dintre
metode,trebuie
remarcata metoda Update care va fi apelata ori de cate ori a fost
schimbat
directorul curent,sau proprietatea Mask.
TDirectoryListBox este un obiect specializat pentru a afisa
directoare-
le de pe unitatea curenta de disc.Prin proprietatea Drive se poate
cupla
cu un obiect TDriveComboBox,astfel incat utilizatorul sa poata
schimba
activ unitatea de memorie pentru care se afiseaza directoarele.Dupa
fie-
care actualizare,se va apela metoda Update prin evenimentul OnChange.
Metodele OpenCurrent,GetItemPath si FileCompareText se pot utiliza
pentru
a deschide automat un anumit director (fara a fi nevoie sa fie
selectat
cu mouse).Pentru a cupla obiectul cu un obiect TFileListBox se poate
utiliza proprietatea FileList.
Pentru a deschide un director se va executa un dublu click pe
director-
ul respectiv.Directorul selectat este arhivat automat in Directory.

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

TSpinButton este un obiect asemanator cu TUpDoun (din Win32) si


este
destinat pentru a putea incrementa sau decrementa o anumita
valoare,sau
pentru a putea deplasa cursorul intr-o lista,etc.Practic,obiectul
ofera
o interfata grafica pentru a actiune de incrementare sau
decrementare.
EXEMPLU: (vezi si Prj98);
Salvati o fila noua si proiectul in Prj98.Adaugati un obiect
TSpinButton
si un camp TLabel.Editati cate o procedura pentru cele doua
evenimente:
OnDownClick si OnUpClick ale obiectului SpinButton1:
Adaugati in sectiunea "public" din interfata : nr:longint apoi:
procedure TForm1.SpinButton1DownClick(Sender: TObject);
var r1:variant;
begin
nr:=nr-1;
r1:=nr;
Label1.Caption:=r1;
end;
si: procedure TForm1.SpinButton1UpClick(Sender: TObject);
var s1:variant;
begin
nr:=nr+1;
s1:=nr;
Label1.Caption:=s1;
end;
Setati dimensiunile,fonturile si culorile.Eventual schimbati
DownGlyph si
UpGlyph (din Images/Buttons).Tastati F9 si executati aplicatia.
-107-
TSpinEdit este un obiect asemanator cu TSpinButton,dar este mai
elabo-
rat.Contine un camp TEdit in care este afisata valoarea
initiala,specifi-
cata prin proprietatea Value,permite fixarea unei valori minime prin
pro-
prietatea MinValue si a unei valori maxime prin proprietatea
MaxValue.
Obiectul contine functiile interne pentru incrementare si
decrementare si
permite specificarea fiecarui salt/operatie prin proprietatea
Increment.
Mai mult,se poate regla si viteza de executie prin specificarea
pauzei
dintre doua operatii succesive (InitRepeatpause si RepeatPause).In
rest,
contine o serie de proprietati care permit schimbarea aspectului
grafic.
EXEMPLU: (vezi si Prj99)
Salvati o fila noua si proiectul in Prj99.Adaugati un obiect
TSpinEdit si
un obiect TLabel.
Setati culorile si fonturile dorite.
Alegeti SpinEdit1 si setati: Increment=5,MaxValue=50,MinValue=-25 si
Value=10,apoi adaugati urmatoarea procedura OnChange:
procedure TForm1.SpinEdit1Change(Sender: TObject);
var r1:variant;
begin
r1:=SpinEdit1.Value;
Label1.Caption:=r1;
end;
Tastati F9 si executati aplicatia.Obiectul functioneaza intre -25 si
50.

TDirectoryOutline - este un obiect specializat pentru prezentarea


gra-
fica a directoarelor arhivate in unitatea de memorie curenta.Se
utilizeaza
pentru orientare sau pentru a deschide un anumit director,in timpul
exe-
cutiei unui program.Se poate utiliza si pentru a schimba unitatea de
me-
morie (Drive).Obiectul afiseaza o caseta de dialog de tip Windows in
care directoarele sunt prezentate utilizand resursele grafice ale
siste-
mului Windows.Daca doriti sa utilizati alte imagini grafice,puteti
utili-
za proprietatile PictureClosed,PictureLeaf si PictureOpen pentru a
incarca alte file de tip .BMP care sa determine aspectul
grafic.Pentru a
prelua calea de acces la directorul curent,puteti utiliza
proprietatea
Directory iar pentru a schimba unitatea de memorie,proprietatea
Drive.
EXEMPLU: (vezi si Prj100)
Salvati o fila noua si proiectul in Prj100.Adaugati un obiect
TDirectory-
Outline,un camp Tlabel si un buton.
Pentru DirectoryOutline1 adaugati urmatoarea proprietate OnChange:
procedure TForm1.DirectoryOutline1Change(Sender: TObject);
begin
Label1.Caption:=DirctoryOutLine1.Directory;
end;
Pentru buton adaugati urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: Tobject);
begin
DirectoryOutline1.Drive:='A';
end;
Tastati F9 si executati aplicatia.In mod similar puteti adauga cate
un
buton pentru fiecare unitate de memorie instalata.Daca doriti alte
desene
pentru reprezentarea directoarelor,adaugati in Prj100 alte file
.BMP(mici)
si apoi incarcati aceste file in
PictureClosed,PictureLeaf,PictureOpen.

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

TIBEventAlerter este un obiect simplu destinat pentru a afisa la


co-
manda o agenda de lucru.Datele afisate pot fi setate in etapa de
design
sau pot fi preluate automat dintr-o baza de date oarecare.Datele pot
fi
modificate si in timpul executiei,dar valoarea actualizata nu va fi
per-
manenta decat pe perioada de executie a instantei respective.
EXEMPLU: (vezi si Prj102)
Salvati o fila noua si proiectul in Prj102.Adaugati un obiect
TIBEvent-
Alerter si un buton.
Selectati obiectul IBEventsAlerter si utilizati proprietatea Events
pentru
a scrie o agenda de lucru a zilei respective,sau un set de informatii
pe
care doriti sa le puteti afisa in timpul executiei (informatii
Help,date
despre autor etc).Daca doriti,puteti scrie o procedura automata prin
care
Events se poate actualiza cu date preluate dintr-o baza de date.
Apoi selectati butonul si adaugati urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var r:boolean;
s:TStrings;
begin
s:=IBEventAlerter1.Events;
r:=EditAlerterEvents(s)
end;
Verificati daca in lista de unitati figureaza si unitatea Ibevnts.In
caz
contrar adaugati si aceasta unitate,apoi tastati F9 si executati
aplicatia
La apasarea butonului se va afisa o caseta de dialog cu datele din
Events.
Puteti utiliza mai multe obiecte de acest gen si butoanele
corespunzatoare
pentru a afisa selectiv orarul scolar,programul unui congres...etc.

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

TChartfx este un obiect specializat pentru reprezentari


grafice.Pentru
specificarea preferintelor,adaugati in Form un astfel de obiect,apoi
executati un click drept de mouse si alegeti Properties (vezi si
Prj103).
Fereastra de dialog afisata permite o serie intreaga de
setari.Alegeti
tipurile si valorile dorite.Pentru a putea schimba setarile si in
timpul
executiei,alegeti optiunea Tools si executati un click pe butonul
ToolBar,
apoi confirmati cu Apply.Observati ca in imagine a aparut o bara de
butoane,cu reprezentarea grafica sugestiva pentru rostul lor.
Tastati F9 si executati aplicatia.Observati ca apasand butoanele se
va
schimba forma de prezentare a datelor,sau puteti adauga grile de
marcaj,
texte si indicatoare de nivel,fonturi si culori etc.
Pentru a afla functia fiecarui buton fixati indicatorul mouse pe
butonul respectiv si executati un click de mouse cu butonul
drept( doar
in timpul executiei).
-110-
Pentru a modifica setul de butoane afisate,inchideti
aplicatia,alegeti
din nou Properties,apoi Tools si apasati butonul situat dupa butonul
CheckBtn ToolBar.Pentru a alege sau a elimina o optiune executati un
click
de mouse pe desenul care o reprezinta.Cele excluse vor fi inconjurate
de
un cerc rosu.
Datele afisate automat sunt generate de o functie aleatoare.Pentru
a
determina numarul de coloane si numarul de elemente
reprezentate,alegeti
Data Values si setati optiunile Series si Points.
Daca doriti sa schimbati valorile generate aleator,cu valorile
dorite
de d-voastra,adaugati in bara de instrumente si butonul Tools
(simbolizat
de un ciocan).Executati aplicatia.Apasati butonul Tools si selectati
optiunea DataEditor.In grila afisata,modificati valorile dupa bunul
plac,
apoi alegeti din nou Tools si deselectati optiunea Data Editor.
Acum datele prezentate vor contine valorile setate de d-voastra.
Puteti arhiva,sau puteti imprima graficul obtinut (in caz contrar
datele
se sterg si la relansarea aplicatiei vor fi afisate date aleatoare).
Daca salvati datele,puteti utiliza butonul "Import from a file"
pentru
a relua datele salvate,ori de cate ori doriti.
Obiectul permite reprezentari complexe,poate fi personalizat in
mii si
milioane de forme de prezentare.Daca doriti sa utilizati si functii
sau
proceduri automate pentru manipularea datelor,va trebui sa deschideti
fila chartfx3 si sa identificati singuri mijloacele de implementare.

TVSSpell - este un obiect destinat pentru verificarea greselilor


de
ortografie.Obiectul poate fi utilizat pentru 28 de limbi straine
(inclusiv
limba romana),dar versiunea inclusa in Delphi nu contine decat
dictiona-
rul limbii engleze (inclus in fila american.vtd).Definitia obiectului
este
in fila vcspell3.Puteti utiliza aceasta fila daca doriti sa editati
pro-
grame si aplicatii cu acest obiect.O solutie simpla de exploatare
este:
EXEMPLU: (vezi si Prj104)
Salvati o fila noua si proiectul in Prj104.Adaugati un obiect
TVSSpell,
doua campuri TMemo si un buton.
Puteti utiliza Memo1.Lines pentru a introduce un text oarecare (in
limba
Engleza) sau puteti introduce datele daor in timpul executiei.
Pentru a verifica ortografia textului introdus in Memo1,alegeti
butonul
si adaugati urmatoarea procedura OnClick:
TForm1.Button1Click(Sender: TObject);
begin
Memo2.Clear;
VSSpell1.CheckText:=Memo1.Text;
if VSSPell1.ResultCode = 0 then
Memo2.Lines.Add(VSSpell1.Text);
end;
Tastati F9 si executati aplicatia.Introduceti in Memo1 cuvinte in
limba
Engleza,apoi apasati butonul pentru confirmare.Daca textul este
corect,
va fi copiat in Memo2.Daca exista greseli de ortografie,se va afisa
automat fereastra de dialog "sentence" in care puteti observa si
corecta
cuvantul gresit.Pentru sugestii apasati butoanele Suggestions
(amandoua).
Exemplu: introduceti si verificati cuvantul (gresit) "wayq".
Puteti adauga si o procedura automata de salvare a textului
verificat.
Este un obiect simplu,economic,util,usor de implementat.

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

TGraph -este tot un obiect destinat pentru reprezentari grafice si


a
fost conceput de Bits Per Second Ltd.Versiunea inclusa in Delphi este
destul de simpla,dar poate fi foarte utila pentru a reprezenta un
numar
limitat de date.Spre deosebire de obiectele anterioare,tipurile de
repre-
zentare includ si grafice liniare de tip logaritmic sau reprezentarea
in
coordonate polare.Pentru setarea optiunilor se utilizeaza
Properties,dupa
un click de mouse drept in aria obiectului.
EXEMPLU: (vezi si Prj107)
Salvati o fila noua si proiectul in Prj107.Adaugati un obiect
TGraphic.
Executati un click de mouse drept si alegeti Properties.Obiectul
afiseaza
implicit un set de valori aleatorii.Pentru a reprezenta valorile
dorite
de d-voastra alegeti optiunea Graph si deselectati butonul
RandomData.
Alegeti numarul de coloane si de valori in casetele NumSets si
NumPoints.
Apoi alegeti tipul de grafic din Graph_Type.Eventual schimbati
culorile
si paleta de culori.Pentru a introduce datele selectati optiunea Data
si
apoi introduceti valorile pe rand,in GraphData astfel incat pentru
fiecare
valoare sa corespunda alt index ThisPoint(utilizati butoanele
sageata).
Practic introduceti prima valoare,confirmati cu Apply,apoi apasati
sageata
in sus pana se afiseaza ThisPoint:2.Introduceti cea de a doua valoare
si
confirmati cu Apply.Apasati sageata pentru ThisPoint: 3 apoi
introduceti
valoarea si confirmati cu Apply...etc.
Restul optiunilor sunt pentru personalizarea
obiectului:culori,texte,
legenda,axe,fonturi,titluri etc.
Pentru setarea aspectului general si/sau pentru imprimarea datelor
se
poate utiliza optiunea General.
Setati toate optiunile dorite,apoi tastati F9 si executati obiectul.

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

-119- Drag and


Drop
Una dintre cele mai spectaculoase facilitati oferite de sistemul
de
operare Windows poarta numele de "Drag and Drop" si consta din
posibili-
tatea de a trage un obiect peste altul,pentru a transmite obiectului
tinta o serie de date sau de proprietati.Exemplul clasic este atunci
cand trageti o fila intr-un fisier,pentru a fi arhivata.
Pentru a realiza acest gen de interactiune grafica,Windows
utilizeaza
un set intreg de mesaje si un grup de proceduri specifice.In Delphi,
aceste operatii sunt simplificate de faptul ca programatorul nu
trebuie
sa tina evidenta mesajelor Windows (Delphi organizeaza toate
mesajele).
Operatia poate fi subimpartita in patru etape succesive:
1.Initierea operatiei de tragere (controlata prin proprietatea
DragMode
si prin evenimentul BeginDrag).
2.Acceptarea obiectului suprapus (controlata prin evenimentul
OnDragOver).
3.Eliberarea obiectului tras (conrolata prin evenimentul OnDragDrop).
4.Finalizarea operatiei (controlata prin evenimentul OnEndDrag).
Pentru fiecare dintre aceste etape,se poate redacta o procedura
speci-
fica si se pot seta proprietatile obiectului,astfel incat la
sfarsitul
operatiei sa se obtina rezultatul scontat.
Obiectele care pot beneficia de aceasta facilitate au in Object
Inspec-
tor proprietatile DragCursor si DragMode.Pentru a simplifica operatia
de
tragere,setati DragMode la valoarea dmAutomatic.
EXEMPLU: (vesi si Prj118)
Salvati o fila si proiectul in Prj118.Adaugati un camp TLabel si un
buton.
Vom utiliza "drag and drop" pentru a transmite butonului textul din
Label1.Caption.
Selectati Label1 si setati Caption la textul dorit.Apoi setati
proprieta-
tea DragMode=dmAutomatic.Din Events alegeti OnClick si adaugati
urma-
toarea procedura:
procedure TForm1.Label1Click(Sender: TObject);
begin
BeginDrag(true);
EndDrag(true);
end;
Apoi alegati evenimentul OnDragEnd si adaugati urmatoarea procedura:
procedure TForm1.Label1EndDrag(Sender,Target: TObject;X,Y:
Integer);
begin
Button1.Caption:=Label1.Caption;
end;
Tastati F9 si executati aplicatia.In timpul executiei executati un
clic
pe campul Label si si apoi eliberati butonul.Observati ca indicatorul
mouse are alt cursor.Procedura din OnEndDrag se va executa indiferent
de
pozitia in care eliberati cursorul,deoarece nu a fost fixata nici o
restrictie (implicit toate obiectele au proprietatea Accept=True).
Acceasi operatie putea fi efectuata si direct,dar prin initierea unui
proces de "drag and drop",Windows va aloca pentru operatie un spatiu
suplimentar de memorie,va transmite un set intreg de mesaje si va
activa
o serie intrega de functii si proceduri care pot fi apelate pentru a
obtine diferite efecte,pentru a executa mai multe operatii simultan,
pentru a verifica si filtra datele preluate,pentru a schimba formatul
sau
aspectul datelor,pentru a executa o copie de siguranta sau pentru a
executa si o serie de operatii invizibile pentru utilizator.
-120-
De exemplu,pentru a prezenta datele in alt format decat cel in
care au
fost preluate:
EXEMPLU: (vezi si Prj119)
Salvati o fila noua si proiectul in Prj119.Adaugati doua campuri
Tlabel si
un obiect TComboBox.Alegeti fonturi,culori si dimensiuni diferite
pentru
cele doua campuri TLabel si setati Label1.DragMode=dmAutomatic.Apoi
includeti in ComboBox1.Items lista de texte dorita.
Pentru ComboBox1 alegeti evenimentul OnChange si adaugati procedura:
TForm1.ComboBox1Change(Sender: tObject);
begin
Label1.Caption:=ComboBox1.Text;
end;
Pentru Label alegeti evenimentul OnClick si adaugati urmatoarea
procedura
procedure TForm1.Label1.Click(Sender: TObject);
begin
Label1.BeginDrag(true);
Label1.EndDrag(true);
end;
Apoi alegeti evenimentul OnEndDrag si adaugati procedura:
procerdure TForm1.Label1EndDrag(Sender,Target: TObject;X,Y:
Integer);
begin
Label2.Caption:=Label1.Caption:
end;
Tastati F9 si executati aplicatia.Selectati texte din TComboBox,apoi
executati un click in Label1 pentru a transfera datele in
Label2.Even-
tual puteti adauga un filtru in Label1EndDrag astfel incat anumite
combinatii de caractere sa fie excluse de la transfer (gen
imprecatii).
Pentru ca operatia de "drag and drop" sa se desfasoare doar in
anu-
mite conditii,se va utiliza si Accept din OnDragOver:
EXEMPLU: (vezi si Prj120)
Salvati o fila noua si proiectul in Prj120.Adaugati un obiect TImage
si
utilizati Picture pentru a incarca o
imagine(Images/Splash/16color/Athena)
apoi selectati evenimentul OnMouseDown si adaugati urmatoarea
procedura:
procedure TForm1.Image1MouseDown(Sender: TObject;Button:
TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if ssCtrl in Shift then Image1.BeginDrag(true);
end;
In acest fel,operatia de "drag and drop" nu va fi initiata decat daca
se
apasa si tasta Ctrl in timp ce se executa un click de mouse.
Selectati Form1,alegeti evenimentul OnDragOver si adaugati procedura:
procedure TForm1.FormDragOver(Sender,Source: TObject; X,Y :
Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=(Source is TImage);
end;
Observati ca procedura adauga doua informatii esentiale: Accept este
diferit de False si Source este TImage.Cu alte cuvinte,obiectul care
accepta operatia de drag and drop este un obiect de tip TImage.
Pentru a trage obiectul Image1 se poate pastra DragMode la valoarea
dmManual,deoarece exista deja o selectie clara a obiectului activ.

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

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