Limbajul C++ si oop abc-doar


o tabela de raspuns,la fel ca pentru orice alt eveniment.Functia de ras-



Yüklə 1,36 Mb.
səhifə11/18
tarix12.09.2018
ölçüsü1,36 Mb.
#81721
1   ...   7   8   9   10   11   12   13   14   ...   18

o tabela de raspuns,la fel ca pentru orice alt eveniment.Functia de ras-

puns este declansata la aparitia mesajului WM_COMMAND + ID_BUTTON.La fie-

care apasara de buton,Windows emite automat cele doua mesaje.


-68-

In exemplu,apasarea butonului genereaza un mesaj de raspuns si executa

o operatie grafica de umplere a unei suprafete,folosind un obiect de tip

TBrush.In constructor,valorile numerice specifica pozitia si dimensiuni-

le butonului.Pentru detalii,studiati fila .

Pentru a va simplifica munca de programare,este bine sa extrageti din

filele header obiectele cu care lucrati frecvent,impreuna cu definitia

constructorilor si metodele pe care le utilizati frecvent.Este bine sa

aveti si o schita de ansamblu cu arborele genealogic al tuturot obiectelor

OWL,pentru a urmarii cat mai usor metodele mostenite de la ancestori.

(copiati schita de pe Internet,sau desenati o schita proprie).

Un alt element de interfata,extrem de comun,este textul static(TStatic).

Se utilizeaza pentru a introduce diverse etichete explicative.Este definit

in fila

EXEMPLU: (vezi si OWL_ABC / owl7 )

Deschideti un proiect nou si complectati fila .cpp astfel:

#include

#include

#include

#include

const uint16 ID_STATIC1 = 101;

const uint16 ID_STATIC2 = 102;

const uint16 ID_STATIC3 = 103;

class Fer1 : public TWindow {

public:

Fer1(); };

Fer1::Fer1():TWindow(0,0,0) {

new TStatic(this,ID_STATIC1,"Text static 1 (eticheta)",50,50,250,20);

new TStatic(this,ID_STATIC2,"Al doilea text static" ,50,100,250,50,50);

new TStatic(this,ID_STATIC3,"Eticheta cea mai lata",50,200,250,100,50);

};

