|
unei anumite operatii,ca rezultat a mesajului receptionat etc...)
|
səhifə | 15/24 | tarix | 03.11.2017 | ölçüsü | 2,15 Mb. | | #28851 |
| unei anumite operatii,ca rezultat a mesajului receptionat etc...).
-121-
EXEMPLU:
program obiect5;
uses WinProcs,WinTypes,ODialogs,OWindows;
type E=object(TApplication)
procedure InitMainWindow;virtual;
end;
PE=^TE1;
TE1=object(TWindow)
LB1:PListBox;
constructor Init(AParent:PWindowsObject;ATitle:PChar);
procedure SetupWindow;virtual;
end;
constructor TE1.Init(AParent:PWindowsObject;ATitle:PChar);
var AStat : PStatic;
begin
inherited init(AParent,Atitle);
LB1:=New(PListBox,Init(@Self,101,20,40,150,100));
AStat:=New(PStatic,Init(@Self,102,'Caseta ListBox',20,10,150,20,0));
end;
procedure TE1.SetupWindow;
begin
inherited SetupWindow;
LB1^.AddString('Text pe randul 1');
LB1^.AddString('Text pe randul 2');
LB1^.AddString('Text pe randul 3 etc...');
end;
procedure E.InitMainWindow;
begin
MainWindow:=New(PE,Init(nil,'Caseta tip listBox'));
end;
var E1:E;
begin
E1.Init('ListBox');
E1.Run;
E1.Done;
end.
Observati ca spre deosebire de casetele de tip ListBox create sub forma de
resurse cu ajutorul utilitarului Resource Workshop,obiectul de tip ListBox
definit in ODialogs cu numele TListBox,beneficieaza de metode proprii
pentru introducerea sau stergerea sirurilor de caractere in caseta.Aceste
metode(AddString,DeleteString,GetString,InsertString etc.) faciliteaza
foarte mult operatiile asupra datelor afisate.Pentru construirea listei am
utilizat parametrul implicit Self,care garanteaza ca se va apela metoda
virtuala corecta pentru instanta actuala a obiectului(self este parametrul
implicit de apelare al tuturor metodelor).
Pentru referirea oricarui obiect sau membru,se utilizeaza pointerii.In
exemplul de mai sus,observati pointerii: PE,PStatic,PListBox si LB1^.
Atunci cand obiectul predefinit contine o metoda destinata pentru operatia
pe care dorim sa o efectuam,este intotdeauna de preferat sa utilizati
metoda implicita,decat sa definiti una noua(economie de memorie si efort).
-122-
Astfel,de exemplu,metoda Run din TApplication initializeaza si mentine
automat bucla de mesaje Windows.Pentru a receptiona si interpreta un mesaj
nu mai este necesar sa declarati si initializati o bucla de tip GetMessage
EXEMPLU:
program obiect6;
uses WinProcs,WinTypes,OWindows,ODialogs;
type Buton = object(TApplication)
procedure InitMainWindow;virtual;
end;
PB1 = ^B;
B = object(TWindow)
Cec:PCheckBox;
constructor Init(AParent:PWindowsObject;ATitle;PChar);
procedure ActivareButon(var Msg:TMessage);
virtual id+First + 101;
end;
constructor B.Init(Aparent:PWindowsObject;Atitle:PChar);
begin
inherited Init(Aparent,ATitle);
Cec:=New(PCheckBox,Init(@Self,101,'Buton de control',160,12,150,26,nil));
end;
procedure B.ActivareButon(var Msg:TMessage);
begin
if Cec^.GetCheck = bf_Unchecked then
MessageBox(HWindow,'Neselectat','Butonul este:',MB_OK)
else MessageBox(HWindow,'Selectat','Butonul este:',MB_OK);
end;
procedure Buton.InitMainWindow;
begin
MainWindow:=New(PB1,Init(nil,'Selectati/deselectati butonul !'));
end;
var Buton1:Buton;
begin
Buton1.Init(nil);
Buton1.Run;
Buton1.Done;
end.
Se observa ca procedura de activare a butonului(ActivareButon) primeste
mesajele Windows desi nu am declarat nici o bucla de repetitie.Aceasta
proprietate este valabila pentru toate obiectele de tip TApplication care
apeleaza la metoda Run.
Probabil ca va intrebati ce rost are declararea procedurilor si metode-
lor cu atributul "virtual".In primul rand,declararea obiectului se face
apeland la definitia abstracta pentru ca obiectul sa poata fi vizualizat
si inteles dintr-o singura privire de ansamblu.Multe dintre metodele si
procedurile unui obiect sunt destul de lungi si daca ar fi incluse de la
inceput in definitia obiectului,aceasta s-ar extinde uneori pe mai multe
zeci de randuri si obiectul nu ar putea fi vizulaizat intreg.In plus,in
obiectele derivate din superclasa,metoda sau procedura respectiva poate
fi definita in mod diferit,in functie de necesitatile de moment,asigurand
astfel o maleabilitate extrem de mare a rezultatelor obtinute.
-123-
In exemplul de mai sus,butonul este functional si poate fi utilizat pentru
orice alta operatie dorita.
Obiectul de tip TWindow,beneficiaza in plus si de metoda WMLButtonDown
care detecteaza un click al butonului stang de mouse si trimite mesaje
de tip wm_Timer atat timp cat butonul este apasat.
EXEMPLU:
program obiect7;
uses WinTypes,WinProcs,OWindows;
type PW1 = ^F1;
F1 = object(TWindow)
procedure WMLButtonDown(Var Msg: TMessage);
virtual wm_First + wm_LButtonDown;
end;
Aplicatie = object(TApplication)
procedure InitmainWindow;virtual;
end;
procedure F1.WMLButtonDown(var Msg: Tmessage);
begin
MessageBox(HWindow,'Click de mouse !','Mesaj afisat:',mb_OK);
end;
procedure Aplicatie.InitMainWindow;
begin
MainWindow:=New(PW1,Init(nil,'Apasati butonul mouse !'));
end;
var A:Aplicatie;
begin
A.Init(nil);
A.Run;
A.Done;
end.
Observati ca la fiecare clic de mouse cu butonul stang,se va afisa
mesajul prestabilit prin metoda WMLButtonDown.
Observati si faptul ca nu conteaza ordinea in care sunt declarate
obiectele predefinite (TApplication,TWindow etc.) deoarece ierarhia lor
este prestabilita si ramane aceeasi indiferent de ordinea in care sunt
declarate.In cazul obiectelor declarate de d-voastra,trebuie insa sa fiti
extrem de atenti la pozitia in care declarati un obiect,deoarece tipul
de mostenire (daca exista) este determinat de modul in care includeti un
obiect in alt obiect.In cazul programelor mari,cu mai multe obiecte,este
bine sa faceti mai intai o schema grafica pe o coala de hartie,eventual
cu reprezentari simbolice ale obiectelor si metodelor implementate,astfel
incat in etapa de declarare si definire sa fie cat mai usor de pozitionat.
In mod similar cu exercitiul de mai sus,puteti utiliza o fereastra de
tip TWindow si metoda WMLButtonDown pentru a executa orice alta operatie
declansata de un click de mouse (de exemplu puteti trasa linii sau chiar
puteti desena cu mouse etc.).
Metoda WMLButtonDown poate fi utilizata si pentru a prelua date sau
informatii in momentul unui click de mouse.De exemplu,pentru a determina
si afisa pozitia indicatorului mouse in cadrul ferestrei active se poate
utiliza o procedura simpla care citeste mesajele Windows si salveaza
coordonatele X si Y prin LParamLo si LParamHI intr-un tampon de memorie.
-124-
EXEMPLU:
program obiect8
uses WinTypes,WinProcs,OWindows,Strings;
type PW1 = ^F1;
F1 = object(TWindow)
DC:HDC;
procedure WMLButtondown(var Msg: TMessage);
virtual wm_Furst + wm_LButtonDowm;
end;
Aplicatie = object(TApplication)
procedure InitMainWindow;virtual;
end;
procedure F1.WMLButtonDown(var Msg:Tmessage);
var S: array[0..9] of Char;
begin
wvsprintf(S,'(%d,%d)',Msg.LParam);
DC:=GetDC(HWindow);
TextOut(DC,Msg.LParamLo,Msg.LParamHi, S, StrLen(S));
ReleaseDC(HWindow,DC);
end;
procedure Aplicatie.InitmainWindow;
begin
MainWindow:=New(PW1,Init(nil,'Deplasati si apasati butonul mouse !'));
end;
var A:Aplicatie;
begin
A.Init(nil);
A.Run;
A.Done;
end.
Exemplul de mai sus prezinta cea mai simpla modalitate de a prelua
date sau de a declansa o anumita operatie,la un click de mouse.Pentru ca
operatia sa fie mai discriminativa,se poate face si conditionarea inversa
prin care operatia este executata doar daca se executa un clic de mouse
in interiorul unui perimetru bine determinat din interiorul ferestrei.
Pentru a executa o anumita operatie grafica la un clic de mouse,puteti
construi un obiect similar cu cel din exemplul de mai sus,in care metoda
F1.WMLButtonDown poate fi inclocuita cu una de genul:
procedure F1WLMButtonDown(var Msg: TMessage);
begin
DC:=GetDC(HWindow);
Rectangle(DC,Msg.LParamLo,Msg.LParamHi,Msg.LParamLo+20,Msg.LParamHi+20);
end;
care va desena un patrat cu latura de 20 pixeli la fiecare clic de mouse,
la pozitia actuala a indicatorului mouse.
Reluati cu atentie ultimele trei exemple si observati cat de usor se
poate utiliza un obiect pentru a obtine rezultate diferite.Din acest
motiv,este bine sa pastrati toate exercitiile si aplicatiile dezvoltate in
cursul etapei de invatare a limbajului.In viitor,la nevoie,ve-ti putea
prelua si transforma oricare dintre obiectele create,in functie de nece-
sitatile de moment.
-125-
Un alt tip de obiect tip fereastra descendenta sunt casetele de dialog
de tip ComboBox(caseta combinata).Aceste controale se utilizeaza in mod
curent pentru a forma obiecte complexe,de tip TDialog,si pot fi de trei
feluri:simple,cu derulare si cu lista in derulare.Casetele tip ComboBox
beneficieaza de un numar foarte mare de mesaje,la care se adauga metodele
proprii ale obictului(Clear,getText,Init,Load,SetText,SetupWindow,ShowList
Store,Transfer etc.) permitand astfel o foarte mare flexibilitate pentru
personalizarea aplicatiilor.
EXEMPLU:
program obiect10;
uses WinProcs,WinTypes,ODialogs,OWindows;
type E=object(TApplication)
procedure InitMainWindow;virtual;
end;
PE=^TE1;
TE1=object(TWindow);
CB1:PComboBox;
constructor Init(Aparent:PWindowsObject;ATitle:PChar);
procedure SetupWindow;virtual;
end;
constructor TE1.Init(AParent:PWindowsObject;ATitle:PChar);
var AStat : PStatic;
begin
inherited Init(AParent,ATitle);
CB1:=New(PComboBox,Init(@Self,101,20,40,150,100,cbs_DropDownList,0));
AStat:=New(PStatic,Init(@Self,102,'Control Combobox',20,20,150,20,0));
end;
procedure TE1.SetupWindow;
begin
inherited SetupWindow;
CB1^.AddString('Text pe randul 1');
CB1^.AddString('Text pe randul 2');
CB1^.AddString('Text pe randul 3 etc...');
end;
procedure E.InitmainWindow;
begin
MainWindow:=New(PE,Init(nil,'Caseta tip ComboBox'));
end;
var E1:E;
begin
E1.Init('ListBox');
E1.Run;
E1.Done;
end.
Pentru a prelua datele din caseta,sau pentru a le prelucra sau sorta
in mod diferit,este nevoie de o alta procedura suplimentara.Selectia si
modul de combinare a mesajelor Windows utilizate depinde de experienta si
preferintele fiecarui programator.Principial se prefera solutiile cele mai
simple,dar unele prelucrari de date necesita elaborarea unor algoritmi
speciali de prelucrare.In mod curent,casetele de tip ComboBox,la fel ca si
cele de tip ListBox se utilizeaza in combinatie cu butoane de control.
-126-
Obiectele Windows pot fi personalizate dupa bunul plac.Una dintre cele
mai mult utilizate tehnici este cea de adaugare a unor imagini grafice
colorate,cu ajutorul corora obiectul poate fi distins de cele similare.
Pentru a vedea culorile fundamentale,executati exemplul urmator.
EXEMPLU:
program obiect11;
uses WinTypes,WinProcs,OWindows,Strings;
const Rosu :array[0..7] of byte =(0,0,0,0,250,250,250,250);
Verde:array[0..7] of byte =(0,0,250,250,0,0,250,250);
Albastru:array[0..7] of byte =(0,250,0,250,0,250,0,250);
type PW1 = ^F1;
F1 = object(TWindow)
DC:HDC;
procedure WMLButtonDown(var Msg:Tmessage);
virtual wmFirst + wm_LButtonDown;
end;
Aplicatie = object(TApplication)
procedure InitmainWindow;virtual;
end;
procedure F1.WMLButtonDown(var Msg: Tmessage);
var i,p,o:integer;
begin
DC:=GetDC(HWindow);
for i:=0 to 7 do
begin
p:=CreateSolidBrush(RGB(Rosu[i],Verde[i],Albastru[i]));
o:=SelectObject(DC,p);
Rectangle(DC,i*25,i*25,i*25+20,i*25+20);
DeleteObject(p);
end;
TextOut(DC,100,250,'Paleta de culori standard !',27);
ReleaseDC(HWindow,DC);
end;
procedure Aplicatie.InitMainWindow;
begin
MainWindow:=New(PW1,Init(nil,'Apasati butonul mouse !'));
end;
var A:Aplicatie;
begin
A.Init(nil);
A.Run;
A.Done;
end.
In exemplul de mai sus,la un click al butonului stang de mouse se vor
afisa o serie de patratele colorate in paleta standard de culori(formata
din nuantele extreme ale culorilor respective).Pentru a obtine palete
de culori diferite,nu trebuie decat sa modificati valorile din cele trei
arii de definitie (Rosu,Verde si Albastru) cu alte valori cuprinse intre
0 si 255.Teoretic sunt posibile cateva milioane de nuante (255x255x255),
dar ochiul uman nu percepe decat un numar mult mai mic de nuante.Pentru
alegerea nuantei preferate puteti utiliza exemplul urmator:
-127-
EXEMPLU: program obiect12;
uses WinProcs,WinTypes,ODialogs,OWindows,Strings;
type E=object(TApplication)
procedure InitMainWindow;virtual;
end;
PE=^TE1;
TE1=object(TWindow)
P1,P2,P3:PScrollBar;
T1,T2,T3:PStatic;
B1:PButton;
constructor Init(AParent:PWindowsObject;Atitle:PChar);
procedure SetupWindow;virtual;
procedure Culoare(var Msg: TMessage);virtual id_First + 104;
end;
constructor TE1.Init(AParent:PWindowsObject;ATitle:PChar);
begin
inherited Init(AParent,Atitle);
P1:=New(PScrollBar,Init(@Self,101,20,50,250,30,True));
P2:=New(PScrollBar,Init(@Self,102,20,150,250,30,True));
P3:=New(PScrollBar,Init(@Self,103,20,250,250,30,true));
T1:=New(PStatic,Init(@Self,201,' Rosu',100,30,100,20,0));
T2:=New(PStatic,Init(@Self,202,' Verde',100,130,100,20,0));
T3:=New(PStatic,Init(@Self,203,' Albastru',100,230,100,20,0));
B1:=New(PButton,Init(@Self,104,' OK ',370,310,50,50,True));
end;
procedure TE1.SetupWindow;
begin
inherited SetupWindow;
P1^.SetRange(0,250);
P2^.SetRange(0,250);
P3^.Setrange(0,250);
end;
procedure TE1.Culoare(var Msg: TMessage);
var DC,p,s:integer;
begin
DC:=GetDC(HWindow);
p:=CreateSolidBrush(RGB(P1^.GetPosition,P2^.GetPosition,P3^.GetPosition));
s:=SelectObject(DC,p);
Rectangle(DC,300,50,500,300);
TextOut(DC,20,1,'Deplasati cursoarele apoi confirmati cu butonul OK!',51);
DeleteObject(p);DeleteObject(s);ReleaseDC(HWindow,DC);end;
procedure E.InitMainWindow;
begin
MainWindow:=New(PE,Init(nil,'Apasati butonul OK !'));
end;
var E1:E;
begin
E1.Init('Test culori');
E1.Run;
E1.Done;
end.
-128-
Dupa declararea tipului de obiect,se pot declara mai multe variabile
din tipul respectiv.In acest fel,obiectul respectiv va putea fi apelat
cu ajutorul a doua variabile diferite.Acest gen de operatie este util
atunci cand dorim sa derivam obiecte diferite din tipul respectiv de
obiect,sau cand efectuam un numar mare de operatii cu obiectul respectiv
si dorim sa avem o copie de siguranta a obiectului.Procedeul este utilizat
si in etapa de depanare a programelor pentru a determina daca eroarea
este legata de variabila respectiva sau este generata de definitia tipului
de obiect(eroare de tampon /eroare de definitie).
EXEMPLU:
program obiect13;
uses WinCRT,WinProcs,WinTypes,OWindows,ODialogs;
type B=object(TApplication)
procedure InitMainWindow;virtual;
end;
PE=^TE;
TE=object(TWindow)
BR1,BR2,BR3:PRadioButton;
constructor Init(AParent:PWindowsObject;ATitle:PChar);
end;
constructor TE.Init(AParent:PWindowObject;ATitle:PChar);
begin
inherited Init(AParent,ATitle);
BR1:=New(PRadioButton,Init(@Self,101,'Buton 1',30,10,80,20,nil));
BR2:=New(PRadioButton,Init(@Self,102,'Buton 2',30,40,80,20,nil));
BR3:=New(PRadioButton,Init(@Self,103,'Buton 3',30,70,80,20,nil));
end;
procedure B.InitMainWindow;
begin
MainWindow:=New(PE,Init(nil,'Butoane radio'));
end;
var Buton:B;
var Obiect:B;
begin
Buton.Init(nil);
Buton.Run;
Buton.Done;
writeln('tastati ENTER !');
readln;
Obiect.Init(nil);
Obiect.Run;
Obiect.Done;
end.
Observati ca am declarat un tip de obiect format din trei butoane radio
incluse intr-o fereastra de tip TWindow.Am declarat doua variabile(Buton
si Obiect) din tipul respectiv dupa care am apelat si executat obiectul cu
fiecare dintre cele doua variabile.Acest procedeu este util in caz ca
tamponul de memorie care contine obiectul a fost suprascris sau este de-
fectiv.Observati ca obiectele nu au nevoie de un destructor,deoarece
metoda Done din TApplication efectueaza toate operatiile de curatire
necesare pentru obiectele implicite create dinamic.
-129-
Obiectele pot fi deplasate si redimensionate cu ajutorul functiilor
din unitatea WinProcs,sau cu ajutorul unor proceduri special concepute.
Cea mai simpla metoda de redimensionare este sa utilizati functia Move-
Window pentru fereastra de tip TWindow care contine obiectul.
EXEMPLU:
program obiect14;
uses WinProcs,WinTypes,OWindows,ODialogs;
type F1=object(TApplication);
procedure InitMainWindow;virtual;
end;
PF2=^F2;
F2=object(TWindow)
DC:HDC;
procedure WMLButtonDown(var Nsg: TMessage);
virtual wm_First + wm_LButtonDown;
procedure WMRButtonDown(var Msg: TMessage);
Dostları ilə paylaş: |
|
|