You are on page 1of 197

Copie autorizata pentru studenii CFBC

Prefa

Sistemul Borland C++ Builder (BCB) este unul dintre cele mai
moderne i mai rspndite sisteme de programare vizual. El conine
instrumente eficiente de elaborare a aplicaiilor de tip Windows, client-server
etc. Avnd drept limbaj de programare C++ (derivat din limbajul C), este n
acelai timp unul dintre cele mai potrivite pachete pentru nvarea programrii
orientate spre obiecte i a celei vizuale.
Prezenta lucrare este un ghid de iniiere n programarea vizual i
programarea orientat spre obiecte cu ajutorul sistemului BCB. Este structurat
n trei capitole, care ofer informaii de baz i exemple demonstrative, menite
s ilustreze aspectele teoretice.
n capitolul I (denumit Platforma BCB) snt descrise modalitile de
utilizare a componentelor specifice majoritii aplicaiilor tip Windows,
precum i algoritmii de elaborare a astfel de aplicaii (inclusiv a celor de
prelucrare a informaiei grafice).
Crearea i gestionarea bazelor de date este una dintre cele mai prioritare
domenii ale programrii. Sistemul Borland C++ Builder conine un set de
utilitare, care permit crearea i/sau ntreinerea bazelor de date, inclusiv de tip
FoxPro, MySQL, Access, Oracle, etc. Algoritmii de lucru cu bazele de date
snt descrii n capitolul II Prelucrarea bazelor de date.
n capitolul III (denumit Programarea Orientat spre Obiecte cu
C++) snt explicate caracteristicile limbajului C++ i mecanismele POO:
incapsularea, motenirea, suprancrcarea operatorilor, polimorfismul etc.
Contieni de complexitatea POO, am inclus o serie de coduri de program, care
(sperm) vor ajuta la nelegerea acestor mecanisme.
Am presupus c cititorul este iniiat cu un limbaj de programare
(preferabil cu C). Chiar dac nu are o astfel de iniiere, urmnd consecvent i
consecutiv paragrafele ghidului, el va reui s obine cunotine i competene
de elaborare a produselor program de tip Windows.
n variant de manuscris, lucrarea a fost experimentat pe studenii
Universitii de Stat din Tiraspol i ai Colegiului Financiar-Bancar A.
Diordia din Chiinu, care au i solicitat apariia ei.
Ea va fi util nu doar studenilor specialitilor de Informatic, dar i
tuturor celorlali interesai de programarea modern.

Autorii

-3-

Copie autorizata pentru studenii CFBC

Capitolul I
Platforma BCB
1. Mediul de dezvoltare integrat BCB
Mediul de dezvoltare BCB include urmtoarele elemente:

Bara de titlu

Bara meniului principal

Bara de instrumente

Paleta cu componente

Fereastra formei

Bara cu instrumente

Object TreeView

Object Inspector
Dup lansarea la execuie a sistemului BCB apar urmtoarele ferestre:

-4-

Copie autorizata pentru studenii CFBC

1. Bara de titlu
Bara de titlu afieaz numele proiectului curent (Project1) i numele
programului (C++ Builder 6).

2. Bara meniului principal


Pe bara meniului principal se afl urmtoarele meniuri:
a) Meniul File conine opiunile:
New deschide o fereastr de dialog pentru adugarea de ferestre n cadrul
proiectului curent sau de creare a unei noi aplicaii;
Open deschide un fiier sau un proiect;
Open Project deschide o fereastr de dialog pentru ncrcarea unui proiect
existent;
Reopen deschide un meniu care conine denumirile proiectelor utilizate
anterior;
Save salveaz fiierul curent;
Save As salveaz fiierul curent sub un nume nou;
Save Project As salveaz proiectul curent sub un nume nou;
Save All salveaz toate fiierele deschise;
Close nchide proiectul curent i toate fiierele asociate acestui proiect;
Close All nchide toate fiierele deschise;
Include Unit adaug unit-ul selectat la clauza Uses a unit-ului activ;
Print tiprete fiierul curent;
Exit nchide proiectul curent i prsete mediul BCB.
b) Meniul Edit se utilizeaz pentru a manipula texte sau componente n
timpul crerii programului i conine opiunile:
Undo/Undelete anuleaz ultima aciune sau ultima tergere;
Redo anuleaz ultima operaie Undo;
Cut mut obiectul selectat pe masa de montaj (n Clipboard);
Copy copiaz obiectul selectat n Clipboard;
Paste copiaz coninutul mesei de montaj n poziia cursorului;
Delete terge obiectul selectat;
Select All selecteaz toate componentele de pe form (machet, fereastr);
Align to Grid aliniaz componentele selectate la cel mai apropiat punct din
gril;
Bring to Front mut componenta selectat n fa;
Send to Back mut componenta selectat n spate;
Align aliniaz componentele;

-5-

Copie autorizata pentru studenii CFBC

Size redimensioneaz componentele selectate;


Scale redimensioneaz proporional toate componentele de pe form;
Tab Order modific ordinea n care se sare apsnd tasta Tab;
Creation Order modific ordinea n care snt create componentele nevizuale;
Flip Children mut obiecte simetric fa de axa de simetrie vertical a
ferestrei;
Lock Controls Secures nepenete toate componentele n poziiile curente
(dac aceast opiune este activat, atunci poziiile componentelor nu pot fi
modificate).
c) Meniul Search se utilizeaz pentru a cuta texte, obiecte, erori, unit-uri,
variabile i simboluri n editorul de cod (fereastra n care se editeaz codul),
prin intermediul urmtoarelor opiuni:
Find caut un text specificat i marcheaz prima apariie a acestuia n
editorul de cod;
Find in Files caut textul specificat i afieaz fiecare potrivire n fereastra
aflat sub editorul de cod;
Replace caut textul specificat i-l nlocuiete cu un altul;
Search Again repet ultima cutare;
Incremental Search caut textul pe msur ce este scris;
Go to Line Number mut cursorul la linia specificat.
d) Meniul View se utilizeaz pentru a afia sau pentru a ascunde diverse
elemente ale sistemului BCB, coninnd urmtoarele opiuni:
Project Manager afieaz managerul de proiect (acesta poate fi utilizat
pentru a naviga prin fiierele proiectului, pentru a le copia, terge, aduga,
salva);
Translation Manager afieaz managerul pentru traduceri;
Object Inspector afieaz Inspectorul de obiecte;
Object TreeView afieaz fereastra Object TreeView;
To-Do List face vizibil lista cu evenimentele care urmeaz a fi realizate;
Alignment Palette afieaz o fereastr n care se gsesc opiuni destinate
alinierii obiectelor;
Code Explorer face vizibil editorul de cod;
Component List afieaz o list cu toate componentele BCB;
Window List face vizibil o list cu toate ferestrele BCB care snt deschise;
Debug Windows afieaz un meniu din care pot fi alese ferestrele necesare
pentru depnarea programului;
Desktops permite afiarea, salvarea sau tergerea modurilor de aezare a
ferestrelor;
Toggle Form/Unit comut ntre fereastr i unit-ul corespunztor;

-6-

Copie autorizata pentru studenii CFBC

Units afieaz o list cu toate unit-urile proiectului;


Forms afieaz o list cu toate formele proiectului;
Type Library afieaz editorul pentru biblioteci de tipuri (Type Library);
New Edit Window deschide nc o fereastr pentru editarea de cod;
Toolbars conine un meniu din care pot fi selectate barele de butoane care vor
fi afiate.
e) Meniul Project este utilizat pentru a compila o aplicaie. El conine
urmtoarele opiuni:
Add to Project adaug un fiier proiectului;
Remove from Project elimin un fiier din proiect;
Import Type Library afieaz o list cu bibliotecile nregistrate n sistem
pentru a fi adugate la proiect;
Add to Repository afieaz o caset de dialog pentru a salva un ablon de
proiect;
View Source afieaz sursa proiectului;
Languages permite adugarea, eliminarea sau rennoirea bibliotecilor DLL
pentru alfabetul utilizat;
Add New Project adaug la proiect o nou aplicaie;
Add Existing Project adaug la proiect un proiect existent;
Compile Uni t compileaz unit-ul curent;
Make Project creeaz proiectul, adic fiierul executabil ( implicit
Project1.exe);
Build project compileaz toate modulele proiectului;
Information for project afieaz informaii despre proiectul compilat;
Make All Projects compileaz fiierele care au fost modificate;
Build All Projects compileaz toate fiierele proiectului curent;
Options afieaz o fereastr de dialog, prin intermediul creia pot fi
modificate opiunile pentru compilare, linkeditare etc.
f) Meniul Run conine comenzi pentru executarea, depnarea i oprirea unei
aplicaii:
Run compileaz i execut aplicaia;
Attach to Process afieaz o list cu procesele care pot fi depnate;
Parameters specific parametrii cu care va fi lansat n execuie aplicaia;
Register ActiveX Server adaug o intrare n regitrii Windows-ului pentru
controlul elementelor ActiveX;
Unregister ActiveX Server terge intrarea n regitrii Windows-ului pentru
controlul elementelor ActiveX;
Install MTS Object instaleaz obiectele MTS (Microsoft Transaction Server)
din proiectul curent ntr-un pachet MTS;

-7-

Copie autorizata pentru studenii CFBC

Step over execut un program linie cu linie, fr verificarea funciilor;


Trace Into execut un program linie cu linie cu verificarea funciilor;
Trace to Next Source execut un program, oprindu-se la urmtoarea linie
executabil din program;
Run To Cursor execut programul curent pn la poziia cursorului din
editorul de cod;
Run Until Return execut procesul pn la ieirea din funcia curent;
Show Execution Point poziioneaz cursorul la linia care se execut;
Program Pause oprete temporar execuia programului;
Program Reset termin execuia programului i elibereaz memoria ocupat
de ctre acesta;
Inspect deschide o fereastr pentru analizarea variabilelor specificate;
Evaluate/Modify afieaz o fereastr care permite evaluarea sau modificarea
unei valori sau a unei expresii;
Add Watch afieaz o fereastr pentru urmrirea variabilelor;
Add Breakpoint afieaz un meniu folosit pentru adugarea i modificarea
punctelor de ntrerupere.
g) Meniul Component conine comenzi pentru crearea i instalarea
componentelor:
New Component deschide o fereastr, cu ajutorul creia se pot crea
componente noi;
Install Component instaleaz o component existent;
Import ActiveX Control adaug o bibliotec de tip ActiveX;
Create Component Template salveaz componentele modificate pe o pagin
nou;
Install Packages instaleaz un pachet de componente;
Configure Palette deschide o fereastr din care se poate configura paleta de
componente.
h) Meniul DataBase conine comenzi pentru manipularea bazelor de date:
Explore lanseaz la execuie utilitarul Database Explorer sau SQL Explorer;
SQL Monitor lanseaz SQL Monitor;
Form Wizard se utilizeaz pentru crearea rapid a unor ferestre de vizualizare
a bazelor de date.
i) Meniul Tools ofer comenzi pentru programele utilitare (disponibile), fr
a prsi sistemul BCB.
j) Meniul Window este un meniu de lucru cu ferestre.

-8-

Copie autorizata pentru studenii CFBC

k) Meniul Help conine comenzi pentru afiarea aplicaiilor de tip Help.

3. Bara de instrumente
Bara de instrumente conine butoane cu rol de acces la unele comenzi
(pot fi accesate prin sistemul de meniuri), care ofer posibilitatea de a aduga
sau a exclude instrumente.

4. Paleta de componente
Paleta de componente este format din cteva pagini de componente.
Aceste componente (care mai snt numite i controale) urmeaz a fi plasate pe
suprafaa formei pentru a fi prelucrate. Cele mai utilizate pagini de componente
snt:
Standart conine controalele cel mai des utilizate;
DataAcces conine controale pentru stabilirea legturilor ntre componente;
DataControls conine controale pentru prelucrarea bazelor de date (de ex.
pentru afiarea informaiei dintr-un tabel);
BDE conine controale ce permit stabilirea unei conexiuni cu baza de date,
prin intermediul tabelelor, interogrilor, etc;
ADO asigur accesul aplicaiilor client la date.

5. Fereastra formei
Fereastra formei afieaz o forma curent, pe suprafaa creia se pot
depune controale n perioada de elaborare a proiectului.

6. Fereastra Object TreeView


Object TreeView este o fereastra folosit
pentru accesarea rapid a controalelor de pe
suprafaa unei forme.

-9-

Copie autorizata pentru studenii CFBC

7. Fereastra Object Inspector

Object Inspector (Inspectorul de obiecte) este o fereastr format din


dou pagini:
a) Pagina Properties se folosete pentru a seta proprietile componentelor
(dimensiunile, poziia n cadrul formei, fonturile folosite etc). De asemenea,
proprietile pot fi setate n momentul execuiei programului prin scrierea
codului surs:
Nume_Control-> Nume_Proprietate = valoare;
b) Pagina Events se utilizeaz pentru a stabili corespondena dintre fiecare
eveniment i subprogramul care descrie reacia aplicaiei la acest eveniment.
Pentru a crea aceast coresponden se execut un double-click n caseta din
dreptul numelui evenimentului. Elaborarea unui astfel de subprogram se face n
fiiere .cpp i n fiiere .h.
n partea de sus a ferestrei Object Inspector se afl o list derulant care
conine toate componentele de pe form mpreun cu tipul lor.
Observaie. Prin expresia prelucrarea evenimentului vom nelege
descrierea subprogramului corespunztor acestui eveniment.

- 10 -

Copie autorizata pentru studenii CFBC

8. Fereastra editorului de cod


Fereastra editorului de cod se afl n spatele formei. n ea se scriu
subprogramele de prelucrare a evenimentelor, adic coninutul fiierului
Unit1.cpp. De asemenea, executnd un click pe fila Unit1.h (de pe bara de
stare a ferestrei editorului de cod) se poate afia coninutul fiierului Unit1.h.

- 11 -

Copie autorizata pentru studenii CFBC

2. Structura unei aplicaii BCB


Un proiect BCB este format din cteva fiiere (de regul, ele snt salvate
n acelai director).
Fierul Proiect1.cpp (asociat funciei WinMain a aplicaiei)
Coninutul predefinit al acestui fiier este:
#include <vcl.h>
#pragma hdrstop
USEFORM("Unit1.cpp", Form1);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application>ShowException(&exception);
}
}
return 0;
}

El poate fi afiat executnd Project \ View Sourse.

- 12 -

Copie autorizata pentru studenii CFBC

Fiierele Unit1.h, Unit1.cpp, Unit1.dfm (caracteristice unei forme)


a) Fiierul Unit1.h conine informaia despre componente i evenimente
(prototipul lor este scris n interiorul clasei). Coninutul iniial este:
#ifndef Unit1H
#define Unit1H
//------------------------------------------------------------#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//------------------------------------------------------------class TForm1 : public TForm
{
__published:
// IDE-managed Components
private:
// User declarations
public:
// User declarations
__fastcall TForm1(TComponent* Owner);
};
//------------------------------------------------------------extern PACKAGE TForm1 *Form1;
//------------------------------------------------------------#endif

Dac pe suprafaa formei vor fi plasate componente sau vor fi


prelucrate evenimente, atunci prototipurile lor vor aprea n clas, protejate la
nivel __published.
b) Fiierul Unit1.cpp conine subprogramele de prelucrare a
evenimentelor. Coninutul inial:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------

- 13 -

Copie autorizata pentru studenii CFBC

Funcia

__fastcall

TForm1::TForm1(TComponent*

Owner):

reprezint constructorul formei.


Descrierea subprogramelor de prelucrare a evenimentelor se efectueaz
dup aceast declaraie. Fiecare dintre aceste subprograme are declarat
prototipul n fiierul Unit1.h.

TForm(Owner)

c) Fiierul Unit1.dfm conine informaia despre imaginea unei forme.


Coninutul unei forme fr componente poate arta astfel:
object Form1: TForm1
Left = 192
Top = 114
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end

Fiierul formei nu este un fiier ASCII (deci nu poate fi vizualizat cu un


editor de texte obinuit). Pentru a afia coninutul fiierului .dfm se execut
comanda View as Text din meniul contextual al formei.
Modificarea formei (redimensionarea, plasarea sau excluderea
componentelor pe suprafaa ei etc.) provoac modificri n coninutul fiierului
ei.
Fiierul de resurse Proiect1.res conine informaia despre resursele utilizate
n timpul proiectului (imagini, pictograme etc.). Acest fiier este creat automat
de ctre sistemul BCB.
Fiierul proiectului Project1.bpr include toate fiierele enumerate anterior.

- 14 -

Copie autorizata pentru studenii CFBC

3. Aplicaii de consol
Sistemul BCB ofer posibilitatea elaborrii aplicaiilor de consol.
Pentru a crea o astfel de aplicaie:
1) Executm File\New\Other. Apare fereastra New Items:

2) Efectum un double-click pe pictograma Console Wizard. Apare fereastra


Console Wizard:

3) Selectm limbajul de programare (C sau C++) i executm Ok.


4) Apare fereastra editorului de cod (Unit1.cpp) n care scriem codul de
program:

- 15 -

Copie autorizata pentru studenii CFBC

5) Apsnd tasta F9 compilm i executm programul.

Exemplu rezolvat
S elaborm o aplicaie de consol care va citi de la tastatur dou
numere ntregi, apoi va afia la consol suma acestor numere.
Realizare:
1) Executm File\New\Other.
2) Efectum un double-click pe pictograma Console Wizard.
3) n fereastra aprut (Console Wizard) selectm limbajul de programare (C
sau C++) i executm Ok.
4) n fereastra editorului de cod (Unit1.cpp) scriem programul:

- 16 -

Copie autorizata pentru studenii CFBC

5) Apsm F9 pentru compilarea i executarea programului.


6) Apare fereastra consolei, n care introducem date, iar programul afieaz
rezultatele:

- 17 -

Copie autorizata pentru studenii CFBC

4. Generaliti
Structura unei clase C++ Builder nu se deosebete esenial de structura
unei clase C++.
n C++ Builder apare un nou modificator de acces: __published. La
acest nivel de protecie snt declarate prototipurile controalelor i
evenimentelor.
Tipul __fastcall este creat n special pentru prelucrarea evenimentelor.
n general sistemul BCB opereaz cu pointeri, din aceast cauz
proprietile i metodele unui obiect snt apelate prin intermediul operatorului
sgeat: ->. n cazul n care acestea nu snt de tip pointer, ele snt apelate prin
intermediul operatorului punct: . (pentru detalii vezi capitolul III).
Dup elaborarea unei aplicaii este creat fiierul final (Project1.exe).
Pentru ca aplicaia BCB s se lanseze la execuie fr erori pe o staie care nu
are instalat sistemul BCB la salvarea proiectului final se vor efectua
urmtoarele modificri:
1) Din meniul Project deschidem ferastra Options.
2) Alegem paleta Packages i scoatem bifa casetei de validare Build
with runtime Packages.

- 18 -

Copie autorizata pentru studenii CFBC

3) Din cadrul paletei Linker scoatem bifa casetei de validare Use


dynamic RTL.

4) Din cadrul paletei Compiler efectum un click pe butonul Realease.

- 19 -

Copie autorizata pentru studenii CFBC

5. Clasa TForm
O aplicaie Windows este format din ferestre, dintre care una este
considerat fereastr principal (implicit prima fereastr este principal). n
C++ Builder ferestrele snt descrise n clasa TForm, din care cauz ele mai snt
numite forme (sau machete).
Pa bara de titlu a formei se afl titlul ei, butoanele de minimizare, de
maximizare, de nchidere i meniul principal (dac acesta exist).
Pe suprafaa zonei client a formei programatorul poate plasa
componente. Pentru a prelucra o form trebuie s cunoatem proprietile,
metodele i evenimentele clasei TForm. Menionm c multe dintre aceste
proprieti i evenimente exist i pentru clasele corespunztoare altor
componente.

Unele proprieti ale formei


Action este utilizat pentru centralizarea rspunsurilor la comenzile date de
utilizator. Majoritii componentelor li se poate asocia o aciune. Aciunile snt
centralizate i gestionate folosind componenta ActionList din pagina de
componente Standard.
ActiveControl specific controlul de pe o form care se afl n focar.
Valoarea acestei proprieti este numele controlului de pe form aflat n focar.
AutoSroll (de tip logic) stabilete dac bara de rulare va aprea (pentru
valoarea true) sau nu va aprea automat n cazul n care componentele nu vor
ncpea pe form.
AutoSize (de tip logic) permite (pentru valoarea false) sau interzice
redimensionarea formei. n cazul valorii true forma automat capt
dimensiunile necesare.
BorderIcons este o proprietate compus format din subproprietile
biSystemMenu, biMinimize, biMaximize, biHelp (toate de tip logic). Precizeaz
dac forma va avea (pentru valoarea true) sau nu va avea respectiv meniu
principal, butoane de minimizare, de maximizare i buton pentru apelarea unui
ajutor (butonul apare doar dac snt excluse butoanele de minimizare i de
maximizare). Valorile posibile:
- biSystemMenu (forma are un meniul de System, cu ajutorul cruia forma
poate fi nchis, maximizat, minimizat etc.);
- biMinimize (forma are un buton de minimizare);
- biMaximize (forma are un buton de maximizare);
- biHelp (forma are un buton de help, care are desenat pe el un semn de

- 20 -

Copie autorizata pentru studenii CFBC

ntrebare);
BorderStyle specific stilul chenarului formei. Valorile posibile:
- bsDialog (forma nu poate fi redimensionat, chenarul ei fiind
standard);
- bsSingle (forma nu poate fi redimensionat, marginile chenarului snt
linii);
- bsNone (forma nu poate fi redimensionat, nu are chenar);
- bsSizeable (forma poate fi redimensionat);
- bsToolWindow (la fel ca bsSingle, doar cu un titlu mai mic);
- bsSizeToolWin (la fel ca bsSizeable, doar cu un titlu mai mic).
BorderWitdh indic distana n pixeli dintre zona client i marginile formei.
Caption specific titlul ferestrei (textul care apare pe bara de titlu).
Color stabilete culoarea formei.
Constrains este o proprietate compus format din subproprietile
MaxWidth, MaxHeight, MinWidth, MinHeight. Indic restricii asupra
dimensiunilor formei. Dac toate cele 4 proprieti au valoarea 0, atunci
restricii nu snt.
Cursor specific forma mouse-lui.
Font este o proprietate compus pentru stabilirea mrimii, fontului,
efectelor de stil pentru textele de pe form i a textelor aferente componentelor
de pe form.
FormStyle stabilete stilul formei. Valori posibile:
- fsNormal (form obinuit);
- fsMDIChild (form de tip MDI copil);
- fsMDIForm (form de tip MDI printe);
- fsStayOnTop (form afiat pe Desktop, deasupra celorlalte forme).
Heitch specific nlimea n pixeli a formei.
Hint specific textul care va aprea la plasarea cursorului de mouse pe
form. Acest text apare numai n cazul n care proprietatea ShowHint are
valoarea true.
ModalResult este utilizat pentru o form modal. Aplicaia principal nu
reacioneaz la evenimente att timp ct este deschis o fereastr modal. Prin
aceast proprietate se poate gestiona modul n care a fost nchis fereastra
modal. Din aceast cauz ea nu apare n lista de proprieti din fereastra
Object Inspector.
Name stabilete numele formei (utilizat pe post de identificator al formei).
Position specific dimensiunile i poziia pe care o va avea o form pe
ecran. Valorile posibile:
- poDesigned (forma apare pe ecran n aceeai poziie i aceleai
dimensiuni ca i cele setate la proiectarea ei);
- poDefault (sistemul Windows alege poziia i dimensiunea formei);

- 21 -

Copie autorizata pentru studenii CFBC

- poDefaultPosOnty (sistemul Windows alege doar poziia formei,


dimensiunile fiind cele setate la proiectare);
- poDefaultSizeOnty (sistemul Windows alege doar dimensiunile formei,
poziia rmnnd cea de la proiectare);
- poScreenCenter (forma apare centrat pe ecran, dimensiunile fiind cele
setate la proiectare).
Visible (de tip logic) specific dac forma este (pentru valoarea true) sau nu
este vizibil.
Width specific limea n pixeli a formei.

Unele metode ale formei

Bringtofront() aduce forma n fa.


Close() nchide forma.
Hide() ascunde forma.
Refresh(), Repaint() redeseneaz forma.
Sendtoback() trimite forma n spatele tuturor ferestrelor afiate pe ecran.
Setfocus() selecteaz un control de pe form.
Show() face vizibil forma.

Unele evenimente ale formei


Not. Prezentm i prototipul metodei care prelucreaz evenimentul.

OnActivate apare atunci cnd forma devine activ.

void __fastcall TForm1::FormActivate(TObject *Sender)

OnCanResize apare atunci cnd se redimensioneaz forma.

void __fastcall TForm1::FormCanResize(TObject *Sender,


int &NewWidth, int &NewHeight, bool &Resize)

OnClick apare atunci cnd utilizatorul execut un click de mouse pe form .

void __fastcall TForm1::FormClick(TObject *Sender)

OnClose apare la nchiderea formei.

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction


&Action)

- 22 -

Copie autorizata pentru studenii CFBC

OnCreate apare la crearea formei.

void __fastcall TForm1::FormCreate(TObject *Sender)

OnDblClick apare atunci cnd utilizatorul execut double click pe form.

void __fastcall TForm1::FormDblClick(TObject *Sender)

OnDeactivate apare cnd forma pierde focarul.

void __fastcall TForm1::FormDeactivate(TObject *Sender)

OnDestroy apare cnd forma este distrus (la nchiderea ei).

void __fastcall TForm1::FormDestroy(TObject *Sender)

OnDockDrop apare cnd un obiect este depus pe form prin operaia dragand-dock.
void __fastcall TForm1::FormDockDrop(TObject *Sender,
TDragDockObject *Source, int X, int Y)

OnDockOver apare cnd un obiect este tras peste form pentru o operaie
drag-and-dock.
void __fastcall TForm1::FormDockOver(TObject *Sender,
TDragDockObject *Source, int X, int Y, TDragState State,
bool &Accept)

OnDragDrop apare cnd utilizatorul elibereaz obiectul adus prin


operaia drag-and-drop.
void __fastcall TForm1::FormDragDrop(TObject *Sender, TObject
*Source, int X, int Y)

OnDragOver apare cnd un obiect este tras peste form pentru o operaie
drag-and-drop.
void __fastcall TForm1::FormDragOver(TObject *Sender,
*Source, int X, int Y, TDragState State, bool &Accept)

TObject

OnEndDock apare cnd operaia de tragere s-a terminat. Se utilizeaz pentru


a trata situaia n care operaia drag-and-dock s-a terminat.

- 23 -

Copie autorizata pentru studenii CFBC

void __fastcall TForm1::FormEndDock(TObject *Sender, TObject


*Target, int X, int Y)

OnGetSiteInfo apare nainte de OnDockDrop dac proprietatea DockSite


este true.
void __fastcall TForm1::FormGetSiteInfo(TObject *Sender,
TControl *DockClient, TRect &InfluenceRect,
TPoint &MousePos, bool &CanDock)

OnHelp apare cnd forma primete o cerere de ajutor.

bool __fastcall TForm1::FormHelp(WORD Command, int Data, bool


&CallHelp)

OnHide apare atunci cnd forma este ascuns (de exemplu dac proprietatea
Visible obine valoarea false).
void __fastcall TForm1::FormHide(TObject *Sender)

OnKeyDown apare la apsarea unei taste, dac forma se afl n focar.


Parametrul Key pstreaz codul tastei apsate.
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)

OnKeyPress apare dac utilizatorul apas o tast care genereaz un singur


caracter. Parametrul Key conine caracterul tastei ap sate (combinaiile de taste
nu provoac acest eveniment).
void __fastcall TForm1::FormKeyPress(TObject *Sender,char &Key)

OnKeyUp apare la eliberarea unei taste. Parametrul Key pstreaz codul


tastei apsate, iar parametrul Shift indic care dintre tastele Shift, Ctrl sau Alt a
fost apsat odat cu tasta Key.
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)

OnMouseDown apare la apsarea unui buton al mouse-ului.

void __fastcall TForm1::FormMouseDown(TObject *Sender,


TMouseButton Button, TShiftState Shift, int X, int Y)

- 24 -

Copie autorizata pentru studenii CFBC

OnMouseUp apare la eliberarea unui buton al mouse-ului.

void __fastcall TForm1::FormMouseUp(TObject *Sender,


TMouseButton Button, TShiftState Shift, int X, int Y)

OnMouseMove apare la micarea mouse-ului pe form.

void __fastcall TForm1::FormMouseMove(TObject *Sender,


TShiftState Shift, int X, int Y)

OnPaint apare atunci cnd forma este redesenat .

void __fastcall TForm1::FormPaint(TObject *Sender)

OnResize apare la redimensionarea formei.

void __fastcall TForm1::FormResize(TObject *Sender)

OnShortCut apare la apsarea unei taste nainte de evenimentul


OnKeyDown. Se utilizeaz pentru a trata short-cut-urile nainte de a trata
apsrile obinuite de taste.
void __fastcall TForm1::FormShortCut(TWMKey &Msg,bool &Handled)

OnShow apare atunci cnd forma este fcut vizibil.

void __fastcall TForm1::FormShow(TObject *Sender)

Exemplu rezolvat
S crem o aplicaie format dintr-o fereastr (fr componente pe ea).
La efectuarea unui click suprafaa formei va deveni de culoare roie, iar al
apsarea tastei h titlul ferestrei se va modifica n Salut! Prima aplicatie BCB.
Realizare:
1) Executm File\New\Application.
2) Prelucrm evenimentul OnClick al formei. Scriem instruciunea:
Form1->Color = clRed;

- 25 -

Copie autorizata pentru studenii CFBC

3) Prelucrm evenimentul OnKeyPress al formei. Scriem instruciunea:


if(Key=='h') Form1->Caption=" Salut! Prima aplicatie BCB";

4) Apsm F9 pentru compilarea i executarea programului.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}
void __fastcall TForm1::FormKeyPress(TObject *Sender, char
&Key){
if(Key=='h') Form1->Caption="Salut! Prima aplicatie BCB";
}
void __fastcall TForm1::FormClick(TObject *Sender){
Form1->Color= clRed;
}

- 26 -

Copie autorizata pentru studenii CFBC

6. Clasa TButton
Butoanele snt, probabil, cele mai des utilizate controalele n BCB. Ele
snt destinate lansrii la execuie a diferitor aciuni.

Unele proprieti ale clasei TButton


Default (de tip logic) stabilete dac butonul de comand este (pentru
valoarea true) sau nu este buton implicit al formei. Dac butonul este implicit,
atunci acionarea tastei Enter va fi considerat eveniment al butonului, n caz
contrar al formei. Forma poate avea un singur buton implicit.
Cancel (de tip logic) stabilete dac butonul de comand este (pentru
valoarea true) sau nu este buton de anulare al formei. Dac butonul este de
anulare, atunci acionarea tastei Esc va fi considerat eveniment al butonului,
n caz contrar al formei. Forma poate avea un singur buton de anulare.
Observaie. Butonul de anulare nu nchide forma. Aceasta poate vi
nchis cu o instruciune de forma Form1->Close();
Name specific numele butonului.
Caption stabilete textul care va fi afiat pe suprafaa butonului.
Font este o proprietate compus pentru stabilirea mrimii literelor, fontului,
efectelor de stil pentru textul de pe suprafaa butonului.
Visible (de tip logic) stabilete dac butonul este (pentru valoarea true) sau
nu este vizibil pe suprafaa formei.
ModalResult se folosete n cazul ferestrelor modale. Valori posibile:
mrNone (valoare implicit), mrOk, mrCancel, mrAbort, mrRetry, mrIgnore,
mrYes, mrNo.

7. Clasa TEdit
Un exemplar al clasei TEdit afieaz o caset de editare n care
utilizatorul poate scrie un text sau poate afia un mesaj.
Unele proprieti ale clasei TEdit
AutoSize (de tip logic) permite (pentru valoarea false) sau interzice
redimensionarea automat a casetei (n cazul n care un eveniment ar modifica

- 27 -

Copie autorizata pentru studenii CFBC

mrimea textului din caset).