class Aplicatie1 : public TApplication {

public:

Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{

MainWindow = new TFrameWindow(0,"Test",new Fer1);

};

int OwlMain(int,char* [])

{

return Aplicatie1().Run();

};

Codul intern de identificare a elementului (ID_STATIC) se utilizeaza doar

pentru a putea identifica automat elementul de interfata dorit.Daca nu

va fi necesar in program,se poate utiliza orice valoare numerica int (-1).

Valorile numerice din constructor descriu pozitia si dimensiunile.

In toate exemplele am pastrat si fila pentru ca sa fie cat

mai usor de transformat.Toate filele header standard au conditii de pre-

compilare astfel concepute incat sa nu se incarce de doua ori in memorie.

Puteti transforma exemplele dupa bunul plac.Restul filelor header va atrag

doar atentia asupra filelor sursa in care sunt definite obiectele.


-69-

Un alt element de interfata este butonul CheckBox.Este definit in fila

si este format dintr-un buton de selectie si un element

static de tip text.Se utilizeaza pentru a selecta sau pentru a seta un

grup de date sau de valori,sau pentru a declansa un set de operatii.

EXEMPLU: ( vezi si OWL_ABC / owl8 )

Deschideti un nou proiect si editati fila .cpp astfel:

#include

#include

#include

#include

const uint16 ID_CHECKBOX1 = 101;

const uint16 ID_CHECKBOX2 = 102;

class Fer1 : public TWindow {

public: Fer1();

protected:

void HandleCheckBox1Msg();

void HandleCheckBox2Msg();

TCheckBox* CB1;

TCheckBox* CB2;

DECLARE_RESPONSE_TABLE(Fer1); };

DEFINE_RESPONSE_TABLE1(Fer1,TWindow)

EV_COMMAND(ID_CHECKBOX1,HandleCheckBox1Msg),

EV_COMMAND(ID_CHECKBOX2,HandleCheckBox2Msg),

END_RESPONSE_TABLE;

Fer1::Fer1():TWindow(0,0,0) {

CB1=new TCheckBox(this,ID_CHECKBOX1,"Control 1",50,50,150,20,0);

CB2=new TCheckBox(this,ID_CHECKBOX2,"Control 2",50,100,150,20,0);

void Fer1::HandleCheckBox1Msg()

{ if (CB1->GetCheck() == BF_CHECKED)

MessageBox("Control 1 = SELECTAT","text:",MB_OK);

else

MessageBox("Control 1 = Neselectat","text:",MB_OK); };

void Fer1::HandleCheckBox2Msg()

{ if (CB2->GetCheck() == BF_CHECKED)

MessageBox("Control 2 = SELECTAT","text:",MB_OK);

else

MessageBox("Control 2 = Neselectat","text:",MB_OK); };

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1::InitMainWindow()

{

MainWindow = new TFrameWindow(0,"Test",new Fer1);

};

int OwlMain(int,char* [])

{

return Aplicatie1().Run();

};

Observati ca cele doua controale pot fi apelate prin pointeri (CB1 si CB2)

iar cu ajutorul operatorului -> (selectia membrului dintr-un pointer) se

pot apela metodele obiectului pointat.


-70-

Un alt tip de buton,este butonul "radio",definit in fila "radiobut.h".

Este asemanator cu butonul "checkbox",dar,atunci cand exista mai multe

butoane radio incluse in acelasi spatiu de vizibilitate(in acelasi obiect)

selectarea unuia dintre butoane le deselecteaza automat pe celelalte.

EXEMPLU: (vezi si OWL_ABC / owl9)

#include

#include

#include

#include

const uint16 ID_RADIOB1 = 101;

const uint16 ID_RADIOB2 = 102;

class Fer1 : public TWindow {

public: Fer1();

protected:

void HandleRadioB1Msg();

void HandleRadioB2Msg();

TRadioButton* RB1;

TRadioButton* RB2;

DECLARE_RESPONSE_TABLE(Fer1); };

DEFINE_RESPONSE_TABLE(Fer1,TWindow)

EV_COMMAND(ID_RADIOB1,HandleRadioB1Msg),

EV_COMMAND(ID_RADIOB2,HandleRadioB2Msg),

END_RESPONSE_TABLE;

Fer1::Fer1():TWindow(0,0,0) {

RB1=new TRadioButton(this,ID_RADIOB1,"Radio 1",50,50,150,20,0);

RB2=new TRadioButton(this,ID_RADIOB2,"Radio 2",50,100,150,20,0); };

void Fer1::HandleRadioB1Msg()

{

MessageBox("Butonul Radio 2","text:",MB_OK); };

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow();

};

void Aplicatie1::InitMainWindow()

{

MainWindow = new TFrameWindow(0,"Test",new Fer1);

};

int OwlMain(int,char* [])

{

return Aplicatie1().Run();

};

Compilati,construiti,link-ati si apoi executati aplicatia.Pentru a selecta

un buton,executati un click de mouse,in orice loc din aria butonului.

Observati ca selectarea unui buton,deselecteaza automat celalat buton

(in cazul in care era selectat anterior).Prin urmare,acest gen de butoane

se poate utiliza atunci cand se doreste selectia unei singure optiuni,

dintr-un grup oarecare de optiuni.Pentru a forma mai multe grupuri de

optiuni,care sa nu se excluda reciproc,trebuie ca fiecare grup de butoane

sa fie inclus intr-un obiect distinct.Pentru acest scop,se poate utiliza

un obiect simplu,denumit "groupbox" si definit in fila "groupbox.h".

Obiectul groupbox,limiteaza spatiul de vizibilitate si asigura si cateva


-71-

metode auxiliare (GetText(),SetText(),GetNotifyParent() etc.).

EXEMPLU: (vezi si OWL_ABC / owl10)

deschideti un nou proiect si editati fila .cpp:

#include

#include

#include

#include

#include

const uint ID_RADIOB1 = 101;

const uint ID_RADIOB2 = 102;

const uint ID_GROUPBOX = 103;

class Fer1() : public TWindow {

public: Fer1();

protected:

void HandleGroupBoxMsg(uint);

TRadioButton* RB1;

TRadioButton* RB2;

TGroupBox* Grup1;

DECLARE_RESPONSE_TABLE1(Fer1); };

DEFINE_RESPONSE_TABLE(Fer1); };

