Limbajul Pascal abc-doar


MainWindow:=New(PWindow,Init(nil,'Text'))



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

MainWindow:=New(PWindow,Init(nil,'Text'));

end;

procedure Ap1.Executie;

var S:TBufStream;

x:integer;

begin

S.Init('FILA1',stCreate,512);

S.Init('FILA1',stOpen,100);

StrPCopy(A,'@Text #### inc^lus #### in ** $ fila FILA1 ');

S.Write(A,44);

writeln('Textul analizat este: ',A);

for x:=0 to 44 do

begin

S.Seek(x);

S.Read(C,1);

if IsCharAlphaNumeric(C[0])=True then

StrCat(B,C);

end;

MessageBox(GetActiveWindow,B,'Text transferat:',MB_OK);

S.Done;

end;

var T:Ap1;

begin

T.Init(nil);

T.Executie;

T.Run;

T.Done;

end.

Observati ca toate caracterele care nu sunt alfanumerice (inclusiv

spatiile goale) au fost excluse de la copiere.Acest gen de operatie este

util pentru a extrage textul dintr-o fila executabila,sau pentru a depana

o fila de tip text corupta cu comenzi sau caractere executabile,etc...


-139-

Un alt obiect predefinit,extrem de util,este TDlgWindow din unitatea

ODialogs,care combina caracteristicile unei ferestre cu cele ale ferestre-

lor de tip dialog.O astfel de fereastra are asociata o resursa de tip

dialog(BitMap,Character String,DialogBox,Icon,Cursor,Menus etc.),care

descrie si determina aspectul si pozitia obiectului realizat.Cel mai comod

este ca resursa sa fie creata cu utilitarul Resource Workshop si sa fie

arhivata in directorul curent,intr-o fila de tip .RES.

EXEMPLU:

program obiect22;

uses WinCRT,ODialogs,WinTypes,WinProcs;

var i:integer;

{$R iconita}

type PF=^TF;

TF=object(TDlgWindow)

constructor Init;

end;

constructor TF.Init;

begin

writeln('Fereastra cu o resursa tip ICON');

TDlgWindow.Init(nil,'text oarecare');

TF.Create;

i:=LoadIcon(hInstance,'ICON_1');

DrawIcon(GetDC(GetActiveWindow),50,50,i);

end;

var MM:TF;

begin

MM.Init;

MM.Done;

end.

Pentru exercitiul de mai sus am utilizat iconita pe care am realizat-o

in exercitiul pentru functia LoadIcon() (vezi WinProcs).Puteti utiliza

orice resursa cu conditia sa o incarcati cu ajutorul comenzii de precom-

pilare {$R ...} si apoi sa o apelati cu LoadResource sau cu functia spe-

cifica resursei respective.

Observati ca obiectul declarat nu are un destructor special,dar am

apelat metoda Done,care este mostenita de la ancestorul sau TWindow.

Pentru a studia arborele genealogic al obiectelor predefinite puteti

apela meniul Search,din care selectati Optiunea Objects (vezi meniul

principal al programului).

Fereastra de tip TDlgWindow beneficiaza in plus,fata de TWindow si de

metodele Cancel si OK,care raspund la mesajele generate de un click de

mouse si pot fi apelate pentru a implementa diverse functii.

Pentru receptionarea si prelucrarea mesajelor de tip Windows,obiectul

preferat este insa TDialog.TDialog este definit tot in unitatea ODialogs

si a fost special destinat pentru casetele de dialog.Casetele de dialog,

pot fi de doua tipuri(modal sau modeless).Casetele de dialog de tip modal

nu permit revenirea la o fereastra situata in afara controlului curent,

decat dupa parasirea casetei de dialog,in timp ce casetele de dialog de

tip modeless,permit parasirea si revenirea repetata in si din caseta de

dialog curenta.In plus,obiectele de tip TDialog permit schimbul de mesaje

dintre doua obiecte diferite(butoane,casete listbox,casete combobox etc.).


-140-

EXEMPLU: program obiect23;

{$R DIALOG.RES}