Text specific textul din caset.
CharCase determin dac literele textului din caset vor fi convertite sau
nu n majuscule sau minuscule. Valori posibile:
- ecLowerCase (literele vor fi convertite n minuscule);
- ecUpperCase (literele vor fi convertite n majuscule);
- ecNormal (literele nu vor fi convertite).
MaxLength specific lungimea (numrul de simboluri) maximal a irului
din caset. Valoarea 0 anuleaz restricia pentru lungime. n regim de
proiectare nainte de a seta MaxLength coninutul casetei trebuie golit.
PasswordChar permite organizarea parolelor. Valoarea-simbol a acestei
proprieti va aprea n locul oricrui simbol scris de utilizator n caset.
ReadOnly (de tip logic) interzice (pentru valoarea true) sau permite
modificarea textului din caset.

Unele metode ale clasei TEdit

Clear() terge textul din caset.


ClearSelection() terge textul selectat din caset.
ClearUndo() anuleaz metoda Undo().
CopyToCliboard() copie textul selectat din caset pe masa de montaj.
CutToCliboard() mut textul selectat din caset pe masa de montaj.
PasteFromCliboard() plaseaz coninutul mesei de montaj n caset.
SelectAll() selecteaz textul din caset.

Exemplu rezolvat
S crem o aplicaie, a crei fereastr va conine dou casete de editare
(componente de tip TEdit) i dou butoane de comand (Copy i Codific).
Utilizatorul va scrie un text n prima caset, apoi dup efectuarea unui click pe
butonul Copy textul din prima caset va fi copiat n caseta a doua. La
efectuarea unui click pe butonul Codific textul din caseta a doua va fi
codificat.
Realizare:
1) Executm File\New\Application.
2) Plasm componentele conform enunului.

- 28 -

Copie autorizata pentru studenii CFBC

3) Modificm valorile proprietilor Caption ale butoanelor de comand


conform enunului.
4) Prelucrm evenimentele OnClick ale butoanelor de comand.
5) Lansm aplicaia le execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender) {
Edit2->Text = Edit1->Text;
}
void __fastcall TForm1::Button2Click(TObject *Sender){
Edit2->PasswordChar = '#';
}

8. Clasa AnsiString
n limbajul C++ nu exist un tip de date ir de caractere, cum ar fi tipul
string n Pascal. Prelucrarea irurilor de caractere n C++ se face prin
intermediul tablourilor de tip char, care snt numite i iruri de caractere.
Mediul C++ Builder motenete toate facilitile oferite de limbajele C i C++
referitoare la lucrul cu iruri de caractere.

- 29 -

Copie autorizata pentru studenii CFBC

Funciile care implementeaz lucrul cu aceste iruri de caractere snt


definite n unit-ul string.h.
AnsiString este o clas care implementeaz irul lung de caractere.
AnsiString-urile snt iruri pentru care primul caracter are numr de ordine 1.
Subprogramele pentru prelucrarea irurilor de tip AnsiString snt
definite n unit-ul dstring.h al bibliotecii vcl.

Unele metode ale clasei AnsiString


Constructorul AnsiString() creeaz un ir vid.
AnsiString (valoare) transform valoare n ir de caractere i returneaz
acest ir. Parametrul valoare poate fi de orice tip.
Delete (I, N) terge N caractere ncepnd cu poziia I.
Insert (S, I) insereaz irul de caractere S pe poziia I n irul obiectului
curent.
Length() returneaz lungimea irului.
SetLength (newLength) trunchiaz irul la lungimea newLength. Dac
lungimea irului este mai mic dect newLength, atunci irul nu este trunchiat.
LowerCase () convertete n minuscule literele irului.
UpperCase ()convertete n majuscule literele irului.
Pos (subStr) returneaz poziia primei apariii a irului subStr n irul
obiectul curent.
SubString (I, N) returneaz un subir de lungime N care ncepe de pe
poziia I.
ToDouble() convertete irul la o valoare real (tip double). Dac irul nu
poate fi convertit, atunci este generat o excepie.
ToInt () convertete irul la o valoare ntreag. De exemplu, expresia
Edit1->Text.ToInt() returneaz un numr ntreg coninutul casetei Edit1
(evident dac acesta este numr).
CompareStr (S1, S2) returneaz:
- o valoare negativ dac irul S1 este mai mic (lexicografic) dect irul S2;
- 0 dac irurile snt egale;
- o valoare pozitiv dac irul S1 este mai mare dect irul S2.
CompareText (S1, S2) este similar funciei CompareStr doar c la
comparare nu face distincie ntre literele mari i ntre cele mici.
AnsiPos (Sub, S) returneaz poziia ncepnd cu care irul Sub apare n irul
S. Dac Sub nu apare n S, atunci funcia returneaz valoarea 0.
Trim(S) elimin spaiile de debut i cele de sfrit ale irului S.
Observaie. Cu toate c tipul char i tipul AnsiString definesc iruri de

- 30 -

Copie autorizata pentru studenii CFBC

caractere, ele nu snt compatibile. Valorile casetelor de editare snt de tipul


AnsiString.
Operatori aplicabili asupra irurilor de caractere
Operatorul + se folosete pentru concatenarea irurilor.
Operatorul = se folosete pentru atribuirea unei valori unei variabile.
Operatorii < (mai mic), <= (mai mic sau egal), >(mai mare), >= (mai mare
sau egal), = = (egal), != (diferit) snt operatorii de comparare.

9. Clasa TLabel
O component de tip TLabel afieaz o etichet, care se utilizeaz
pentru afiarea textelor. Texul poate poate fi specificat att n perioada de
elaborare a proiectului, ct i n timpul execuiei, prin intermediul proprietii
Caption. Multe dintre proprietile controlului Label coincid cu proprietile
controalelor studiate.

Unele proprieti specifice clasei TLabel


Alignment stabilete modul de aliniere pe orizontal a textului aferent
etichetei. Valori posibile: taLeftJustify, taRightJustify, taCenter.
AutoSize (de tip bool) permite (pentru valoarea false) sau interzice
redimensionarea automat a etichetei.
ShowAccelChar (de tip bool) specific dac caracterului & va determina
(pentru valoarea true) sau nu un caracter accelerator (caracterul accelerator este
afiat subliniat). Dac utilizatorul acioneaz tasta corespunztoare caracterului
accelerator, atunci focarul va ajunge la componenta specificat de proprietatea
FocusControl a etichetei. Aceasta permite transferarea rapid a focarului la
componentele care au proprietatea Caption. n cazul valorii false, caracterul
& va fi afiat ca atare, iar proprietatea FocusControl a etichetei nu va putea
fi utilizat.
Transparent (de tip bool) specific dac componenta este sau nu
transparent. n cazul valorii true, componenta va fi transparent, astfel nct,
de exemplu, o imagine grafic situat sub component nu va fi acoperit.

- 31 -

Copie autorizata pentru studenii CFBC

FocusControl stabilete componenta care va fi activ atunci cnd va fi


apsat tasta corespunztoare caracterului accelerator (vezi proprietatea
ShowAccelChar).
Layout stabilete modul de aliniere vertical a textului afiat de etichet.
Poate avea una din urmtoarele valori: TlTop (aliniat sus, valoare implicit),
TlCenter (aliniat centrat), TlBottom (aliniat jos).
WordWrap (de tip bool) specific dac textul etichetei poate fi afiat
(pentru valoarea true) sau nu pe mai multe rnduri. n cazul valorii false textul
va fi afiat ntr-o singur linie.

Unele metode ale clasei TLabel

Hide() ascunde eticheta de pe suprafaa formei.


Show() afieaz eticheta, dac ea a fost ascuns.

Evenimentele clasei TLabel


OnMouseEnter apare atunci cnd indicatorul mouse-ului se mut pe
etichet.
OnMouseLeave apare atunci cnd indicatorul mouse-ului prsete
eticheta.

Exemple rezolvate
1. S crem o aplicaie care va calcula aria i perimetrul unui dreptunghi fiind
date dimensiunile dreptunghiului.
Realizare:
1) Executm File\New\Application.
2) Plasm dou componente de tip TEdit (pentru citirea dimensiunilor
dreptunghiului), trei de tip TLabel (pentru denumirile dimensiunilor i pentru
afiarea rezultatelor), un buton de comand.
3) Prelucrm evenimentul OnClick al butonului de comand.

- 32 -

Copie autorizata pentru studenii CFBC

4) Pentru un design mai atractiv modificm proprietatea Font a fiecrei


componente.
5) Salvm, apoi lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender) {
double a,b,arie,perimetru;
Form1->Caption="DREPTUNGHIUL"; Label3->Caption="";
a=Edit1->Text.ToDouble();
//convertirea din sir in numar
b=Edit2->Text.ToDouble();
arie=a*b; perimetru=(a + b)*2;
Label3->Font->Color=clRed;
Label3->Caption="Aria : "+AnsiString(arie)+"
Perimetrul : "
+ AnsiString(perimetru);
}

2. Calculatorul
S crem o aplicaie care va efectua operaii aritmetice cu numere reale, a crei

- 33 -

Copie autorizata pentru studenii CFBC

fereastr va arta ca n urmtoarea imagine.

Realizare:
1) Executm File\New\Application.
2) Plasm pe form o caset de editare, 17 butoane de comand conform
imaginii.
3) Modificm valoarea proprietii Caption a fiecrui buton de comand i cea
a formei conform imaginii.
4) Atribuim proprietii Text a casetei de editare valoare vid.
5) Prelucrm evenimentul OnClick al fiecrui buton de comand (la efectuarea
unui click pe unul din butoanele 0 .. 9 este necesar adugarea valorii butonului
n caseta de editare).
6) Deoarece datele iniiale snt de tip AnsiString, le vom transforma n numr,
le vom prelucra i apoi le vom transforma napoi n text pentru a le afia.
Pentru a exclude introducerea datelor greite din punct de vedere sintactic (se
accept doar cifre i caracterul .) vom prelucra evenimentul OnKeyPress a
casetei de editare.
7) Pentru a interzice scrierea caracterelor n cutia de editare se va seta
proprietatea ReadOnly la valoarea true.

- 34 -

Copie autorizata pentru studenii CFBC

8) Prelucrm evenimentul OnCreate al formei.


9) Salvm i lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString s="";
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
double eval(AnsiString exp){
AnsiString op="",c="";
double a;
int i;
for(i=1;i<=exp.Length();i++)
{
if( exp[i]>='0' && exp[i]<='9' || exp[i]=='.') c=c+exp[i];
else
{
if(op=='+' || op=='-' || op=='*' || op=='/')
{
if(op=='+') a=a+c.ToDouble();
if(op=='-') a=a-c.ToDouble();
if(op=='*') a=a*c.ToDouble();
if(op=='/') a=a/c.ToDouble();
op=s[i];
}
else
{
a=c.ToDouble();
op=exp[i];
}
c="";
}
}
if(op=='+') a=a+c.ToDouble();
if(op=='-') a=a-c.ToDouble();
if(op=='*') a=a*c.ToDouble();
if(op=='/') a=a/c.ToDouble();
return a;
}
void __fastcall TForm1::FormCreate(TObject *Sender){

- 35 -

Copie autorizata pentru studenii CFBC

Edit1->Clear();
Edit1->SetFocus();
}
void __fastcall TForm1::Button12Click(TObject *Sender){
Edit1->Clear();
Edit1->Text=AnsiString(eval(s));
s="";
Edit1->SetFocus();
}
void __fastcall TForm1::Button13Click(TObject *Sender){
Edit1->Clear();
s=s+"+";
Edit1->SetFocus();
}
void __fastcall TForm1::Button14Click(TObject *Sender){
Edit1->Clear();
s=s+"-";
Edit1->SetFocus();
}
void __fastcall TForm1::Button15Click(TObject *Sender){
Edit1->Clear();
s=s+"*";
Edit1->SetFocus();
}
void __fastcall TForm1::Button16Click(TObject *Sender){
Edit1->Clear();
s=s+"/";
Edit1->SetFocus();
}
void __fastcall TForm1::Button9Click(TObject *Sender){
Edit1->Text=Edit1->Text+"1";
s=s+"1";
Edit1->SetFocus();
}
void __fastcall TForm1::Button10Click(TObject *Sender){
Edit1->Text=Edit1->Text+"0";
s=s+"0";
Edit1->SetFocus();
}
void __fastcall TForm1::Button11Click(TObject *Sender){
Edit1->Text=Edit1->Text+".";
s=s+".";
}
void __fastcall TForm1::Button5Click(TObject *Sender){
Edit1->Text=Edit1->Text+"5";
s=s+"5";
Edit1->SetFocus();
}
void __fastcall TForm1::Button6Click(TObject *Sender){
Edit1->Text=Edit1->Text+"4";

- 36 -

Copie autorizata pentru studenii CFBC

s=s+"4";
Edit1->SetFocus();
}
void __fastcall TForm1::Button7Click(TObject *Sender){
Edit1->Text=Edit1->Text+"3";
s=s+"3";
Edit1->SetFocus();
}
void __fastcall TForm1::Button8Click(TObject *Sender){
Edit1->Text=Edit1->Text+"2";
s=s+"2";
Edit1->SetFocus();
}
void __fastcall TForm1::Button1Click(TObject *Sender){
Edit1->Text=Edit1->Text+"9";
s=s+"9";
Edit1->SetFocus();
}
void __fastcall TForm1::Button2Click(TObject *Sender){
Edit1->Text=Edit1->Text+"8";
s=s+"8";
Edit1->SetFocus();
}
void __fastcall TForm1::Button3Click(TObject *Sender){
Edit1->Text=Edit1->Text+"7";
s=s+"7";
Edit1->SetFocus();
}
void __fastcall TForm1::Button4Click(TObject *Sender){
Edit1->Text=Edit1->Text+"6";
s=s+"6";
Edit1->SetFocus();
}
void __fastcall TForm1::Button17Click(TObject *Sender){
Edit1->Clear();
Edit1->SetFocus();
}
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char
&Key)
{
switch(Key){
case '.' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :

- 37 -

Copie autorizata pentru studenii CFBC

case
case
case
case
case
case
case

'9'
'0'
'+'
'-'
'*'
'/'
'='

:
:
:
:
:
:
:

Edit1->Text=Edit1->Text+Key;s=s+Key; break;
Button13Click(Sender);break;
Button14Click(Sender);break;
Button15Click(Sender);break;
Button16Click(Sender);break;
Button12Click(Sender);break;

}
}

- 38 -

Copie autorizata pentru studenii CFBC

10. Ferestre pentru afiarea mesajelor


Cu C++ Builder se pot crea diferite tipuri de ferestre pentru afiarea
mesajelor.
Apelarea funciei ShowMessage(S) afieaz o fereastr cu mesajul S.
De exemplu, instruciunea ShowMessage("Salut!") afieaz urmtoarea
fereastr:

Pentru afiarea ferestrelor cu mesaje de atenionare, eroare, confirmare


etc. se folosete funcia MessageDlg (S, Tip, LB, N), unde S este mesajul, Tip
tipul messajului, LB lista de butoane ale ferestrei, iar N numrul ecranului
de ajutor care va fi afiat la solicitare atunci cnd fereastra este activa.
Valorile parametrului Tip snt mtCustom, mtInformation, mtWarning,
mtError, mtConfirmation.
Valorile parametrului LB snt mbOk, mbCancel, mbYes, mbNo,
mbAbort,
mbRetry,
mbIgnore,
mbYesNoCancel,
mbOKCancel,
mbAbortRetryIgnore.
n cazul valorilor care corespund unui singur buton acestea se scriu dup
expresia TMsgDlgButtons(). De exemplu, instruciunea
MessageDlg("Noroc!", mtConfirmation, TMsgDlgButtons()<< mbIgnore
<< mbNo, 0)

afieaz urmtoarea fereastr:

Instruciunea MessageDlg("Salut!", mtInformation, mbYesNoCancel, 0)


afieaz urmtoarea fereastr:

- 39 -

Copie autorizata pentru studenii CFBC

Valoarea returnat de funcia MessageDlg depinde de modul de


nchidere a ferestrei i poate fi una din valorile mrOk, mrCancel, mrYes, mrNo,
mrAbort, mrRetry, mrIgnore.

Funcia MessageDlgPos (S, Tip, LB, N, X, Y) are efect similar


funciei MessageDlg cu deosebirea c fereastra cu mesaje este afiat n
poziia specificat de parametrii X, Y (colul stnga sus al ferestrei va avea
coordonatele (X, Y) n raport cu colul stnga sus al ecranului).

Funcia MessageBox de asemenea se utilizeaz pentru afiarea


mesajelor. Aa cum ea face parte din clasa TApplication, pentru apelarea ei se
va scrie o instruciune de forma Application->MessageBox(S, T, LB), unde S
este mesajul, T titlul ferestrei, iar LB precizeaz lista de butoane ale ferestrei
i poate fi una din valorile prezentate n urmtorul tabel:

Valoarea parametrului LB
MB_ABORTRETRYIGNORE
MB_OK
MB_OKCANCEL
MB_RETRYCANCEL
MB_YESNO
MB_YESNOCANCEL

Butoanele ferestrei de dialog


Abort, Retry, i Ignore.
OK.
OK i Cancel.
Retry i Cancel.
Yes i No.
Yes, No, i Cancel.

Funcia MessageBox returneaz una din valorile IDOK, IDCANCEL,


IDABORT, IDRETRY, IDIGNORE, IDYES, IDNO care ofer posibilitatea
verificrii modului de nchidere a ferestrei. De exemplu, instruciunea if
(Application->MessageBox("Salut !!!", "Exemplu",
MB_ABORTRETRYIGNORE)==IDRETRY) ShowMessage("Ati apasat Retry");

afieaz urmtoarea fereastr de dialog:

- 40 -

Copie autorizata pentru studenii CFBC

Dac aceast fereastr va fi nchis prin tastarea tastei Retry, atunci se va afia
fereastra

11. Ferestre pentru citirea datelor


O aplicaie C++ Builder poate primi date dintr-o fereastr de introducere
a datelor, dintr-un cmp al unei casete de editare sau dintr-un fiier. Pentru a citi
datele dintr-o fereastr de introducere a datelor se utilizeaz funcia InputBox
sau funcia InputQuery.
Funcia InputBox (S1, S2, S3) afieaz o fereastr cu titlul S1, S2 este textul
ce comenteaz introducerea, iar S3 textul care se afl iniial n fereastr. Dac
utilizatorul va nchide fereastra prin apsarea tastei Ok, atunci rezultatul
funciei va fi coninutul casetei de editare din cadrul ferestrei, altfel valoarea
S3. De exemplu, n urma executrii instruciunii
Edit1->Text=InputBox("Date personale", "Scrie virsta", "20");

se va afia urmtoarea fereastr:

- 41 -

Copie autorizata pentru studenii CFBC

Funcia InputQuery (S1, S2, S3) are efect similar funciei InputBox cu
deosebirea c textul din linia de editare se returneaz prin parametrul S3.
Valoarea returnat de funcie este de tip logic i este true doar n cazul cnd
fereastra a fost nchis prin apsarea tastei Ok. n caz contrar S3 primete
valoare vid. De exemplu, n urma executrii instruciunii
if (InputQuery("Date personale", "Numele", S))
Label1->Caption = S;

se va afia urmtoarea fereastr:

Eticheta Label1 va afia textul din caseta de editare a ferestrei doar dac
utilizatorul va apsa butonul Ok.

12. Aplicaii multiforme. Ferestre modale


Am menionat c o aplicaie Windows este format din cteva ferestre,
una fiind considerat fereastr principal (implicit prima fereastr este
principal). Pentru a crea o aplicaie multiform (adic format din cteva
ferestre) se pot folosi formularele-proiecte MDI (Multiple Document Interface
interfa cu documente multiple).
Deci, un proiect MDI este format dintr-o fereastr principal (numit
fereastr printe) i una sau mai multe ferestre subordonate ferestrei principale
(numite ferestre copil). Fereastra copil se afl doar n interiorul ferestrei
printe (nu poate fi deplasat, redimensionat n afara ferestrei printe).
Tipul ferestrei poate fi specificat cu ajutorul proprietii FormStyle, a
crei valori posibile snt: fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop.

- 42 -

Copie autorizata pentru studenii CFBC

Exemplu rezolvat
S crem o aplicaie MDI cu 3 ferestre. La efectuarea unui click pe
fereastra principal (fereastra printe), ferestrele subordonate vor fi aranjate una
lng alta n interiorul ferestrei principale. La efectuarea unui click pe o fereastr
subordonat, toate ferestrele vor fi aranjate sub form de casccad.
Realizare
1) Includem 3 forme n proiect (Form1 forma principal, Form2 i Form3
forme subordonate).
2) Modificm proprietatea Caption a fiecrei forme ( vezi fig.1).
3) Prelucrm evenimentul OnClick al fiecrei forme.
4) Salvm i lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#pragma package(smart_init)

- 43 -

Copie autorizata pentru studenii CFBC

#pragma resource "*.dfm"


TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::FormClick(TObject *Sender){
Form2->Top=0;
Form2->Left=0;
Form2->Width=Form1->Width/2;
Form3->Top=0;
Form3->Left=Form1->Width/2;
Form3->Width=Form1->Width/2;
}

Coninutul fiierului Unit2.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm2::FormClick(TObject *Sender){
Form1->Cascade();}

Coninutul fiierului Unit3.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
__fastcall TForm3::TForm3(TComponent* Owner): TForm(Owner){}
void __fastcall TForm3::FormClick(TObject *Sender){
Form1->Cascade();}

n timpul execuiei ferestrele unei aplicaii pot fi afiate obinuit sau


exclusiv. n ultimul caz fereastra se numete modal. Deci, o fereastr modal
este o fereastr care interzice orice aciune asupra ferestrei principale pn
aceast fereastr modal nu este nchis. De exemplu, ferestrele de dialog snt
ferestre modale.

- 44 -

Copie autorizata pentru studenii CFBC

Pentru a afia o fereastr n mod exclusiv se apeleaz metoda


ShowModal(). Valoarea returnat de aceast funcie stabilete starea (afiat
sau nchis) i modul de nchidere ferestrei. Ea este atribuit automat
proprietii ModalResult a ferestrei. Valori posibile:
- 0 fereastra este afiat (valoare implicit);
- mrOk fereastra a fost nchis prin apsarea butonului OK;
- mrCancel fereastra a fost nchis prin apsarea butonului Cancel;
- mrAbort fereastra a fost nchis prin apsarea butonului Abort;
- mrRetry fereastra a fost nchis prin apsarea butonului Retry;
- mrIgnore fereastra a fost nchis prin apsarea butonului Ignore;
- mrYes fereastra a fost nchis prin apsarea butonului Yes;
- mrNo fereastra a fost nchis prin apsarea butonului No.
Amintim c un buton de comand, de asemenea, are proprietatea
ModalRezult cu aceleai valori posibile.
Pentru a afia o form n mod obinuit se va utiliza metoda Show().
Exemplu rezolvat
S crem o aplicaie a crei fereastr va avea un buton de comand (cu
denumirea Intrare). Butonul va afia urmtoarea fereastr modal.

Utilizatorul va scrie n casetele de editare numele si parola. n cazul


scrierii i confirmrii parolei corecte (irul 123) se va afia mesajul Corect, iar
fereastra aplicaiei i va modifica culoarea. n caz contrar se va afia mesajul
Scrie parola corecta si confirma.
Realizare
1) Executm File\New\Application.
2) Executm File\New\Form.

- 45 -

Copie autorizata pentru studenii CFBC

3) Plasm pe form doua dou etichete, dou casete de editare i un buton de


comand conform imaginii din enun.
4) Modificm proprietatea Caption a formei Form2, a etichetelor i a butoanelor
de comand conform enunului. Proprietii ModalResult al butonului Confirma
i atribuim valoarea mrOk.
5) n fiierul Unit1.cpp adugm directiva #include "Unit2.h" .
6) Prelucrm evenimentul OnClick al fiecrui buton de comand.
7) Salvm i lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender){
Form2->Edit2->Text=""; Form2->ShowModal();
Form2->Edit1->Text="";
if(Form2->Edit2->Text=="123" && Form2->ModalResult==mrOk)
{ShowMessage("Corect"); Color=clLime;}
else ShowMessage("Scrie parola corecta si confirma");}

- 46 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit2.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
__fastcall TForm2::TForm2(TComponent* Owner): TForm(Owner){ }

13. Butoane i cutii de grupare


S examinm cteva clase de componente care se folosesc deseori la
elaborarea unui proiect.

13.1. Clasa TBitBtn


Spre deosebire de un buton de comand obinuit (de tip TButton), un
obiect de tip TBitBtn este un buton, pe suprafaa cruia se poate plasa o
imagine. Componenta BitBtn se afl pe paleta Additional.
Unele proprieti ale clasei TBitBtn
Glyph specific imaginea de pe suprafaa butonului.
Kind indic tipul butonului.
Layout indic amplasamentul imaginii fa de textul afiat pe buton.

13.2. Clasa TUpDown


Un obiect de tip TUpDown este un buton pentru incrementare i pentru
decrementare. Se poate asocia cu un alt component, de exemplu cu o cutie de
editare pentru incrementarea sau decrementarea unei valori numerice.
Componenta TUpDown se afl pe paleta Win32.
Unele proprieti ale clasei TUpDown
Associate specific controlul cu care este asociat butonul de
incrementare/decrementare.
AlignButton determin poziia butonului fa de controlul asociat (stnga
sau dreapta).

- 47 -

Copie autorizata pentru studenii CFBC

Increment indic cu cte uniti se va mri sau se va micora valoarea


iniial la efectuarea unui click pe una din tastele butonului. Iniial are valoarea
1.
Orientation specific orientarea controlului (orizontal sau vertical).
Min specific valoarea minimal (0 este valoare implicit) a butonului.
Max specific valoarea maximal (100 este valoare implicit) a butonului.
Position specific valoarea returnat de buton i atribuit controlului
asociat.

13.3. Clasa TGroupBox


Componenta GroupBox este o cutie de grupare, se afl pe paleta
Standard i este utilizat pentru gruparea logic a componentelor de pe
suprafaa unei forme. Are rol de container, n a crui interior pot fi plasate alte
componente. Aceste componente vor aparine aceluiai grup. ntre cutie i
component se creeaz o relaie de tip printe-copil. n regim de proiectare la
deplasarea cutiei se vor deplasa i toate componentele din interiorul ei.

13.4. Clasa TCheckBox


O component de tip TCheckBox afieaz un buton de opiune (se mai
spune caset de validare). De regul, se utilizeaz pentru activarea
(conectarea, selectarea) sau dezactivarea (deconectarea) unei stri sau a unui
regim. Starea selectat se caracterizeaz prin prezena bifei n caset.
Componenta CheckBox se afl pe paleta Standard.
Unele proprieti ale clasei TCheckBox
Aligment determin poziia textului ataat butonului fa de acesta. Valori
posibile: taRightJustify (dreapta), taLeftJustify (stng).
AllowGrayed (de tip bool) permite (pentru valoarea true) sau interzice
starea estompat (se mai spune starea gri) a butului de opiune. n cazul valorii
true butonul poate avea trei stri (selectat, neselectat, estompat), altfel
dou stri (selectat i neselectat).
Checked (de tip bool) determin dac butonul este (pentru valoarea true)
sau nu este selectat.
State indic starea butonului. Valori posibile: cbUnchecked (valoare

- 48 -

Copie autorizata pentru studenii CFBC

implicit, butonul nu este selectat), cbChecked (butonul este selectat),


cbGrayed (butonul se afl n stare estompat).

13.5. Clasa TRadioButton


Componenta RadioButton se afl pe paleta Standard i afieaz un buton
radio, care, n cazul n care este singur, are acelai rol ca i un buton de
opiune. De regul, butoanele radio se folosesc n grup. La selectarea unui
buton din grup celelalte butoane din grup automat devin neselectate. De fapt,
pentru a crea grupuri de butoane radio se recomand utilizarea componentei
RadioGroup.
Unele proprieti ale clasei TRadioButton
Aligment determin poziia textului ataat butonului fa de acesta.
Checked (de tip boolean) determin dac butonul este sau nu este selectat.

13.6. Clasa TRadioGroup


Componenta RadioGroup se afl pe paleta Standard i afieaz un grup
de butoane radio. Butoanele unui astfel de grup coopereaz: n orice moment
de timp se poate selecta doar un singur buton. La selectarea unui buton,
celelalte devin neselectate.

Unele proprieti ale clasei TRadioGroup


Columns specific numrul de coloane n care snt aezate butoanele
grupului. Valori posibile: 1 (valoare implicit), 2, ... 16.
ItemIndex specific numrul de ordine al butonului radio selectat. Indicele
butonului al n-lea este n 1. Valoarea 1 este implicit i corespunde situaiei
cnd nu este selectat nici un buton.
Items definete numrul i denumirea butoanelor din grup. Se utilizeaz ca
i proprietatea Items a componentei Memo.
Exemplu rezolvat
S crem o aplicaie care va conine un grup de butoane radio
(component de tip TRadioGroup), un buton de opiune (component de tip
TCheckBox),
trei casete de editare, o etichet i un buton de

- 49 -

Copie autorizata pentru studenii CFBC

incrementare/decrementare (component de tip TUpDown). Ultimul buton va fi


asociat casetei Edit3.

La selectarea unui buton radio n caseta Edit1 va aprea numele lui. Un click
pe una din tastele butonului de incrementare/decrementare va mri sau va
micora valoarea din caseta Edit3. Caseta Edit2 va afia starea butonului de
opiune.

Realizare
1) Executm File\New\Other.
2) Plasm pe form componentele conform enunului.
3) Modificm proprietatea Caption a formei, a etichetei, a butonului de opiune
conform enunului. Crem butoanele radio cu ajutorul proprietii Items a
componentei RadioGroup1.
4) Proprietii Asociate a butonului de opiune i atribuim valoarea Edit3.
5) Prelucrm evenimentul OnClick al butonului de opiune i cel al componentei
RadioGroup1.
6) Salvm i lansm aplicaia la execuie.

- 50 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::RadioGroup1Click(TObject *Sender){
int nr=RadioGroup1->ItemIndex;
Edit1->Text=RadioGroup1->Items->Strings[nr];
}
void __fastcall TForm1::CheckBox1Click(TObject *Sender){
if(CheckBox1->Checked==true) Edit2->Text="Bifat";
else Edit2->Text="Nebifat";
}

14. Clasa TMemo


O component de tip TMemo este o cutie de editare format din mai
multe linii, numit i zon de editare.
Numerotarea liniilor zonei ncepe cu 0. Informaia din zon se pstreaz
n proprietatea Lines (de tipul TStrings). Tipul TStrings descrie o list de iruri
de caractere. Accesul la linia a n-a a listei se realizeaz prin construcia
Strings[n-1].

- 51 -

Copie autorizata pentru studenii CFBC

TMemo are unele dintre proprieti identice cu proprietile clasei


TEdit: MaxLength, ReadOnly, Text, Name, Color, BorderStyle, Cursor, etc.
Unele proprieti specifice clasei TMemo
Align stabilete poziia zonei pe form i poate lua una din urmtoarele
valori:
- alNone componenta nu-i va schimba poziia;
- alRight componenta se va alinia n partea dreapt a formei;
- alLeft componenta se va alinia n partea stng a formei;
- alBottom componenta va fi plasat n partea de jos a formei;
- alClient componenta va ocupa tot spaiul formei.
Aligment stabilete tipul de aliniere a textului n zon.
Lines conine textul din zon, sub form de iruri de caractere.
Scoolbars indic dac zona are sau nu are bare de defilare. Valori posibile:
ssNone, ssHorizontal, ssVertical, ssBoth.
WantReturns (de tip bool) stabilete dac utilizatorul poate (pentru valoarea
true, valoare implicit) s insereze n zon sfrituri de linii cu ajutorul tastei
Enter. n cazul valorii false evenimentul de acionare a tastei Enter va fi
prelucrat de ctre form. n acest caz trecerea la linie nou se realizeaz prin
combinaia Ctrl + Enter.
WantTabs (de tip bool) stabilete dac utilizatorul poate (pentru valoarea
true) s insereze n zon spaieri cu ajutorul tastei Tab. n cazul valorii false
(valoare implicit) la acionarea tastei Tab se va trece la urmtoarea
component de pe form. n acest caz spaierile se vor insera prin combinaia
Ctrl + Tab.
WordWrap (de tip bool) stabilete (pentru valoarea true, valoare implicit)
regimul de trecere automat la linie nou atunci cnd se ajunge la muchia din
dreapta a zonei (fr inserarea automat a caracterelor de trecere la linie nou).
Evident, n acest caz bara de defilare orizontal n-are sens.
Clasa TMemo este destinat editrii/gestionrii textelor, de aceea
pentru prelucrarea informaiei din zona de editare pot fi utilizate metodele
clasei TEdit. n acelai timp, graie proprietii Lines (de tip TStrings), de
asemenea, pot fi folosite proprietile i metodele clasei TSrings.