EV_CHILD_NOTIFY_ALL_CODES(ID_GROUPBOX,HandleGroupBoxMsg),

END_RESPONSE_TABLE;

Fer1::Fer1():TWindow(0,0,0) {

Grup1=new TGroupBox(this,ID_GROUPBOX,"Grup 1",20,20,200,200);

RB1=new TRadioButton(this,ID_RADIOB1,"Radio 1",50,50,150,20,Grup1);

RB2=new TRadioButton(this,ID_RADIOB2,"Radio 2",50,100,150,20,Grup1); };

void Fer1::HandleGroupBoxMsg(uint)

{

if( RB1->GetCheck() == BF_CHECKED)

MessageBox("Butonul Radio 1 este SELECTAT","text:",MB_OK);

if( RB2->GetCheck() == BF_CHECKED)

MessageBox("Butonul Radio 2 este SELECTAT","text:",MB_OK); };

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow();

};

void Aplicatie1::InitMainWindow()

{

MainWindow = new TFrameWindow(0,"Test",new Fer1);

};

int OwlMain(int,char* [])

{

return Aplicatie1().Run();

}

Compilati,construiti,link-ati si apoi executati aplicatia.In acest caz,

cele doua butoane radio vor fi incluse in caseta denumita "Grup1".Se pot

introduce in fereastra "Fer1" mai multe astfel de grupuri de optiuni,

astfel incat fiecare grup sa fie independent de celelalte.Observati cele

doua modificari din program: 1.constructorul celor doua butoane radio are

ca ultim paramteru obiectul care le contine(Grup1) si 2. tabela de raspuns

utilizeaza comanda CHILD_NOTIFY_ALL_CODES pentru a prelua mesajele de la


-72-

obiectul din interior(obiectul "child") in loc de a prelua mesajele de la

fereastra principala.Prin acest tip de compartimentare,mesajele fiecarui

grup de butoane nu pot corupe mesajele unui alt grup.Compartimentarea se

poate face utilizand orice alt tip de obiecte(de exemplu:doua ferestre

diferite) dar volumul de memorie ocupata per obiect va fi mult mai mare.

Un obiect asemanator este "checklist" definit in fila "checklst.h".

Obiectul permite selectarea unei optiuni,sau a unui anumit grup de optiuni

dintr-o lista.Se utilizeaza pentru a realiza combinatii complexe intre

mai multe grupuri de optiuni sau elemente distincte.

EXEMPLU: (vezi si OWL_ABC /owl11 )

deschideti un proiect nou si completati fila .cpp astfel:

#include

#include

#include

#include

#include

const uint16 ID_CHECKLIST = 201;

class Fer1 : public TWindow {

public: Fer1();

protected: bool CanClose();

TCheckList* Lista;

TCheckListItem* Items; };

Fer1::Fer1():TWindow(0,0,0) {

Items= new TCheckListItem[4];

Items[0].SetText("Primul element din lista");

Items[1].SetText("Al doilea element din lista");

Items[2].SetText("Al treilea element din lista");

Items[3].SetText("Ultimul element din lista");

Items[0].Toggle();

Items[1].SetIndeterminate();

Items[2].SetThreeStates(true);

Lista=new TCheckList(this,ID_CHECKLIST,40,40,400,200,Items,4); };