uses WinTypes,WinProcs,OWindows,ODialogs;

type PTestDialog = ^TTestDialog;

TtestDialog = object(TDialog)

procedure IDBN1(var Msg: TMessage);virtual id_First + 152;

procedure IDLB1(var Msg: TMessage);virtual id_First + 151;

end;

PTestWindow = ^TTestWindow;

TTestWindow = object(TWindow)

constructor Init(AParent: PWindowsObject;ATitle:PChar);

procedure CMDialTest(var Msg: TMessage);virtual cm_First + 101;

end;

TDlgApplication = object(TApplication)

procedure InitMainWindow;virtual;end;

procedure TTestDialog.IDBN1(var Msg: TMessage);

var TextItem:Pchar;

begin

TextItem :='Optiunea 1';

SendDlgItemMsg(151, lb_AddString, 0, Longint(TextItem));

TextItem :='Optiunea 2';

SendDlgItemMsg(151, lb_AddString, 0, Longint(TextItem));

end;

procedure TTestDialog.IDLB1(var Msg:TMessage);

var Idx: Integer; SelectedText: array[0..10] of Char;

begin

if Msg.lParamHi = lbn_SelChange then

begin

Idx :=SendDlgItemMsg(151,lb_GetCurSel, 0, Longint(0));

SendDlgItemMsg(151,lb_GetText, Idx, Longint(@SelectedText));

MessageBox(HWindow,SelectedText,'Optiunea selectata:',MB_OK);

end;end;

constructor TTestWindow.Init(AParent: PWindowsObject; ATitle: PChar);

begin

inherited Init(AParent,ATitle);

Attr.Menu :=LoadMenu(Hinstance, MakeIntResource(100));

end;

procedure TTestWindow.CMDialTest(var Msg: Tmessage);

begin

Application^.ExecDialog(New(PTestDialog,Init(@Self,'DIAL')));

end;

procedure TDlgApplication.InitMainWindow;

begin

MainWindow:= New(PTestWindow, Init(nil,'DIALOG'));

end;

var MyApp:TDlgApplication;

begin

MyApp.Init('Dialtest');

MyApp.Run;

MyApp.Done;

end.


-141-

Exercitiul este adaptat dupa programul dialtest.pas care insoteste

programul (C:bp\examples\docdemos\owl\dialtest.pas).Am pastrat aceleasi

notatii,pentru a putea fi urmarit comparativ.Am simplificat putin pro-

gramul pentru a putea fi inclus pe o singura pagina si am modificat putin

resursa cu ajutorul utilitarului Resource Worckshop.Daca nu detineti o

copie a programului,puteti crea o resursa similara cu specificatiile:

Pentru meniu:

MENUITEM "&TestDialog"

__EndMenu__

Pentru caseta de dialog:

DIAL1 DIALOG 30, 49, 188, 100

STYLE WS_POPUP | WS_DLGFRAME

BEGIN

PUSHBUTTON "OPTIUNI", 152, 111, 13, 68, 12

PUSHBUTTON "Cancel", 2, 112, 66, 68, 12

CONTROL "LISTBOX",151,"LISTBOX",LBS_STANDARD|WS_CHILD|WS_VISIBLE,8,8,83,73

END

Verificati toate programele din directorul EXAMPLES si incercati sa le

modificati pe cele care va intereseaza,dupa modelul exercitiilor din acest

manual.Nu este nici o frauda,daca utilizati fragmente de program scrise

de altii (cu exceptia situatiilor in care acest fapt este specificat

expres in documentatia care insoteste programul respectiv).Puteti utiliza

orice sursa de cod intitulata FreeWare sau Tutorial.

In mod similar,este bine sa reutilizati sau sa transformati exercitiile

pe care le-ati dezvoltat anterior,sau sa utilizati module din alte pro-

grame.

Intregul concept de programare structurata si mai ales cel de progra-

mare orientata spre obiect are ca ultim scop,tocmai aceasta versatilitate

si usurinta de a genera aplicatii noi,pe baza unui cod preexistent.Acest

sistem de lucru,va simplifica foarte mult viata,dar aduce dupa sine si un