Unele proprieti i metode ale clasei TStrings

- 52 -

Copie autorizata pentru studenii CFBC

Count pstreaz numrul de iruri ale zonei de editare.


Strings[i] specific al i+1 lea ir al zonei.
SaveToFile (F) salveaz lista de iruri n fiierul cu numele F.
LoadFro1File (F) umple lista cu linii de text din fiierul F.
Add(S) adaug ir de caractere S la sfritul listei.
Clear golete lista de iruri de caractere.

De exemplu, instruciunea Memo1->Lines->SaveToFile(C: \\fis.txt) salveaz


coninutul zonei Memo1 n fiierul fis.txt de pe discul C.

Exemplu rezolvat
S elaborm o aplicaie care va determina toi divizorii unui numr
natural. Pentru a citi valoarea numrului va fi utilizat o cutie de editare, iar
pentru afiarea rezultatului o zon de editare. Butonul Determin Divizorii va
calcula i va afia n zon divizorii numrului. Butonul Salveaza va salva
rezultatul ntr-un fiier, a crui nume va fi specificat de utilizator.
Realizare:
1) Plasm controalele necesare pe suprafaa formei.

2) Prelucrm evenimentul OnClick al controlului Button1 (fiierul Unit1.cpp)


3) Prelucrm evenimentul OnClick al controlului Button2 (fiierul Unit1.cpp)
4) Modificm proprietatea Caption a formei i a controalelor de pe form.
5) Salvm i lansm aplicaia la execuie.

- 53 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int num;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){ }
void __fastcall TForm1::Button1Click(TObject *Sender){
num=Edit1->Text.ToInt();
Memo1->Lines->Add("Divizorii numarului "+AnsiString(num));
AnsiString s="";
for(int i=1;i<=num;i++) if(num%i==0) s=s+AnsiString(i)+" ";
Memo1->Lines->Add(s);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
AnsiString cale;
cale=InputBox("Salvare rezultate","Dati calea fisierului","");
Memo1->Lines->SaveToFile(cale);
}

- 54 -

Copie autorizata pentru studenii CFBC

15. Gestiunea meniurilor


Majoritatea aplicaiilor Windows conin meniuri. Deosebim meniuri
principale (de regul, plasate orizontal n partea de sus a ferestrelor aplicaiei)
i meniuri flotante (care se apeleaz printr-un click pe butonul drept al mouselui).

15.1. Clasa TMainMenu


Pentru crearea unui meniu principal se folosete componenta MainMenu
(de tip TMainMenu) de pe paleta Standard de componente. Un meniu principal
este format din unul sau mai multe elemente de meniu (comenzi), aezate
orizontal pe o bar. Fiecare element de meniu este de tipul TMenuItem, ceea ce
nseamn c unui astfel de element i se poate ataa o fereastr derulant.
Fereastra derulant poate conine unul sau mai multe elemente (aezate
vertical) de asemenea de tip TMenuItem. Fiecrui din aceste elemente i se pot
ataa submeniuri etc.
Algoritmul de creare i prelucrare a meniului principal
1) Plasm o component MainMenu pe form.
2) Crearea elementelor de meniu se realizeaz cu ajutorul utilitarul de
proiectare a meniurilor. Pentru a afia utilitarul de proiectare a meniurilor:
- se execut un double-click pe componenta MainMenu (de pe form) sau
- se execut un double-click n caseta de valori a proprietii Items a
componentei MainMenu sau pe butonul cu trei puncte din aceast caset sau
- se execut comanda Menu Designer a meniului contextual al contextual al
componentei MainMenu.
Trecerea la un subnivel se realizeaz prin apsarea tastei Enter sau a
combinaiei de taste Ctrl + tast-sgeat, sau se execut comanda Insert a
meniului contextual al elementului pentru care se dorete crearea subnivelului.
Fiecare element de meniu apare n lista derulant a Inspectorului de
obiecte. Numele acestui element n mod predefinit este urmat de simbolul 1
(sau de simbolul 2 dac exist deja un astfel de nume etc.).

- 55 -

Copie autorizata pentru studenii CFBC

Astfel, un element de meniu are propriile evenimente i proprieti. Dac


o liter L din numele elementului este precedat de simbolul & , atunci
elementul respectiv va putea fi selectat (eventual executat) i prin combinaia
de taste Alt + L. n acelai timp, o combinaie de taste corespunztoare
elementului de meniu (indiferent de prezena simbolului & n numele lui) poate
fi stabilit prin intermediului proprietii ShortCut.
n faa numelui fiecrui element de meniu poate fi introdus o imagine
(prin intermediul proprietii Image).
3) n urma alegerii unui element de meniu se declaneaz evenimentul OnClick
al acestui element.

15.2. Clasa TPopUpMeniu


Componenta PopupMenu (are tipul TPopupMenu) se folosete pentru
crearea meniului contextual (se mai spune meniu flotant). Un meniu contextual
poate fi afiat prin executarea unui click-dreapta i apare n poziia n care se
afl cursorul de mouse n momentul efecturii acestui click. Unul sau mai
multe meniuri flotante pot fi atribuite att formelor, ct i componentelor prin
intermediul proprietii PopupMenu a formei sau a componentei.
Unele proprieti i evenimente specifice componentei PopupMenu

Proprietatea Alignment specific locul n care va aprea meniul contextual


fa de cursorul de mouse (n momentul excutrii click-dreapta). Aligment
poate lua urmtoarele valori:

- 56 -

Copie autorizata pentru studenii CFBC

- paLeft - meniul va fi afiat n colul din stnga sus al cursorului de


mouse
- paCenter - meniul va fi afiat n centrul marginii de sus al curorului de
mouse.
- paRight - meniul va fi afiat n colul din dreapta sus al cursorului de
mouse.
Proprietatea Items este un obiect de tip TMenuItems prin care se definesc
elementele meniului.
Proprietatea PopupComponent stabilete componenta care este
proprietarul actual al meniului contextual. Se utilizeaz atunci cnd mai
multe componente folosesc acelai meniu contextual.
Proprietatea AutoPopup (de tip bool) permite (n cazul valorii true)
afiarea meniului contextual prin executarea unui click-dreapta asupra
componentei-proprietar al acestui meniu. n cazul valorii false meniul va
putea fi afiat numai prin program, apelnd metoda Popup a componenteiproprietar. Aceast metod permite specificarea poziiei de ecran n care va
aprea meniul.
Evenimetul OnPopup se declaneaz n momentul n care urmeaz s fie
afiat meniul.
Observaie. Dup crearea meniului este obligatoriu ca el s fie asociat
unui control (proprietatea PopupMenu a controlului).

Exemple rezolvate
1. S crem o aplicaie cu dou ferestre. Prima fereastr va avea
urmtoarele meniuri:
File
Forma Noua
Inchide

View
Mica
Marime Mijlocie
Mare
Verde
Culoare Rosu
Albastru
Meniul principal

Inaltime

Latime

100
200
300
100
200
300

Meniul contextual

Comanda Forma Noua va afia fereastra a doua. Comanda Inchide va


nchide aplicaia. Selectarea celorlalte elemente de meniu va modifica
corespunztor forma.

- 57 -

Copie autorizata pentru studenii CFBC

Realizare:
1) Executm File\New\Application.
2) Executm File\New\Form. Atribuim proprietii Visible a formei Form2
valoarea false.
3) Plasm componentele MainMenu i PopupMenu pe form.
4) Lansm utilitarul de proiectare a meniurilor executnd un click n caseta de
valori a proprietii Items a fiecrei componente. Scriem elementele de meniu
conform enunului.
5) Atribuim proprietii PopupMenu a formei valoarea PopupMenu1.
6) Prelucrm evenimentul OnClick al fiecrui element de meniu.
7) Salvm i lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


# include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::FormaNoua1Click(TObject *Sender){
Form2->Show();

- 58 -

Copie autorizata pentru studenii CFBC

}
void __fastcall TForm1::Inchide1Click(TObject *Sender){
Form1->Close();
}
void __fastcall TForm1::Mica1Click(TObject *Sender){
Form1->Width=50; Form1->Height=50;
}
void __fastcall TForm1::mijlocie1Click(TObject *Sender){
Form1->Width=200; Form1->Height=200;
}
void __fastcall TForm1::Mare1Click(TObject *Sender){
Form1->Width=400; Form1->Height=400;
}
void __fastcall TForm1::Verde1Click(TObject *Sender){
Form1->Color=clGreen;
}
void __fastcall TForm1::Galben1Click(TObject *Sender){
Form1->Color=clRed;
}
void __fastcall TForm1::Albastru1Click(TObject *Sender){
Form1->Color=clBlue;
}
void __fastcall TForm1::N1001Click(TObject *Sender){
Form1->Height=100;
}
void __fastcall TForm1::N2001Click(TObject *Sender){
Form1->Height=200;
}
void __fastcall TForm1::N3001Click(TObject *Sender){
Form1->Height=300;
}
void __fastcall TForm1::N1002Click(TObject *Sender){
Form1->Width=100;
}
void __fastcall TForm1::N2002Click(TObject *Sender){
Form1->Width=200;
}
void __fastcall TForm1::N3002Click(TObject *Sender){
Form1->Width=300;
}

Observaie. N1001, N2001, N3001 snt valorile proprietilor Name ale


elementelor din submeniul Inaltime, iar N1002, N2002, N3002 snt valorile
proprietilor Name ale elementelor din submeniul Latime.

- 59 -

Copie autorizata pentru studenii CFBC

2. Fiecare rnd al fiierului student.txt conine informaia despre


studentul unei grupe (numele, prenumele, denumirea grupei i nota medie).

S crem o aplicaie a crei fereastr va conine un meniu principal


pentru prelucrarea informaiei din fiier. Vom crea clasele student (care va
descrie un student) i lista (care va conine metode de citire din fiier, de
afiare a listei, de filtrare a nregistrrilor dup cmpuri cu valori maxime sau
minime).
Realizare:
1) Executm File\New\Application.
2) Plasm pe form un meniu principal, o zon de editare i o etichet.
3) Scriem elementele meniului principal:
Afisare
Eminentii
Restantierii
Toti studentii

Iesire

4) Modificm proprietatea Caption a etichetei i a formei. Definim clasele


student i lista n fiierul Unit1.cpp.
5) Prelucrm evenimentul OnClick al fiecrui element de meniu.
6) Salvm i lansm aplicaia la execuie.

- 60 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "fstream.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){ }
fstream f("student.txt");
class student{
public:
char nume[20], prenume[20], grupa[10];
double media;
student *next;
student(){next=NULL;}
void citire();
AnsiString linie();
};
class lista{
public:
student *l,*prim;
lista(){prim=NULL;}
void creare();
void afisare();
void lenesi();
void eminenti();
~lista();
};
void student::citire(){f>>nume>>prenume>>grupa>>media;}
AnsiString student::linie(){

- 61 -

Copie autorizata pentru studenii CFBC

AnsiString s1,s2,s3,s4,sir;
int i;
s1=AnsiString(nume);
for(i=s1.Length();i<21;i++) s1=s1+"
";
s2=AnsiString(prenume);
for(i=s2.Length();i<21;i++) s2=s2+"
";
s3=AnsiString(grupa);
for(i=s3.Length();i<16;i++) s3=s3+"
";
s4=AnsiString(media);
for(i=s4.Length();i<11;i++) s4=s4+"
";
sir=s1+s2+s3+s4;
return sir;
}
void lista::creare(){
student *p;
while(!f.eof()){
p=new student;
p->citire();
if(prim==NULL){prim=l=p;}
else{l->next=p;l=p;}
}
}
void lista::afisare(){
l=prim;
while(l->next!=NULL){
Form1->Memo1->Lines->Add(l->linie());
l=l->next;
}
}
void lista::lenesi(){
l=prim;
while(l->next!=NULL){
if(l->media<=6) Form1->Memo1->Lines->Add(l->linie());
l=l->next;
}
}
void lista::eminenti(){
l=prim;
while(l->next!=NULL){
if(l->media>=8.88) Form1->Memo1->Lines->Add(l->linie());
l=l->next;
}
}
lista::~lista(){
while(prim!=NULL){
l=prim;
prim=prim->next;
delete l;
}
}

- 62 -

Copie autorizata pentru studenii CFBC

lista p;
void __fastcall TForm1::Iesire1Click(TObject *Sender){
Application->Terminate();
}
void __fastcall TForm1::FormCreate(TObject *Sender){
p.creare();
}
void __fastcall TForm1::Totistudentii1Click(TObject *Sender){
Memo1->Clear(); p.afisare();
}
void __fastcall TForm1::Studentilenesi1Click(TObject *Sender){
Memo1->Clear(); p.lenesi();
}
void __fastcall TForm1::Studentieminenti1Click(TObject
*Sender){
Memo1->Clear(); p.eminenti();
}
void __fastcall TForm1::Button1Click(TObject *Sender){
Memo1->Clear();
}

- 63 -

Copie autorizata pentru studenii CFBC

16. Elemente de grafic


n Borland C++ Builder pentru prelucrarea informaiei grafice se
folosesc trei tipuri de obiecte:
Graphics, care exist n form de fiiere sau resurse.
Motenitoare ale clasei TGraphics snt clasele TBitmap, TIcon, TMetafile.
Picture, care reprezint containere care pstreaz obiecte
grafice. De regul, obiectele de tip TWinControl conin proprietatea Picture (de
tip TPicture)
Canvas, care reprezint o suprafa (pnz de desenare) format
din puncte (Bitmapped). Obiectele clasei TCanvas exist doar n calitate de
proprieti ale altor obiecte sau componente. Astfel, componentele Form,
Image, PaintBox conin proprietatea Canvas.

16.1. Unele proprieti ale obiectului Canvas

Brush (proprietate compus, de tip TBrush) stabilete proprietile pensulei


utilizate pentru colorarea sau haurarea interiorului domeniilor. Classa
TBrush are urmtoarele proprieti:
Bitmap conine modul (n format de bii) de colorare a domeniului.
Dac se utilizeaz aceast proprietate, atunci nu au efect proprietile
Color i Style. n calitate de model de colorare poate fi o imagine.
Color stabilete culoarea pensulei. Valoarea clWhite (alb) este
implicit.
Handle conine descrierea pensulei Windows GDI.
Style determin stilul pensulei. Valori posibile: bsSolid, bsClear,
bsHorizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross,
bsDiagCross.

ClipRect (de tip TRect, are atributul readonly) determin domeniul


dreptunghiular de pnz care poate fi desenat. n cazul formei acest
domeniu coincide cu domeniul client al formei. Tipul TRect este definit
astfel:

struct TRect {
TRect() {}
TRect(const TPoint& TL, const TPoint& BR) {
left=TL.x; top=TL.y; right=BR.x; bottom=BR.y;
}

- 64 -

Copie autorizata pentru studenii CFBC

TRect(int l, int t, int r, int b) {left=l; top=t; right=r;


bottom=b;}
TRect(RECT& r) {
left=r.left; top=r.top; right=r.right; bottom=r.bottom;
}
}

CopyMode determin regimul de copiere a informaiei dintr-un obiect de


tip TGraphics.

Font (proprietate compus) specific fontul i stilul textelor care se vor


afia pe pnz. A se vedea proprietatea Font a formei.

Handle conine descrierea mecanismului, n baza cruia este construit


pnza. Se folosete pentru operaii de nivel jos.

Pen (proprietate compus) stabilete proprietile creionului de desenare.


Clasa TPen are urmtoarele proprieti: Color, Handle, Mode, Style, Width.

PenPos (de tip TPoint) specific coordonatele indicatorului poziiei


curente. Tipul TPoint se definete astfel:

struct TPoint {
TPoint() {}
TPoint(int _x, int _y) : x(_x), y(_y) {}
TPoint(POINT& pt) { x=pt.x; y=pt.y; }
}

Pixels[X][Y] stabilete culoarea punctului de coordonate X, Y.

TextAlign stabilete modul de aliniere a textului care urmeaz a fi afiat pe


pnz. Valori posibile: taTop, taBottom.

16.2. Unele metode ale obiectului Canvas

Arc (X1, Y1, X2, Y2, X3, Y3, X4, Y4) construiete un segment de elips
nscris n dreptunghiul determinat de coordonatele ntregi X1, Y1, X2, Y2
i mrginit de semidreptele cu originea n centrul dreptunghiului i care trec
prin punctele (X3, Y3), (X4, Y4). Se deseneaz mpotriva acelor de ceas.

Chord (X1, Y1, X2, Y2, X3, Y3, X4, Y4) construiete o elips nscris n
dreptunghiul determinat de coordonatele ntregi X1, Y1, X2, Y2, domeniul

- 65 -

Copie autorizata pentru studenii CFBC

mrginit de elips i coarda determinat de punctele (X3, Y3), (X4, Y4)


este haurat.
CopyRect (Dest, I, Source) copie imaginea I (de tip TCanvas) din
domeniul Sourse n domeniul Dest (ambele de tipul TRect).

Draw (X, Y, Graphic) deseneaz obiectul Graphic (de tip TGraphic),


astfel nct colul stnga-sus al desenului are coordonatele ntregi (X, Y).

DrawFocusRect (Rect) copie domeniul dreptunghiular Rect (de tip TRect)


cu ajutorul operaiei XOR, de aceea la desenarea repetat desenul anterior
se terge.

Ellipse (D) construiete i coloreaz o elips nscris n dreptunghiul D (de


tip TRect).

FillRect(D) coloreaz dreptunghiul D.

LineTo(X, Y) construiete un segment din poziia curent pn-n punctul


de coordonate ntregi (X, Y).

Lock blocheaz pnza.

MoveTo(X, Y) deplaseaz indicatorul poziiei curente n punctul (X, Y).

Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4) construiete un sector de elips
nscris n dreptunghiul determinat de coordonatele X1, Y1, X2, Y2 i
mrginit de semidreptele cu originea n centrul dreptunghiului i care trec
prin punctele (X3, Y3), (X4, Y4). Se deseneaz mpotriva acelor de ceas.

Polygon (Points, PointsSize) construiete i coloreaz un poligon cu


PointsSize vrfuri definite de vectorul de puncte Points. De exemplu,
procedura

void __fastcall TForm1::Button1Click(TObject *Sender){


TPoint points[4];
points[0] = Point(10,10);
points[1] = Point(210,10);
points[2] = Point(210,110);
points[3] = Point(160,160);
Form1->Canvas->Brush->Color = clTeal;
Form1->Canvas->Polygon(points, 3);
}

- 66 -

Copie autorizata pentru studenii CFBC

construiete urmtorul patrulater:

Polyline (Points, PointsSize) construiete o linie frnt cu PointsSize


vrfuri definite de vectorul de puncte Points.

Rectangle (X1, Y1, X2, Y2) construiete i coloreaz un dreptunghi, a


crui diagonal este mrginit de punctele (X1, Y1), (X2, Y2).

Refresh stabilete pentru creion i pensul valori predefinite.

ResetClipRegion restabilete domeniul de desenare stabilit anterior cu


procedura SetClipRect.

RoundRect (X1, Y1, X2, Y2, X3, Y3: Integer) construiete i coloreaz
un dreptunghi cu colurile rotunjite, a crui diagonal este mrginit de
punctele (X1, Y1), (X2, Y2).

StretchDraw (D, Graphic) deseneaz obiectul Graphic (de tip


TGraphics) n domeniul D (de tip TRect).

TextOut(X, Y, S) afieaz textul S pe poziia (X, Y).

TextRect(D, X, Y, S) afieaz textul S n interiorul dreptunghiului D (de


tip TRect). Textul care nu ncape n dreptunghi este trunchiat. Colul
stnga-sus al dreptunghiului are coordonatele (X, Y).

TextHeight (S) returneaz nlimea (n pixeli) a dreptunghiului n care


este inclus textul S.

- 67 -

Copie autorizata pentru studenii CFBC

TextWidth (S) returneaz limea dreptunghiului, n a crui interior este


inclus textul S.
TextExtent (const S) (de tip TSize) returneaz nlimea i limea
dreptunghiului n care este inclus textul S. Tipul TSize este definit astfel:

typedef struct TSize {


long cx; long cy;
}

TryLock (de tip bool) returneaz valoarea true dac pnza de desenare nu
este blocat de alte comenzi, apoi o blocheaz.

16.3. Evenimentele obiectului Canvas

OnChange se declaneaz n momentul cnd imaginea de pe pnz a fost


modificat.

OnChanging se declaneaz nainte de nceperea modificrii imaginii de


pe pnz.

16.4. Clasa TImage


Componenta Image (are tipul TImage, aparine unit-ului QExtCtrls)
reprezint un container pentru afiarea imaginilor. Imaginea poate fi ncrcat
i n timpul proiectrii aplicaiei prin apelarea proprietii Picture a
componentei.
Unele proprieti ale clasei TImage

Canvas reprezint pnza de desenare corespunztoare componentei Image.

Center (de tip bool) stabilete dac centrul imaginii afiate de component
va coincide (pentru valoarea true) sau nu cu centrul ei. n cazul valorii
false, colul stnga-sus al imaginii va fi poziionat n colul-stnga sus al
componentei. Proprietatea Center nu are nici un efect atunci, cnd
proprietatea AutoSize are valoarea true, sau atunci cnd proprietatea Stretch
este true i proprietatea Picture nu specific un simbol grafic de extensie
*.ICO.

- 68 -

Copie autorizata pentru studenii CFBC

Picture (de tip TPicture) specific imaginea care va fi afiat de


componenta Image. Clasa TPicture are proprietile Bitmap, Graphic,
Height,
Icon,
Width
i
metodele
Assign,
LoadFromFile,
LoadFromMimeSource,
LoadFromStream,
RegisterFileFormat,
RegisterFileFormatRes, SaveToFile, SaveToMimeSource, SaveToStream,
TPicture (creeaz un obiect de tip TPicture), UnregisterGraphicClass.

Stretch (de tip bool) stabilete dac imaginea va fi redimensionat (pentru


valoarea true) sau nu la dimensiunile containerului.

Exemple rezolvate
1. S crem o aplicaie care va desena pe fereastra aplicaiei un disc n poziia n
care utilizatorul va efectua un click de mouse. Meniul contextual al aplicaiei va
conine comenzile Curata i Inchide pentru curirea ferestrei i respectiv
pentru nchiderea aplicaiei. De asemenea, la apsarea tastei x aplicaia va fi
nchis. Pentru determinarea poziiei mouse-lui vom folosi expresiile:
Mouse->CursorPos.x returneaz coordonata x;
Mouse->CursorPos.y returneaz coordonata y.
Realizare
1) Executm File\New\Application. Plasm pe form o component de tip
TPopupMenu.
2) Prelucrm evenimentele OnClick i OnKeyPress ale formei.
3) Modificm proprietatea Caption a formei. Scriem elementele meniului
contextual i prelucrm evenimentul OnClick al fiecrui element de meniu.
4) Salvm i lansm aplicaia la execuie.

- 69 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int X=10;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void desen(int a,int b){
Form1->Canvas->Brush->Color = clRed;
Form1->Canvas->Ellipse(a-X, b-X, a+X, b+X);
}
void __fastcall TForm1::FormClick(TObject *Sender) {
int x,y;
x=Mouse->CursorPos.x-Form1->Left;
y=Mouse->CursorPos.y-X*2.5-Form1->Top;
desen(x,y);
}
void __fastcall TForm1::FormKeyPress(TObject *Sender, char
&Key){
if(Key=='c'){ Form1->Hide(); Form1->Show();}
if(Key=='x') Form1->Close();
}
void __fastcall TForm1::curata1Click(TObject *Sender){
Form1->Hide();
Form1->Show();
}
void __fastcall TForm1::Inchide1Click(TObject *Sender){ Form1>Close();}

2. S crem o aplicaie care afia graficul funciei y = x3 pe intervalul [5, 5].


La redimensionarea ferestrei aplicaiei graficul se va redimensiona
corespunztor.
Realizare:
1) Executm File / New Application.
2) Prelucrm evenimentele OnPaint i OnResize ale formei.
3) Lansm aplicaia la execuie.

- 70 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fastcall TForm1::FormPaint(TObject *Sender) {
double x,y;
int x1, y1;
Form1->Canvas->Pen->Width=1;
Color=clWhite;
Canvas->MoveTo(ClientWidth /2,0);
Canvas->LineTo(ClientWidth / 2, ClientHeight);
Canvas->MoveTo(0, ClientHeight / 2);
Canvas->LineTo(ClientWidth, ClientHeight / 2);
Canvas->TextOut(ClientWidth-10, ClientHeight / 2 + 2, "X");
Canvas->TextOut(ClientWidth / 2 + 20, ClientHeight / 2, "1");
Canvas->TextOut(ClientWidth / 2 + 2, 5, "Y");
Canvas->TextOut(ClientWidth / 2 + 2, ClientHeight / 2 - 20,
"1");
Form1->Canvas->Pen->Width=3;
x=-5;
while (x<=5) {
y=x*x*x;
x1=20*x+ (ClientWidth / 2);
y1=(ClientHeight / 2)-20*y;
Canvas->Pixels[x1][y1]=clRed;

- 71 -

Copie autorizata pentru studenii CFBC

x=x+0.001;
}}
void __fastcall TForm1::FormResize(TObject *Sender){
double x,y;
int x1, y1;
Form1->Canvas->Pen->Width=1;
Canvas->Rectangle(0,0, ClientWidth, ClientHeight);
Color=clWhite;
Canvas->MoveTo(ClientWidth /2,0);
Canvas->LineTo(ClientWidth / 2, ClientHeight);
Canvas->MoveTo(0, ClientHeight / 2);
Canvas->LineTo(ClientWidth, ClientHeight / 2);
Canvas->TextOut(ClientWidth-10, ClientHeight / 2 + 2, "X");
Canvas->TextOut(ClientWidth / 2 + 20, ClientHeight / 2, "1");
Canvas->TextOut(ClientWidth / 2 + 2, 5, "Y");
Canvas->TextOut(ClientWidth / 2 + 2, ClientHeight / 2 - 20,
"1");
Form1->Canvas->Pen->Width=3;
x=-5;
while (x<=5) {
y=x*x*x;
x1=20*x+ ClientWidth / 2;
y1=ClientHeight / 2-20*y;
Canvas->Pixels[x1][y1]=clRed;
x=x+0.001;
}}

16.5. Clasa TTimer

. Efecte de animaie

Componenta Timer (de tip TTimer) se afl pe pagina de componente


System i este utilizat pentru apelarea periodic (dup scurgerea unui interval
de timp) a unei funcii. De fapt dac proprietatea Enabled a aceste componente
este true, atunci periodic se declaneaz evenimentul OnTimer (n care se poate
defini funcia menionat) Componenta Timer nu este vizibil n regim de
execuie.
Unele proprieti ale clasei TTimer
Enabled (de tip bool) specific dac periodic se va declana (pentru
valoarea true) sau nu evenimentul OnTimer.
Interval specific numrul de milisecunde (perioada) dintre dou apeluri
consecutive ale handlerului de evenimente OnTimer.

- 72 -

Copie autorizata pentru studenii CFBC

Exemplu rezolvat
S crem o aplicaie a crei fereastr va conine dou butoane de
comand (Start i Stop). Butonul Start va lansa un proces care va desena n
poziii aleatoare discuri de culori aleatorii la fiecare 0,5 secunde. Butonul Stop
va ntrerupe procesul.
Realizare:
1) Executm File / New /Application.
2) Plasm pe form dou butoane de comand i o component de tip
TTimer.
3) Atribuim proprietii Caption a butoanelor de comand valori
conform enunului.
4) Prelucrm evenimentul OnTimer al componentei Timer1 i
evenimentul OnClick al fiecrui buton de comand.
5) Lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "fstream.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
int X=10;
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}

- 73 -

Copie autorizata pentru studenii CFBC

void desen(int a,int b,int c){


switch(c){
case 0 : Form1->Canvas->Brush->Color = clBlue; break;
case 1 : Form1->Canvas->Brush->Color = clRed; break;
case 2 : Form1->Canvas->Brush->Color = clNavy; break;
case 3 : Form1->Canvas->Brush->Color = clTeal; break;
case 4 : Form1->Canvas->Brush->Color = clGreen; break;
case 5 : Form1->Canvas->Brush->Color = clAqua; break;
} Form1->Canvas->Ellipse(a-X, b-X, a+X, b+X);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender){
int x,y,culoare;
x=random(Form1->Width); y=random(Form1->ClientHeight-40)+40;
culoare=random(6); desen(x,y,culoare);
}
void __fastcall TForm1::Button1Click(TObject *Sender){
Timer1->Interval=500; Timer1->Enabled= true;
}
void __fastcall TForm1::Button2Click(TObject *Sender){Timer1>Enabled=false;}

2. S crem o aplicaie care va conine dou butoane de comand (Start i Stop)


i va simula plutirea unui ptrat. Plutirea va ncepe dup efectuarea unui click
pe butonul Start i se va opri la efectuarea unui click pe butonul Stop.
Realizare:
1) Executm File / New /Application.
2) Plasm componentele necesare pe suprafaa formei (Timer1 i Button1).
3) Prelucrm evenimentele Button1Click, Button2Click i FormPaint. Prin
prelucrarea evenimentului FormPaint va fi posibil stergerea ultimei figuri
desenate.
4) Salvm i lansm n execuie aplicaia.

- 74 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double a,b,i,x,y;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void figura(int x, int y);
void __fastcall TForm1::Button1Click(TObject *Sender){
x=10;
y=Form1->Height/2; a=x;
b=Form1->Width ; i=a;
Timer1->Enabled=true;
}
void figura(int x, int y){
int l=25;
Form1->Canvas->Rectangle(x-l/2,y-l/2,x+l/2,y+l/2);
}
void __fastcall TForm1::FormPaint(TObject *Sender){
Form1->Canvas->Pen->Color=clRed;
Form1->Color=clWhite;
Form1->Canvas->Brush->Color=clBlue;
Form1->Canvas->Pen->Mode=pmNotXor;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender){
if(i>b) i=a;
figura(x+i,y-sin(i/25)*50);
i+=5;
figura(x+i,y-sin(i/25)*50);
}
void __fastcall TForm1::Button2Click(TObject *Sender){Timer1>Enabled=false;}

17. Cutii de dialog


Exist un tip de ferestre, numite cutii de dialog, prin intermediul crora
se pot simplifica operaiile de introducere i extragere a datelor unei aplicaii.
Componentele care afieaz aceste cutii se afl pe paleta Dialogs.

- 75 -

Copie autorizata pentru studenii CFBC

17.1. Clasa TOpenDialog


Componenta OpenDialog afieaz o cutie de dialog pentru a selecta
fiierele care urmeaz a fi deschise.
Unele proprieti i metode ale clasei TOpenDialog
Propretatea Title specific titlul cutiei. Dac valoarea acestei proprieti va
fi vid, atunci titlul cutiei va fi Open.
Propretatea DefaultExt specific extensia implicit pentru un fiier.
Propretatea FileName indic numele (inclusiv calea) ultimului fiier
selectat n cutie.
Propretatea Filter specific filtrul pentru selecia de fiiere. Pentru a crea un
filtru efectum un click pe cele trei puncte din caseta de valori a proprietii.
Apare editorul de filtre care afieaz un tabel cu dou coloane. n coloana
Filter Name se scrie numele filtrului, iar n coloana Filter extensia fiierelor
specificate de aceste filtre.

Filtrul poate fi scris direct n caseta de valori a proprietii Filter (din


Inspectorul de Obiecte). De exemplu, filtrul din imagine poate fi creat prin
atribuirea valorii
texte MS WORD|.doc|Pascal|.pas
Proprietatea FilterIndex specific numrul de ordine al filtrului care
urmeaz a fi ales.

Metoda Execute() afieaz cutia de dialog.

De exemplu, pentru a ncrca ntr-o zon de editare (Memo1) coninutul unui


fiier prin intermediul unei cutii de dialog (OpenDialog1) se va scrie
instruciunile:
OpenDialog1->Execute();
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);

- 76 -

Copie autorizata pentru studenii CFBC

17.2. Clasa TSaveDialog


Componenta SaveDialog afieaz o cutie de dialog pentru salvarea unui
fiier. Utilizatorul poate specifica numele i locul unde va fi salvat fiierul. Ea
are proprieti asemntoare cu cele ale componentei OpenDialog.

17.3. Clasele TOpenPictureDialog

