Sunteți pe pagina 1din 11

Ministerul Educaiei al Republicii Moldova Universitatea Tehnic a Moldovei Facultatea Calculatoare, Informatic i Microelectronic Catedra Automatic i Tehnologii Informaionale

RAPORT

Disciplina: Medii interactive de dezvoltare a produselor soft Lucrare de laborator Nr. 1 (a, b, c) Tema: Componentele mediului integrat C++ Builder. Funcii pentru gestionarea timpului ale mediului C++ Builder. Funcii pentru gestionarea resurselor grafice ale mediului C++ Builder

A efectuat : A verificat: lector universitar Boleac Ruslan

Chiinu 2013
1 Obiectivele lucrrii 1. nsuirea modului de utilizare a celor mai importante componente ale mediului integrat C++ Builder. 2. Realizarea unui program simplu care utilizeaz componente de tip TButton, TEdit, Tlabel, RadioButton etc. 3. nsuirea modului de utilizare a componentei VCL TTimer. 4. nsuirea modului de utilizare a funciilor de lucru cu timpul sistem. 5. Realizarea unor aplicaii de gestionare a resursei timp. 6. nsuirea modului de utilizare a componentelor VCL TPaintBox i TPanel. 7. nsuirea modului de utilizare a principalelor funcii grafice ale mediului C++ Builder. 8. Realizarea unor elemente pentru afiarea grafic a informaiei. 2 Consideraii teoretice Spre deosebire de Borland C++ clasic, n Borland C++ Builder se scriu programe sub Windows, folosindu-se anumite componente specifice Windows-ului. Programele astfel concepute trebuie s rspund anumitor evenimente (apsarea unei taste, un click de mouse etc.) Aciunile utilizatorului sunt efectuate asupra unor obiecte care sunt caracterizate prin anumite proprieti (culoare, mrime etc.) Evident c nu orice obiect poate rspunde la orice eveniment i difer de altele prin diferite proprieti. Programele sub windows utilizeaz biblioteci speciale de subprograme numite DLL-uri (dynamic-link library). Acestea includ elementele de interfa utilizate (subprograme care se apeleaz de fiecare dat cnd este nevoie de ele). Executnd click pe butonul run aflat pe bara de comenzi rapide sau F9 se comand compilarea i execuia programului. Obiectele (componentele) aplicaiei se adaug n formulare. O aplicaie poate conine unul sau mai multe formulare. Colecia de componente se gsete pe Paleta de componente. Un obiect are anumite proprieti, valorile acestora putnd fi stabilite utiliznd inspectorul de obiecte. De exemplu, pentru formular (care este i el un obiect) se poate stabili textul din bara de titlu utiliznd proprietatea Caption. Dezvoltarea rapid a aplicaiilor nseamn suport pentru propietile, metodele i evenimentele obiectelor (PME). Propietile permit setarea uoar a caracteristicilor componentelor. Metodele execut aciuni asupra obiectelor. Evenimentele permit ca aplicaia s rspund la mesajele Windows, sau la schimbri de stare a obiectelor. Folosirea modelului PME furnizeaz un robust i intuitiv mediu de dezvoltare pentru aplicaiile Windows.
2

Utilizarea componentei TTimer Componenta TTimer se gsete n Component Palette (pagina System). Obiectul de acest tip permite execuia n cadrul aplicaiei a unor funcii la intervale specificate. n context Windows obiectul TTimer lanseaz ctre aplicaie mesaje la intervale prestabilite. Gestionarea timpului Prototipurile funciilor de gestionare a timpului sistem se gsesc in header-ele dos.h, time.h , vcl\sysdefs.h. Precizrile urmtoare se refer la header-ul dos.h., n care se gsesc prototipurile urmatoarelor funcii ce permit gestionarea resursei timp: void getdate(struct date *datep) void gettime(struct time *timep) void setdate(struct date *datep) void settime(struct time *timep) n care: *datep si *timep sunt pointeri la structurile struct date si struct time. Utilizarea componentei TPaintBox Componenta TPaintBox se gsete n Component Palette (pagina System). Obiectul de acest tip furnizeaz o component TCanvas care permite desenarea n interiorul unui dreptunghi, prevenind depirea marginilor acestuia. Utilizarea componentei TPanel Componenta TPanel se gsete n Component Palette (pagina Standard) . Obiectul de acest tip poate fi utilizat pentru desenare dac pe el se amplaseaz o component TPaintBox. 3 Elaborarea aplicaiilor 3.1 Se vor utiliza urmtoarele obiecte (n afara formei): dou butoane (Button 1 i 2) pentru incrementarea (UP) respectiv decrementarea (DOWN) a unei variabile ntregi i ; un buton (Button 3) pentru iesirea din program (Exit); o caset de editare (Edit1) unde se va afia valoarea variabilei i;