bool Fer1::CanClose() {

char tampon[400];

char text[40];

tampon[0]=0;

for (int i=0;i<4;i++) {

if (Items[i].IsChecked() || Items[i].IsIndeterminate())

{ Items[i].GetText(text,40);

strcat(tampon,text);

strcat(tampon,"\r\n"); }}

MessageBox(tampon,"Elementele selectate sunt: ",MB_OK);

return TRUE; };

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication(){};

void InitmainWindow(); };

void Aplicatie1::InitMainWindow()

{ MainWindow = new TFrameWindow(0,"test",new Fer1); };

int OwlMain(int,char* [])

{ return Aplicatie1().Run(); }

Compilati,construiti si link-ati (eventual cu F7).


-73-

Observati ca fiecare element din lista este la randul sau un obiect de

tip TCheckListItem.Deschideti fila si observati definitia

celor doua clase.

In constructorul ferestrei am declarat la inceput un obiect de tip

TCheckListItem si am initializat obiectul cu o serie de valori de tip

text,pentru fiecare element.Apoi am apelat cate o metoda(Toggle()...etc.)

pentru a determina aspectul casutei de selectie) si in final am utilizat

operatorul "new" pentru a construi un obiect din tipul TCheckList,la care

am utilizat in constructor obiectul TCheckListItem declarat anterior.

Fiecare element are o casuta de selectie,care poate avea trei aspecte

diferite(selectata,neselectata sau indeterminata=colorata in gri).Pentru

a seta automat casuta se pot utiliza cele trei metode ale obiectului de

tip TCheckListItem(Toggle(),SetIndeterminate() si SetThreeStates() ).

Un alt element nou in program este faptul ca nu am utilizat o tabela

de raspuns prin care sa se contabilizeze fiecare mesaj din fereastra,ci

am utilizat metoda CanClose(),prin care se va efectua doar bilantul final

al evenimentelor din fereastra inainte de inchiderea aplicatiei.

Pentru metoda CanClose() au utilizat o bucla iterativa in care se

verifica starea fiecarui element si se arhiveaza starea acestuia intr-un

tampon temporar de memorie de tip caracter.In final,tamponul de memorie

este afisat intr-o fereastra de tip MassageBox,pentru a semnala elementele

din lista care au fost selectate.

Obiectul de tip TCheckList contine si el o serie de metode proprii,

dintre care cele mai valoroase sunt: EvLButtonDown,EvChar si Update().

Cu ajutorul acestui tip de obiect se pot realiza conexiuni si interactiuni

complexe.Fiecare element din lista poate declansa o anumita actiune,sau

se pot realiza diverse combinatii,prin care doar o anumita combinatie de

elemente selectate sa determine o operatie oarecare.Mai mult,se pot uti-

liza in paralele mai multe obiecte de tip TCheckList,de la care se pot

utiliza si combina una sau mai multe combinatii de optiuni.

Pe masura ca aplicatia incepe sa contina tot mai multe obiecte dis-

tincte,este tot mai greu sa urmariti filiatia fiecarui obiect.Pentru o

orientare rapida se poate utiliza diagrama oferita de meniul View/Classes.

Un alt element extrem de important il reprezinta spatiul de vizibilitate

al fiecarui obiect din interfata.Atunci cand exista un singur obiect,

totul este extrem de simplu.Cand exista mai multe obiecte,este posibil sa

apara interferente intre obiecte,datorita faptului ca un anumit mesaj

Windows poate fi exploatat de catre mai multe obiecte concurente.Pentru

a evita astfel de situatii,trebuie sa alegeti cu atentie tipul de mesaj

care va fi exploatat de catre fiecare obiect in parte,sau sa izolati

obiectele care utilizeaza acelasi mesaj in compartimente diferite.De

obiecei,interferentele apar intre obiectele care utilizeaza un mesaj

extrem de comun(gen WM_ACTIVATE,WM_COMMAND,WM_LBUTTONDOWN etc.).

Pentru a evita orice gen de neplaceri,este bine sa utilizati cat mai