i TSavePictureDialog

Componentele OpenPictureDialog i SavePictureDialog afieaz cutii


de dialog pentru ncrcarea i respectiv salvarea imaginilor.
Proprietile i metodele acestor componente snt similare cu ale
componentelor OpenDialog i SaveDialog. De exemplu, pentru a ncrca o
imagine n componenta Image1 (de tip TImage) se va scrie instruciunile:
OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

Pentru salvarea imaginii afiat de componenta Image1 se va scrie:


SavePictureDialog1->Execute();
Image1->Picture->SaveToFile(SavePictureDialog1-> FileName);

17.4. Clasa TFontDialog


Componenta FontDialog afieaz o cutie de dialog pentru selectarea
unui font. De exemplu, pentru a modifica fontul textului din zona de editare
Memo1 se va scrie:
FontDialog1->Execute();
Memo1->Font->Assign(FontDialog1->Font);

17.5. Clasa TColorDialog


Componenta ColorDialog genereaz o cutie de dialog pentru selectarea unei
culori. Astfel, pentru modificarea culorii creionului pentru desenare se va scrie:
if(ColorDialog1->Execute();
Canvas->Pen->Color=ColorDialog1->Color;

- 77 -

Copie autorizata pentru studenii CFBC

17.5. Clasa TReplaceDialog


Componenta ReplaceDialog afieaz o cutie de dialog pentru cutarea
i substituirea automat a unui text prin alt text. Comparativ cu celelalte cutii
de dialog, n acest caz trebuie prelucrat evenimentul OnReplace al
componentei ReplaceDialog. De exemplu, pentru a efectua cutarea i
substituirea automat unui text prin alt text n zona de editare Memo1 se poate
prelucra evenimentul OnClick al unui buton de comand (acesta va afia cutia)
i evenimentul OnReplace:
void __fastcall TForm1::Button1Click(TObject *Sender){
ReplaceDialog1->Execute();
Label1->Caption= ReplaceDialog1->ReplaceText;
}
void
__fastcall
TForm1::ReplaceDialog1Replace(TObject
*Sender){
TReplaceDialog *dlg = (TReplaceDialog *)Sender;
int SelPos = Memo1->Lines->Text.Pos(dlg->FindText);
if (SelPos > 0) {
Memo1->SelStart = SelPos - 1;
Memo1->SelLength = dlg->FindText.Length();
Memo1->SelText = dlg->ReplaceText;
}
}

Observaie. Componentele PrinterDialog


FindDialog

, PrinterSetupDialog

se utilizeaz similar.

Exemple rezolvate
1. S crem o aplicaie a crei fereastr va conine dou butoane de comand:
unul va ncrca coninutul unui fiier ntr-o zon de editare, cellalt va salva
coninutul zonei ntr-un fiier.
Realizare:
1) Executm File / New /Application.
2) Plasm pe form dou butoane de comand i cte o component de tip
TMemo, TSaveDialog i TOpenDialog. Modificm valorile proprietilor
Caption ale butoanelor de comand.

- 78 -

Copie autorizata pentru studenii CFBC

3) Prelucrm evenimentele OnClick ale componentelor Button1 i Button2.


4) Lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender){
OpenDialog1->Execute();
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
SaveDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}

2. S crem un editor de texte cu urmtorul meniu principal:


File
New
Open
Save As
Close

Edit
Copy
Paste
Select All

- 79 -

Font

Copie autorizata pentru studenii CFBC

Realizare:
1) Executm File / New /Application.
2) Plasm pe suprafaa formei trei cutii de dialog (OpenDialog1, SaveDialog1,
FontDialog1), o zon de editare (Memo1), un meniu principal (MainMenu1).
Crem elementele meniului principal.
3) Prelucrm evenimentul OnClick al fiecrui element de meniu.
4) Aa cum la redimensionarea ferestrei aplicaiei, dimensiunile zonei de
editare trebuie s fie racordate cu dimensiunile acestei ferestre, prelucrm
evenimentele OnResize i OnShow ale formei.
5) Lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::FormShow(TObject *Sender){
Memo1->Top=0; Memo1->Left=0;
Memo1->Height=Form1->Height-55;
Memo1->Width=Form1->Width-10;

- 80 -

Copie autorizata pentru studenii CFBC

}
void __fastcall TForm1::FormResize(TObject *Sender){
Memo1->Top=0;
Memo1->Left=0;
Memo1->Height=Form1->Height-55;
Memo1->Width=Form1->Width-10;
}
void __fastcall TForm1::SaveAs1Click(TObject *Sender){
SaveDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
void __fastcall TForm1::Open1Click(TObject *Sender){
OpenDialog1->Execute();
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}
void __fastcall TForm1::New1Click(TObject *Sender){
int i=Application->MessageBoxA("Doriti sa salvati
fisierul","Save", MB_YESNO);
if(i==IDYES){
OpenDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
Memo1->Clear();
}
void __fastcall TForm1::Close1Click(TObject *Sender){
Form1->Close();}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction
&Action){
int i=Application->MessageBoxA("Doriti sa salvati
fisierul","Save", MB_YESNO);
if(i==IDYES){
OpenDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
}
void __fastcall TForm1::Copy1Click(TObject *Sender){
Memo1->CopyToClipboard();
}
void __fastcall TForm1::Paste1Click(TObject *Sender){
Memo1->PasteFromClipboard();
}
void __fastcall TForm1::SelectAll1Click(TObject *Sender){
Memo1->SelectAll();}
void __fastcall TForm1::Font1Click(TObject *Sender) {
FontDialog1->Execute();
Memo1->Font=FontDialog1->Font;
}

- 81 -

Copie autorizata pentru studenii CFBC

18. Liste de opiuni i casete combinate


Listele de opiuni i casetele combinate se folosesc pentru alegerea
elementelor dint-o list derulant.

18.1. Clasa TListBox


O component de tip TListBox afieaz o list de opiuni (elemente,
articole), dintre care utilizatorul poate alege una sau mai multe. Dac toate
opiunile nu ncap n zona listei, atunci automat apare o bar de defilare
vertical.
Unele proprieti ale clasei TListBox
Columns determin numrul de coloane vizibile. Valoarea 0 nseamn c
nu este permis afiarea pe mai multe coloane.
Items (de tip TStrings) reprezint elementele din caset. Se utilizeaz ca i
proprietatea Items a componentei Memo.
Style stabilete stilul de desenare a listei. Valori posibile: lbStandard
(elementele listei snt iruri de caractere i au aceeai nlime, valoare
implicit), lbOwnerDrawFixed (elementele listei au aceeai nlime i snt
desene desenate cu procedura evenimentului OnDrawItem al fiecrui element),
lbOwnerDrawVariable (elementele listei au nlime variabil, snt imagini
desenate cu procedura evenimentului OnDrawItem al fiecrui element,
nlimea fiind specificat n procedura evenimentului OnMeasureItem).
ItemHeight specific nlimea n puncte a tuturor elementelor listei (dac
proprietatea Style are valoarea lbOwnerDrawFixed).
IntegralHeight (de tip bool) stabilete dac nlimea listei va fi (pentru
valoarea true) sau nu un multiplu al valorii proprietii ItemHeight. n cazul
valorii false (valoare implicit) posibil ca ultimul element al listei s fie
trunchiat.
ItemIndex indic numrul de ordine al elementului selectat din cutie. Dac
nici un articol nu este selectat, atunci ItemIndex ntoarce 1. Primul articol are
indexul 0.
MultiSelect (de tip bool) specific dac utilizatorul poate (pentru valoarea
true) selecta simultan articole.
ExtendedSelect (de tip bool) specific dac utilizatorul poate selecta mai
multe elemente consecutive. Dac MultiSelect este false, atunci ExtendedSelect
nu are nici un efect.

- 82 -

Copie autorizata pentru studenii CFBC

SelCount returneaz numrul de elemente selectate, dac snt permise


selectri multiple.
Selected[i] (de tip bool) returneaz true dac articolul cu numrul de ordine
i+1 este selectat.
Sorted (de tip bool) determin dac elementele listei snt afiate (pentru
valoarea true) sau nu n ordine alfabetic.
TabWidth stabilete lungimea (n puncte de ecran) a spaiului de tabulare.
TopIndex stabilete indicele elementului care apare n partea superioar a
listei. Se utilizeaz i pentru a determina indicele elementului aflat n partea
superioar a listei.

Unele metode ale clasei TListBox

Funcia ItemAtPos (Pos, Existing) returneaz:


- indicele unui element al listei dac punctul de coordonatele Pos (de tip
TPoint) aparine acestui element;
- 1 dac Existing este true i acest punct este situat dup ultimul
element al listei;
- returneaz indicele ultimului element al listei plus 1 dac Existing este
false i acest punct este situat dup ultimul element al listei.
Funcia ItemRect (I) (de tip TRect) returneaz coordonatele dreptunghiului
care conine elementul cu indicele I.

Evenimentee specifice clasei TListBox


OnDrawItem se declaneaz atunci cnd urmeaz s fie desenat un element
al listei (dac proprietatea Style are valoarea lbOwnerDrawFixed sau
lbOwnerDrawVariable).
OnMeasureItem se declaneaz atunci cnd urmeaz s fie desenat un
element al listei (dac proprietatea Style are valoarea lbOwnerDrawVariable).

Exemplu rezolvat
Fereastra urmtoarei aplicaii va conine:
- o caset de editare n care vom scrie un text;
- o list de opiuni n care se va aduga cte o opiune textul din caseta
de editare;

- 83 -

Copie autorizata pentru studenii CFBC

butonul Adauga care va aduga cte o opiune textul din caseta de


editare;
butonul Sterge care va terge elementul selectat din lista de opiuni;
butonul Selectat care va afia ntr-o fereastr de mesaje elementul
selectat;
butonul Iesire care va nchide aplicaia.

Realizare:
1) Executm File / New /Application.
2) Plasm pe form componentele conform enunului.
3) Prelucrm evenimentul OnClick al fiecrui buton de comand.
3) Modificm proprietatea Caption a formei i a butoanelor de comand.
4) Apsm F9 pentru compilarea i executarea programului.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button2Click(TObject *Sender){

- 84 -

Copie autorizata pentru studenii CFBC

if (!(ListBox1->ItemIndex == -1))
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
void __fastcall TForm1::Button1Click(TObject *Sender){
ListBox1->Items->Add(Edit1->Text);
Edit1->Clear();
}
void __fastcall TForm1::Button3Click(TObject *Sender){ Close();
}
void __fastcall TForm1::Button4Click(TObject *Sender){
ShowMessage(ListBox1->Items->Strings[ListBox1->ItemIndex]);
}

18.2. Clasa TComboBox


O component de tip TComboBox este o caset combinat format
dintr-o caset de editare i o list de opiuni. Utilizatorul poate alege unul sau
mai multe articole din lista de opiuni sau poate scrie denumirea unui articol n
caset. TComboBox are multe dintre proprietile i metodele claselor TListBox
(de exemplu, Items, Sorted, SelText, ItemIndex, ItemHeight) i TEdit (de
exemplu, Text, MaxLength).

Unele proprieti ale clasei TComboBox


DropDownCount (valoarea implicit este 8) specific numrul maxim de
elemente care se afieaz simultan n list.
DroppedDown (de tip bool) stabilete dac lista derulant a listei combinate
este (pentru valoarea true) sau nu vizibil.
Style stabilete stilul listei combinate. Valori posibile:
- csDropDown (lista este format dintr-o caset de editare i o list derulant
care poate fi ascuns sau afiat cu ajutorul unui buton-sgeat, elementele
listei snt iruri de caractere de aceeai nlime);
- csSimple (lista este format dintr-o caset de editare i o list derulant care
nu poate fi ascuns);
- csDropDownList (lista este format dintr-o caset de editare formal n care
utilizatorul nu poate scrie un text, fiind utilizat doar pentru afiarea
elementului selectat, i o list derulant care poate fi ascuns sau afiat cu
ajutorul unui buton-sgeat, elementele listei snt iruri de caractere de aceeai
nlime);

- 85 -

Copie autorizata pentru studenii CFBC

- csOwnerDrawFixed (list similar cu lista care are stilul csDropDownList,


elementele listei au aceeai nlime i snt desenate de utilizator n procedura
evenimentului OnDrawItem);
- csOwnerDrawVariable (list similar cu lista care are stilul
csDropDownList, nlimea fiecrui element al listei se definete n procedura
evenimentului OnMeasureItem, apoi aceste elemente snt desenate de utilizator
n procedura evenimentului OnDrawItem).

Unele evenimente ale componentei ComboBox


OnChange apare n momentul n care un alt articol este selectat sau un text
este introdus n caseta de editare.
OnDropDown se declaneaz n momentul n care urmeaz s fie deschis
lista derulant a listei combinate.
Exemplu rezolvat
Fereastra urmtoarei aplicaii va conine o caset combinat
(ComboBox1) cu numerele 1, 2, ..., 40. La selectarea unui num r din list, ntrun titlu de etichet (Label2) va fi afiat rdcina ptrat a acestui numr.
Realizare:
1) Executm File / New /Application.
2) Plasm pe form componentele conform enunului.
3) Prelucrm evenimenul OnCreate al formei (pentru a completa cu valori
caseta combinat) i evenimentul OnClick al acestei casete.
4) Modificm proprietatea Caption a formei i a etichelor Label1 i Label3.
5) Apsm F9 pentru compilarea i executarea programului.

- 86 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "math.h"
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::ComboBox1Click(TObject *Sender){
double r;
r=sqrt((ComboBox1->Items->Strings[ComboBox1>ItemIndex]).ToInt()); Label1->Caption=AnsiString(r);
}
void __fastcall TForm1::FormCreate(TObject *Sender){
for(int i=1;i<=40;i++)
ComboBox1->Items->Add(IntToStr(i));
}

19. Clasa TStringGrid


Componenta StringGrid afieaz un tabel, a crui celule conin valori
de tip AnsiString.
Unele proprieti ale componentei TStringGrid
Cells [col][row] determin celula care se obine la intersecia coloane col i
rndului row. Numerotarea coloanelor i a rndurilor ncepe de la 0.
Cols [I] (de tip TStrings) determin coloana I de celule.
Col specific indicele coloanei creia i aparine celula curent.

- 87 -

Copie autorizata pentru studenii CFBC

ColCount specific numrul de coloane ale reelei.


ColWidths [I] specific limea celulelor coloanei I.
DefaultColWidth specific limea tuturor celulelor coloanelor, pentru care
nu a fost stabilit limea cu ColWidths.
DefaultRowHeight specific nlimea tuturor celulelor coloanelor, pentru
care nu a fost stabilit limea cu ColWidths.
FixedColor (de tip TColor) stabilete culoarea de fondal a celulelor de
antet.
FixedCols specific numrul de coloane de antet.
FixedRows specific numrul de rnduri de antet.
GridHeight (readonly) determin nlimea (n pixeli) a reelei.
GridLineWidth determin limea (n pixeli) liniilor care delimiteaz
celulele reelei .
GridWidth (readonly) determin limea reelei.
Row specific indicele rndului cruia i aparine celula curent.
Rows [I] (de tip TStrings) determin rndul I de celule.
RowCount specific numrul de rnduri ale reelei.
RowHeights [I] specific nlimea celulelor rndului I.
ScrollBars stabilete dac reeaua va fi sau nu nzestrat cu bare de defilare.
Valori posibile: ssNone, ssHorizontal, ssVertical, ssBoth.
TopRow specific indicele primului rnd vizibil cu bara de defilare.
VisibleColCount numrul de coloane vizibile n reea. Celelalte coloane se
vor lista cu bara de defilare.
VisibleRowCount numrul de rnduri vizibile n reea. Celelalte rnduri se
vor lista cu bara de defilare.
Options (proprietate compus, de tip TGridOption) stabilete diferite
opiuni de lucru cu celulele reelei. Elementele mulimii TGridOption:
goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect,
goDrawFocusSelected,
goRowSizing,
goColSizing,
goRowMoving,
goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor,
goThumbTracking. De exemplu, instruciunea
StringGrid1->Options = StringGrid1->Options >> goEditing;

interzice editarea reelei, iar instruciunea


StringGrid1->Options = StringGrid1->Options << goEditing;

permite editarea.
Unele evenimente ale clasei TStringGrid
OnColumnMoved apare atunci cnd este modificat poziia coloanelor.
OnDrawCell se declaneaz n momentul n care trebuie desenat o celul
a reelei.

- 88 -

Copie autorizata pentru studenii CFBC

OnGetEditText apare atunci cnd urmeaz editarea unei celule a reelei.


OnRowMoved apare atunci cnd este modificat poziia rndurilor.
OnSelectCell apare atunci cnd este selectat o celul a reelei.
OnSetEditText apare atunci cnd utilizatorul editeaz o celul a reelei
OnTopLeftChanged apare imediat dup modificarea proprietii TopRow
sau a proprietii LeftCol.

Exemplu rezolvat
S crem o aplicaie care va efectua adunarea a dou matrice ptratice
de ordinul 4. Vom folosi pentru stocarea matricelor i a rezultatului trei
componente de tip TStringGrid. Butonul de comand Genereaz elementele
(Button1) va genera aleator elementele celor dou matrice cu ajutorul funciei
random, iar butonul Calculeaza suma va calcula matricea-sum.
Realizare:
1) Executm File / New /Application.
2) Plasm pe form componentele conform enunului.
3) Atribuim proprietilor FixedCols i FixedRows ale fiecrei componente de
tip TStringGrid valoarea 0.
5) Modificm proprietatea Caption a formei i a butoanelor de comand.
6) Prelucrm evenimentul OnClick al fiecrui buton de comand
7) Apsm F9 pentru compilarea i executarea programului.

- 89 -

Copie autorizata pentru studenii CFBC

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include<stdlib.h>
#include "Unit1.h"
#define dim 4
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i,j,a,b;
char c;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){

void __fastcall TForm1::Button1Click(TObject *Sender){


StringGrid1->ColCount=dim; StringGrid1->RowCount=dim;
StringGrid2->ColCount=dim; StringGrid2->RowCount=dim;
StringGrid3->ColCount=dim; StringGrid3->RowCount=dim;
randomize();
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
StringGrid1->Cells[i][j]=random(100);
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
StringGrid2->Cells[i][j]=random(100);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
{
a=StringGrid1->Cells[i][j].ToInt();
b=StringGrid2->Cells[i][j].ToInt();
StringGrid3->Cells[i][j]=a+b;
}
}

20. Prelucrarea datelor calendaristice


Pentru prelucrarea datelor calendaristice n Borland C++ Builder se
folosete clasa TDateTime, care este definit n biblioteca systdate.h. Valorile
acestui tip snt de fapt numere reale de tipul double. Partea ntreag a unei
valori pozitive de tip TDateTime reprezint numrul de zile care au trecut de la
30 decembrie 1899. n cazul unei valori negative partea ntreag este numrul

- 90 -

Copie autorizata pentru studenii CFBC

de zile care preced data menionat. Partea fracionar semnific fraciuni din
ziua corespunztoare valorii.
De exemplu, numrul 2.75 reprezint data 1 ianuarie 1900 ora 18:00, iar
numrul 3.25 data 27 decembrie 1899 ora 6:00.
Formatul de reprezentare a datei printr-un string depinde de opiunile
regionale stabilite n Windows. De exemplu, noi folosim formatul dd.MM.yy.
H:mm:ss, unde dd este numrul zilei n lun, MM numrul lunii, yy anul,
H ora, mm numrul minute, ss numrul de secunde.
Dac utilizatorul nu specific ora, minutele sau secundele, atunci acestea
se consider nule.

Unele metode ale clasei TDateTime


Date (de tip TDateTime) returneaz data curent (fr timp).
DateTimeToStr (D) returneaz reprezentarea simbolic a datei (cu timp,
dac parametrul D (de tip TDateTime) l conine).
DateTimeToString (Result, Format, D) transform valoarea lui D (de tip
DateTime) n text respectnd formatul specificat de parametrul Format (de tip
AnsiString) i atribuie rezultatul parametrului Result (de tip AnsiString).
DateToStr (D) returneaz reprezentarea simbolic a datei D (fr timp, D
este de tipul TDateTime).
DayOfWeek (D) returneaz numrul de ordine al zilei n sptmn
corespunztoare datei D (de tip TDateTime). (Numrul 1 corespunde duminicii,
2 zilei de luni, 3 zilei de mari etc.)
DecodeDate (D, Year, Month, Day) determin anul Year, numrul lunii
Month din an i numrul de ordine Day n lun corespunztoare valorii D (de
tip TDateTime).
DecodeDateFully (D, Year, Month, Day, DOW) determin anul Year,
numrul lunii Month din an, numrul de ordine Day n lun i numrul de
ordine n sptmn DOW corespunztoare valorii D (de tip DateTime). Funcia
DecodeDateFully returneaz valoarea true dac i numai dac D corespunde
unui an bisect.
DecodeTime (Time, Hour, Min, Sec, MSec) determin ora Hour, minutele
Min, secundele Sec, milisecundele MSec corespunztoare valorii Time (de tip
TDateTime).
EncodeDate (Year, Month, Day) returneaz valoarea de tip calendaristic
(adic de tip TDateTime) corespunztoare anului Year, lunii Month i zilei
Day.
EncodeTime (Hour, Min, Sec, MSec) returneaz valoarea de tip
calendaristic (adic de tip TDateTime) corespunztoare orei Hour, minutelor

- 91 -

Copie autorizata pentru studenii CFBC

Min, secundelor Sec i milisecundelor MSec.


FormatDateTime (Format, D) returneaz reprezentarea simbolic a valorii
D (de tip DateTime) respectnd formatul specificat de parametrul Format (de
tip AnsiString).
De exemplu, dac la moment este ora 20:56, miercuri, 18 martie, 2009, atunci
expresia FormatDateTime ("Acum este " dddd, d, mmmm yyyy, " ora "
hh:mm AM/PM', Now) va returna textul Acum este miercuri, 18, martie 2009,
ora 8:56 PM.
Now() returneaz timpul curent (de tip TDateTime).
StrToDate (S) returneaz valoarea de tip calendaristic (adic de tip
TDateTime) corespunztoare reprezentrii simbolice S a datei (fr timp).
StrToDateTime (S) returneaz valoarea de tip calendaristic (adic de tip
TDateTime) corespunztoare reprezentrii simbolice S a datei (cu timp).
StrToTime (S) returneaz valoarea de tip calendaristic (adic de tip
TDateTime) corespunztoare reprezentrii simbolice S a datei (doar cu timp).
Time returneaz timpul curent (de tip TDateTime).
TimeStampToMSecs (TimeStamp) transform valoarea TimeStamp n
numrul ntreg de milisecunde. Tipul TTimeStamp este definit astfel: struct
TtimeStamp { int Time; int Date; };

TimeToStr (Time) returneaz reprezentarea simbolic a timpului (data nu se


include n rezultat). Astfel, TimeToStr(Now()) returneaz reprezentarea
simbolic a timpului curent, DateToStr(Now()) a datei curente, iar
DateTimeToStr(Now()) a datei i timpului curent.
TryEncodeDate (Year, Month, Day, Date) returneaz valoarea Date de tip
TDateTime corespunztoare valorilor Year (cuprins ntre 1 i 9999 inclusiv),
Month (cuprins ntre 1 i 12 inclusiv), Day (cuprins ntre 1 i 28, 29, 30 sau
31, n funcie de valoarea Month). Dac valorile parametrilor actuali nu se
ncadreaz ntre limitele permise, atunci valoarea funciei TryEncodeDate va fi
false, altfel true.
TryEncodeTime (Hour, Min, Sec, Msec, Time) returneaz valoarea Time de
tip TDateTime corespunztoare valorilor Hour (cuprins ntre 0 i 24 inclusiv),
Month (cuprins ntre 1 i 12), Min i Sec (cuprinse ntre 0 i 59 inclusiv),
MSec (cuprins ntre 0 i 999 inclusiv). Dac valorile parametrilor actuali nu se
ncadreaz ntre limitele permise, atunci valoarea funciei va fi false, altfel
true.
Exemplu rezolvat
S crem o aplicaie a crei fereastr va conine dou etichete i dou
butoane de comand. Butonul Data curenta va afia n titlul etichetei Label1
data curent, iar butonul Timpul curent n titlul etichetei Label2 timpul

- 92 -

Copie autorizata pentru studenii CFBC

curent. La nchiderea aplicaiei va aprea o fereastr cu un mesaj de informare


despre durata de execuie a aplicaiei.
Realizare:
Pentru a afla durata de execuie a aplicaiei create vom prelucra
evenimentele OnCreate i OnClose ale formei. n procedura fiecrui eveniment
se va fixa ntr-o variabil timpul curent.
1) Executm File / New /Application.
2) Plasm componentele conform enunului. Modificm proprietatea Caption a
formei i a butoanelor.
3) Prelucrm evenimentele OnCreate i OnClose ale formei, precum i
evenimentul OnClick al fiecrui buton de comand.
4) Apsm F9 pentru compilarea i executarea programului.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TDateTime p1,p2,d,w;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::FormCreate(TObject *Sender){p1=Time();}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction
&Action){
p2=Time();
d=p2-p1;

- 93 -

Copie autorizata pentru studenii CFBC

ShowMessage("Timpul executiiei este "+AnsiString(d));


}
void __fastcall TForm1::Button1Click(TObject *Sender){
w=Date();
Label1->Caption=" Data Curenta "+AnsiString(w);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
w=Time();
Label2->Caption=" Timpul Curent "+AnsiString(w);
}

20.1. Clasa TMonthCalendar


Componenta MonthCalendar (de tip TMonthCalendar) se afl pe
pagina Win32 i este proiectat n special pentru a introduce tipuri de date
calendaristice. Ea afieaz un calendar, din care utilizatorul poate selecta o
data.
Unele proprieti ale clasei TMonthCalendar
CalColor (de tip TMonthCalColors) indic culorile folosite pentru fiecare
parte din calendar. Clasa TMonthCalColors are proprietile:
- BackColor (definete culoarea de fundal pentru lunile din calendar);
- MonthBackColor (definete culoarea de fundal pentru calendar);
- TextColor (definete culoarea textului datelor lunii curente);
- TitleBackColor(definete culoarea de fundal a barei de titlu a
calendarului);
- TitleTextColor (definete culoarea textului de pe bara de titlu a
calendarului);
- TrailingTextColor (definete culoarea datelor lunii care nu conin data
curent).
MaxDate indic data maxim (de tip TDate) pn la care utilizatorul poate
parcurge calendarul. TDate reprezint un tip special de TDateTime care nu are
partea zecimal. Deci, o valoare de tip TDate reprezint numrul de zile care sau scurs de la 30 decembrie1899.
MinDate indic data maxim (de tip TDate) pn la care utilizatorul poate
parcurge calendarul.
Date (de tip TDate) specific data selectat de utilizator. Valoarea datei
trebuie s se afle n intervalul specificat de proprietile MaxDate i MinDate.

- 94 -

Copie autorizata pentru studenii CFBC

20.2. Clasa TDateTimePicker


Componenta DateTimePicker (de tip TDateTimePicker), de asemenea,
se afl pe pagina Win32 i se folosete pentru a introduce tipuri de date
calendaristice. Ea afieaz o caset combinat format dintr-o linie de editare
i un calendar, din care utilizatorul poate selecta o data. n acelai timp
utilizatorul poate scrie data n linia de editare a componentei. Clasa
TDateTimePicker conine unele (CalColors, Date, DateTime, MaxDate,
MinDate) dintre proprietile clasei TMonthCalendar.

Unele proprieti specifice clasei TDateTimePicker


DateFormat indic modul n care este afiat o dat. Valori posibile:
dfShort (formatul scurt, de exemplu, 21/11/2008), dfLong (formatul lung 21
noiembrie 2008).
DateMode indic modul de afiare a componentei. Valori posibile:
dmComboBox (valoarea impliit), dmUpDown (calendarul nu se afieaz,
caseta va avea un buton de incrementare/ decrementare pentru selectarea datei).
DroppedDown (de tip bool) returneaz true doar dac calendarul este
afiat.
Kind specific dac componenta DateTimePicker va afia o dat sau un
moment de timp. Valori posibile: dtkDate, dtkTime.
Time specific timpul selectat de utilizator. Se folosete doar dac
proprietatea Kind este setat la valoarea dtkTime.
ShowCheckbox (de tip bool) ataeaz (pentru valoarea true) componentei o
caset de validare.
Ckeched (de tip bool) specific starea casetei de validare ataat
componentei.

Exemplu rezolvat
Se crem o aplicaie a crei fereastr va afia dou calendare (unul de
tip TMonthCalendar, altul de tip TDateTimePicker) i un ceas digital care va
arta timpul curent. Selectarea unei date n unul dintre calendare va selecta
aceeai dat n cellalt calendar.

- 95 -

Copie autorizata pentru studenii CFBC

Realizare:
1) Executm File / New /Application.
2) Plasm pe form cte o component de tip TMonthCalendar,
TDateTimePicker, TTimer i dou etichete
3) Prelucrm evenimentele OnTimer al componentei Timer1, OnCreate al
formei, OnClick al componentei MonthCalendar1 i OnChange al
componentei DateTimePicker1.
4) Modificm proprietatea Caption a formei i a etichetelor.
5) Apsm F9 pentru compilarea i executarea programului.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Timer1Timer(TObject *Sender){

- 96 -

Copie autorizata pentru studenii CFBC

TDateTime d;
d=Time();
Label1->Caption=AnsiString(d);
}
void __fastcall TForm1::FormCreate(TObject *Sender){
Timer1->Enabled=true;
Timer1->Interval=100;
}
void __fastcall TForm1::MonthCalendar1Click(TObject *Sender){
DateTimePicker1->Date=MonthCalendar1->Date;
}
void __fastcall TForm1::DateTimePicker1Change(TObject *Sender){
MonthCalendar1->Date=DateTimePicker1->Date;
}

21. Prelucrarea fiierelor i cataloagelor


Pentru prelucrarea fiierelor i cataloagelor n Borland C++ Builder se
pot folosi componentele paletei Win 3.1.

21.1. Clasa TFileListBox


Componenta FileListBox (de tip TFileListBox) este o cutie care afieaz
fiierele unui catalog.

Unele proprieti ale componentei FileListBox


Directory (de tip AnsiString) specific catalogul (mpreun cu calea) a crui
fiiere snt afiate n cutie.
Drive (de tip char) specific unitatea de disc pe care se afl fiierele afiate

- 97 -

Copie autorizata pentru studenii CFBC

de cutie.
FileEdit (de tip TEdit) stabilete cutia de editare care va afia numele
fiierului selectat de utilizator n cutie.
FileName (de tip AnsiString) pstreaz numele (mpreun cu calea)
fiierului selectat de utilizator n cutie.
FileType (de tip mulime) determin ce tip de fiiere va afia cutia. Valori
posibile: ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive,
ftNormal.
Mask specific care fiiere pot fi afiate, asemeni proprietii Filter a
componentei OpenDialog.
ShowGlyphs (de tip bool) stabilete dac n faa fiecrui fiier va aprea
(pentru valoarea true) sau nu va aprea pictograma.

21.2. DirectoryListBox
Componenta DirectoryListBox (de tip TDirectoryListBox) este o cutie
care afieaz subcataloagele unei uniti de disc sau a unui catalog.

Unele proprieti ale componentei DirectoryListBox


Directory (de tip AnsiString) indic denumirea catalogului, a crui coninut
este afiat.
Drive indic unitatea de disc pe care se afl catalogul, a crui coninut este
afiat.
FileList specific numele componentei de tip TFileListBox n care se vor
afia fiierele catalogului deschis n componenta DirectoryListBox.
DirLabel (de tip TLabel) specific numele etichetei care va afia denumirea
catalogului curent. De exemplu, n urma instruciunii DirectoryListBox1>DirLabel=Label1 eticheta Label1 va afia denumirea catalogului selectat n
cutia DirectoryListBox1.

- 98 -

Copie autorizata pentru studenii CFBC

21.3. Tipul TSearchRec


TSearchRec definete tipul de date fiier, avnd urmtoarea declaraie:
struct TSearchRec{
int Time;
int Size;
int Attr;
AnsiString Name;
int ExcludeAttr;
int FindHandle;
_WIN32_FIND_DATAA FindData;
};

El este folosit pentru cutarea fiierelor cu ajutorul funciilor FindFirst i


FindNext.
Funcia FindFirst (Path, Attr, F) caut n catalogul specificat de Path
(de tip AnsiString) primul fiier cu numele specificat de Path i cu atributul
Attr. Rezultatul se returneaz prin parametrul F (de tip TSearchRec). Funcia
FindFirst returneaz 0 doar dac fiierul specificat a fost gsit (altfel
returneaz un cod de eroare).
Funcia FindNext (F) caut urmtorul fiier cu numele i atributele
menionate anterior ntr-un apel FindFirs. Rezultatul se returneaz prin
parametrul F (de tip TSearchRec). Funcia FindNext returneaz 0 doar dac
fiierul specificat a fost gsit.

Exemplu rezolvat
S crem o aplicaie a crei fereastr va conine trei etichete (Atribute,
Nume fisier, Volum), un buton de comand (Cauta), apte butoane de validare
(fiecare caseta corespunde unui atribut de fiier), o caset de editare i un tabel
cu dou coloane (de tip TStringGrid). Utilizatorul va scrie n caseta de editare
numele unui fiier (sau o masc de fiier). Butonul Cauta va afia n tabel
denumirile i volumul fiierelor specificate de caset, care au atributele
butoanelor validate.
Realizare:
1) Executm File / New /Application.
2) Plasm pe form componentele conform enunului.

- 99 -

Copie autorizata pentru studenii CFBC

3) Modificm valorile proprietii Caption a etichetelor, a butonului de


comand i a butoanelor de validare.
4) Prelucrm evenimentul OnClick al butonului de comand.
5) Apsm F9 pentru compilarea i executarea aplicaiei.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }
void __fabstcall TForm1::Button1Click(TObject *Sender) {
TSearchRec Rez;
int iAttributes = 0;
iAttributes |= faReadOnly * CheckBox1->Checked;
iAttributes |= faHidden * CheckBox2->Checked;
iAttributes |= faSysFile * CheckBox3->Checked;
iAttributes |= faVolumeID * CheckBox4->Checked;
iAttributes |= faDirectory * CheckBox5->Checked;
iAttributes |= faAnyFile * CheckBox6->Checked;
StringGrid1->RowCount = -1;

- 100 -

Copie autorizata pentru studenii CFBC

if (FindFirst(Edit1->Text, iAttributes, Rez) == 0)


{
do
{
if ((Rez.Attr & iAttributes) == Rez.Attr)
{
StringGrid1->RowCount = StringGrid1->RowCount + 1;
StringGrid1->Cells[0][StringGrid1->RowCount-1] =
Rez.Name;
StringGrid1->Cells[1][StringGrid1->RowCount-1] =
IntToStr(Rez.Size);
}
} while (FindNext(Rez) == 0);
FindClose(Rez);
}
}

Unele funcii de prelucrare a fiierelor i cataloagelor


FileAge (F) returneaz data crerii fiierului F (de tip AnsiString).
FileExist (F) (de tip bool) returneaz valoare true dac fiierul F (de tip
AnsiString) exist.
DeleteFile (F) terge fiierul F (de tip AnsiString).
De exemplu, instruciunea DeleteFile(OpenDialog1->FileName); va
terge fiierul selectat de utilizatorul n fereastra OpenDialog1.
RenameFile (F, F_nou) modific numele fiierului F n F_nou (ambele de
tip AnsiString).
ExtractFilePath (F) returnez calea fiierului F (de tip AnsiString).
ExtractFileDrive (F) returneaz numele discului pe care se afl fiierul F
(de tip AnsiString).
CreateDir (C) creeaz catalogul C (de tip AnsiString).
RemoveDir (C) terge catalogul C (de tip AnsiString), dac acesta este gol.

Exemplu rezolvat
S crem o aplicaie pentru a ilustra un mod de lucru cu directoare i
fiiere. Fereastra aplicaiei va conine patru etichete, un meniu principal
(MainMenu1) cu opiunile Creare (catalog), Sterge (catalog, fiier), un meniu
contextual (PopupMenu1) cu opiunea Sterge, cte o component de tip
TDirectoryListBox, TFileListBox, TEdit, TButton. Utilizatorul va putea viziona,
crea, terge cataloage.

- 101 -

Copie autorizata pentru studenii CFBC

Realizare:
1) Executm File / New /Application.
2) Plasm componentele pe form conform enunului. Modificm proprietatea
Caption a formei i a controalelor de pe form conform enunului. Atribuim
proprietii PopupMenu1 a componentei FileListBox1 valoarea PopupMenu1.
3) Pentru a crea legtura dintre componentele DirectoryListBox1 i
FileListBox1 atribuim valoarea FileListBox1 proprietii ListBox a controlului
DirectoryListBox1.
4) Prelucrm evenimentul OnClick al butonului de comand i al fiecrui
element de meniu.
5) Apsm F9 pentru compilarea i executarea programului.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

- 102 -

Copie autorizata pentru studenii CFBC

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){ }


void __fastcall TForm1::Button1Click(TObject *Sender) {
DirectoryListBox1->Directory=Edit1->Text;
}
void __fastcall TForm1::catalog1Click(TObject *Sender){
AnsiString nume;
nume=InputBox("Crearea catalogului","Numele catalogului","");
CreateDir(nume);
DirectoryListBox1->Update();
FileListBox1->Update();
}
void __fastcall TForm1::catalog2Click(TObject *Sender) {
AnsiString nume;
nume=InputBox("Sterge catalog","Numele catalogului
care va fi sters","");
RemoveDir(nume);
DirectoryListBox1->Update();
FileListBox1->Update();
}
void __fastcall TForm1::fisier1Click(TObject *Sender){
AnsiString nume;
nume=InputBox("Sterge fisier","Numele complet al
fisierului","");
DeleteFile(nume);
DirectoryListBox1->Update();
FileListBox1->Update();
}
void __fastcall TForm1::Sterge2Click(TObject *Sender) {
if(FileListBox1->ItemIndex==-1)
ShowMessage("Nici un fisier nu este selectat");
else if(DeleteFile(FileListBox1->FileName)) {
FileListBox1->Update();
ShowMessage("Fisierul a fost sters");
}
else ShowMessage("Fisierul nu a fost sters");
}

- 103 -

Copie autorizata pentru studenii CFBC

22. Crearea obiectelor n timpul


execuiei aplicaiei
Am menionat deja c n Borland C++ Builder obiectele vizuale se
numesc componente. Deci, o component este de fapt un exemplar al unei
clase. De exemplu Button1 este un obiect (sau un exemplar ) al clasei TButton.
Uneori programatorul nu cunoate din timp numrul de componente
necesare pentru derularea eventual a unui proces al aplicaiei lansat de
utilizator sau de nsi aplicaie. Prin urmare, apare problema crerii i
distrugerii obiectelor n timpul execuiei aplicaiei.
Pentru soluionarea acestei probleme se folosesc operatorii new i delete
pot fi utilizai pentru alocare, respectiv eliberea memorie n cazul obiectelor.
Modaliatea de utilizarea a acestor operatori nu se deosebete esenial de
utilizare lor n cazul claselor (C++).
n continuarevom analiza problema aqlocarii dinamice a obiectelor. La
plasarea unei componente pe suprafaa formei declararea obiectului n cauz
este scris n fiierul unuit.h. n cazul alocrii dinamice nu se va lucra cu acel
fiier, adic nu se vor efectua careva declaraii ale evntualeor obiecte. Pentru a
aloca dinamic a mai multe obiecte de tip (Nume_clasa), se va proceda astfel:
1) n antetul fiierului (.cpp) de declar un pointer (de obicei dublu
pointer) de tipul clasei.
Nume_clasa **obiect;

2) Se aloc memoria pentru pointerul n cauz.


obiect=new Nume_clasa*[nr];// nr reprezint numrul de
obiecte
for(i=0;i<nr;i++) obieect[i]=new Nume_clasa(this);/* pentru
fiecare dintre obiect este apelat constructorul cu parametric
implicii pentru fiecare obiect*/

3) Setm valorile iniiale pentru fiecare obiect, de exemplu


for(i=0;i<nr;i++){
obieect[i]->Width=i+100;
obieect[i]-> Height=i+50;
// alte initializari, dupa necessitate
}

4) Se indic care este printele obiectului (dac se va aloca memorie,


acest obiect va fi creat, dar nu va fi posibil de-l utilizat ca component vizual),
pentru ca indica obiectele create mai sus s fie vizibile pe form, vom scrie:
for(i=0;i<nr;i++) obieect[i]->Parent=Form1;

5) Se utilizeaz obiectele n cadrul aplicaiei


6) Se elibereaz memoria ocupat de obiectele respective.
for(int i=0;i<nr;i++) obiect[i] ;/*se elibereaz memoria

- 104 -

Copie autorizata pentru studenii CFBC

ocupat de fiecare obiect*/


delete obiect;//se elibereaz adresa de memorie ocupat de
fiecare obiect

Exemplu rezolvat
1. Pe supraa formei vor fi plasate urmtoare componete:
O cutie de editare, n cadrul creia utilizatorul va introduce numrul de
obiecte.
O cutie Label pentru afiarea rezultatului.
Trei componete TButton.
De elaborat o aplicaie care va permite utilizatorului s introduc un numr,
care s reprezinte numrul de cutii de tip TEdit. n aceste cutii utilizatorul va
introduce cte o valoare numeric. La efectuarea unui click pe butonul
determina suma, n Label1 va fi scris valoarea sumei, iar efectuarea unui click
pe butonul Distruge obiectele create, obiectele create vor disprea de pe form.
Realizare
Pentru comoditatea vor mai fi create dinamic i obiecte de tip TLabel,
Pentru a sugera utilizatorului introducerea valorilor numerice n cutiile TEdit
recent create
1) File/New/Application
2) Plasm componentele pe form, i modificm proprietatea caption (Fig.1)

Fig.1 Forma n timpul proiectrii


3) Prelucrm evenimentele (Unit1.cpp)
4) Salvm i lansm n execuie aplicaia (Fig. 2)

- 105 -

Copie autorizata pentru studenii CFBC

Fig.2 Aplicaia n execuie


Fiierul Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n;
TEdit **Edit;
TLabel **Label;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender){
int s=0;
for(int i=0;i<n;i++)
s+=Edit[i]->Text.ToInt();
Label1->Caption="Suma este: "+AnsiString(s);
}
void __fastcall TForm1::Button2Click(TObject *Sender){
n=Edit1->Text.ToInt();
Edit = new TEdit *[n];
Label=new TLabel *[n];
for(int i=0;i<n;i++) {
Edit[i] = new TEdit(this);
Label[i]=new TLabel(this);
Edit[i]->Parent = Form1;
Label[i]->Parent = Form1;
Label[i]->Caption="Introdu valoarea "+AnsiString(i+1);
Edit[i]->Top = i*25+70;
Edit[i]->Left = 120;
Edit[i]->Width = 50;
Edit[i]->Height = 23;
Label[i]->Top = i*25+70;
Label[i]->Left = 20;

- 106 -

Copie autorizata pentru studenii CFBC

Label[i]->Height = 23;
}
}
void __fastcall TForm1::Button3Click(TObject *Sender){
for(int i=0;i<n;i++) {
delete Edit[i] ;
delete Label[i];
}
delete Edit;
delete Label;
}

2. S se creze o aplicaie care va permite s creeye n mod dinamic o


form, iar pe suprfaa acestieia s conin n cutii de edutare. n fiecare din
aceste cutii se va scrie valori numerice generate n mod aleator. Valorea
maximal i minimal va fi colorat. Forma principal a plicaiei va connine
dou butoane, unul pentru crearea dinamic a formei i altul pentru distrugerea
ei, deasemeni va mai conine o cutie de editare, prin intermediul creia
utilizatorul va introduce valoarea n.
Realizare
1) File/New/Application
2) Plasm componentele pe form, i modificm proprietatea caption (Fig.3)

Fig.3 Forma n timpul proiectrii


3) Prelucrm evenimentele (Unit1.cpp)
4) Salvm i lansm n execuie aplicaia (Fig. 4)

- 107 -

Copie autorizata pentru studenii CFBC

Fig.4

Aplicaia n execuie

Fiierul Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n;
TEdit **Edit;
TForm *Forma;
TButton *Buton;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button2Click(TObject *Sender){
Forma= new TForm(this);
Forma->Caption="Vector";
n=Edit1->Text.ToInt();
Edit = new TEdit *[n];
for(int i=0;i<n;i++){
Edit[i] = new TEdit(this);
Edit[i]->Parent = Forma;
Edit[i]->Top = 50;
Edit[i]->Left = 50+i*50;
Edit[i]->Width = 50;
Edit[i]->Height = 50;
Edit[i]->Text=AnsiString(random(100));
}
int max,min,p1,p2,y;
max=min=Edit[0]->Text.ToInt();
for(int i=1;i<n;i++){
y=Edit[i]->Text.ToInt();
if(max<y) {max=y;p1=i;}
if(min>y) {min=y;p2=i;}
}
Edit[p1]->Color=clMoneyGreen;
Edit[p2]->Color=clSkyBlue;

- 108 -

Copie autorizata pentru studenii CFBC

Forma->Show();
}
void __fastcall TForm1::Button1Click(TObject *Sender){
for(int i=0;i<n;i++) delete Edit[i];
delete Edit;
delete Forma;
}

- 109 -

Copie autorizata pentru studenii CFBC

Capitolul

II

Prelucrarea bazelor de date


1. Noiuni generale
O baza de date (BD) reprezint o modalitate de stocare a unor
informaii (date) pe un suport extern, cu posibilitatea regsirii acestora. n BCB
baza de date este un spaiu n memorie organizat ntr-un anumit mod pentru
pstrarea grupurilor de date. Sistemul de gestiune a bazelor de date (SGBD)
realizeaz ntreinerea BD i accesul la datele bazei.
Grupurile de date n Borland C++ Builder snt prezentate prin tabele i
funcii de pstrare. Prin nregistrri se are n vedere liniile tabelelor.
Calculatoarele pe care se plaseaz bazele de date se numesc servere, iar
cele de pe care snt accesate datele se numesc clieni. Bazele de date pot fi de
diferite tipuri:
bazele de date locale pot fi de tipul Paradox, dBase, Access, etc.
prin reea: InterBase, Informix, SyBase, Oracle, etc.

1.1.Crearea unui alias


Pentru a accesa o surs de date, o aplicaie BCB utilizeaz mecanismul
BDE (Borland Database Engine). Acest mecanism servete pentru
managementul bazelor de date, fiind un mediator ntre program i baza de date.
Pentru crearea unei conexiuni cu baza de date, BDE utilizeaz un alias.
Aliasul (sau pseudonimul) unei BD descrie setrile conexiunii la baza
de date. Tabelele snt stocate ntr-o baz de date. O baz de date de tip Paradox
sau de tip dBase, de regul, este format din cteva fiiere (spre deosebire de o
baz de date Acces), toate fiind incluse n acelai catalog. Adresa acestui
catalog este stocat ntr-un fiier de configurare. Aceast abordare ofer
posibilitatea de a avea uor acces la date fr a recompila programul.

- 110 -

Copie autorizata pentru studenii CFBC

Pentru crearea unui alias:


1. Lansm BDE Administrator (Start\Programs\Borland C++ Builder\BDE
Administrator).
2. n opiunea Database alegem tipul aliasului (sau a bazei de date). Vom
alege tipul BCDEMOS. Apare pagina Definitions, n care descriem
caracteristicile bazei de date.

3. Din meniul Object alegem comanda New. Apare fereastra New Database
Alias n care alegem tipul aliasului. Alegem STANDARD i apsm OK.

4. n pagina Databases apare un cmp nou cu numele iniial STANDARD1


(numele aliasului) i scriem numele nou (de exemplu, MyBase). n cmpul Path
indicm locului de pe disc al aliasului.
5. n obiunea Configuration alegem Drivers\Native\Paradox, iar n cmpul
LANGDRIVER al paginii Definition alegem driverele pentru alfabet. Salvm
aliasul prin acionarea unui click pe opiunea Apply din meniul Object

- 111 -

Copie autorizata pentru studenii CFBC

Observaie. La instalarea pachetului BCB, n dosarul Program Files este creat


dosarul Common Files. Acest dosar conine un set de informaii suplimentare,
printrea care i aliasul BCDEMOS (Program Files\Common Files\Borland
Shared\Data).

- 112 -

Copie autorizata pentru studenii CFBC

1.2. Crearea tabelelor


Pentru a crea un tabel vom folosi utilitarul DatabaseDesktop, care
permite crearea sau modificarea tabelelor de tip Paradox, dBASE i SQL.
DatabaseDesktop poate fi lansat prin selectarea comenzii DataBaseDesktop
din meniul Tools al sistemului Borland C++ Builder.

n fereastra deschis selectm succesiv File/New /Table. Apare o feastr


de dialog n care putem alege tipul tabelului, care trebuie s coincid cu tipul
bazei de date create anterior.

Alegem Paradox7 i acionm OK. Apare feastra Create Paradox Table


pentru definirea cmpurilor tabelului.

- 113 -

Copie autorizata pentru studenii CFBC

Zona Field roster este format din patru coloane:


Field Name numele cmpului;
Type tipul datelor cmpului (se poate alege dintr-o list care se afieaz
prin acionarea tastei Space sau din meniul contextual al coloanei);
Size dimensiunea cmpului;
Key stabilete dac cmpul va fi cmp-cheie primar. Un cmp-cheie
primar:
- exclude nregistrrile repetate;
- face ca nregistrrile tabelului s fie sortate dup acest cmp.
Butonul Borrow... ofer posibilitatea crearii uni tabel dup un model
deja existent. La efectuarea unui clic pe acest buton apare o fereastr din care
se alege modelul (ulterior tabelul poate fi modificat).
Pentru eliminarea unui cmp l selectm i apsm combinaia de taste
Ctrl+Delete.

1.3. Stabilirea proprietilor unui tabel


n partea dreapt a ferestrei se afl o list derulant, prin intermediul
careia se pot stabili proprietile tabelului. Pentru un tabel pot fi stabilite
urmtoarele opiuni:

- 114 -

Copie autorizata pentru studenii CFBC

Validity Checks asigur o completare mai bun a datelor prin verificarea lor
dup urmtorii parametri:
Minimul value valoarea minim;
Maximum value valoarea maxim;
Default value valoarea implicit;
Picture specific tipul informaiei care urmeaz a fi plasat (creaz o
masc pentru introducerea datelor; de exemplu, masca [-]#*# permite
utilizatorului s scrie doar numere ntregi negative sau pozitive, iar
masca #*# doar a celor pozitive);
Butonul Assist... afieaz o fereastr prin care utilizatorul poate alege o
masc pentru caseta Picture.
Table Lookup permite introducerea valorilor n mas, folosind datele
existente dintr-un alt tabel.
Secondary Indexes este un index care permite sortarea datelor nu doar dup
cmpul cheie-primar. Cu ajutorul acestui index se poate indica:
o nou sortare a datelor;
cmpul, care poate lega tabelul cu alt tabel;
o metod de cutare.
Un tabel poate avea mai multe tipuri de index cum ar fi:
Unique interzice nregistrrile cu aceleai valori ntr-un anumit cmp;
Case Sensitive face diferen dintre majuscule i minuscule n timpul
sortrii;
Maintained (poate fi activat doar dac nu este activat Unique) reinoiete
indexul;
Descending stabilete sortarea descresctoare a nregistrrilor.
Referential Integrity stabilete proprietile relaiei dintre dou tabele. ntre
dou tabele de tip paradox poate fi creat o relaie Parinte Copil, unde
tabelul de tip Copil primete datele de la tabelul Printe.
Password Security creeaz parole pentru protejarea tabelului de un acces
neautorizat.

Table Language permite alegerea alfabetului pentru tabel.

Observaie. Tabelele create se salveaz n catalogul bazei de date sau a


aliasului acestei baze.

- 115 -

Copie autorizata pentru studenii CFBC

2. Realizarea accesului la date


Pentru organizarea i gestionarea bazelor de date Borland C ++ Builder
ofer urmtoarele palete de componente:
Data Access (include componente nevizuale concepute pentru accesul la
date, care snt comune tuturor tehnologiilor);
BDE (conine componente pentru gestionarea bazelor de date, care permit
crearea legturilor dintre program i baze de date de diferite formate);
dbExpress (conine componente de acces la date prin intermediul
mecanismului dbExpress);
ADO (conine componente de acces la date prin intermediul mecanismului
ADO);
InterBase (conine componente de acces a datelor la distan, adic prin
reea);
Data Controls (conine componente pentru afiarea i listarea datelor);
Decision Cube (conine componente, prin intermediul crora se analizeaz
datele provenite de la o surs de date a unei structuri multidimensionale);
Quick Reports (conine componente pentru generarea rapoartelor).

2.1. Clasa TTable


Cel mai simplu mod de accesare a tabelelor unei BD, este utilizarea
clasei TTable. Componenta Table se afl pe paleta de componente BDE. Ea
asigur o legtur direct cu tabelele unei BD.

Unele proprieti ale clasei TTable


Active (de tip bool) permite (pentru valoarea true) sau interzice accesul
ctre tabel.
Bof (de tip bool) determin dac cursorul se afl (pentru valoarea true) sau
nu la nceputul tabelului.
Eof (de tip bool) determin dac cursorul se afl (pentru valoarea true) sau
nu la sfritul tabelului.
Database Name indic numele sau pseudonimul bazei date.
TableName specific numele tabelului.
TableType indic tipul tabelului. Valori posibile: ttDefault, ttParadox,
ttDBase, ttFoxPro, ttASCII.

- 116 -

Copie autorizata pentru studenii CFBC

DefaultIndex (de tip bool) stabilete dac la deschiderea tabelului


nregistrrile lui vor fi afiate (pentru valoarea true) sau nu n ordinea
cmpului-cheie primar.
Exclusive (de tip bool) intrezice (pentru valoarea truei) sau permite accesul
altei aplicaii ctre tabel atunci cnd acesta este deschis.
ReadOnly (de tip bool) stabilete dac datele din tabel vor putea fi (pentru
valoarea false) sau nu modificate.
FieldValues permite scrierea/citirea datelor din cmpurile tabelului. Pentru
citire vom scrie:
Nume_tabel->FieldValues["Nume_Cimp"]="Valoare";

iar pentru citire:


V = Nume_tabel ->FieldValues["Nume_Cimp"],

unde V este o

variabil de tipul cmpului. De exemplu, instruciunea


Label1->Caption=Table1->FieldValues["Nume"];

pstreaz n titlul etichetei Label1 valoarea din cmpul Nume a nregistrrii


curente (adic a celei aflate n focar).
Fields (de tip TFields) conine lista cmpurilor tabelului. Prin intermediul
acestei proprieti compuse se poate lucra cu cmpurile tabelului.
Subproprietatea Count specific numrul de cmpuri ale listei. Fields conine
propria subproprietate Fields[I] (de tip TField), aceasta specificnd cmpul cu
indicele I. Primul cmp are indicele 0. De exemplu, instruciunea
Edit1->Text=Table1->Fields->Fields[0]->FieldName;

pstreaz n caseta Edit1 numele primului cmp al tabelului Table1 (se


consider c tabelul a fost n prealabil deschis cu metoda Open() a tabelului).
Unele metode ale clasei TTable
CreateTable() ceaz un tabel.
DeleteTable() distruge tabelul activ din baza de date.
EmptyTable() terge toate nregistrrile din tabel.
Open() deschide tabelul.
Close() nchide tabelul.
First(), Last(), Next(), Prior() plaseaz focarul pe prima, respectiv ultima,
urmtoarea, precedenta nregistrare din tabel. La deschiderea tabelului, n focar
se afl prima nregistrare.
MoveBy(n) mut focarul pe nregistrarea a n-a.
Insert() insereaz o nregistrare vid.
Delete() sterge nregistrarea activ (adic cea din focar).
Append() adaug o nregistrare vid la sfritul tabelului.
Post() salveaz modificrile tabelului n BD.
Cancel() anuleaz salvarea efectuat de metoda Post().

- 117 -

Copie autorizata pentru studenii CFBC

2.2. Clasa TDBGrid


Componenta TDBGrid (de tip TDBgrid) se afl pe paleta de
componente DataControls. Ea creeaz o reea pentru afiarea informaiei unui
tabel (de tip TTable).
Unele proprieti ale clasei TDBGrid
DataSource specific sursa, prin intermediul creia se va extrage
informaia. Valoarea acestei proprieti este numele unei componente de tip
TDataSourse.
Colums descrie coloanele care vor fi afiate n reea
Color determin culoarea de fundal a reelei.
FixedColor specific culoarea pentru cmpuri.
Options stabilete diferite opiuni pemtru reea. De exemplu, dac opiunea
dgEditing este activ, atunci datele pot fi redactate.
TitleFont specific formatul textului pentru cmpurile tabelului.

2.3. Clasa TDataSource


Componenta DataSource (de tip TDataSource) se afl pe paleta de
componente DataAcces i se utilizeaz pentru a crea legtura dintre
componentele Table i DBGrid.
Unele proprieti ale clasei TDataSourse
AutoEdit (de tip bool) permite (pentru valoarea true) sau interzice editarea
datelor.
DataSet specific setul de date. Valoarea acestei proprieti poate fi numele
unei componente de tip TTable.
Prin urmare, pentru afiarea nregistrrilor din tabelul Table1:
1. Plasm pe suprafaa formei cte o componet de tip TDataSource,
TDBGrid.
2. Atribuim proprietii DataSet a componentei DataSource1 valoarea

- 118 -

Copie autorizata pentru studenii CFBC

Table1.
3. Atribuim proprietii DataSource a componentei DBGrid1 valoarea
DataSource1.
4. Stablim valoarea true pentru proprietatea Active a controlului Table1.
Observaie. Evident, proprietile DatabaseName
componentei Table1 au fost setate n prealabil.

TableName

ale

2.4. Clasa TDBNavigator


Componenta DBNavigator (de tip TDBNavigator) se afl pe paleta
DataControls afieaz un panou de instrumente care poate fi ataat (prin
intermediul proprietii DataSourse1) unui tabel pentru gestionarea rapid i
comod a nregistrrilor.

Butoanele componentei DBNavigator


Prin intermediul proprietii VisibileButtons se poate stabili care dintre
butoanele panoului DBNavigator vor fi vizibile.

First

stabilete cursorul pe prima nregistrare.

Prior

stabilete cursrul pe nregestrarea precedent.

Next

stabilete cursorul pe nregistrarea urmtoare.

Last

stabilete cursorul pe ultima nregistrare.

Insert

insereaz o nregistrare vid i activeaz regimul de editare.

Delete
terge nregistrarea curent i poziioneaz cursorul pe
urmtoarea nregistrare.

- 119 -

Copie autorizata pentru studenii CFBC

Edit

activeaz pentru nregistrarea curent regimul de editare.

Post

salveaz modificarile efectuate n setul de date.

Cancel

ignor redactarea nregistrrilor curente.

Refresh

renoiete datele din setul de date active.

Exemplu rezolvat
S crem un tabel de tip Paradox (avnd numele Muncitori) cu
urmtoarea cmpuri:
Numele cmpului
Nume
Prenume
Anul_ang
Categoria
Sal_Calculat
Impozite
Sal_Primit

Tipul cmpului
ir de caractere (Alpha)
ir de caractere (Alpha)
Numeric (Number)
Numeric (Number)
Numeric (Number)
Numeric (Number)
Numeric (Number)

Astfel, Nume, Prenume snt respectiv numele i prenumele salariatului,


Anul_ang anul cnd acesta a fost agajat, Categoria categoria salariului,
Sal_Calculat salariul, Impozite suma de bani care este reinut pentru
impozite, Sal_primit salariul care urmeaz a fi primit de ctre angajat.
Considerm c impozitul este de 8%
Utilizatorul va completa doar cmpurile Nume, Prenume, Categoria
(care poate fi 1, 2 sau 3) i Anul_ang. Aplicaia va calcula salariul fiecrui
angajat utiliznd urmtoarele formule:
Salariul de baz este egal cu numrul ore*zile, unde ore i zile snt
constante egale respectiv cu 8 i 24.
Dac muncitorul are categoria 1 (respectiv 2, 3), atunci el are un adaos
de 20 % (respectiv 50 %, 80 %) la salariul de baz.
Muncitorii cu o vechime n munc mai mare de 5 ani (respectiv 15 ani)
primesc un adaos de 10% (respectiv 20%) din salariu calculat dup
adaosul categoriei.

- 120 -

Copie autorizata pentru studenii CFBC

Considerm impozitul pe venit egal 8%, din salariul calculat mpreun cu


vechimea n munc, asigurarea medical 4%, iar fondul social 5% din
salariul calculat.
Realizare
Vom afla salariul calculat (sc), impozitele (Impozit) i salariul primit
(Sal_primit) dup formulele:
sc = ore*zile*coef_cat, unde coef_cat este egal cu 1,2, sau 1,5, sau 1,8;
Dac vecimea n munc este mai mare dect 15 ani (respectiv 5 ani), atunci
sc+ = sc*0,2 ( respectiv sc+ = sc*0,1).
Impozit = impozitul pe venit + asigurarea medical + fondul social.
Sal_primit = sc Impozit.
1. Crem un alias n care vom pstra tabelul (vezi 1).
2. Lansm Database Descktop i crem tabelul Muncitori conform enunului.
3. Salvm tabelul Muncitori n aliasul creat la pasul 1.
4. Introducem datele n tabel (proprietatea Name a tabelului are valoarea
Table1).

5. Plasm pe form cte o componentde tip TDataSourse, TDBGrid, TButton.

- 121 -

Copie autorizata pentru studenii CFBC

6. Atribuim proprietii DataSet a componentei DataSource1 valoarea Table1.


7. Atribuim proprietii DataSource a componentei DBGrid1 valoarea
DataSource1.
8. Stablim valoarea true pentru proprietatea Active a controlului Table1.
9. Prelucrm evenimentul OnClick al butonului de comand.
10. Salvm i lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#define anul_curent 2009
#pragma resource "*.dfm"

- 122 -

Copie autorizata pentru studenii CFBC

TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}
void __fastcall TForm1::Button1Click(TObject *Sender){
double sc,imp,iv,fs,am;
int cat,anul,ore,zile;
ore=8; zile=24;
Table1->First();
while(!Table1->Eof)// cit timp nu sntem la ultima
inregistrare
{
cat=Table1->FieldValues["Categoria"];
anul=Table1->FieldValues["Anul_Ang"];
switch(cat) {
case 1: sc=1.2*ore*zile; break;
case 2: sc=1.5*ore*zile; break;
case 3: sc=1.8*ore*zile; break;
}
if(anul_curent-anul>=15)
sc+=sc*0.2;
else if(anul_curent-anul>=5)
sc+=sc*0.1;
iv=sc*0.08;
fs=sc*0.05;
am=sc*0.04;
Table1->Edit();//Pregateste tabelul pentru a inscrie date
Table1->FieldValues["Sal_Calculat"]=sc;
Table1->FieldValues["Impozite"]=fs+am+iv;
Table1->FieldValues["Sal_Primit"]=sc-fs-am-iv;
Table1->Post();//Salveaza modificarele efectuate in tabel
Table1->Next();//trece la urmatoarea inregistrare
}
}

3. Alte componente ale paletei Data Controls


n afar de componentele DBGrid i DBNavigator pe paleta
DataControls se afl urmtoarele controale:

DBText
este un control asemeni etichetei Label. Prin intermediul
proprietii DataSource poate fi creat legtura dintre acest control i
un tabel sau o interogare. Dup crearea legturii n proprietatea
DataField se indic cmpul, a crui informaie va fi afiat de
componenta DBText.

- 123 -

Copie autorizata pentru studenii CFBC

DBEdit
este un control asemeni casetei de editare Edit. Se poate
folosi pentru afiarea sau pentru editarea datelor unui cmp al unei surse
de date. Modalitatea de lucru este similar cu a controlului DBText.

DBMemo
este un control asemeni zonei de editare Memo.
Modalitatea de lucru este similar cu a controlului DBText. DBMemo
este utilizat deseori pentru prezentarea informaiei din cmpurile care
conin un volum mai mare de informaie.

DBImage
este un control asemeni componentei Image. Este utilizat
pentru reprezentarea imaginilor unei baze de date.

DBListBox
reprezint o list asemeni controlului ListBox.
Coninutul listei este valoarea proprietii Items (de tip TStrings).
Astfel, pentru a aduga n lista DBListBox1 informaia din cmpul
Virsta al tabelului Table1 se vor scrie instruciunile:

while(!Table1->Eof){
DBListBox1->Items->Add(AnsiString(Table1->
FieldValues["Virsta"]));
Table1->Next();
};