- dou etichete (Label1 i 2) pentru afiarea textului Incrementare decrementare contor. Respectiv a sensului de variaie a variabilei i din caseta Edit1; - n caption-ul formei se va afia textul MIDPS 1- A; - fiecare obiect va avea hint-ul activ completat corespunztor .
3

Realizarea sarcinii Declaram variabila nr de tip intreg, cu valoarea initiala egala cu zero. Aceasta variabila va fi incrementata sau decrementata in dependenta de butonul apasat pe forma. Am definit un sir de caractere s cu dimensiunea maxima egala cu 10.
int nr = 0; char s[10];

Am scris o functie inscrieValoare() care realizeaza convertirea numarului care trebuie afisat din tipul intreg in sir de caractere. Pentru convertire am utilizat functia itoa care are 3 parametri : variabila de tip intreg care trebuie convertita, variabila sir in care se inscrie sirul si baza numarului care urmeaza sa fie convertit. Dupa convertire, textul din sirul s se inscrie in componenta Edit1 din Form1.
void inscrieValoarea() { itoa(nr, s, 10); Form1->Edit1->Text = s; }

Am definit evenimentul pentru apasarea butonului Exit. La apasarea butonului se realizeaza iesirea din executia programului, prin apelarea functiei Close() .
void __fastcall TForm1::Button3Click(TObject *Sender) { Close(); }

Definim evenimentul pentru butonul Incrementeaza. La apasarea butonului se realizeaza incrementarea variabilei nr apoi se apeleaza functia inscrieVariabila() pentru convertirea noii valori a lui nr in sir de caractere si afisarea lui.
void __fastcall TForm1::Button1Click(TObject *Sender) { ++nr; inscrieValoarea(); }

Definim evenimentul pentru butonul Decrementeaza. La apasarea butonului se realizeaza decrementarea variabilei nr apoi se apeleaza functia inscrieVariabila() pentru convertirea noii valori a lui nr in sir de caractere si afisarea lui.
void __fastcall TForm1::Button2Click(TObject *Sender) { 4

--nr; inscrieValoarea(); }

Rezultatul programului

3.2 Se elaboreaz un program pentru realizarea unui cronometru. Se vor utiliza urmtoarele obiecte, evideniate n figura 4.2: o form (Form1) pe care sunt dispuse celelalte obiecte i n Caption-ul creia se va afia textul

MIDPS; patru butoane (Button 1, 2, 3 , 4) cu urmtoarele funcii: Button1 pornirea cronometrului( Caption Start); Button2 oprirea cronometrului( Caption Stop); Button3 iniializarea cronometrului( Caption Zero); Button4 ieirea din program (Caption Exit).

dou timere (Timer1 i Timer2) cu urmtoarele funcii Timer1 (Interval=1000 ms) utilizat la afiarea timpului curent; Timer2 (Interval=100 ms) utilizat pentru cronometru;

dou casete de editare (Edit1 si Edit2) utilizate pentru :


5

Edit1 - afisarea datei si orei curente; Edit2 - afiarea timpului cronometrat;

dou etichete (Label1 si Label2) cu Caption-ul conform figurii 2.4 Observaii: din primele trei butoane, la un un moment dat va fi activ unul singur;