grad crescut de responsabilitate.Pentru ca aplicatiile si programele

generate de d-voastra sa poata fi utilizate sau transformate de altii,

trabuie sa scrieti coduri cat mai simple,clare,corecte,insotite de expli-

catii sintetice si sa gestionati memoria de asa maniera incat sa nu ramana

in urma obiectelor nici un byte neeliberat dupa apelul destructorului.

In etapa de invatare,este chiar indicat sa utilizati un schelet de cod

din alt program sau exercitiu,pana cand va familiarizati cu toate concep-

tele si mijloacele de organizare a datelor.

In exercitiul precedent,observati ca obiectul de tip TDialog contine

doua proceduri,una pentru butonul Obiecte si cealalata pentru caseta de

dialog de tip listbox.

Prima procedura (IDNBN1),in mementul in care receptioneaza mesajul

Windows de activare a butonului,transfera obiectului ListBox (identificat

prin codul 151) datele continute in procedura.

Cea de a doua procedura (IDLB1),retransmite un mesaj generat de selectia

uneia dintre optiuni si respectiv afiseaza o caseta de tip MesageBox in

care afiseaza optiunea selectata.

Exemplul prezinta un model simplist de comunicatie intre doua obiecte

(butonul transfera date care ListBox) si o bucla simpla de actualizare a