De regul, componenta DBListBox nu se folosete pentru ncrcarea


nregistrrilor unei baze de date (pentru aceasta exist controlul
DBLookupListBox).

DBComboBox
este un control asemeni casetei combinate
ComboBox. Modalitatea de lucru este similar cu a componentei
DBListBox.

DBCheckBox
este un control asemeni casetei de validare
CheckBox i, de regul, este utilizat pentru afiarea valorilor unui cmp
de tip logic.

DBRadioGroup

este un control asemeni butonului RadioGroup.

- 124 -

Copie autorizata pentru studenii CFBC

DBLookupListBox
nregistrrilor

DBLookupComboBox
DBLookupListBox.

DBRichEdit
DBMemo.

DBChart
este un control pentru crearea diagramelor pe baza
informaiei tabelelor unei baze de date (modalitatea de creare este
asemntoare cu cea din Microsoft Excel).

se utilizez pentru crearea casetelor de cutare a

este un control asemeni controlului

este un control asemeni controalelor DBEdit i

Exemple rezolvate
1. S elaborm o aplicaie prin intermediul creia utilizatorul va putea
modifica cmpul Categoria al tabelulului Muncitori (creat n paragraful
anterior). n cmpul Categoria pot fi introduse valori de la 1 la 5.
Realizare:
Pentru prezentarea informaiei din tabel vor fi utilizate componente de
tip DBText, iar pentru navigarea datelor tabelului va fi utilizat o component
de tip TDBNavigator. Prin intermediul butonului Post i a componentei de tip
TDBListBox, va fi posibil modificarea cmpului Categoria. n cadrul
proprietii Items a componentei vor fi introduse valori de la 1 la 5.
1. Considerm aliasul i tabelul Muncitori create, iar componentele Table1 i
DataSourse1 plasate pe form (vezi 1 i exemplul rezolvat din 2), precum
i setate proprietatea DataSet a componentei DataSourse1 i proprietatea
Active a componentei Table1.
2. Plasm pe form 5 componente de tip TDBText, cte o component de tip
TDBListBox, TDBNavigator.
3. Crem legtura ntre surs i controlul DBNavigator1: atribuim proprietii
DataSourse a componentei DBNavigator1 valoarea DataSourse1.

- 125 -

Copie autorizata pentru studenii CFBC

4. Setm proprietile DataField i DataSourse ale componentelor DBText


astfel:

5. Salvm i lansm aplicaia la execuie.

Pentru editarea cmpului Categoria utilizatorul se va deplasa la


inregistrarea necesar, dup care va alege una din valorile date n cutie i va
efectua un click pe butonul Post

2. Considerm tabelul Muncitori (creat un exemplele precedente), n care a fost


adugat cmpul NrOrdine. Considerm creat n acelai alias nc un tabel,
numit Locuinta i format din cmpurile Adresa i NrOrdine (ultimul este cmp
cheie-primar). S elaborm o aplicaie care va pune n coresponden fiecrui
muncitor o adres din cmpul Adresa. Deci, ntre tabelele Locuinta i Muncitori
se va stabili o relaie de tipul unu la muli.

- 126 -

Copie autorizata pentru studenii CFBC

Realizare:
1. Considerm create aliasul i tabelele Muncitori i Locuinta, iar
componentele Table1, Table1, DataSourse1, DataSourse2, TDBText1,
TDBText2, TDBText3 plasate pe form (vezi 1 i exemplul rezolvat din 2),
precum i setate proprietatea DataSet ale componentelor DataSourse1,
DataSourse2, proprietatea Active ale componentelor Table1, Table2,
proprietile DataField i DataSourse ale componentelor de tip TDBText.
2. Plasm pe form o component de tip TDBLookupComboBox.
3. Crem relaia ntre tabele (dup cmpul NrOrdine) prin intermediul
componentei DBLookupComboBox1. Setm proprietile componentei
DBLookupComboBox1 astfel:
DataSource=DataSource1
DataField=NrOrdine
ListSource= DataSource1
KeyField= NrOrdine
ListField=Adresa
4. Salvm i lansm aplicaia la execuie.

3. S crem o diagram cu bare pentru salariul muncitorilor nregistrai n


tabelul Muncitori.
Realizare:
1. Considerm aliasul i tabelul Muncitori create, iar componentele Table1 i
DataSourse1 plasate pe form (vezi 1 i exemplul rezolvat din 2), precum
i setate proprietatea DataSet a componentei DataSourse1 i proprietatea

- 127 -

Copie autorizata pentru studenii CFBC

Active a componentei Table1.

2. Plasm pe form o component de tip TDBChart.


3. Efectum double-click pe componenta DBChart1.
4. Efectum click pe butonului Add i alegem tipul diagramei (Bar).
5. Indicm titlul (butonul Title).

6. ndicm sursa (tabelul din care vor fi extrase datele): din paleta Series
alegem pagina DataSource, iar de aici DataSet. Efectum modificrile
necesare.

- 128 -

Copie autorizata pentru studenii CFBC

6. Executm un click pe butonul Close. Pe form apare diagrama:

- 129 -

Copie autorizata pentru studenii CFBC

4. Interogri
Interogarea este un obiect, prin intermediul cruia din baza de date se
extrag nregistrri, care corespund condiiilor indicate. Cu ajutorul interogrilor
se pot vizualiza, analiza i modifica datele din tabele. Pentru crearea
interogrilor, BCB ofer componenta Query, care se afl pe paleta DBE.
Interogrile se scriu n limbajul SQL.

4.1. Tipuri de interogri


Interogrile de selecie snt cele mai des solicitate interogri i se
creeaz utiliznd cuvntul cheie SELECT.
Sintaxa general a unei cereri de interogare:
SELECT [domeniu] list_selecie
FROM nume_tabel1, nume_tabel2,
[WHERE criteriu_selecie]
[HAVING criteriu_de_grupare]
[ORDER BY cmpuri_criteriu];

unde domeniu specific o opiune de includere sau de eliminare din rezultatul


seleciei, a nregistrrilor care conin duplicate.
List_selecie cuprinde cmpurile ce vor aprea n tabelul cu rezultatele
interogrii.
Clauza FROM specific numele tabelului sau al tabelelor pe care se face
cererea de interogare. Pentru mai multe tabele, numele acestora se separ prin
virgul.
Clauza WHERE este opional i specific doar nregistrrile care ndeplinesc
criteriul de selecie. Criteriul de selecie este o expresie care conine
obligatoriu i un operator adecvat tipului de dat al cmpului respectiv.
Clauza ORDER BY (de asemenea este opional) cere ordonarea rezultatelor
interogrii. Ordonarea se poate face dup unul sau mai multe cmpuri_criteriu.
Clauza HAVING conine criteriul care va fi aplicat cmpului argument al
funciei agregat. Spre deosebire de WHERE, care acioneaz nainte de
gruparea nregistrrilor, HAVING acioneaz dup definirea acesteia.

- 130 -

Copie autorizata pentru studenii CFBC

Interogrile de aciune tip INSERT snt folosite pentru adugarea de


nregistrri dintr-un tabel n altul. Exist dou forme ale instruciunii i anume:
a) INSERT ... VALUES
n acest caz se adaug o singur nregistrare ntr-un tabel, menionnd
cmpurile i valorile acestora. Se utilizeaz pentru operaii simple, care
presupun lucrul cu un numr redus de nregistrri.
INSERT INTO nume_tabel (cmp1, cmp2...)
VALUES (valoare1, valoare2...);
b) INSERT ... SELECT
n acest caz, este posibil s se copieze mai multe nregistrri dintr-un tabel n
unul sau mai multe tabele.
INSERT INTO tabel_destinaie (cmp1, cmp2...)
SELECT [domeniu] cmp1, cmp2...
FROM tabel_surs WHERE criteriu_de_adugare;
Interogrile de aciune tip DELETE terg parial sau total
nregistrrile dintr-un tabel. Nu se folosete pentru tergerea de valori din
cmpuri individuale, ci acioneaz asupra nregistrrii n totalitatea ei.
DELETE FROM nume_tabel
[WHERE criteriu_de_tergere];
Ca i instruciunea INSERT, operaia de tergere a nregistrrilor unui
tabel poate duce la probleme de integritate referenial n alte tabele.
Exemplu:
DELETE * FROM Vnzri
DELETE * FROM Angajai WHERE Vrsta>60
Interogrile de aciune tip UPDATE pot introduce nregistrri noi i
pot modifica valorile cmpurilor din nregistrri existente.
UPDATE nume_tabel
SET nume_cmp1=valoare1
[,nume_cmp2=valoare2]...
[WHERE criteriu_de_actualizare];
Exemplu:
UPDATE Comunicaii
SET Reea=Orange
WHERE Reea=Dialog AND Data>#12.12.2001;

- 131 -

Copie autorizata pentru studenii CFBC

4.2. Clasa TQuery


Componenta Query poate fi utilizat att n lucru cu BD locale, ct i cu
BD ndeprtate.
Unele proprieti ale clasei TQuery
DatabaseName indic numele pseudonimului BD.
Params reprezinta o serie de copii ale unui obiect TParam i determin
caracteristicile tuturor parametrilor de interogare.
SQL (de tip TStrings) conine textul de interogare SQL, care va fi executat
la invocarea metodelor Open sau ExecSQL.
Text conine textul interogrii.
DataSource reprezint sursa.
Unele metode ale clasei TQuery

ExecSQL() execut interogarea coninut n cadrul proprietii SQL.


Open() execut cererea.
Prepare() asigur resursele necesare ca cererea s poat fi realizat.

Exemplu rezolvat
S elaborm o aplicaie care va permite efectuarea urmtoarelor
interogri pentru tabelul Muncitori (creat un exemplele precedente):
- Afiarea muncitorilor cu salariu mai mare dect 300 (de uniti
convenionale);
- Afiarea muncitorilor cu salariu mai mic dect 300;
- Afiarea muncitorilor angajai pn n 1990;
- Afiarea muncitorilor angajai dup 1990;
- Afiarea tuturor muncitorilor.
Realizare:
1. Considerm aliasul i tabelul Muncitori create, iar componentele Table1 i
DataSourse1 plasate pe form (vezi 1 i exemplul rezolvat din 2), precum
i setate proprietatea DataSet a componentei DataSourse1 i proprietatea
Active a componentei Table1.

- 132 -

Copie autorizata pentru studenii CFBC

2. Plasm pe suprafaa formei componentele Query1 (pentru efectuarea


interogrii), DBGrid1 (pentru vizualizarea datelor), DataSource (pentru crearea
legturii dintre Query1 i DBGrid1), RadioGroup1 (pentru alegerea
interogrii).
3. Efectum conexiunea controalelor Query1 (setm
DatabaseNamei i DataSource) i DBGrid1 (setm sursa).

proprietile

4. Scriem coninutul interogrilor n vectorul s (vezi fiierul Unit1.cpp).


5. Prelucrm evenimentul RadioGroup1Click.
6. Salvm i lansm aplicaia la execuie.

Coninutul fiierului Unit1.cpp:


#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString s[6];
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){
s[1]="select nume, prenume, sal_primit from muncitori where

- 133 -

Copie autorizata pentru studenii CFBC

sal_primit > 300 order by sal_primit";


s[2]="select nume, prenume, sal_primit from muncitori where
sal_primit < 300 order by sal_primit";
s[3]="select nume, prenume, anul_ang from muncitori where
anul_ang < 1990";
s[4]="select nume, prenume, anul_ang from muncitori where
anul_ang > 1990";
s[5]="select nume, prenume, anul_ang, sal_primit from muncitori
order by sal_primit";
}
void __fastcall TForm1::RadioGroup1Click(TObject *Sender){
int nr=RadioGroup1->ItemIndex;
switch(nr){
case 0 : Query1->SQL->Text=s[nr+1]; break;
case 1 : Query1->SQL->Text=s[nr+1]; break;
case 2 : Query1->SQL->Text=s[nr+1]; break;
case 3 : Query1->SQL->Text=s[nr+1]; break;
case 4 : Query1->SQL->Text=s[nr+1]; break;
}
Query1->Open();
}

5. Rapoarte
Un raport reprezint o modalitate de extragere a unei informaii din BD
cu scopul ca ulterior aceasta s fie tiprit.
Prin sursa unui raport vom nelege un tabel sau o interogare.
Pentru crearea rapoartelor BCB ofer paleta de componente QReport.
Vom examina unele componente ale acestei palete.

5.1. Clasa TQuickRep


Componenta QuickRep (de tip TQuickRep) reprezint o pagin, pe
suprafaa creia se va afia informaia extras din sursa raportului.
Unele proprieti ale clasei TQuickRep
Bands (de tip logic) permite afiarea benzilor. O pagin QuickRep poate
conine urmtoarele tipuri de benzi:
HasColumnHeader afieaz antetul fiecrei coloane.

- 134 -

Copie autorizata pentru studenii CFBC

HasDetail afieaz numrul fiecrei nregistrri din tabel.


HasPageFooter stabilete antet pentru fiecare pagin.
HasPageHeader stabilete o not de subsol pentru fiecare pagin.
HasSummary formeaz i extrage subtotalurile.
HasTitle permite afiarea unui titlu pentru raport.
DataSet stabilete legtura dintre raport i nregistrri (valoarea acestei
proprieti poate fi de tipul TQuery i TTable).
Description pstreaz comentarii.
Options este o proprietate compus, avnd urmtoarelor proprieti:
FirstPageHeadear stabilete dac va fi afiat sau nu antetul pe prima
pagin.
LastPageHeadear stabilete dac va fi afiat sau nu nota de subsol pe
ultima pagin.
Compression indic dac se va pstra sau nu raportul n memorie n
momentul proiectrii.
Page este o proprietatea compus i stabilete parametrii paginii.
PrinterSettings indic modul de tiprire a raportului.
ReportTitle specific titlul raportului.

5.2. Clasa TQRBand


Componenta QRBand (de tip TQRBand) este un container pentru
plasarea diferitor tipuri de obiecte (antet, subsol etc.), prin intermediul crora
se va extrage informaia.
Unele proprieti ale clasei TQRBand
BandType indic modul de repezentare a informaiei (asemenea
proprietilor Bands a controlului QuickRep).
ForceNewColummn (de tip logic) specific dac fiecare nregistrare va
ncepe din rnd nou (pentru valoarea true) sau nu.
ForceNewPage (de tip logic) specific dac fiecare nregistrare va ncepe
(pentru valoarea true) pe o pagin nou sau nu.

5.3. Clasa TQRDBText


Componenta QRDBText (de tip TQRDBText) se utilizeaz pentru
extragerea datelor. Fiecare cmp care urmeaz a fi afiat va avea propria

- 135 -

Copie autorizata pentru studenii CFBC

component QRDBText, care poate


proprietilor DataSet i DataField.

fi

configurat

prin

intermediul

Exemplu rezolvat
Vom crea un raport pe baza tabelului Muncitori (utilizat mai sus).
Realizare:
1. Considerm aliasul i tabelul Muncitori create, iar componentele Table1 i
DataSourse1 plasate pe form (vezi 1 i exemplul rezolvat din 2), precum
i setate proprietatea DataSet a componentei DataSourse1 i proprietatea
Active a componentei Table1.
2. Plasm pe form cte un control de tip TButton (pentru viualizarea prealabil
a raportului) i TQuickRep.
3. Atribuim proprietii DataSet a controlului QuickRep valoarea Table1.
4. Plasm 4 componente de tip TQRLabel i 4 componente de tip TQRDBText.
Setm proprietile DataSet i DataField a fiecrei dintre componentele
QRDBText (vezi imaginea), precum i proprietatea Caption a fiecrei dinte
componentele QRLabel.

5. Plasm pe suprafaa raportului trei controale de tip TQRBand cu proprietatea


BandType setat respectiv rbPageHeader, rbTitle, rbDetail.

- 136 -

Copie autorizata pentru studenii CFBC

6. Pe componenta QRBand1 (cu BandType setat rbPageHeader) plasm un


control de tip QRLabel i scriem proprietatea Caption a acestuia numele
raportului (Lista angajatilor).
7. Pe componenta QRBand2 (cu BandType setat rbTitle) plasm 4 controale
de tip QRLabel, care vor indica denumirle celor 4 cmpuri.
8. Pe componenta QRBand2 (cu BandType setat rbDetail) plasm 4 controale
de tip QRDBText pentru extragerea textului pe suprafaa raportului. Pentru
fiecare din aceste 4 controale, atribuim proprietii DatSet valoarea Table1, iar
proprietii DataField numele cmpului respectiv.
9. Pentru vizualizarea informaiei din raport din meniul contextual al
componentei QuickRep1 alegem Preview sau n program putem folosi o
instruciune de forma QuickRep1->Preview().
10. Prelucrm evenimentul OnClick al butonului de comand, n a crui
procedur scriem instruciunea QuickRep1->Preview().
11. Salvm i lansm aplicaia la execuie.

- 137 -

Copie autorizata pentru studenii CFBC

6. Tehnologia ADO
Microsoft ADO (ActiveX Data Objects) asigur acces aplicaiilor client
la date. Pentru implementarea modelului ADO Borland C++ Builder ofer
paleta de componente ADO, cu ajutorul creia se poate realiza conectarea la
sursele de date suportate de ADO. S examinm componentele acestei palete.
Componenta ADOConnection (de tip TADOConnection) se utilizeaz
pentru conectarea la baza de date. Mai multe seturi de date pot folosi n comun
aceast conexiune pentru extragerea datelor i pentru executarea comenzilor.
Componenta ADOCommand (de tip TADOCommand) execut comenzi
SQL care nu genereaz date. Poate fi folosit cu o alt component ADO de tip
TDataSet.
Componenta ADODataSet (de tip TADODataSet) se folosete pentru
extragerea i operarea datelor din una sau mai multe tabele. Conexiunea se
poate face direct cu sursa de date sau printr-o component de tip
TADOConnection.
Componenta ADOTable (de tip TADOTable) reprezint un set de date sub
form de tabel folosit pentru extragerea i operarea unui set de nregistrri
produs de o singur tabel din BD. Poate fi conectat direct cu sursa de date
sau poate folosi o conexiune existent.
Componenta ADOQuery (de tip TADOQuery) este un set de date de tip
interogare care poate extrage un set de nregistrri bazat pe o comand valid
SQL. Conexiunea se poate face direct cu sursa de date sau printr-o component
de tip TADOConnection..
Componenta ADOStoredProc (de tip TADOStoredProc) se folosete
pentru execuia funciilor stocate care pot sau nu s genereze date.

- 138 -

Copie autorizata pentru studenii CFBC

6.1. Conectarea la o surs de date


Unul sau mai multe componente pot folosi mpreuna o singur
conexiune la o surs de date utiliznd (n timpul proiectrii aplicaiei)
proprietatea Connection a componentei ADOConnection.
nainte de a se putea folosi conexiunea trebuie identificat sursa de date
la care se dorete conectarea. De regul, se folosete proprietatea
ConnectonString (de tip ir de caractere) a aceleiai componente. Simbolul ; se
folosete pentru a delimita parametrii conexiunii.
Parametri posibili:
Provider specific numele unui ADO provider utilizat cu conexiunea
respectiv.
File name reprezint numele unui fiier, care conine informaiile despre
conexiune.
Remote Provider este numele unui ADO provider care exist pe o alt
staie.
Remote Server este numele serverului, n cazul n care se folosete o alt
staie.

6.2. Conectarea la o baz de date de tip MS Access


Pentru efectuarea conexiunii cu o baz de date MS Access:
1. Executm un click pe butonul
Apare urmtoare fereastr de dialog:

- 139 -

a proprietii ConnectionString.

Copie autorizata pentru studenii CFBC

2. Alegem opiunea Use Connection String i apsm butonul Build.


Apare fereastra de dialog Data Link Properties.

3. Alegem Microsoft OLE DB Provider for ODBC Drivers i apsm


butonul Next.
4. Apare pagina Connection a aceleiai ferestre. Selectm Use connection
String, apoi apsm butonul Build.

- 140 -

Copie autorizata pentru studenii CFBC

5. n fereastra aprut Select Data Source apsm pe butonul New.

- 141 -

Copie autorizata pentru studenii CFBC

6. Apare fereastra Create New Data Source n care alegem opiunea


Microsoft Acces Driver (*.mdb) i efectum un click pe butonul Next.

7. Cu ajutorul butonului Browse indicm adresa, la care va fi salvat


fiierul de tip .dsn.

- 142 -

Copie autorizata pentru studenii CFBC

8. Executm un click pe butonul Next.

9. n fereastra aprut snt afiate adresa fiierului creat i tipul bazei de


date. Executm un click pe butonul Finish.

- 143 -

Copie autorizata pentru studenii CFBC

10. Apare fereastra ODBC Microsoft Access Setup. Apsm butonul Select.

11. Apare fereastra Select Database.

12. Alegem baza de date i efectum un click pe butonul OK. Din acest
moment conexiunea cu baza de date este creat.
Dup stabilirea conexiunii pot fi utilizate componentele pentru
prelucrarea informaiei din baza de date.

- 144 -

Copie autorizata pentru studenii CFBC

Exemplu rezolvat
Considerm tabelul Autori al bazei de date Biblioteca, creat cu MS
Access. S crem o aplicaie care va afia datele dintru-un tabel MS Access.
Realizare:
1. Plasm pe form cte o component de tip TADOConnection, TADOTable
(de pe paleta ADO), TDataSource (de pe paleta Data Acess), TDBGrid (de pe
paleta Data Controls).
2. Atribuim proprietilor Connection i TableName ale componentei
ADOTable1 respectiv valorile ADOConection1 i Autori.
3. Atribuim valoarea ADOTable1 proprietii DataSet a componentei
DataSource1.
4. Atribuim proprietii DataSource a controlului DBGrid1 valoarea
DataSource1.
5. Stabilim proprietii Active a componentei ADOTable1 valoarea true.
6. n DBGrid1 vor aprea datele din tabelul Autori.

7. Compilm proiectul, apoi lansm la execuie fiierul executabil (din dosarul


proiectului).

- 145 -

Copie autorizata pentru studenii CFBC

6.3. Conectarea la o baz de date de tip MySql


Spre deosebire de pachetul MS Office (n care este inclus MS Access),
interfaa ODBC (Open DataBase Connectivity) nu conine drivere pentru
accesul la bazele de date de tip MySql. Aceste drivere pot fi desc rcate gratuit
de pe serverul MySql (http://www.mysql.com). Dup instalarea lor se poate
efectua conexiunea dintre componentele BCB i baza de date (MySql). n linii
generale modalitatatea de conectare este similar conexiunii Access.

Pentru efectuarea conexiunii cu o baz de date MS Access:


1. Efectum un click pe butonul
controlului ADOConection.

n dreapta proprietii ConnectionString a

2. Alegem opiunea Use Connection String i apsm butonul Build. Apare


fereastra de dialog Data Link Properties.
3. Alegem Microsoft OLE DB Provider for ODBC Drivers i apsm butonul
Next.

4. Apare pagina Connection a aceleiai ferestre. Selectm Use connection


String, apoi apsm butonul Build.
5. n fereastra aprut Select Data Source apsm pe butonul New.
6. Apare freastra Create New Data Source n care alegem opiunea MySQL
ODBC 5.1 Driver (driverele recent instalate sau poati fi i alt versiune), apoi
executm un click pe butonul Next.

7. Cu ajutorul butonului Browse indicm adresa, la care va fi salvat fiierul de


tip .dsn.

- 146 -

Copie autorizata pentru studenii CFBC

8. Executm un click pe butonul Next. n fereastra aprut apare adresa


fiierului creat i tipul bazei de date. Executm un click pe butonul Finish.
9. Apare urmtoarea fereastr:

10. Indroducem datele despre adresa bazei de date. n caseta Server scriem
numele serverului pe care se afl baza de date (localhost serverul local).
11. n caseta User indicm numele user-ului pe care lucrm (nu este un account
al bazei de date).
12. n cazul n care user-ul este protejat cu parol, aceasta se indic n caseta
Password.
13. Dac datele au fost introduse corect, atunci n lista derulant Database apar
numele bazelor de date existente (n imagine, information_schema, mysql).
Dup selecrarea numelui bazei de date se efectueaz un click pe butonul Ok.
14. Se confirm numele conexiunii n fereastra Select Data Source. Din acest
moment conexiunea este efectuat.
15. Pentru prelucrarea bazei de date urmeaz a fi plasate i configurate
componentele necesare.

- 147 -

Copie autorizata pentru studenii CFBC

Capitolul III
Programarea Orientat
pe Obiecte cu C++
1. Preliminarii
Orice limbaj de programare se bazeaz pe o anumit ideee dominant,
care determin structura programelor create cu acest limbaj.
Din punct de vedere istoric iniial a dominat idea structurrii
procedurale a programelor. Programatorul decidea ce proceduri va utiliza n
program, apoi alegea cel mai potrivit algoritm pentru realizarea acestor
proceduri. De exemplu, limbajul Fortran este un limbaj de programare
procedural. Acest tip de programare a dus la crearea bibliotecilor mari de
proceduri.
Pe parcursul dezvoltrii informaticii accentul s-a deplasat de la
proceduri spre organizarea datelor. S-a ajuns la concluzia c pentru elaborarea
programelor eficace era nevoie de utilizarea corect a datelor. Ca o consecin
logic a noii tendine, a aprut ideea structurrii programelor cu ajutorul
modulelelor (adic a unitilor de program). n ele erau stocate nu doar
subprograme, dar i date. De exemplu, limbajul Pascal este un limbaj de
programare modular.
Ideea dominant a programrii moderne, numit Programare
Orientat pe Obiecte (POO), presupune unirea datelor cu subprogramele care
prelucreaz aceste date ntr-un tot ntreg, numit obiect. Aceast aciune (de
unire) se numete incapsulare, iar subprogramele unui obiect metode. La
incapsulare se ia n considerare legtura logic dintre date i metode.
De fapt, concepia de obiect a intervenit pentru crearea unor noi tipuri
de date, care nu snt predefinite (de exemplu, tipurile de date numr complex i
graf nu snt definite n majoritatea limbajelor dfe programare). Aa cum un tip
de date este definit nu doar de mulimea valorilor tipului (adic de datele
propriu zis), dar i de operatorii aplicabili asupra acestor valori, a aprut ideea
incapsulrii datelor i metodelor. Pe parcursul timpului, sensul atribuit

- 148 -

Copie autorizata pentru studenii CFBC

conceptului obiect a revenit conceptului clas. Deci, o clas definete un tip


abstract de date, iar un obiect este o dat a acestui tip. Se mai spune c
obiectul este un exemplar sau o instaniere a clasei respective.
O caracteristic important a POO este ierarhizarea claselor. Sugerat
de istoria dezvoltrii tiinelor, ideea de ierarhizare presupune organizarea
ierarhiilor de clase, ntre care exist proprieti comune. n vrful ierarhiei se
afl clasa (numit clas de baz) care are trsturi comune tuturor celorlalte
clase ale ierarhiei. n acela timp, clasele aflate pe urmtorul nivel al ierarhiei
(numite clase derivate) pot avea trsturi suplimentare. n acest caz se spune
c clasa de baz este clas-printe a acestor clase derivate. La rndul su,
fiecare clas derivat poate fi clas-printe a unor clase de pe nivelul ierarhic
imediat urmtor (de asemenea, numite clase derivate). Deci, clasele derivate
motenesc datele i metodele clasei-printe.
De exemplu, putem crea o ierarhie de clase referitoare la patrulatere,
clasa de baz fiind patrulaterul convex, urmnd clasele derivate paralelogram,
patrulater convex arbitrar i clasele derivate din clasa paralelogram: romb,
trapez etc.
Alt caracteristic important a POO, numit polimorfism, ofer
posibilitatea definirii unei interfee comune pentru mai multe metode cu
diferite funcionaliti. De exemplu, n cazul ierarhiei de poligoane se pot crea
metode cu acela nume Aria (deci, aceia interfa, ns diferite funcionaliti).
Menionm c prioritile POO se manifest la elaborarea programelor
mari.

2. Clase
Aa cum clasa este un tip abstract de date, rezult c ea este format din
dou pri:
a) partea care definete datele, componentele ei fiind numite date
membru;
b) partea care definete operaiile asupra datelor, format din
subprograme, numite funcii membru.
Clasele de baz se declar cu ajutorul cuvntului-cheie class, conform
urmtoarei diagrame de sintax:

- 149 -

Copie autorizata pentru studenii CFBC

Definirea complet a funciilor membru se face mai jos, n textul


programului (vezi exemplul rezolvat).
Exemple:
1. Definirea clasei complex
class complex{
double Im, Re;
double Modulul();
};

// Im i Re snt datele membru


// metoda Modulul este func ie membru

2. Definirea clasei vector


class vector{
int v[100]; int maxim();
void citire(); void afisare();
};

Pentru a controla mai bine operaiile asupra datelor clasei se folosete


mecanismul de protejare a datelor i a funciilor membru ale clasei. Cu acest
scop se utilizeaz modificatorii de protecie (se mai numesc specificatori de
acces): private, public i protected. Aceste atribute de protecie au urmtoarea
semnificaie:
Membrii din domeniul de aciune al modificatorului public nu snt
protejai, fiind accesibili oricrei funcii n tot programul unde ei snt
vizibili.
Membrii domeniului private snt accesibili doar funciilor membru. n mod
implicit membrii unei clase se consider declarai n domeniul private.
Membrii domeniului protected snt accesibili doar funciilor membru i
funciilor claselor derivate din clasa n care au fost declarate aceti membri.
Operatorul de rezoluie :: este utilizat pentru definirea complet a
funciilor membru (n afara clasei). Sintaxa de definire complet a unei funcii
membru (adic a unei metode) este:

- 150 -

Copie autorizata pentru studenii CFBC

Dac funcia nu returneaz o valoare, n locul tipului se scrie cuvntul


cheie void.
Accesul la datele i metodele unui obiect se poate face:
a) utiliznd operatorul . ( atunci cnd se cunoate obiectul) sau
b) operatorul -> (dac se cunoate pointerul la clas).
Exemplu rezolvat
S crem clasa vector cu metodele citire(), afisare(), suma(), max().
Coninutul programului:
#include<iostream.h>
#include<iomanip.h>
#define N 100
class vector{
public:
int vect[N];
void citire();
void afis();
int suma();
int max();
};
void vector::citire(){for(int i=0;i<N;i++) cin>>vect[i];}
void vector::afis(){for(int i=0;i<N;i++)
cout<<setw(5)<<vect[i];cout<<endl;}
int vector::suma(){
int i,s=0;
for(i=0;i<N;s+=vect[i],i++);
return s;
}
int vector::max(){int m,i;m=vect[0];
for(i=1;i<N;i++)
if(m<vect[i]) m=vect[i];
return m;
}
main(){
vector v;
cout<<"Introdu elementele vectorului"<<endl; v.citire();
cout<<"Elementele vectorului :"<<endl;
v.afis();
cout<<"suma elementelor : "<<v.suma()<<endl;
cout<<"elemental maxim : "<<v.max()<<endl;
}

- 151 -

Copie autorizata pentru studenii CFBC

3. Pointerul *this
Orice metod apelat a unui obiect are definit implicit pointerul
this, a crui valoare este adresa obiectului. El nu poate fi declarat explicit, nu
poate fi modificat, dar poate fi utilizat explicit.
Exemplu:
class complex {
public:
double re,im;
void init(double x,double y);
};
void complex::init(double x,double y)
{
this->re = x;
this->im = y;
}

4. Funcii inline
La compilare operaiile suplimentare de apel a unei funcii inline i de
revenire din ea snt eliminate. O metod definit (nu doar declarat) n
interiorul clasei este implicit metod inline.
O metod definit n fara clasei se consider metod inline doar dac n
locul unde ea este definit antetul metodei este prefixat de cuvntul cheie inline.
De exemplu, metoda citire() a clasei vector poate fi definit metod
inline astfel:
inline void vector::citire(){for(int i=0;i<N;i++)
cin>>vect[i];}

Observaii
1. Este interzis folosirea n cadrul funciilor inline a structurilor repetitive (for,
while, do while),
i a funciilor recursive.
2. De regul, o metod inline conine n definirea ei pn la 45 instruciuni.
3. De regul, metodele inline nu conin n definirea lor operaii aritmetice.

- 152 -

Copie autorizata pentru studenii CFBC