fiecare obiect va avea hint-ul activ completat corespunztor; Realizarea sarcinii Am definit variabilele min, sec si zec de tip int, utilizate pentru afisarea intervalului de timp al

timer-ului(minute, secunde, zecimi de secunda).


int min, sec, zec;

La primul timer, care va afisa data si ora am folosit structurile struct date si struct time, predefinite in biblioteca dos.h. Am definit un sir de caractere de dimensiune maximala 25. Utilizam functiile getdate si gettime pentru aflarea datei si orei de la sistem, iar ca parametri indicam adresele unde vor fi pastrate aceste valori. Pentru inscrierea datei si orei intr-un sir de caractere, care mai apoi va fi afisat se utilizeaza functia sprintf. Ca parametri se indica sirul in care se vor inscrie valorile, apoi se realizeaza formatarea valorilor pentru afisare(introducerea a cel putin 2 valori, completarea spatiilor cu zerouri, tipul valorilor), apoi se utilizeaza campurile structurilor pentru inscrierea datei si orei. Apoi sirul obtinut se inscrie in Edit1.
void __fastcall TForm1::Timer1Timer(TObject *Sender) { static struct date d; static struct time t; char s[25]; getdate(&d); gettime(&t); sprintf(s, "%02d-%02d-%04d %02d:%02d:%02d", d.da_day, d.da_mon, d.da_year, t.ti_hour, t.ti_min, t.ti_sec); Edit1->Text = s; }

Pentru timer-ul al doilea am utilizat trei instructiuni de decizie care verifica valorile variabelelor ce se incrementeaza astfel ca la atingerea valorii 10 a variabilei zec se incrementeaza valoarea sec, iar cand aceasta ajunge la valoarea 60 se incrementeaza variabila min.
void __fastcall TForm1::Timer2Timer(TObject *Sender) { 6

char s[25]; ++zec; if (zec == 10) { ++sec; zec = 0; } if (sec == 60) { ++min; sec = 0; } sprintf(s, "%02d min %02d sec %d zec", min, sec, zec); Edit2->Text = s; }

Initial, timerul nu este pornit, deci butonul stop este inactiv, iar celelate sunt active.
void __fastcall TForm1::Button2Click(TObject *Sender) { Timer2->Enabled = false; Button1->Enabled = true; Button2->Enabled = false; Button3->Enabled = true; }

Apoi, daca a fost pornit timerul, toate butoanele se dezactiveaza, cu excceptia butonului stop.
void __fastcall TForm1::Button1Click(TObject *Sender) { Timer2->Enabled = true; Button1->Enabled = false; Button2->Enabled = true; Button3->Enabled = false; }

La apasarea butonului ZERO se anuleaza toate valorile timerului, adica valorile variabelelor mis, sec si zec se egaleaza cu zero.
void __fastcall TForm1::Button3Click(TObject *Sender) { min = sec = zec = 0; Edit2->Text = "00 min 00 sec 0 zec"; }

Am definit evenimentul pentru apasarea butonului Exit. La apasarea butonului se realizeaza iesirea din executia programului, prin apelarea functiei Close() .
7

void __fastcall TForm1::Button4Click(TObject *Sender) { Close(); }

Rezultatele programului

3.3 Sa se reprezinte graficul unei functii utilizand componenta paintBox. Realizarea sarcinii Definim coordonatele minime si maxime ale ferestrei si portii. Am definit un tablou care contine pointeri la 3 functii.
double xfmin, yfmin, xfmax, yfmax; int xpmin, ypmin, xpmax, ypmax, nseg = 1000; double (*func[3])(double), (*f)(double);

Definim cele trei functii globale caror grafice vor putea fi vizualizate : x^2, x^3 si sin(x) ;
double f1(double x) { return x * x; } double f2(double x) { return x * x * x; } double f3(double x) { return sin(x); } 8