datelor din obiect (caseta listbox trimite un mesaj adresat catre sine

insusi,dupa selectarea unei optiuni,prin care reconfirma datele.


-142-

Pentru ca doua obiecte sa poata face schimb de date,fara sa fie nece-

sara transmiterea de mesaje,sau de functii call-back pentru receptionarea

acestor mesaje,trebuie ca cele doua obiecte sa utilizeze variabile cu

acelasi domeniu de vizibilitate.Cel mai simplu este sa includeti obiectele

in aceeasi interfata grafica (fereastra TWindow,obiect TObject etc.):

EXEMPLU:

program obiect24;

uses WinTypes,WinProcs,OWindows,ODialogs,WinCRT;

type PTW = ^TW;

TW = object(TWindow)

CB1,CB2:PComboBox;

BT1:PButton;

constructor Init(AParent: PWindowsObject; ATitle: PChar);

procedure Buton(var Msg: TMessage);virtual id_First + 101;

procedure SetupWindow;virtual;

end;

TDlgApp = object(TApplication)

procedure InitMainWindow;virtual;

end;

constructor TW.Init(AParent: PWindowsObject; ATitle: PChar);

begin

inherited Init(AParent,ATitle);

CB1:=New(PComboBox,Init(@Self,301,20,40,100,150,cbs_Simple,0));

CB2:=New(PComboBox,Init(@Self,302,200,40,100,150,cbs_Simple,0));

BT1:=New(PButton,Init(@Self,101,'Transfer',30,200,90,20,True));

end;

procedure TW.Button(var Msg: TMessage);

var text:Pchar;

begin

text:=' ';

CB1^.GetSelString(text,20);

CB2^.AddString(text);

end;

procedure TW.SetupWindow;

begin

inherited SetupWindow;

CB1^.AddString('Optiunea 1');

CB1^.AddString('Optiunea 2');

CB1^.AddString('Optiunea 3');

CB1^.AddString('Optiunea 4');

end;

procedure TDlgApp.InitMainWindow;

begin

MainWindow:=New(PTW,Init(nil,'Selectati si transferati !'));

end;

var App: TDlgApp;

begin

App.Init('Transfer');

App.Run;

App.Done;

end.


-143-

Observati ca datele transferate din o caseta de dialog in cealalta sunt

si sortate automat.Pentru a introduce date de la tastatura,este recoman-

dabil sa apelati la un obiect de tip TEdit.Programul precedent poate fi

modificat dupa cum urmeaza:

EXEMPLU:

program obiect25;

uses WinTypes,WinProcs,OWindows,ODialogs,WinCRT;

type PTW = ^TW;

TW = object(TWindow)

ED1:PEdit;

CB1:PComboBox;

BT1,BT2:PButton;

PS1:PStatic;

constructor Init(AParent: PWindowsObject; ATitle: PChar);

procedure Buton(var Msg: TMessage);virtual id_First + 101;

procedure Sterge(var Msg: Tmassage);virtual id_First + 102;

end;

TDlgApp = object(TApplication)

procedure InitMainWindow;virtual;

end;

constructor TW.Init(AParent: PWindowsObject; ATitle: PChar);

begin

inherited Init(AParent,ATitle);

PS1:=New(PStatic,init(@Self,201,'Introduceti date:',30,50,150,20,0));

ED1:=New(PEdit,Init(@Self,301,'',30,90,140,30,30,False));

CB1:=New(PComboBox,Init(@Self,302,200,40,100,150,cbs_Simple,0));

BT1:=New(PButton,Init(@Self,101,'Salveaza',30,200,90,20,True));

BT2:=New(PButton,Init(@Self,102,'Sterge',30,160,90,20,True));

end;

procedure TW.Buton(var Msg: TMessage);

var text:PChar;

begin

text:=' ';

ED1^.GetLine(text,30,0);

CB1^.AddString(text);

end;

procedure TW.Sterge(var Msg:TMessage);

begin

ED1^.DeleteLine(0);

end;

procedure TDlgApp.InitmainWindow;

begin

MainWindow:=New(PTW,Init(nil,'Selectati si arhivati !'));

end;

var App:TDlgApp;

begin

App.Init('Arhivare');

App.Run;

App.Done;

end.

Pentru a adauga o noua functie,se mai adauga un buton si o procedura:


-144-

EXEMPLU: program obiect26;

uses WinTypes,WinProcs,OWindows,ODialogs,WinCRT;

type PTW = ^TW;

TW = object(TWindow)

ED1:PEdit;

CB1:PComboBox;

BT1,BT2,BT3:PButton;

PS1:PStatic;

constructor Init(AParent: PWindowsObject; ATitle: PChar);

procedure Buton(var Msg: TMessage);virtual id_First + 101;

procedure Sterge(var Msg: TMessage);virtual id_First + 102;

procedure Undo(var Msg: TMessage);virtual id_First + 103;

end;

TDlgApp = object(TApplication)

procedure InitMainWindow;virtual;end;

constructor TW.Init(AParent: PWindowsObject; ATitle: PChar);

begin

inherited Init(AParent,ATitle);

PS1:New(PStatic,Init(@Self,201,'Introduceti date;',30,50,150,20,0));

ED1:New(PEdit,Init(@Self,301,'',30,90,140,50,30,True));

CB1:=New(PComboBox,Init(@Self,302,200,40,100,150,cbs_Simple,0));

BT1:=New(PButton,Init(@Self,101,'Transfera',30,160,90,20,True));

BT2:=New(PButton,Init(@Self,102,'Sterge',30,240,90,20,True));

BT3:=New(PButton,Init(@Self,103,'Undo',30,200,90,20,True));

end;

procedure TW.Button(var Msg: TMessage);

var text:PChar;

begin

text:=' ';

ED1^.GetLine(text,30,0);

CB1^.AddString(text);

end;

procedure TW.Sterge(var Msg: TMessage);

begin

ED1^.DeleteLine(0);

end;

procedure TW.Undo(var Msg: TMessage);

begin

ED1^.Undo;

end;

procedure TDlgApp.InitMainWindow;

begin

MainWindow := New(PTW,Init(nil,'Selectati si transferati !'));

end;

var App: TDlgApp;

begin

App.Init('Transfer');

App.Run;

App.Done;

end.

Pentru a arhiva datele permanent,se poate utiliza un fisier de tip TEXT.


-145-

EXEMPLU: program obiect27;

uses WinTypes,WinProcs,OWindows,ODialogs,WinCRT;

type PTW = ^TW;

TW = object(TWindow)

ED1:PEdit;BT1,BT2:PButton;PS1:PStatic;F1:TEXT;

constructor Init(AParent: PWindowsObject; ATitle: PChar);

procedure Scrie(var Msg: TMessage);virtual id_First + 101;

procedure Afiseaza(var Msg: TMessage);virtual id_First + 102;

end;

TDlgApp = object(TApplication)

procedure InitMainWindow;virtual;end;

constructor TW.Init(Aparent: PWindowsObject; ATitle: PChar);

begin

inherited Init(AParent,ATitle);

PS1:=New(PStatic,Init(@Self,201,'Introduceti date:',30,50,150,20,0));

ED1:=New(PEdit,Init(@Self,301,'',30,90,340,30,80,False));

BT1:=New(PButton,Init(@Self,101,'Salveaza',30,160,90,20,True));

BT2:=New(PButton,Init(@Self,102,'Afiseaza',30,200,90,20,True));

Assign(F1('Fisier,TXT');ReWrite(F1);

end;

procedure TW.Scrie(var Msg: TMessage);

var text: PChar;

begin

text:=' ';

ED1^.GetLine(text,80,0);

Append(F1);

writeln(F1,text);

Close(F1);

ED1^.DeleteLine(0);

end;

procedure TW.Afiseaza(var Msg: Tmessage);

var s:string;

begin

Reset(f1);

while not EOF(F1) do

begin

readln(F1,s);

writeln(s);

end;

end;

procedure TDlgApp.InitMainWindow;

begin

MainWindow:=New(PTW,Init(nil,'Editati si arhivati 1));

end;

var App: TDlgApp;

begin

App.Init('Arhivare');

App.Run;

App.Done;

end.

Dupa prima executie,stregeti ReWrite(F1) din constructor(pt.acumulare).


-146-

Un alt obiect extrem de util,este fereastra de tip multidocument (TMDI)

care este definit in unitatea OWindows.Acest tip de fereastra permite

deschiderea simultana a unui numar nelimitat de ferestre de tip document,

si implicit,operatii simultane cu mai multe obiecte.Permite manipularea

simultana a ferestrelor descendente.O fereastra multidocument detine si

un obiect de tip TMDIClient pe care il arhiveaza in variabila ClientWnd.

Cea mai simpla modalitate de apelare este utilizarea unui pointer de tip

PMDIWindow la crearea ferestrei principale(MainWindow).

EXEMPLU:

program obiect29;

uses WinTypes,WinProcs,OWindows,ODialogs;

type TDlgAPP = object(TApplication)

procedure InitMainWindow;virtual;

end;

procedure TDlgApp.InitMainWindow;

var PW1,PW2:PWindow;

begin

MainWindow := New(PMDIWindow,Init('Fereastra multidocument',0));

PW1:=New(PWindow,Init(MainWindow,'Fereastra descendenta 1'));

PW2:=New(PWindow,Init(mainWindow,'Fereastra descsndenta 2'));

end;

var App: TDlgApp;

begin

App.Init('Multidocument');

App.Run;

App.Done;

end.

Pentru a vizualiza comenzile de manipulare a ferstrelor descendente,

puteti utiliza un meniu care apeleaza direct codul intern al sistemului.

EXEMPLU:

program obiect28;

{$R MENIU.RES}

uses WinTypes,WinProcs,OWindows;

type TDlgApp = object(TApplication);

procedure InitMainWindow;virtual;

end;

procedure TDlgApp.InitMainWindow;

begin

MainWindow:=New(PMDIWindow,Init('Fereastra multidocument',

LoadMenu(HInstance,'MDIMenu')));

end;

var App: TDlgApp;

begin

App.Init(nil);

App.Run;

App.Done;

end.

Deschideti mai multe ferestre descendente de tip MDI Child prin selec-

tarea optiunii Creaza din meniul Optiuni,dupa care alegeti optiunea

Aliniaza pentru a reordona ferestrele,sau respectiv Cascada pentru a

reveni la forma suprapusa de afisaj.


-147-

Resursa intitulata MENIU.RES a fost creata cu utilitarul Resource Work-

shop si are urmatoarea configuratie:

MDIMENU MENU

Yüklə 2,15 Mb.

Dostları ilə paylaş:
1   ...   13   14   15   16   17   18   19   20   ...   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