Limbajul Pascal abc-doar


unei anumite operatii,ca rezultat a mesajului receptionat etc...)



Yüklə 2,15 Mb.
səhifə15/24
tarix03.11.2017
ölçüsü2,15 Mb.
#28851
1   ...   11   12   13   14   15   16   17   18   ...   24

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);

Yüklə 2,15 Mb.

Dostları ilə paylaş:
1   ...   11   12   13   14   15   16   17   18   ...   24




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