frecvent cate o tabela de raspunsuri,in care pentru fiecare comanda de

identificare se atribuie o anumita functie da raspuns.Se vor evita astfel

situatiile in care mesajele sunt corupte,sunt preluate sau exploatate de

catre alt obiect din interfata sau declanseaza raspunsuri multiple.

Pentru situatiile complexe,sau pentru depanarea unor aplicatii,se poate

desena o "harta de evenimente",pe care specificati in ordinea in care apar

toate evenimetele din program si mesajul Windows eliberat/sau exploatat.


-74-

Un alt element frecvent utilizat in interfata grafica este caseta de

dialog de tip "listbox".Clasa TListBox este definita in fila "listbox.h",

impreuna cu clasa TListBoxData.Clasa TListBox,contine un numar mare de

metode prin care se poate opera asupra datelor(vezi fila "listbox.h").

EXEMPLU: (vezi si OWL_ABC / owl12 )

deschideti un proiect nou si completati fila .cpp astfel:

#include

#include

#include

#include

#include

const uint16 ID_LISTA1 = 201;

class Fer1 : public TWindow {

public: Fer1();

void SetupWindow();

protected:

TListBox* Lista; };

Fer1::Fer1():TWindow(0,0,0) {

Lista = new TListBox(this,ID_LISTA1,50,50,400,200);

};

void Fer1::SetupWindow()

{

Lista->Create();

Lista->AddString("Prima linie din lista");

Lista->AddString("A doua inregistrare");

Lista->AddString("...................");

Lista->AddString("Ultima inregistrare");

};

class Aplicatie1 : public TApplication {

public: Aplicatie1() : TApplication() {};

void InitMainWindow(); };

void Aplicatie1 :: InitMainWindow()

{ MainWindow = new TFrameWindow(0,"Test",new Fer1); };

int OwlMain(int,char* [])

{ return Aplicatie1().Run(); }

Compilati,construiti si executati aplicatia.

Pentru a utiliza o astfel de caseta de dialog,se va utiliza operatorul

new si constructorul TListBox,in constructorul ferestrei principale(Fer1),

dupa care se va apela o functie oarecare,in care se pot efectua toate

operatiile de configurare a obiectului.Conventional,se utilizeaza o

functie denumita SetupWindow(),pentru a fi usor de identificat,dar puteti

utiliza orice alta denumire.Obiectul nu poate fi initializat cu valori

in constructorul ferestrei(se returneaza un mesaj de eroare).Pentru a

introduce date in caseta de dialog se pot utiliza metodele AddString(),sau

InsertString().Pentru a alege tipul de caseta listbox se poate utiliza

proprietatea Attr.Style.Casetele de dialog de tip listbox pot fi de trei

tipuri: simple,cu multiselectie sau cu afisare pe mai multe coloane.

Constructorul implicit creaza o caseta simpla in care datele din lista

sunt sortate automat in ordine alfabetica( vezi owl12).Pentru a afisa

datele nesortate,se poate apela prporietatea: Attr.Style ~LBS_SORT.

Toate setarile se vor efectua in functia de configurare(SetupWindow).

-75-

EXEMPLU: ( vezi si OWL_ABC / owl13 )

#include

#include

#include

#include

#include

const uint ID_LISTA1 = 201;

class Fer1 : public TWindow {

public: Fer();

void SetupWindow();

protected:

TListBox* Lista; };

Fer1::Fer1():TWindow(0,0,0) {

Lista = new TListBox(this,ID_LISTA1,50,50,400,40); };

void Fer1::SetupWindow()

{

Lista->Attr.Style |= LBS_MULTICOLUMN;

Lista->AttrStyle &= ~LBS_SORT;

Lista->SetColumnWidth(100);

Lista->Create();

Lista->AddString("unu");

Lista->AddString("doi");

Lista->AddString("trei");

Yüklə 1,36 Mb.

Dostları ilə paylaş:
1   ...   7   8   9   10   11   12   13   14   ...   18




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin