|
MainWindow:=New(PWindow,Init(nil,'Text'))
|
səhifə | 17/24 | tarix | 03.11.2017 | ölçüsü | 2,15 Mb. | | #28851 |
| 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
Dostları ilə paylaş: |
|
|