5. Constructor
Constructorul este o funcie-membru special care are ca scop principal
iniializarea obiectelor. Se pot defini civa constructori pentru aceeai clas. Ei
vor fi funcii suprancrcate (vom examina suprancrcarea mai trziu) i se
vor deosebi prin numrul i/sau tipurile parametrilor. Constructorii respect
urmtoarele reguli:
1. Au acelai nume ca i clasa pentru care snt definii.
2. Constructorii nu returneaz nimic.
3. Constructorii pot fi suprancrcai.
4. Constructorii se apeleaz automat la crearea unui obiect al clasei (se mai
spune la instanierea obiectului).
De regul, constructorii snt apelai:
a) la declararea de obiecte sau la crearea dinamic de obiecte n care se
prevd iniializri cu variabile sau obiecte de tipul/clasa parametrilor
constructorului;
b) la convertirea unor constante sau variabile de alt tip la tipul clasei
respective.
Exemplu:
class complex {
public:
double re,im;
complex(double a, double b){re=a;im=b;} // def. constructorului
};
main(){
complex X(2.4,5.8); // instantierea obiectului X
}

Dac programatorul nu declara un constructor pentru o clas, iar clasa


respectiva nu conine date membru constante sau referin, atunci compilatorul
creeaz un constructor implicit, care este funcie inline, nu iniializeaz datele
membru i invoc constructorii claselor de baza. Dac programatorul definete
cel puin un constructor, atunci compilatorul nu mai genereaz constructorul
implicit.
Constructorul implicit este invocat n urmtoarele situaii:
a) la crearea fr parametri a unui obiect;
b) la declararea unui tablou de obiecte;
c) la crearea dinamic fr parametri a unui obiect, cu operatorul new.

- 153 -

Copie autorizata pentru studenii CFBC

Exemplu de constructor fr parametri


class complex {
public:
double re,im;
complex(){re=im=0;}
};
main(){
complex x;
}

Pentru ca un constructor s fie considerat constructor de copiere,


primul su parametru trebuie s fie o referin la un obiect din clasa respectiv.
n cazul n care un astfel de constructor nu este definit explicit de ctre
programator, compilatorul genereaz automat un constructor de copiere care va
realiza copierea "membru cu membru" a "vechiului" obiect n cel nou creat.
Constructorul de copiere se descrie astfel:
Nume_clasa(Nume_clasa &ob_sursa){
membru_1=ob_sursa.membru_1;
membru_2=ob_sursa.membru_2;
// ...
membru_n=ob_sursa.membru_n;
}

unde membru_i snt date membru ale clasei Nume_clasa. La crearea


constructorului de copiere trebuie utilizate toate datele obiectului, deoarece
compilatorul nu mai genereaz nici un constructor de copiere i transferul
datelor de la un obiect la altul trebuie s fie complet.
Exemplu:
class complex {
public:
double re,im;
complex(complex &a){a.re=re; a.im=im;}
};
main(){
complex x(2.4,5.8), a(x);
}

n cazul instruciunii a=x nu este invocat constructorul de copiere, el


este invocat numai la declaraiile de tipul:
Nume_clasa
nume_obiect(obiectul_de_la_care_se_transfer _datele);

- 154 -

Copie autorizata pentru studenii CFBC

6. Destructor
Destructorul este o funcie-membru special care are ca scop principal
distrugerea obiectului (deci eliberarea memoriei ocupat de acest obiect). Un
obiect se distruge n una din urmtoarele trei situaii:
cnd este prsit blocul n care a fost creat (cazul obiectelor locale);
la terminarea programului (cazul obiectelor globale);
cnd se aplic operatorul delete (obiecte create dinamic cu new).
n cazul n care nu este definit explicit un destructor, compilatorul genereaz
automat unul cu corpul de instruciuni vid. Destructorul nu are parametri i nu
returneaz nimic. O clas are un unic destructor, care nu poate fi suprancrcat
(deoarece nu are parametri). Numele destructorului se formeaz din numele
clasei precedat de simbolul "~" (tilda). Destructorul se apeleaz automat la
distrugerea unui obiect al clasei.
Exemplu rezolvat
1. S crem clasa student cu datele membru nume, nr_de_identificare,
cursul, media i metodele tipareste_student(), bursa(). Vom descrie toate
tipurile de constructori pentru aceast clas.
Realizare:
#include <conio.h>
#include <string.h>
#include <iostream.h>
class student{
public:
char * nume,* nr_de_identificare;
int
anul, cursul;
double media;
/******* Constructori *****/
student(); //Constructor implicit
student(char * , int , char * ,double ); //Constr. de init1
student(char * , char * ,double );//Constr. de init2
student(student& ); //Constructor
de copiere
~student(){}; // Destructor
/****** Metode *******/
void tipareste_student();
void bursa();
}; //sfirsitul declararii clasei
student::student(){
nume = "Nedefinit";

- 155 -

Copie autorizata pentru studenii CFBC

cursul = 0; media = 0;
nr_de_identificare = "Nedefinit";
cout<<endl<<"Constructor implicit "<<endl;
}
student::student(char * a, int c, char * n, double med){
nume=a; cursul=c;
nr_de_identificare=n;
media=med;
cout<<endl<<"Constructor de initializare1 "<<endl;
}
student::student(char * a1, char * n1, double med){
nume=a1; cursul=0;
nr_de_identificare=n1;
media=med;
cout<<endl<<"Constructor de initializare2 "<<endl;
}
student::student(student&C){
nume= C.nume; cursul= C.cursul;
nr_de_identificare= C.nr_de_identificare;
media= C.media;
cout<<endl<<"Constructor de copiere "<<endl;
}
void student::tipareste_student(){
cout<<"Metoda de afisare "<<endl;
cout<<"Nume: "<<nume<<endl<<"Cursul: "<<cursul<<endl;
cout<<"Numarul de identificare: "<<nr_de_identificare<<endl;
cout<<"Media: "<<media<<endl;
}
void student::bursa(){
cout<<"Metoda BURSA "<<endl;
if(media>7) cout<<"Studentul are bursa!"<<endl;
else if(media>5)cout<<"Studentul nu are bursa!"<<endl;
else cout<<"Studentul este restantier"<<endl;
}
void main(){
student st1("Lupei Rodica",2,"AR985I",9.81);
// apelarea constr. de init.1
st1.tipareste_student(); st1.bursa();
student st2("Popa Ion","RD726K",6.89);
// apelarea constr. de init.2
st2.tipareste_student(); st2.bursa();
student st3("Chistruga Alexandru",2,"AD564L",4.99);
st3.tipareste_student();
st3.bursa();
student st4(st1);
st4.tipareste_student();
student st; // apelarea constructorului implicit
st.tipareste_student();
}

- 156 -

Copie autorizata pentru studenii CFBC

2. S crem clasa vector cu metode de citire i de afiare a elementelor


vectorului.
Realizare:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
class vector{
public:
int * vect,N;
vector(); // Constructorul implicit al clasei vector
vector(int a); // Constructor definit, a numarul de elemente
void citire();
void afis();
~vector(); // Declaram destructorul clasei vector
}; // sfirsitul declararii clasei vector
vector::vector(){ // definim constructorul implicit
cout<<Introdu nr. de elemente ale vectorului<<endl;
cin>>N;
vect=new int[N];
}
vector::vector(int a){ N=a; vect=new int[N];}
vector::~vector(){ delete []vect;}//Definim destructorul
void vector::citire(){for(int i=0;i<N;i++)
vect[i]=random(100);}
void vector::afis(){for(int i=0;i<N;i++)
cout<<setw(5)<<vect[i];cout<<endl;}
main(){
randomize();
vector v1;//num. de elemente ale vectorului se cite te de la
tastatur
vector v2(5);// numarul de elemente ale vectorului este 5
v1.citire();
cout<<elementele primului vector<<endl;
v1.afisare();
v2.citire();
cout<<elementele vectorului doi<<endl;
v2.afisare();
}

- 157 -

Copie autorizata pentru studenii CFBC

7. Funcii prietene
Datele i metodele unei clase nu pot fi prelucrate n exteriorul clasei,
dac ele snt protejate cu modificatorii de protecie private sau protected.
Totui, uneori apare necesitatea prelucrrii acestor date n afara clasei lor.
Acest fapt este posibil prin intermediul aa numitor funcii prietene (friend
functions). Declararea unei funcii prietene f() clasei X se realizeaz astfel:
class X{
//
friend tip_returnat
f(parametru_de_tip_clas,lista_de_parametri);
};
tip_returnat f(parametru_de_tip_clas, lista_de_parametri){
// corpul functiei
}

Accesul la datele clasei se face prin intermediul parametrului de tip


clas (nu prin numele obiectului clasei ca n cazul metodelor clasei). Deci
parametru_de_tip_clas este obligatoriu (spre deosebire de funciile membru,
in cazul funciilor prietene nu mai este definit pointerul implicit this), iar
lista_de_parametri poate i s lipseasc.
Exemplu rezolvat
1. S crem o funcie prieten cu clasa vector, care va apela datele i
metodele acestei clase (protejate la nivel private).
Realizare:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<conio.h>
class vector{
int vect[10];
void citire();
void afis();
friend void prieten(vector c);
};
void vector::citire(){
for(int i=0;i<10;i++) vect[i]=random(100);
}
void vector::afis(){
for(int i=0;i<10;i++)
cout<<setw(5)<<vect[i];
cout<<endl;

- 158 -

Copie autorizata pentru studenii CFBC

}
void prieten(vector c){
c.citire(); c.afis();
}
main(){
randomize();
vector Q;
prieten(Q);
getch();
}

Se creeaz obiectul Q, a crui metodele nu pot fi apelate dect n cadrul


funciei prieten. Apelarea metodelor n afara acestei funcii va genera o eroare,
n care se va indica c nu exista acces la metodele obiectului Q.

8. Alocarea dinamic a obiectelor


8.1. Pointeri ctre membrii unei clase
Variabilele pointer pstreaz adrese ale zonelor de memorie, n care
pot fi stocate date sau funcii.
Un pointer ctre un membru al clasei pstreaz locaia de memorie
din interiorul clasei. De fapt, el conine doar deplasarea datei n cadrul oricrui
exemplar (adic obiect) al clasei.
Pentru prelucrarea adresei unui membru al clasei se folosete sintaxa:
pointer_membru=&clasa::membru.
Pentru accesul la un membru cnd se cunoate adresa lui se folosete
sintaxa:
obiect.*pointer (daca se specifica un obiect al clasei) sau
pointer_obiect->*pointer_membru (daca se specifica un pointer de obiect).

8.2. Operatorii new i delete


Ca i celelalte structuri de date, obiectele pot fi alocate dinamic (adic
pot fi create n timpul execuiei programului). Pentru date obinuite se folosesc
funciile predefinite calloc(), malloc(), realloc() i free() (ale fiierului alloc.h).
Cele mai utilizate snt malloc() i free(). Echivalentul acestor dou funcii n
cazul obiectelor snt operatori new i delete.

- 159 -

Copie autorizata pentru studenii CFBC

Operatorul new se utilizeaz astfel:


tip_data *p;
p= new tip_data [(initializare)];

unde tip_data reprezint tipul definit, adic numele clasei, p este numele
pointerului de tip obiect, iar initializare (care poate s lipseasc) este o
expresie care depinde de tipul datei i permite iniializarea zonei de memorie
alocate. Dac alocarea nu este posibil, pointerul returnat este NULL.
Operatorul new poate produce apelul unui constructor.
Operatorul delete elibereaz o zon de memorie din heap alocat
anterior cu new. De regul, el se utilizeaz n interiorul destructorilor i poate fi
apelat n una din urmtoarele forme:
a) delete P se utilizeaz pentru eliberarea unei zone de memorie
ocupat de o singur dat (obiect), nu de un vector. Pointerul P trebuie s fie
un pointer la o zon de memorie alocat anterior printr-un operator new.
Folosirea operatorului delete cu un pointer care nu este valid este o operaie cu
rezultat nedefinit, cel mai adesea producnd erori de execuie;
b) delete [] P se folosete pentru eliberarea unei zone de memorie
ocupat de un vector de date. De exemplu, avnd alocarea int *V = new
int[10], instruciunea delete V va
elibera zona de memorie alocat
elementului V[0], iar instruciunea delete[] V va elibera spaiul de memorie
alocat ntregului tablou V.
Exemple de alocri i eliberri pentru obiecte ale claselor Complex i student
(declarate n exemplele anterioare):
Complex *pc0 = new Complex;
// apelarea constructorului
implicit
Complex *pc1 = new Complex(2);// apelarea constructorului cu un
parametru
Complex *pc2 = new Complex(3.5,2.9); //apelarea constr. cu 2
parametri
delete pc0; // apelarea destructorului
delete pc1;
delete pc2;
elev *p = new elev(Munteanu,Anatol,8.88);
p->afisare();
delete p;
Complex *pv1 = new Complex[4]; // crearea dynamica a vectorului
pv1
delete []pv1; // eliberarea memoriei rezervate vectorului pv1

- 160 -

Copie autorizata pentru studenii CFBC

Observaie. La declararea unui pointer de tip obiect nu este apelat


constructorul, el este apelat la alocarea memoriei, adic la apelarea operatorului
new.

Exemplu rezolvat
S crem un tablou de poiteri de tip student (care este o clas cu datele
membru: nume, prenume, anul, media i funcia membru afis(), utilizat pentru
afiarea acestor date).
Realizare:
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream.h>
class student{
char *nume,*prenume;
int
anul;
double
media;
public:
student();
student(char *p1,char *p2);
student(char *p1,char *p2,int p3,double p4);
void afis();
~student();
};
student::student(){
char s[20];
cout<<"Constructor implicit"<<endl;
cout<<"Dati numele studentului";cin>>s;
nume=new char[strlen(s)+1];strcpy(nume,s);
cout<<"Dati prenumele studentului";cin>>s;
prenume=new char[strlen(s)+1];strcpy(prenume,s);
cout<<"Dati anul nasterii";cin>>anul;
cout<<"Dati media :";cin>>media;
}
student::student(char *p1,char*p2){
nume= p1;prenume= p2;
anul=0; media=0;
}
student::student(char *p1,char *p2,int p3,double p4){
nume= p1;prenume= p2;anul=p3;media=p4;
}

- 161 -

Copie autorizata pentru studenii CFBC

void student::afis(){
cout<<nume<<" "<<prenume<<" "<<anul<<" "<<media<<endl;
}
student::~student(){delete nume;delete prenume;}
void main(){
student *s[3];
int i;
s[0]=new student;
s[1]=new student("Moraru","Ion");
s[2]=new student("Ciobanu","Vasile",1990,8.75);
cout<<endl<<"Lista studentilor"<<endl<<endl;
for(i=0;i<3;i++) s[i]->afis();
getch();
for(i=0;i<3;i++) delete s[i];
}

9. Suprancrcarea operatorilor
9.1. Modaliti i forme de suprancrcare
n C++ se pot defini operaii cu obiectele claselor folosind simbolurile
operatorilor standard. n acest caz se spune c operatorii standard snt
suprancrcai.
O funcie care definete pentru o clas o operaie echivalent operaiei
efectuate de un operator asupra unui tip predefinit este numit funcie operator.
Majoritatea operatorilor limbajului C++ pot fi suprancrcai, cu excepia
operatorilor ., *, ::, ?:.
Procedeul de suprancrcare const n definirea unei funcii cu numele
operator S, unde operator este cuvnt-cheie, iar S simbolul unui operator
din C++.
Procesul de suprancrcare a unui operator poate fi realizat prin
intermediul:
a) unei funcii membru;
b) unei funcii prietene clasei pentru care urmeaz a fi suprancrcat
operatorul.
a) Forma general de suprancrcare a unui operator S prin intermediul unei
funcii membru:

- 162 -

Copie autorizata pentru studenii CFBC

class nume_clasa
{
// datele i metodele clasei
tip operator S(lista_de_parametri);
};// sfirsitul declaratiei clasei
tip nume_clasa::operator(lista_de_parametri){
// descrierea procesului de suprancrcare
}
unde S este operatorul suprancrcat, tip tipul rezultatului operaiei S,
lista_de_parametri reprezint operanzii care particip la operaia S.

iar

b) Forma general de suprancrcare este a unui operator S prin intermediul


unei funcii prietene:
nume_clasa
{
// datele i metodele clasei
friend tip operator S(lista_de_parametri);
}; // sfirsitul declaratiei clasei
tip operator S (lista_de_parametri){
// descrierea procesului de suprancrcare
}
unde S este operatorul suprancrcat, tip tipul rezultatului operaiei S,
lista_de_parametri reprezint operanzii care particip la operaia S.

iar

Observaie
1. n cazul suprancrcrii prin funcii membru lista_de_parametri va
conine cu un parametru mai puin (din cauza c prin intermediul funciilor
membru este acces la obiectul curent).
2. Dac suprancrcarea este realizat printr-o funcie prieten, atunci primul
operant va reprezenta obiectului curent.

9.2. Restricii la suprancrcarea operatorilor


Suprancrcarea operatorilor este supus urmtoarelor restricii:
1. Se pot suprancrca doar operatorii existeni n C++; nu se pot crea noi
operatori.
2. Nu se poate modifica numrul (paritatea) operanzilor operatorilor
standard.
3. Nu se poate modifica precedena i asociativitatea operatorilor.

- 163 -

Copie autorizata pentru studenii CFBC

4. Dei operatorii suprancrcai pstreaz paritatea i precedena


operatorilor predefinii, ei nu motenesc i comutativitatea acestora.
Observaii:
1. Dac operatorul = nu este suprancrcat, el are o semnificaie implicit.
2. Funcia operator trebuie s aib cel puin un argument (implicit sau
explicit) de tipul clasei pentru care s-a suprancrcat operatorul.
3. Unui operator i se poate atribui orice semnificaie, ns se recomand ca
aceasta s fie ct mai apropiat de semnificaia natural.

Exemple rezolvate
1. Suprancrcarea operatorului +
S crem un exemplu n care vom suprancrca operatorul + pentru
clasa complex. Deoarece adunarea numerelor complexe este comutativ, vom
examina cazurile:
1. complex + complex
2. double + complex
3. complex + double
n primul i al treilea caz suprancrcarea poate fi efectuat prin
intermediul funciilor membru, ns n cazul doi suprancrcarea este posibil
numai prin intermediul unei funciei prieten, deoarece primul parametru al unei
funcii membru operator este implicit de tipul clasei i nu poate fi de alt tip.
Rezolvare:
#include<iostream.h>
class complex{
public:
double x,y;//complex=x+yi
void citire();
void afisare();
complex operator +(complex);
friend complex operator +(double, complex);
complex operator+(double);
};
void complex::citire(){
cout<<partea reala;cin>>x;
cout<<partea imaginara;cin>>y;
}
void complex::afisare(){cout<<x<<+<<y<<i<<endl;}

- 164 -

Copie autorizata pentru studenii CFBC

complex complex::operator+(complex b){


complex c;
c.x=x+b.x;
c.y=y+b.y;
return c;
}
complex complex::operator+(double b){
complex c;
c.x=x+b;
c.y=y;
return c;
}
complex operator+(double a, complex b){
complex c;
c.x=a+b.x;
c.y=b.y;
return c;
}
main(){
complex x,y,z;
double a;
cout<<"Introdu valoarea numarului complex"<<endl;
x.citire();
cout<<"Mai introdu inca una"<<endl;
y.citire();
cout<<"Introdu un numar real"<<endl; cin>>a;
cout<<"Valorile introduse"<<endl;
cout<<"x="l;
x.afisare();
cout<<"y=" ;
y.afisare();
cout<<"a="<<a<<endl;
cout<<"*********Operatorul + *********"<<endl;
cout<<"***complex complex***"<<endl;
z=x+y;
z.afisare() ;
cout<<"***complex double***"<<endl;
z=x+a;
z.afisare();
cout<<"***double complex***"<<endl;
z=a+x;
z.afisare();
}

2. Suprancrcarea operatorului =
n cazul n care operatorul de atribuire nu este suprancrcat explicit,
compilatorul genereaz unul implicit i copie valorile datelor membri ale
operandului drept direct n datele membri ale operandului stng.
Operatorul de atribuire implicit este nesatisfctor n situaiile n care

- 165 -

Copie autorizata pentru studenii CFBC

obiectele clasei au date membri de tip pointer, sau n situaiile n care memoria
este alocat n mod dinamic.
S crem dou exemple n care vom suprancrca explicit operatorul =
pentru clasa complex prin intermediul unei funcii membru i respectiv cu
ajutorul unei funcii friend.
Realizare:
a) Suprancrcarea operatorului = pentru clasa complex prin intermediul unei
funcii membru.
class complex{
public:
double x,y;
complex operator = (complex );
};
complex complex::operator = (complex z){
x=z.x; y=z.y; return *this;
//this este pointer ctre obiectul curent, a n main
}
void main(){
complex a, b;
a = b;
}

b) Suprancrcarea operatorului = pentru clasa complex prin intermediul unei


funcii friend.
class complex{
public:
double x,y;
friend complex operator=(complex,complex);
};
complex operator = (complex z1, complex z2){
z1.x=z2.x;
z1.y=z2.y;
return z1;}
void main(){
complex a, b;
a = b;
}

- 166 -

Copie autorizata pentru studenii CFBC

3. Suprancrcarea operatorilor de comparaie


Aa cum limbajul de programare C++ nu are implementat tipul de date
logic, vom considera valoarea 1 echivalenta valorii true, iar valoare 0
echivalenta valorii false. n acest context tipul rezultatului unei operaii de
comparare a dou valori numerice poate fi int, avnd valorile posibile 1 sau 0.
Suprancrcarea operatorilor de comparaie poate fi efectuat att prin
intermediul funciilor membru ct i prin intermediul funciilor friend. n
general, suprancrcarea unui operator de comparaie (printr-o funcie friend)
va avea urmtoarea sintax general:
class nume_clasa{
//Date i metode;
friend int operator@( nume_clasa, nume_clasa);
};
//unde @ este un operator de comparaie

//descrierea suprancrcrii :
int operator@( nume_clasa ob1, nume_clasa ob2){
if(condiia de comparare) return 1;
else return 0;
}

n urmtoarea secven de program vom suprancrca (cu ajutorul unei


funcii prieten) operatorul = = pentru clasa complex:
class complex{
double x,y;
public:
friend int operator== (complex,complex);
};
int operator == (complex ob1, complex ob2){
if(ob1.x==ob2.x && ob1.y==ob2.y) return 1;
else return 0;}
void main(){
complex a, b;
if(a==b) cout<<Numere egale;
else cout<<Numere diferite;
}

Observaie. Procesul de suprancrcare a celorlali operatori de


comparaie este similar cu suprancrcarea operatorului = =. Deosebirea const
n dificultatea comparrii datelor obiectului.

- 167 -

Copie autorizata pentru studenii CFBC

4. Suprancrcarea operatorilor << i >>


Operaiile de intrare/ieire din C++ se efectueaz folosind operatorul de
inserie << i respectiv operatorul de extragere >> din streamuri. Aceste funcii
operator snt definite n clasele ostream i istream. Spre deosebire de ali
operatori, operatorii de intrare/ieire pot fi suprancrcai doar prin intermediul
funciilor friend.
Suprancrcarea operatorilor de intrare/ieire se poate face respectnd
sintaxa:
class nume_clasa {
friend ostream& operator<<(ostream& os,nume_clasa nume);
friend istream& operator>>(istream& is,nume_clasa &nume);
};
ostream& operator<<(ostream& os,tip_clasa nume){
// corpul functiei
return os;
} istream& operator>>(istream& is,tip_clasa &nume){
// corpul functiei
return is;
}

S crem un exemplu n care vom suprancrca operatorii <<, >> pentru clasa
complex.
Realizare:
#include<iostream.h>
class complex {
public:
double x, y;
friend ostrem& operator << (ostrem& os, complex z);
friend istream& operator >>(istream& is,complex& z);
};
ostream& operator<<(ostream& os, complex z){
os <<z.x;
if(z.y==0) os<<endl;
if(z.y<0) os<<-<<z.y<<i<<endl;
if(z.y>0) os<<+<<z.y<<i<<endl;
return os;
}
istream& operator>>(istream& is, complex& z){
cout<<Dati partea reala ; is >> z.x;
cout<<Dati parteaimaginara; >> z.y;
return is;
}

- 168 -

Copie autorizata pentru studenii CFBC

main(){
complex x,y;
cout<<Introdu primul nr complex; cin>>x;
cout<<Introdu a-l doilea nr complex; cin>>y;
cout<<x<<y;
}

10. Motenirea obiectelor


La nceputul acestui capitol am menionat despre mecanismul de
motenire, prin care o clas (numit clas derivat) motenete (copie) datele
i metodele clasei printe (se mai spune clas de baz).
n C++ deosebim moteniri simple i moteniri multiple.
Motenirea simpl se caracterizeaz prin faptul c o clas poate avea
una sau mai multe clase derivate i cel mult un printe.
De exemplu, considernd clasa Angajat printe a clasei Administrator,
obinem o relaie de motenire simpl, n care clasa Admimistrator pstreaz
datele i metodele clasei Angajat. Evient, clasa de derivate poate conine i alte
date sau fucii dect cele ale printelui.

Motenirea multipl se caracterizeaz prin faptul c o clas este


derivat cel puin dou clase.
O clas derivat se declar conform urmtoarei diagrame de sintax
(considernd declarat clasa printe):

- 169 -

Copie autorizata pentru studenii CFBC

n calitate de modificator de protecie poate fi unul din cuvintele-cheie:


public, private, protected.
Domeniul de vizibilitate al datelor i metodelor ntr-o relaie de
motenire este dat de urtorul tabel:
Modificatorul de protecie
al datei sau al
metodei clasei
de baz

din declararea clasei


derivate (din
diagram)

private
protected
public
private
protected
public
private
protected
public

public
public
public
protected
protected
protected
private
private
private

Accesul la datele i metodele clasei de


baz n
clasa derivat
exteriorul clasei
exist la nivel
derivate

private
protected
public
private
protected
protected
private
private
private

nu exist
nu exist
exist
nu exist
nu exist
nu exist
nu exist
nu exist
nu exist

Exemplu rezolvat

S crem un program n care vom descrie personalul unei instituii,


format din dou tipuri de angajai: Angajat i Administrator. Clas Angajat este
de baz i conine date i metode referitoare la orice angajat. Clasa
Administator este derivat din clasa Angajat i mai conine suplimentar cmpul
sectie, care specific numrul seciei de care este responsabil administratorul.
Realizare:
#include<iostream.h>
#include<string.h>
class Angajat{
protected:

- 170 -

Copie autorizata pentru studenii CFBC

char *nume;
double salariu;
public:
void set_ang(char *n, double sal);
void afis_ang();
};
void Angajat::set_ang(char *n, double sal){
int size = strlen(n); nume = new char[size+1];
strcpy(nume, n); salariu = sal;
}
void Angajat::afis_ang(){
cout << "Nume: " << nume<< " Salariu: " << salariu << endl ;
}
class Administrator : public Angajat {
int sectie;
public:
void set_admin(char *n, double sal, int sec);
void afis_admin();
};
void Administrator::set_admin(char *n,double sal, int sec){
int size = strlen(n); nume = new char[size+1];
strcpy(nume, n); salariu = sal; sectie=sec;
}
void Administrator::afis_admin(){
afis_ang();
cout << "Sectia : " << sectie << endl;
}
void main(){
Angajat a1;
cout<<"Datele despre Angajat ";
a1.set_ang("Manole", 2000);
a1.afis_ang();
Administrator m1;
m1.set_admin("Frunza", 3000, 1);
cout<<"Datele despre Administrator ";
m1.afis_admin();
}

n urma execuiei acestui program la consol vor fi afiate urmtoarele mesaje:


Datele despre Angajat Nume: Manole Salariu: 2000
Datele despre Administrator Nume: Frunza Salariu: 3000
Sectia : 1

Observaie. Motenirea multipl va fi examinat n paragraful 13.

- 171 -

Copie autorizata pentru studenii CFBC

11. Constructori i destructori n clasele derivate


11.1. Generaliti
Constructorii i destructorii snt funcii membre care nu se motenesc.
La crearea unui obiect a unei clase derivate se apeleaz implicit mai nti
constructorii claselor de baz, apoi constructorul clasei derivate. Ordinea n
care snt apelai constructorii claselor de baz corespunde ordinii claselor de
baz din declaraia clasei derivate.
Dac clasa de baz (adic clasa printe) nu are constructor implicit sau
se dorete ca un constructor suprancrcat s fie apelat atunci cnd un nou
obiect al unei clase derivate este creat, atunci se poate specifica acest lucru n
definiia constructorului clasei derivate:
Numele_clasei_derivate (lista_de_parametri):
Numele_clasei_de_baz (lista_de_parametri) {}

Ordinea de execuie a destructorilor este invers ordinii apelrii


