Lucare de laborator nr 1 MIDPS

15
Ministerul Educației al Republicii Moldova Universitatea Tehnică a Moldovei Facultatea Calculatoare, Informatică și Microelectronică Catedra Automatică și Tehnologii Informaționale RAPORT Disciplina: Medii interactive de dezvoltare a produselor soft Lucrare de laborator Nr. 1 (a, b, c) Tema: Componentele mediului integrat C++ Builder. Funcții pentru gestionarea timpului ale mediului C+ + Builder. Funcții pentru gestionarea resurselor grafice ale mediului C++ Builder A efectuat : A verificat:

description

Lucrare de laborator MIDPS

Transcript of Lucare de laborator nr 1 MIDPS

Page 1: Lucare de laborator nr 1 MIDPS

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică

Catedra Automatică și Tehnologii Informaționale

RAPORT

Disciplina: Medii interactive de dezvoltare a produselor soft

Lucrare de laborator Nr. 1 (a, b, c)

Tema: Componentele mediului integrat C++ Builder. Funcții pentru gestionarea timpului ale mediului C++ Builder. Funcții pentru gestionarea

resurselor grafice ale mediului C++ Builder

A efectuat :

A verificat: lector universitar Boleac Ruslan

Chișinău 2013

Page 2: Lucare de laborator nr 1 MIDPS

1 Obiectivele lucrării

1. Însuşirea 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. Însuşirea modului de utilizare a componentei VCL TTimer.

4. Însuşirea modului de utilizare a funcţiilor de lucru cu timpul sistem.

5. Realizarea unor aplicaţii de gestionare a resursei timp.

6. Însuşirea modului de utilizare a componentelor VCL TPaintBox şi TPanel.

7. Însuşirea modului de utilizare a principalelor funcţii grafice ale mediului C++ Builder.

8. Realizarea unor elemente pentru afişarea grafică a informaţiei.

2 Considerații 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ă

răspundă anumitor evenimente (apăsarea unei taste, un click de mouse etc.) Acțiunile utilizatorului

sunt efectuate asupra unor obiecte care sunt caracterizate prin anumite proprietăți (culoare, mărime

etc.) Evident că nu orice obiect poate răspunde la orice eveniment și diferă de altele prin diferite

proprietăți.

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ă când este nevoie de ele).

Executând click pe butonul run aflat pe bara de comenzi rapide sau F9 se comandă compilarea și

execuția programului.

Obiectele (componentele) aplicației se adaugă în formulare. O aplicație poate conține unul sau

mai multe formulare. Colecția de componente se găsește pe Paleta de componente.

Un obiect are anumite proprietăți, valorile acestora putând fi stabilite utilizând inspectorul de

obiecte. De exemplu, pentru formular (care este și el un obiect) se poate stabili textul din bara de titlu

utilizând proprietatea Caption.

Dezvoltarea rapidă a aplicaţiilor înseamnă suport pentru propietăţile, metodele şi evenimentele

obiectelor (PME). Propietăţile permit setarea uşoară a caracteristicilor componentelor. Metodele

execută acţiuni asupra obiectelor. Evenimentele permit ca aplicaţia să răspundă la mesajele Windows,

sau la schimbări de stare a obiectelor. Folosirea modelului PME furnizează un robust şi intuitiv mediu

de dezvoltare pentru aplicaţiile Windows.

2

Page 3: Lucare de laborator nr 1 MIDPS

Utilizarea componentei TTimer

Componenta TTimer se găseşte în Component Palette (pagina System).

Obiectul de acest tip permite execuţia în cadrul aplicaţiei a unor funcţii la intervale specificate.

În context Windows obiectul TTimer lansează către aplicaţie mesaje la intervale prestabilite.

Gestionarea timpului

Prototipurile funcţiilor de gestionare a timpului sistem se găsesc in header-ele dos.h, time.h , vcl\

sysdefs.h. Precizările următoare se referă la header-ul dos.h., în care se găsesc prototipurile

urmatoarelor funcţii 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 găseşte în Component Palette (pagina System). Obiectul de acest tip

furnizează o componentă TCanvas care permite desenarea în interiorul unui dreptunghi, prevenind

depăşirea marginilor acestuia.

Utilizarea componentei TPanel

Componenta TPanel se găseşte în Component Palette (pagina Standard) . Obiectul de acest tip

poate fi utilizat pentru desenare dacă pe el se amplasează o componentă TPaintBox.

3 Elaborarea aplicațiilor

3.1 Se vor utiliza următoarele 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 afişa valoarea variabilei i;

- două etichete (Label1 şi 2) pentru afişarea textului „Incrementare decrementare contor.”

Respectiv a sensului de variaţie a variabilei i din caseta Edit1;

- în caption-ul formei se va afişa textul „ MIDPS 1- A”;

- fiecare obiect va avea hint-ul activ completat corespunzător .

3

Page 4: Lucare de laborator nr 1 MIDPS

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

Page 5: Lucare de laborator nr 1 MIDPS

--nr;

inscrieValoarea();

}

Rezultatul programului

3.2 Se elaborează un program pentru realizarea unui cronometru.

Se vor utiliza următoarele obiecte, evidenţiate în figura 4.2:

- o formă (Form1) pe care sunt dispuse celelalte obiecte şi în Caption-ul căreia se va afişa textul

„MIDPS”;

- patru butoane (Button 1, 2, 3 , 4) cu următoarele funcţii:

Button1 – pornirea cronometrului( Caption Start);

Button2 – oprirea cronometrului( Caption Stop);

Button3 – iniţializarea cronometrului( Caption Zero);

Button4 – ieşirea din program (Caption Exit).

- două timere (Timer1 şi Timer2) cu următoarele funcţii

Timer1 (Interval=1000 ms) utilizat la afişarea timpului curent;

Timer2 (Interval=100 ms) utilizat pentru cronometru;

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

5

Page 6: Lucare de laborator nr 1 MIDPS

Edit1 - afisarea datei si orei curente;

Edit2 - afişarea timpului cronometrat;

- două etichete (Label1 si Label2) cu Caption-ul conform figurii 2.4

Observaţii:

- din primele trei butoane, la un un moment dat va fi activ unul singur;

- fiecare obiect va avea hint-ul activ completat corespunzător;

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

Page 7: Lucare de laborator nr 1 MIDPS

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

Page 8: Lucare de laborator nr 1 MIDPS

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

Page 9: Lucare de laborator nr 1 MIDPS

}

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

9

Page 10: Lucare de laborator nr 1 MIDPS

xf = xfmin + i * ((xfmax - xfmin) / nseg);

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;

10

Page 11: Lucare de laborator nr 1 MIDPS

yfmin = -12;

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,

proprietăți, metode și evenimente. Am elaborat o aplicație care utilizează noțiunile, componentele

studiate. Programarea vizuală în C++ Builder ajută la crearea rapidă a aplicațiilor cu o interfață grafică

cu utilizator prietenoasă.

11