Efectuam transformarea fereastra poarta, pentru a trece de la coordonate logice la coordonate ecran.
// Transformarea fereastra-poarta int xp(double xf) { return xpmin + (xf - xfmin) / (xfmax - xfmin) * (xpmax - xpmin); } int yp(double yf) { return ypmax - (yf - yfmin) / (yfmax - yfmin) * (ypmax - ypmin); }

Scriem o functie plot() pentru desenarea graficului la ecran.


void plot() { double xf;

Definim coordonatele poarta minime si maxime, in pixeli.


xpmin = 0; ypmin = 0; xpmax = Form1->PaintBox1->Width; ypmax = Form1->PaintBox1->Height;

Stabilim culoarea de desenare a axelor.


Form1->PaintBox1->Repaint(); Form1->PaintBox1->Canvas->Pen->Color = 0x00ff0000;

Verificam daca axele X si Y se afla pe ecran. Daca ele sunt pe ecran se deseneaza, in caz contrar nu.
if (xfmin < 0 && xfmax > 0) { Form1->PaintBox1->Canvas->MoveTo(xp(0), ypmin); Form1->PaintBox1->Canvas->LineTo(xp(0), ypmax); } if (yfmin < 0 && yfmax > 0) { Form1->PaintBox1->Canvas->MoveTo(xpmin, yp(0)); Form1->PaintBox1->Canvas->LineTo(xpmax, yp(0)); }

Stabilim culoarea de desenare a graficului functiei si intr-un ciclu , prin segmete, desenam insasi graficul finctiei.
Form1->PaintBox1->Canvas->Pen->Color = 0x000000ff; Form1->PaintBox1->Canvas->MoveTo(xp(xfmin), yp(f(xfmin))); for (int i=1; i<=nseg; i++) { xf = xfmin + i * ((xfmax - xfmin) / nseg); 9

Form1->PaintBox1->Canvas->LineTo(xp(xf), yp(f(xf))); }

Stabilim conditiile de minimalitate si maxim pentru coordonatele minime si maxime ale ferestrei, astefel coordonata minima nu poate fi mai mare decat coordonata maxima si invers.
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender) { if (CSpinEdit1->Value >= CSpinEdit2->Value) CSpinEdit1->Value = CSpinEdit2>Value - 1; xfmin = CSpinEdit1->Value; plot(); } void __fastcall TForm1::CSpinEdit2Change(TObject *Sender) { if (CSpinEdit1->Value >= CSpinEdit2->Value) CSpinEdit2->Value = CSpinEdit1>Value + 1; xfmax = CSpinEdit2->Value; plot(); } void __fastcall TForm1::CSpinEdit3Change(TObject *Sender) { if (CSpinEdit3->Value >= CSpinEdit4->Value) CSpinEdit3->Value = CSpinEdit4>Value - 1; yfmin = CSpinEdit3->Value; plot(); } void __fastcall TForm1::CSpinEdit4Change(TObject *Sender) { if (CSpinEdit3->Value >= CSpinEdit4->Value) CSpinEdit4->Value = CSpinEdit3>Value + 1; yfmax = CSpinEdit4->Value; plot(); }

Definim valorile initiale pentru cooronatele minime si maxime ale ferestrei. Pentru fiecare componenta a vectorului specificam cate o functie.
void __fastcall TForm1::FormCreate(TObject *Sender) { xfmin = -8; yfmin = -12; 10

xfmax = 8; yfmax = 25; func[0] = f1; func[1] = f2; func[2] = f3; f = f1; }

Specificam functia pentru care se va desena graficul, prin selectarea acesteia din ListBox1.
void __fastcall TForm1::ListBox1Click(TObject *Sender) { f = func[ListBox1->ItemIndex]; plot(); }

Rezultatul programului

Concluzii La aceast lucrare de laborator am studiat componentele de baz ale mediului C++ Builder, proprieti, metode i evenimente. Am elaborat o aplicaie care utilizeaz noiunile, componentele studiate. Programarea vizual n C++ Builder ajut la crearea rapid a aplicaiilor cu o interfa grafic cu utilizator prietenoas.

11