constructorilor respectivi. Deci, mai nti este apelat destructorul clasei
derivate, apoi destructorul clasei de baz.
n cazul utilizrii constructorilor cu parametri, este necesar ca
constructorul clasei derivate s transfere parametri constructorului clasei de
baz.
Dac transferul de parametri nu este realizat, atunci la compilarea
programului va aprea o eroare, care va genera un mesaj ce va informa c nu
poate fi iniializat constructorul clasei de baz. O asemenea eroare este
generat de urmtorul exemplu:
#include<iostream.h>
class baza{
public:
int i;
baza(int x){i=x;cout<<"construeste baza"<<endl;}
};
class derivat:public baza {

- 172 -

Copie autorizata pentru studenii CFBC

public:
int j;
derivat(int x,int y){j=x;i=y;cout<<"construeste
derivat"<<endl;}
void arata(){cout<<i<<" "<<j<<endl;}
};
main(){
derivat ob(3,4);
ob.arata();
}

La compilarea acestui program se va afia mesajul: Cannot fiind default


constructor initialize base class baza (constructorul clasei de baz nu poate fi
iniializat).
Pentru efectuarea transferului a k parametri ai constructorului clasei
derivate Derivat ctre constructorului clasei de baz Baza, se va utiliza
urmtorul model:
class Baza{
Baza(tip_1 par_1,,tip_k par_k); // construct. clasei de baza
};
class Derivat:public Baza {
Derivat(tip_1 par_1, ,tip_k par_k,,tip_n par_n); // constr.
clasei derivate
};
Derivat::Derivat(tip_1 par_1, ,tip_k par_k, .,tip_n par_n):
Baza(par_1, par_2, ,par_k){
/* iniializare date membre clasa derivata */
}

Exemplu rezolvat
n acest program se ilustreaz modul de utilizare a constructorului cu
parametri ntr-o relaie de motenire Baz Derivat.
#include<iostream.h>
class baza{
public:
int i;
baza(){};
baza(int x){i=x; cout<<"construeste baza"<<endl;}
};
class derivat:public baza {
public:
int j;

- 173 -

Copie autorizata pentru studenii CFBC

derivat(){};
derivat(int x,int y): baza(y){
j=x; cout<<"construeste derivat";
}
void arata(){cout<<i<<" "<<j<<endl;}
};
main(){
derivat ob(3,4);
ob.arata();
}

n acest program n momentul n care este apelat constructorul clasei


derivate ob(3, 4) pentru iniializarea datei i se apelez costructorul clasei de
baz, astfel nct i = 4 i j = 3.

11.2. Pointeri ctre clase derivate


Mecanismul de motenire ofer posibilitatea de a declara obiecte de tip
pointer la clasa de baz, ca mai apoi pentru aceti pointeri s fie apelai
constructorii claselor derivate.
De exemplu, n seciunea de program
class Baza{/*date si metode*/
};
class Derivat:public Baza {/*date si metode*/
};
main(){
Baza *a;
a = new Derivat;
}

instruciunea a = new Derivat implic mai nti iniializarea constructorului


clasei de baz, apoi a constructorului clasei derivate. Cu toate c a fost
iniializat constructorul clasei derivate, nu va fi posibil de apelat metodele
clasei derivate.
Exemplu rezolvat
S elaborm un program care va prelucra ierarhia de clase Student
Bugetar. Clasa Bugetar este derivata clasei Student.

- 174 -

Copie autorizata pentru studenii CFBC

Realizare:
#include <string.h>
#include <iostream.h>
#include<conio.h>
class student{ // descriem clasa student
protected:
char *nume,*prenume;
int
anul;
double
media;
public:
student();
student(char *p1,char *p2,int p3,double p4);
void afis();
};
student::student(){ //definim constructorul clasei de baza
char s[20];
cout<<"Numele studentului";cin>>s;
nume=new char[strlen(s)+1];
strcpy(nume,s);
cout<<"Prenumele studentului"; cin>>s;
prenume=new char[strlen(s)+1];
strcpy(prenume,s);
cout<<"Anul nasterii"; cin>>anul;
cout<<"Media :"; cin>>media;
}
student::student(char *p1,char *p2,int p3,double p4){
nume= p1;
prenume=p2;
anul=p3;
media=p4;
}
void student::afis(){
cout<<nume<<" "<<prenume<<" "<<anul<<" "<<media<<endl;
}
class bugetar:public student{ //descriem clasa bugetar
public:
bugetar(){};
bugetar(char *p1,char *p2,int p3,double
p4):student(p1,p2,p3,p4){};
int bursa(){if(media>8) return 200;else return 0;}
void afis(){student::afis();cout<<"Bursa "<<bursa()<<endl; }
};
void main(){
student *s1,*s2;

- 175 -

Copie autorizata pentru studenii CFBC

int i;
bugetar *a,*b;
cout<<"lucru cu pointeri de tip student"<<endl;
s1=new student("Ciobanu","Vasile",1990,7.75);
s2=new bugetar("Ciubotaru","Vlad",1989,8.75);
cout<<endl<<"studentii din lista"<<endl<<endl;
s1->afis();
s2->afis();
cout<<endl<<"lucru cu pointeri de tip bugetar"<<endl;
b=new bugetar("Moraru","Ion",1989, 9.2);
b->student::afis();
b->afis();
delete s1;
delete s2;
delete b;
getch();
}

12. Funcii virtuale, clase abstracte i polimorfism


Funciile virtuale se folosesc (de regul) atunci, cnd se redefinesc
metodele prinilor i nu se tie din timp care metod cu acelai nume (proprie
sau a unuia dintre prini) va trebui folosit. Metodele virtuale i creeaz
automat propria ierarhie. La declararea printelui-generator al unei astfel de
ierarhii, dup antetul metodei se scrie directiva virtual. Deci, sintaxa pentru
declararea unei funcii virtuale este:
virtual tip_returnat
nume_metod(lista_parametrii_formali);

Observaii.
1. Dac o metod este declarat ca funcie virtual n clasa de baz, ea va
fi virtual pentru toate clasele derivate.
2. O metod virtual este declarat cu scopul de a o utiliza i n alte clase
(nu numai n clasa de baz).
3. Redefinirea unei funcii virtuale ntr-o clas derivat domin definiia
funciei n clasa de baz.

Exemple rezolvate

- 176 -

Copie autorizata pentru studenii CFBC

1. n clasa de baz Baza snt definite metodele citire i afiare, dintre


care metoda citire este virtual. Ambele metode snt redefinite n clasa derivat
Derivat.
#include <iostream.h>
class Baza{
public:
void afisare(){cout<<"afisare Baza"<<endl;}
virtual void citire(){cout<<"citire Baza"<<endl;}
};
class Derivat: public Baza{
public:
void afisare(){cout<<"afisare Derivat"<<endl;}
void citire(){cout<<"citire Derivat"<<endl;}
};
main(){
clrscr();
Derivat a;
a.citire();
a.afisare();
Baza *b;
b=new Derivat;
b->citire();
b->afisare();
}

n urma execuiei programului la ecran se vor afia urmtoarele mesaje:


citire Derivat
afisare Derivat
citire Derivat
afisare Baza

2. S crem un program n care vom defini clasa de baz patrat cu


metodele afisare i arie (virtual), precum i clasa derivat cub, n care vom
redefini metodele clasei de baz. Pentru fiecare clas vom crea cte un
constructor cu parametri.
Realizare:
#include <stdlib.h>
#include <iostream.h>
class patrat{
protected:
double l;
public:

- 177 -

Copie autorizata pentru studenii CFBC

patrat(double a){l=a;}
void afisare(){cout<<"patrat l= "<<l<<endl;}
virtual double arie(){return l*l;}
};
class cub : public patrat{
public:
cub(double w):patrat(w){};
void afisare(){cout<<"cub l="<<l<<endl;}
double arie(){return patrat::arie()*l;}
};
void main(){
patrat *s[10];
s[0]=new patrat(5);
s[1]=new cub(12);
cout<<"metodele nevirtuale"<<endl;
s[0]->afisare();
s[1]->afisare();
cout<<"metodele virtuale"<<endl;
cout<<"patrat "<<s[0]->arie()<<endl;
cout<<"cub "<<s[1]->arie()<<endl;
delete s[0];
delete s[1];
}

La consol se va afia:
metodele nevirtuale
patrat l= 5
patrat l= 12
metodele virtuale
patrat 25
cub 1728

12.1. Funcii virtuale pure i clase abstracte


Deseori o funcie declarat de tip virtual n clasa de baz nu definete o
aciune semnificativ (fiind o metod abstract) i este neaprat necesar ca ea
s fie redefinit n fiecare din clasele derivate. O funcie virtual pur este o
funcie care nu are definiie n clasa de baz, iar declaraia ei are urmtoarea
form:
class nume_baza{
//...
virtual tip_returnat nume_metoda() {};
...
};

- 178 -

Copie autorizata pentru studenii CFBC

tip_returnat nume_baza:: nume_metoda(){/*definirea metodei*/}

Dac o clas conine cel puin o funcie virtual pur, atunci ea se


numete clas abstract. Evident, pentru o astfel de clas nu pot fi create
obiecte, ns pot fi creai pointeri i referine la ele.
n acelai timp, dac n clasa derivat dintr-o clas abstract nu se
redefinesc toate funciile virtuale pure motenite, atunci aceasta, de asemenea,
va fi o clas abstract.

12.2. Polimorfism
n preliminariile acestui capitol am menionat c polimorfismul d
posibilitatea ca att clasa derivat, ct i clasa de baz s poat utiliza metode cu
acelai nume, dar cu diferite funcionaliti.
De cele mai dese ori polimorfismul se realizeaz prin intermediul
funciilor virtuale. Declarate n clasa de baz, se presupune c acestea vor fi
implementate n clasele derivate.
n cazul funciilor normale (pentru care snt cunoscute adresele de apel) se
spune c legarea dintre obiect i funcie este timpurie, n sensul c aceast legare are
loc n timpul compilrii programului. Apelurile soluionate n timpul compilrii au o
vitez ridicat.

Legarea trzie se refera la evenimente din timpul execuiei programului,


adic la cazul cnd adresa funciei care urmeaz sa fie apelata nu este cunoscut
n timpul compilrii, doar n momentul execuiei programului.
Adresa de apel a funciilor virtuale nu este cunoscut n timpul
compilrii. Accesul la ele se face prin pointerii la clasa de baz. Chiar dac
legarea trzie conduce la un timp de execuie mai mare al programelor, aceasta
simplific programele, conferindu-le elegan i flexibilitate.

Exemplu rezolvat
S crem un program n care vom defini clasa de baz triunghi
(corespunztoare triunghiului echilateral) i clasele derivate piramida i prisma
(corespunztoare piramidei triunghiulare regulate i prismei triunghiulare
regulate). Programul va citi datele despre n astfel de figuri i corpuri
geometrice, apoi va afia denumirile celor cu aria maxim, respectiv cu
volumul maximal. Numrul n de figuri/corpuri geometrice, de asemenea, se va
citi de la tastatur.

- 179 -

Copie autorizata pentru studenii CFBC

Realizare:
Metodele afis i volum snt metode abstracte, adic pentru clasa triunghi ele nu
efectueaz nimic, dar vom avea nevoie de aceste metode n clasele derivate.
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream.h>
class triunghi{
protected:
double lat; //
public:
virtual void citire();
virtual double arie();
virtual void afis(){};
virtual double volum(){return 0;}
};
void triunghi::citire(){
cout<<"Introdu lungimea laturii (bazei): ";cin>>lat;
}
double triunghi::arie(){return lat*lat*sqrt(3)/4;}
class piramida:public triunghi{
protected:
double a,h;
public:
void citire();
double arie();
double volum();
void afis();
};
void piramida ::citire() { // redefineste metoda parintelui
cout<<"Introdu masurile piramidei"<<endl;
triunghi::citire(); // apeleaza metoda parintelui
cout<<"Introdu lungimea apotemei :";cin>>a;
cout<<"Introdu inaltimea piramidei:";cin>>h;
}
double piramida ::arie(){
double s;
s=triunghi::arie(); // aria bazei
s=s+triunghi::lat*a/2*3;
return s;
}
double piramida ::volum(){return triunghi::arie()*h/3;}
void piramida ::afis(){
cout<<"Piramida Aria "<<arie()<<" Volumul ";
cout<<volum()<<endl;
}

- 180 -

Copie autorizata pentru studenii CFBC

class prisma:public triunghi{


protected:
double H;
public:
void citire();
double arie();
double volum();
void afis();
};
void prisma::citire(){
cout<<"Introdu masurile prismei "<<endl;
triunghi::citire();
cout<<"Introdu inaltimea:";cin>>H;
}
double prisma::arie(){
double s;
s=2*triunghi::arie(); // ariile bazelor
s=s+triunghi::lat*H;
return s;
}
double prisma::volum(){
double s;
s=triunghi::arie();
s=s*H;return s;
}
void prisma::afis(){
cout<<" prisma Aria "<<arie();
cout<<" Volumul "<<volum()<<endl;}
main(){
triunghi *fig[10];
int n,i,k,arie,volum;
double amax,vmax;
cout<<"Introdu numarul figurilor ";cin>>n;
amax=vmax=0.0;
for(i=0;i<n;i++){
clrscr();
cout<<" Tastati"<<endl<<"1 Piramida"<<endl<<
"2 prisma "<<endl; cin>>k;
if(k==1) fig[i]=new piramida;
else fig[i]=new prisma ;
fig[i]->citire();
if(amax<fig[i]->arie()) {amax=fig[i]->arie(); arie=i;}
if(vmax<fig[i]->volum()) {vmax=fig[i]->volum();volum=i;}
}
cout<<"In depozit snt urmatoarele figuri"<<endl;
for(i=0;i<n;i++) fig[i]->afis();
cout<<"Figura cu aria maxima"<<endl;
fig[arie]->afis();

- 181 -

Copie autorizata pentru studenii CFBC

cout<<"Figura cu volumul maxim"<<endl;


fig[volum]->afis();
for(i=0;i<n;i++)
delete fig[i];
getch();
}

13. Motenirea multipl


13.1. Generaliti
Conceptul de motenire multipl permite crearea de clase noi care
motenesc datele i metodele mai multor clase de baz. Motenirea multipl
aduce mai mult flexibilitate n construirea claselor, rezultatul fiind obinerea
unor structuri de clase complexe.
Astfel, sintaxa general pentru declararea unei clase este:

Principiile prezentate la derivarea simpl i la crearea ierarhiilor simple


de clase snt valabile i n cazul derivrii multiple.

Exemplu rezolvat
S crem un program n care vom implementa clasa cuplu, derivat a
claselor barbat i femeie.
Realizare:
#include <iostream.h>
#include <conio.h>
class barbat{
public:
char *prenume;
int anul;
barbat(){};

- 182 -

Copie autorizata pentru studenii CFBC

barbat(char *a, int b){prenume=a;anul=b;}


void citire();
void afisare();
};
class femeie{
public:
char *prenume;
int anul;
femeie(){};
femeie(char *a, int b){prenume=a;anul=b;}
void citire();
void afisare();
};
class cuplu : public barbat,public femeie{
public:
cuplu(){};
cuplu(char *a,int b,char *c, int d):barbat(a,b),femeie(c,d){};
void citire();
void afisare();
};
void barbat::citire(){
cout<<"Dati datele despre barbat"<<endl;
cout<<"Prenumele :"; cin>>prenume;
cout<<"Anul :";cin>>anul;
}
void barbat::afisare(){
cout<<" Barbatul : "<<prenume<<" Virsta "<<2009-anul<<endl;
}
void femeie::citire(){
cout<<"Dati datele despre femeie"<<endl;
cout<<"Prenumele :"; cin>>prenume;
cout<<"Anul :";cin>>anul;
}
void femeie::afisare(){
cout<<" Femeia : "<<prenume<<" Virsta "<<2009-anul<<endl;
}
void cuplu::citire(){
barbat::citire();
femeie::citire();
}
void cuplu::afisare(){
cout<<"Cuplul este format din:"<<endl;
barbat::afisare();
femeie::afisare();
}
main(){
cuplu a,b("Ion",1976,"Maria",1980);
a.citire();
cout<<"Cuplurile existente "<<endl;
a.afisare();

- 183 -

Copie autorizata pentru studenii CFBC

b.afisare();
}

n urma execuiei acestui program la consol vor fi afiate urmtoarele


messaje:
Dati datele despre barbat
Prenumele :Anton
Anul :1980
Dati datele despre femeie
Prenumele :Ioana
Anul :1990
Cuplurile existente
Cuplul este format din:
Barbatul : Ioana Virsta 29
Femeia : Virsta 19
Cuplul este format din:
Barbatul : Ion Virsta 33
Femeia : Maria Virsta 29

13.3. Clase virtuale


ntr-o motenire multipl este posibil ca o clas s fie motenit indirect
de mai multe ori, prin intermediul unor clase care motenesc, fiecare n parte,
clasa de baz. De exemplu:
class A
class B
class C
class D
{/**/};

{
:
:
:

public: int x;};


public A { /* */};
public A { /* */};
public B, public C
B

Un obiect din clasa D va conine


membrii clasei A de dou ori, o dat prin
D
clasa B i o dat prin clasa C.
n aceast situaie, accesul la un membru al unui obiect de tip D
motenit din clasa A (de exemplu, D ob; ob.x = 2) este interzis (este
semnalat ca eroare la compilare).
O soluie pentru eliminarea ambiguitilor n motenirile multiple este
de a impune crearea unei singure copii a clasei de baz n clasa derivat. Pentru
aceasta este necesar ca acea clas care ar putea produce copii multiple prin

- 184 -

Copie autorizata pentru studenii CFBC

motenire indirect s fie declarat clas de baz de tip virtual.


O clas de baz virtual este motenit o singur dat i creeaz o
singur copie n clasa derivat. Prin urmare, declaraiile de mai sus pot fi
modificate astfel:
class
class
class
class

A
B
C
D

{
:
:
:

public: int x; };
virtual public A { /* */ };
virtual public A { /* */ };
public B, public C { /*
*/ };

Exemplu rezolvat
Pornind de la clasa de baz punct vom construi clasele cerc i patrat,
care la rndul lor vor deriva clasa figura.
Realizare:
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
class punct{
protected:
int x,y,cul;
public:
virtual void citire();
virtual void des();
};
class patrat:virtual public punct{
protected:
int l;
public:
void citire();
void des();
};
class cerc:virtual public punct{
protected:
int raza;
public:
void citire();
void des();
};
class figura:public patrat, public cerc {
public:
void citire();
void des();

- 185 -

Copie autorizata pentru studenii CFBC

};
void punct::citire(){
clrscr();
cout<<"introdu x:";cin>>x;
cout<<"introdu y:";cin>>y;
cout<<"introdu culoare:";cin>>cul;
}
void patrat::citire(){
punct::citire();
cout<<"introdu latura patrarului:";cin>>l;
}
void punct::des(){putpixel(x,y,cul);}
void patrat::des(){
setcolor(cul);
bar(x-int(l/2),y-int(l/2),x+int(l/2),y+int(l/2));
}
void cerc::citire(){
punct::citire();
cout<<"Introduceti raza cercului:"; cin>>raza;
}
void cerc::des(){
setcolor(cul);
circle(x,y,raza);
}
void figura::citire(){
punct::citire();
cout<<"Introduceti latura patratului:"; cin>>l;
cout<<"Introduceti raza cercului:";
cin>>raza;
}
void figura::des(){
if(l*l>M_PI*raza*raza)
{patrat::des(); cerc::des(); }
else{ cerc::des(); patrat::des();}
punct::des();
}
void main(){
punct *masiv[10];
int i,g,m,n; char c;
cout<<"Introdu numarul figurilor"; cin>>n;
for(i=0;i<n;i++){
cout<<"Tastati"<<endl<<"1-PUNCT"<<endl<<"2-PATRAT";
cout<<endl<<"3-CERC"<<endl<<"4-FIGURA"<<endl;
c=getch();
clrscr();
switch(c) {
case '1': masiv[i]=new punct;break;
case '2': masiv[i]=new patrat;break;
case '3': masiv[i]=new cerc;break;
case '4': masiv[i]=new figura; break;
}

- 186 -

Copie autorizata pentru studenii CFBC

masiv[i]->citire();
}
g=DETECT;
initgraph(&g,&m,"d:\\Tc\\bgi");
for(i=0;i<n;i++) {
cleardevice();
masiv[i]->des();
getch();
}
closegraph();
delete []masiv;
}

14. Programarea generic


Programarea generic este o metod de programare n care funciile i
clasele au parametri formali cu tip nedefinit.
n C++ programarea generic poate fi realizat prin mecanismul
template.
Template-ul (sau clasa parametrizat) implementeaz conceptul de tip
parametrizat. Parametrizarea datelor permite definirea unor clase care conin
tipuri de date nespecificate complet. O clas parametrizat reprezint un
ablon (sau container) ce definete o mulime de clase. Deci, un container este
o colecie de obiecte, n care poate fi accesat un singur obiect nt-un anumit
moment. Obiectivul principal al containerelor este instanierea tipului de date
al obiectelor componente. De exemplu, fie clasa vector care definete un
vector. Pentru a lucra cu un vector de numere complexe va trebui creat o clas
(de exemplu vector_complex), care va fi derivat din clasa vector i din clasa
complex (care definete numerele complexe). Deci, un container definete
operaiile ce se pot efectua asupra unor elemente componente, fr s fie
precizat tipul acestora.
Pentru a defini o clas parametrizat se utilizeaz sintaxa:
template < Lista_de_parametri > Declaratie

unde Lista_de_parametri snt tipuri de date (specificate de cuvntul cheie


class sau typename), iar
Declaratie reprezint declararea sau definirea unei clase sau funcii.

- 187 -

Copie autorizata pentru studenii CFBC

14.1. Funcii template


n cazul cnd se utilizeaz acelai algoritm pentru direrite tipuri de date,
deseori se creaz o funcie template, care are un parametru de tip formal, ce
urmeaz s precizeze tipul ei.
Declararea unei funcii template se realizaez conform sintaxei:
template < class T > T nume_functie
formali)

(lista parametric

unde T reprezint parametrul de tip formal, adic tipul funciei.


Exemple rezolvate
1. S crem un program care va conine o funcie template care va
determina valoarea maximal dintre dou valori.
Realizare:
#include<iostream.h>
template <class T> T maxim(T a,T b){
if(a>b) return a; else return b;}
main(){
cout<<"int : "<<maxim<int>(4,7)<<endl;
cout<<"double : "<<maxim<double>(4.7,2.3)<<endl;
cout<<"char : "<<maxim<char>('c','h')<<endl;
}

n urma execuiei acestui program la consol vor fi afiate urmtoarele


mesaje:
int : 7
double : 4.7
char : h

2. S elaborm un program care va sorta elementele a trei vectori cu


elemente de diferite tipuri.

- 188 -

Copie autorizata pentru studenii CFBC

#include<iostream.h>
template<class T>
void sort(T* vect, int n){
int i,j;
T x;
for(i=1; i<n; i++){
x = *(vect + i);
j = i - 1;
while((j >= 0) && (x < *(vect + j))){
*(vect + j + 1) = *(vect + j); j--;
}
*(vect + j + 1) = x; } }
main(){
int i;
double dv[] = {4.7, 0.66, 7.0, 1,8, 3.0, 12.9};
int iv[] = {10, 9, 5, 3, -2, 4};
char cv[] = {'f', '4', 'h', 'i', 'a', 'c'};
sort(dv,6);
sort(iv,6);
sort(cv,6);
cout<<"Tipul double"<<endl;
for (i=0; i<6; i++)
cout << dv[i] << " ";
cout<<endl<<"Tipul int"<<endl;
for (i=0; i<6; i++) cout << iv[i] << " ";
cout<<endl<<"Tipul char"<<endl;
for (i=0; i<6; i++) cout << cv[i] << " ";
}

n urma execuiei acestui program la consol vor fi afiate urmtoarele


mesaje:
Tipul double
0.66 1 3 4.7 7 8
Tipul int
-2 3 4 5 9 10
Tipul char
4 a c f h i

Compilatorul creeaz cte o funcie de sortare pentru fiecare tip de dat


folosit ca argument de apel.

14.2. Clase template


O clas template specific modul n care pot fi construite clase

- 189 -

Copie autorizata pentru studenii CFBC

individuale, diferite prin tipul sau tipurile de date asupra crore se opereaz.
Prefixul template <class T> specific declararea unui template cu un
argument T. Dup aceast introducere, T este folosit exact la fel ca orice tip de
date, n tot domeniul clasei template declarate.
Numele unei clase template urmat de numele tipurilor de date folosite
ca argumente, ncadrate ntre parantezele < i > este numele unei clase
(definite aa cum specific template-ul) i poate fi folosit la fel ca oricare alt
clas.
Utilizarea template-urilor implic generarea de ctre compilator a
fiecarei clase care corespunde tipului (sau tipurilor) de date folosit la declararea
unui obiect.
Exemplu rezolvat
S elaborm un program care va prelucra elementele unui vector de orice
tip ordinal.
#include<iostream.h>
template <class T> class vector{
public:
T *v,x;
int n;
vector(int c){n=c; v=new T[n];}
void citire();
void afisare();
void sortare();
~vector(){delete []v;}
};
template <class T> void vector<T>::citire(){
for(int i=0;i<n;i++) {
cout<<"Introdu elementul "<<i<<
;
cin>>v[i];
} }
template <class T> void vector<T>::afisare(){
for(int i=0;i<n;i++) cout<<v[i]<<" ";
cout<<endl;
}
template <class T> void vector<T>::sortare(){
int i,j;
for(i=1; i<n; i++) {
x = v[i]; j = i - 1;
while((j >= 0) && (x < v[j])) {
v[j+1] = v[j]; j--;
} v[j+1] = x;
}}
main(){
vector<int> v1(5);

- 190 -

Copie autorizata pentru studenii CFBC

vector<double> v2(5);
vector<char> v3(5);
cout<<" 5 valori int "<<endl;
v1.citire();
cout<<" 5 valori double "<<endl;
v2.citire();
cout<<" 5 valori char "<<endl;
v3.citire();
cout<<"valori citite"<<endl;
v1.afisare();
v2.afisare();
v3.afisare();
cout<<"vectorii sortati"<<endl;
v1.sortare();
v1.afisare();
v2.sortare();
v2.afisare();
v3.sortare();
v3.afisare();
}

n urma execuiei acestui program la consol vor fi afiate urmtoarele


mesaje:
5 valori int
Introdu elementul 0
2
Introdu elementul 1
3
Introdu elementul 2
4
Introdu elementul 3
5
Introdu elementul 4
6
5 valori double
Introdu elementul 0
6.7
Introdu elementul 1
8.3
Introdu elementul 2
2.3
Introdu elementul 3
6.9
Introdu elementul 4
0.34
5 valori char
Introdu elementul 0
w
Introdu elementul 1
4
Introdu elementul 2
f
Introdu elementul 3
g
Introdu elementul 4
y
valori citite
2 3 4 5 6
6.7 8.3 2.3 6.9 0.34
w 4 f g y
vectorii sortati
2 3 4 5 6
0.34 2.3 6.7 6.9 8.3
4 f g w y

- 191 -

Copie autorizata pentru studenii CFBC

Am decis ca n varianta electronic s includ o parte din materialul


publicat n:
Gncu S., Utilizarea abloanelor n limbajul C++, n: Didactica Pro, Nr. 6 (64)
decembrie 2010, p.12-15, [disponibil online]
http://www.prodidactica.md/revista/Revista_64.pdf

Ierarhizarea abloanelor
Prin intermediul abloanelor clasele pot fi ierarhizate. Ierarhizarea se
poate efectua prin dou direcii:
Prin motenire. Atunci cnd o clas transmite parametri sau
funcionalitatea altei clase, care la rndul su, se consider clas de baz pentru
o alt ierarhie de motenire.
Prin agregare. Agregarea este relaia ntre dou obiecte n care unul
dintre obiecte aparine celuilalt obiect. Agregarea red aparena unui obiect la
un alt obiect. Semantic, agregarea indic o relaie de tip "part of" ("parte
din").
Motenirea abloanelor
Clasele template ca i clasele obinuite susin mecanismul de motenire.
Toate principiile de baz ale motenire rmn neschimbate. Astfel se ofer
posibilitatea de a construi modele ierarhice de clase. Fie dat ierarhia:

Problema 3
Se consider drept baz clasa dreptunghi, iar n calitate de derivat
clasa prism. Pentru aceast ierarhie va fi realizat polimorfismul pentru
metodele citire, afisare, suprafata i volum. Se va descrie i constructorii
ambelor clase.

- 192 -

Copie autorizata pentru studenii CFBC

#include<iostream.h>
template <class T> class drept {
public:
T a,b;
drept(){};
drept(T,T);
virtual void citire();
virtual void afisare();
virtual T suprafata();
virtual T volum(){return 0;}//metod virtuala pura
};
template <class T> drept<T>::drept(T x, T y){a=x;b=y;}
template <class T> void drept<T>::citire(){
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
}
template <class T> void drept<T>::afisare(){
cout<<"Dreptunghi lungimile laturilor: "<<a<<" "<<b<<endl;
cout<<"Suprafata: "<<suprafata()<<endl;
}
template <class T> T drept<T>::suprafata(){return a*b;}
template <class T> class prisma : public drept< T> {
public:
T h;
prisma(){};
prisma(T,T,T);
void citire();
void afisare();
T suprafata();
T volum();
};
template <class T> prisma<T>::
prisma(T x,T y,T z):drept<T>(x,y){h=z;}
template <class T> void prisma<T>::citire(){
drept<T>::citire();
cout<<"h=";cin>>h;
}
template <class T> void prisma<T>::afisare(){
cout<<"Prisma lungimile laturilor bazei: ";
cout<<a<<" "<<b<<"Inaltimea: "<<h<<endl;
cout<<"Suprafata: "<<suprafata()<<" Volumul: "<<volum()<<endl;
}
template <class T> T prisma<T>::suprafata(){
return 2*(a*b+a*h+b*h);}
template <class T> T prisma<T>::volum(){
return drept<T>::suprafata()*h;}
int main(){
int i; double st,vt;
drept<int> *p[4];
p[0]=new drept<int>(2,3);

- 193 -

Copie autorizata pentru studenii CFBC

p[1]=new prisma<int>(4,2,7);
p[2]=new drept<int>; p[2]->citire();
p[3]=new prisma<int>;p[3]->citire();
cout<<"Datele introduse de tipul int"<<endl;
for(i=0;i<4;i++) p[i]->afisare();
drept<double> *t[4];
t[0]=new drept<double>(2.5,3);
t[1]=new prisma<double>(4.3,2,7.4);
t[2]=new drept<double>; t[2]->citire();
t[3]=new prisma<double>;t[3]->citire();
cout<<"Datele introduse de tipul double"<<endl;
for(i=0;i<4;i++) t[i]->afisare();
prisma<double> b[3];
cout<<"Dati datele a 3 prisme"<<endl;
for(i=0;i<3;i++)
b[i].citire();
vt=st=0.0;
cout<<"Datele introduse"<<endl;
for(i=0;i<3;i++){ b[i].afisare();
vt+=b[i].volum();
st+=b[i].suprafata();
}
cout<<"Volumul total:="<<vt<<endl;
cout<<"Suprafata totala:="<<st<<endl;
return 0;
}

Ierarhizarea abloanelor prin agregare


Un alt mecanism pentru crearea ierarhiilor de clase, este agregarea.
Aceasta presupune c un obiect este inclus n totalitate ntr-un alt obiect.
Exemple de astfel de ierarhii: lista, coada, arbori, etc. Problema 4 este un
program prin intermediul cruia este creat o stiv.
Problema 4
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
template <class T> class celula{
public:
T elem;
celula *next;
celula(){next=NULL;}
void citire();
void afisare();
};
template <class T> void celula<T>::citire(){cin>>elem;}

- 194 -

Copie autorizata pentru studenii CFBC

template <class T> void celula<T>::afisare(){


cout<<setw(6)<<elem;}
template <class T> class stiva{
public:
celula<T> *curent;
stiva(){curent=NULL;}
void creare();
void parcurge();
void inserare();
void exclude();
~stiva();
};
template <class T> stiva<T>::~stiva(){
while(curent!=NULL) exclude();}
template <class T> void stiva<T>::creare(){
int c;
cout<<"Introdu numarul de elemente din stiva"<<endl;cin>>c;
for(int i=0;i<c;i++) {
if(curent==NULL) {
curent=new celula<T>;
curent->citire();
}else inserare();
}
}
template <class T> void stiva<T>::parcurge(){
celula<T> *p;
p=curent;
while(p!=NULL) {
p->afisare();
p=p->next;
}cout<<endl;
}
template <class T> void stiva<T>::inserare(){
celula<T> *q;
q=new celula<T>;
q->citire(); q->next=curent;
curent=q;
}
template <class T> void stiva<T>::exclude(){
celula<T> *q;
q=curent; curent=curent->next;
delete q;
}
template <class T> void meniu( stiva<T> a){
char c;
a.creare();
clrscr();
do{
cout<<"Alegeti una dintre optiuni:"<<endl;
cout<<"1-Parcurge"<<endl;

- 195 -

Copie autorizata pentru studenii CFBC

cout<<"2-Inserare"<<endl;
cout<<"3-Exclude"<<endl;
cout<<"0-iesire"<<endl;
c=getch();clrscr();
switch(c){
case '1':a.parcurge();getch();break;
case '2':a.inserare();break;
case '3':a.exclude();break;
}clrscr();
}while(c!='0');
}
int main(){
clrscr();
cout<<"Stiva de numere intregi"<<endl;
stiva<int> sn;
meniu(sn);
cout<<"Stiva de caractere"<<endl;
stiva<char> sc;
meniu(sc);
return 0;
}

- 196 -

Copie autorizata pentru studenii CFBC

Cuprins

Prefa..................................................................................................

Capitolul I. Platforma BCB


1. Mediul de dezvoltare integrat BCB...............................................
2. Structura unei aplicaii BCB..........................................................

4
12

3. Aplicaii de consol.......................................................................

15

4. Generaliti....................................................................................

18

5. Clasa TForm............................... ..................................................

20

6. Clasa TButton............................... ................................................ 27


7. Clasa TEdit............................... ....................................................

27

8. Clasa AnsiString............................................................................ 29
9. Clasa TLabel.................................................................................. 31
10. Ferestre pentru afiarea mesajelor...............................................

39

11. Ferestre pentru citirea datelor......................................................

41

12. Aplicaii multiforme. Ferestre modale.........................................

42

13. Butoane i cutii de grupare..........................................................

47

14. Clasa TMemo..............................................................................

51

15. Gestiunea meniurilor...................................................................

55

16. Elemente de grafic.....................................................................

64

17. Cutii de dialog.............................................................................

75

18. Liste de opiuni i casete combinate............................................

82

19. Clasa TStringGrid.................................................................... .... 87


20. Prelucrarea datei calendaristice...................................................

- 197 -

90

Copie autorizata pentru studenii CFBC

21. Prelucrarea fiierelor i cataloagelor...........................................

97

22. Crearea obiectelor n timpul execuiei aplicaiei.........................

104

Capitolul II. Prelucrarea bazelor de date


1. Noiuni generale............................................................................

110

2. Realizarea accesului la date........................................................... 116


3. Alte componente ale paletei Data Controls...................................

123

4. Interogri.......................................................................................

130

5. Rapoarte......................................................................................... 134
6. Tehnologia ADO...........................................................................

138

Capitolul III. Programarea Orientat spre


Obiecte cu C++
1. Preliminarii....................................................................................

148

2. Clase..............................................................................................

149

3. Pointerul *this............................................... .................................

152

4. Funcii inline.................................................................................. 152


5. Constructor....................................................................................

153

6. Destructor......................................................................................

155

7. Funcii prietene..............................................................................

158

8. Alocarea dinamic a obiectelor.....................................................

159

9. Suprancrcarea operatorilor..........................................................
10. Motenirea obiectelor..................................................................

162
169

11. Constructori i destructori n clasele derivate..............................

172

12. Funcii virtuale, clase abstracte i polimorfism...........................

176

13. Motenirea multipl..................................................................... 182


14. Programarea generic.................................................................

- 198 -

187

You might also like