Upload
porombricas123
View
1.129
Download
0
Embed Size (px)
Citation preview
U i'i t i i a 'iiI şlinţific:
l’iof. Univ. Dr. Leon ŢâinbuleaI acuitatea tic M atcm aticâ şi Inform aticăI liuversitatca B abcş-B olyai ( luj-N apoca
Uditura Albastră
Director editură Smaranda Derveşteanu
Tehnoredactare computerizată Codruţa Poenaru
CopertaLiviu Derveşteanu
TipăritEDITURA ALBASTRA comanda 166 / 2003
lulitura este acreditată de CNCSIS (Consiliul Naţional al Cercelarii Slinjiliee din invătământul Superior) cu numărul 1142 din 30 iunie 2003 .şi este recomandaţii Consiliului Naţional de Atestare a Titlurilor şi Diplomelor Universitare.
Copyright © 2004Toate d r e p tu r i l e a s u p r a aces te i lucrări a p a r ţ in s.c . C a s a d e L d i tu ra A lb a s t ra s.r.l. R e p ro d u c e r e a i n te g ra lă sau p a r ţ ia la a tex tu lu i s a u a i lu s t r a ţ i i lo r din a c e a s ta c a i l e es le p o s ib i l ă n u m a i c u a c o rd u l p re a la b i l in s c r i s al C a se i de l id i lu ra A lb a s l iu .
CUPRINS
PREFAŢĂ................................................................................................ 9
1..INTRODUCERE................................................................................. 111.1. Limbaj sau mediu de dezvoltare?........................................................ 111.2. Programare Windows............................................................................ 111.3. Cum simplifică mediul Delphi programarea sub W indows?......... 121.4. Obiectele V C L ....................................................................................... 131.5. Componentele........................................................................................ 131.6. Cum se programează sub Delphi......................................................... 131.7. Prima aplicaţie....................................................................................... 141.8. Aplicaţii CLX......................................................................................... 17
1.8.1. Crearea unei aplicaţii CLX.......................................................... 171.8.2. Diferenţele dintre un proiect Delphi 7 şi un proiect K ylix..... 191.8.3. Folosirea funcţiilor API................................................................ 19
2. MEDIUL DE DEZVOLTARE DELPHI............................................ 202.1. Meniul principal..................................................................................... 202.2. Editorul de cod....................................................................................... 222.3. Editorul de form e................................................................................... 232.4. Toolbar............................ ........................................................................ 232.5. Paleta de componente............................................................................ 242.6. Object Inspector..................................................................................... 242.7. Managerul de proiecte........................................................................... 26
3. FIŞIERELE PROIECTULUI.............................................................. 28
4. PROGRAMAREA EXCEPŢIILOR ÎN DELPHI.............................. 31»4.1 .Construcţia try - finally.......................................................................... 324.2. Construcţia try-except........................................................................... 344.3. Generarea unei excepţii......................................................................... 354.4. Clase de excepţii.................................................................................... 35
5. OBIECTE GENERALE......................... ............................................ 395.1. T O bject................................................................................................... 395.2. TPersistent.............................................................................................. 415.3. TCom ponent.......................................................................................... 435.4. TControl.................................................................................................. 445.5. TW inControl.......................................................................................... 60
3
6. FERESTRELE APLICAŢIEI - COMPONtiV TA TFp xn U ^--,;..6.1. T Form .....................................................................................................
7. BUTOANE..........................................................................................7.1. TButton...................................................................................................7.2. TB itB tn...................................................................................................
''7.3. TSpeedButton........................................................................................7.4. TU pD ow n...............................................................................................
8. ETICHETE..........................................................................................8.1. TLabel......................................................................................................8.2. TStaticText..............................................................................................
9. CUTII DE EDITARE...........................................................................9.1. TStrings...................................................................................................9.2. TStringList..............................................................................................9.3. T E dit........................................................................................................9.4. TLabeledEdit.........................................................................................9.5. TM askEdit..............................................................................................9.6. TMemo.....................................................................................................9.7. TRichEdit................................................................................................9.8. TTextAttributes......................................................................................9.9. TParaAttributes......................................................................................
10. BUTOANE RADIO...........................................................................10.1. TRadioButton.......................................................................................10.2. TRadioGroup.......................................................................................
11. COMPONENTE PENTRU OPŢIUNI.............................................11.1. TCheckBox...........................................................................................11.2. TCheckListBox....................................................................................
12. PROGRESUL EXECUŢIEI - COMPONENTA TProgressBar.12.1. TProgressBar.......................................................................................
13. BARĂ DE STATUT.........................................................................13.1. TStatusBar............................................................................................13.2. TStatusPanels.......................................................................................13.3. TStatusPanel........................................................................................
^M A N IP U L A T O R DE PANOURI.....................................................v 14.1. TPageControl.......................................................................................
4
14.2. TTabSheet....................................................................................... 15766
15. RIGLE................................................................................................ 16078 15.1. TTrackBar............................................................................ 1607880 16. MENIURI........................................................................................... 16685 ; r 16.1. TMenu................................................................................................... 16687 16.2. TM ainM enu......................................................................................... 168
16.3. TPopUpMenu....................................................................................... 17516. 4. TM enuItem ......................................................................................... 17816.5. Funcţii care prelucrează meniuri....................................................... 18891
9417. SCURTĂTURI................................................................................... 193
97 17.1. TShortCut.............................................................................................. 19317.2. THotKey............................................................................................... 19317.3. Funcţii şi Proceduri............................................................................. 195
97 101 102HO 18. LISTE, COZI Şl ST IV E ........................................................................... 197112 18.1. TList....................................................................................................... 197
18.2. TOrderedList...................................................................................... . 201H 8 18.3.TQueue.................................................................................................. 20212° 18.4. TStack................................................................................................... 203125
19. FIŞIERE, DIRECTOARE Şl DISCURI............................................... 205129 19.1. TFileListBox........................................................................................ 205129 19.2. TDirectoryListBox.............................................................................. 210130 19.3. TDriveComboBox............................................................................... 212
19.4. TFilterComboBox............................................................................... 214134 19.5. TFileStream.......................................................................................... 217134 19.6. Structuri şi funcţii utile pentru lucrul cu136 fişiere, directoare şi discuri................................................................ 220
19.6.1. Structuri........................................................................................ 220139 19.6.2. Atributele fişierelor.................................................................... 221139 19.6.3. Căutare de fişiere........................................................................ 221
19.6.4. Manipulări de fişiere.................................................................. 223146 19.6.5. Manipulări de extensii................................................................ 223146 19.6.6. Manipulări de căi........................................................................ 224148 19.6.7. Operaţii asupra directoarelor.................................................... 225149 19.6.8. Manipulări de d iscuri................................................................. 226
153 20. ITEM URI...................................................................................................... 227153 20.1. TListBox............................................................................................... 227
20.2. TComboBox......................................................................................... 234
5
20.3. TColorBox........................................................................................... 23920.4. TListView............................................................................................. 24220.5. TListltems............................................................................................. 24920.6. TListltem .............................................................................................. 25120. 7. TTreeView.......................................................................................... 25420. 8. TTreeN odes........................................................................................ 26520.9. TTreeNode............................................................................................ 268
2 l\ GRAFICĂ.......................................................................................... 275'21.1. TColor).................................................................................................. 27521.2. Funcţii pentru prelucrarea culorilor.................................................. 27521.3. TG raphic............................................................................................... 27621.4. TBitmap ...................................................... '........... ............................. 27921.5. TIcon...................................................................................................... 28121.6. TMetaFile.............................................................................................. 28121.7. TJpeglmage.......................................................................................... 28221.8. TGraphicsObject................................................................................. 28521.9. T B rush.................................................................................................. 28521.10. TPen.................................................................................................... 28621.11. TFont............................................................ ....................................... 28821.12. TCanvas............................................................ ................................. 29021.13. TGraphicControl............................................................................... 31121.14. TPaintBox.......................................................................................... 31121.15. TImage................................................................................................ 31321.16. TShape................................................................................................ 31621.17. TBevel................................................................................................. 31721.18. TSplitter.............................................................................................. 31821.19. TImageList......................................................................................... 320
22. TIMERE - COMPONENTA TTim er.............................................. 32522.1. TTim er.................................................................................................. 325
23. FERESTRE DE DIALOG................................................................ 33023.1. TCommonDialog................................................................................ 33023.2. TOpenDialog................................................................................. ...... 33223.3. TSaveDialog........................................................................................ 33623.4. TFontDialog......................................................................................... 33723.5. TColorDialog....................................................................................... 33923.6. TFindDialog......................................................................................... 34123.7. TReplaceDialog.................................................................................. 34523.8. TPrinterSetupDialog........................................................................... 34723.9. TPrintDialog........................................................................................ 34823.10. Funcţii care afişează cutii de dialog............................................... 352
6
24. DATE Şl TIMPURI.......................................................................... 35624.1. T D ate..................................................................................................... 35624.2. TTime.................................................................................................... 35624.3. TDateTime........................................................................................... 35624.4. Operatori aritmetici şi relaţionali...................................................... 35724.5. Funcţii şi proceduri............................................................................. 35924.6. TDateTimePicker................................................................................ 362
25. GRIDURI........................................................................................... 36825.1. TCustomGrid....................................................................................... 36825.2. TDrawGrid........................................................................................... 37225.3. TStringGrid........................................................................................... 375
26. TScreen............................................................................................. 380
27. CLIPBOARDUL.......................................................... .................... 386
28. TApplication.................................................................................... 392
29. TIPĂRIREA LA IMPRIMANTĂ...................................................... 40329.1. Modul T e x t.......................................................................................... 40329.2. Mod standard W indow s..................................................................... 40429.3. Cutiile de dialog................................................................................... 409
30. MULTIMEDIA.................................................................................... 41330.1. TMediaPlayer....................................................................................... 41330.2. TA nim ate.............................................................................................. 417
31. DEZVOLTAREA DE COMPONENTE................................. ........ 42231.1. înţelegerea componentelor................................................................. 42231.2. Scrierea de proprietăţi......................................................................... 425
31.2.1. Tipuri de proprietăţi................................................................... 42531.2.2. Declararea proprietăţilor........................................................... 42631.2.3. Memorarea internă a datelor...................................................... 42631.2.4. Metode de acces.......................................................................... 42731.2.5. Valori implicite ale proprietăţilor............................................. 42831.2.6. Proprietăţi de tip array................................................................ 42831.2.7. Editoare de proprietăţi................................................................ 429
TIntegerProperty............................................................................... 430TCharProperty.................................................................................. 430TColorProperty................................................................................. 430TFontNameProperty........................................................................ 430TFontProperty.................................................................................... 430
7
TCursorProperty................................................. .............................. 430TShortCutProperty............................................................................ 431TMPFilenameProperty..................................................................... 431TDateProperty, TTimeProperty..................................................... 431TDateT imeProperty.......................................................................... 431
31.3. Scrierea de metode.............................................................................. 43731.4. Scrierea de evenimente...................................................................... 43831.5. Grafica în componente....................................................................... 43931.6. Editoarele de componente.................................................................. 44031.7. Help pentru componente.................................................................... 44231.8. înregistrarea componentelor............................................................. 44331.9. Adăugarea unei imagini la o componentă....................................... 44431.10. Exem ple.............................................................................................. 444
31 .10 .1 .0 componentă grafică............................................................. 44431.10.2. O componentă grafică cu un eveniment............................... 4463 1 .10 .3 .0 cutie de dialog specială........................................................ 44831.10.4. A doua cutie de dialog specială.............................................. 44931.10.5. O componentă cu editor de proprietăţi................................. 45131.10.6. Un editor de componente........................................................ 456
BIBLIOGRAFIE...................................................... ............................. . 458
8
PREFAŢĂ*
Delphi este un mediu de programare vizual oferit de către firma Borland International. Versiunea curentă (21 Iulie 2003) este 7.0.
în această lucrare am încercat să oferim o imagine de ansamblu a ceea ce poate oferi mediul Delphi programatorilor.
în capitolul de introducere am prezentat pe scurt elementele necesare programării în mediul Delphi.
Un aspect esenţial al programării în Delphi îl constituie tratarea excepţiilor. O prezentare detaliată a excepţiilor este realizată în capitolul 4. Folosirea mecanismului de tratare a excepţiilor simplifică interceptarea şi tratarea erorilor ce pot apărea pe parcursul execuţiei unei aplicaţii. De aceea recomandăm programatorilor să folosească din plin acest mecanism flexibil şi elegant.
în capitolele următoare (5-30) am realizat o prezentare detaliată a componentelor furnizate de către acest mediu. Pentru fiecare componentă am prezentat câteva exemple practice de funcţionare. Am încercat să atingem majoritatea aspectelor legate de programarea în Delphi începând cu elementele simple, precum butoane, cutii de editare, etichete etc. până la elemente mai complexe precum componentele multimedia.
în ultimul capitol am prezentat modul de creare a componentelor Delphi. Această facilitate oferă atât posibilitatea unei structurări mai puternice a programelor cât şi o modalitate de extindere a mediului Delphi.
10 oct. 03 Autorii
1. INTRODUCERE
Delphi este un mediu de programare sub Windows oferit de către firma Borland. La momentul curent (Iulie 2003) este disponibilă versiunea 7.0 a acestui mediu. Delphi foloseşte limbajul de programare Object Pascal.
Există o versiune a mediului Delphi şi pentru sistemul de operare Linux. Aceasta se numeşte Kylix şi, la data curentă, se află la versiunea 3.0. De remarcat este faptul că se pot crea aplicaţii folosind Delphi pentru Windows care apoi pot fi portate în Kylix şi compilate sub Linux fară nici o modificare. De asemenea, folosind Kylix, se pot crea aplicaţii Linux care pot fi compilate fară modificări şi în mediul Delphi sub Windows.
în acest capitol vom încerca să realizăm o prezentare generală a mediului de programare Delphi. Vom încerca să răspundem în general la întrebări legate de programare sub Windows şi la felul în care mediul Delphi simplifică programarea sub Windows.
1.1. Limbaj sau mediu de dezvoltare?
Mediul Delphi este un mediu de programare şi nu un limbaj de programare. Aceasta înseamnă că mediul Delphi este un editor (în realitate este cu mult mai mult decât atât) în care programatorul scrie instrucţiuni într-un limbaj de programare.
Mediul de dezvoltare Delphi este un mediu general, aproape independent de limbajul folosit pentru dezvoltarea de aplicaţii. Spre exemplu, interfaţa mediului Delphi este folosită şi de către mediul C++Builder.
Limbajul de programare folosit de către mediul Delphi este Object Pascal. Acesta diferă faţă de limbajul folosit în mediul Turbo Pascal în principal prin îmbunătăţirile aduse lucrului cu clase şi obiecte.
1.2. Programare Windows
Programarea sub Windows este o muncă extrem de complicată. Trebuie scris mult cod pentru a crea o fereastră, un buton, sau o cutie de editare. Manipularea acestor obiecte este, de asemenea destul de dificilă pentru un programator obişnuit.
Funcţiile cu ajutorul cărora se construieşte o aplicaţie Windows se numesc funcţii API. Ele sunt scrise în limbajul C, dar pot fi uşor adaptate
11
pentru a ti folosite în Object Pascal. Spre exemplu, funcţia API care creează o fereastră are prototipul:
HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR IpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hlnstance, LPVOID lpparam ) ;
/ / po in ter la num ele clasei de fereastra / / poin ter la şirul care conţine num ele ferestrei // stilul ferestrei/ / coordonatele coltu lu i din stanga sus al ferestrei /// / d im ensiunile ferestreiIIII identi ficatorul p ărin te lu i ferestrei / / identificatoru l m eniului / / identificatoru l aplicaţiei care a creat fereastra / / po in ter la o structura cu datele ataşate ferestrei.
Funcţia întoarce un identificator (de tip HWND) la fereastra nou creată.
în unitul windows.pas, care conţine header-ele Object Pascal pentru majoritatea funcţiilor API, funcţia CreateWindow este translatată astfel:
function CreateWindow(lpClassName: PChar;IpWindowName: PChar; dwStyle: DWORD;X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hlnstance: HINST; lpParam: Pointer): HWND;
Dezvoltarea unei aplicaţii folosind doar funcţii API este dificilă. O simplă aplicaţie care constă dintr-o fereastră pe care sunt amplasate câteva cutii de editare şi butoane poate ajunge uşor la câteva sute de linii. In cele ce urmează vom vedea felul în care Delphi simplifică conceptul de programare sub Windows.
1.3. Cum simplifică mediul Delphi programarea sub Windows?
Firma Borland a creat o bibliotecă de clase şi funcţii care încapsulează funcţionalitatea funcţiilor API. Ea se numeşte VCL (Visual Component Library). Această bibliotecă este implementată în limbajul Object Pascal, însă la ora actuală, există extensii şi pentru limbajul C++.
12
Firma Borland mai dezvoltase o ierarhie de obiecte numită OW L ('Object Windows Library). Această ierarhie a precedat VCL-ul şi a fost destinată pentru aplicaţiile Windows dezvoltate sub Borland C++. Diferenţa esenţială între VCL şi O W L este faptul că obiectele OW L nu au reprezentare vizuală la momentul proiectării aplicaţiei. Folosind OW L -ul trebuie scris doar cod: obiectele trebuie instanţiate manual (apelând constructorul Create), valorile datelor membre trebuie setate prin cod, etc.
Folosind obiectele VCL programarea aplicaţiilor Windows se simplifică în mod semnificativ. Majoritatea obiectelor VCL pot fi manipulate şi la momentul proiectării aplicaţiei cu ajutorul unei unelte soft foarte puternice: Object Inspector (Inspectorul de Obiecte). La pornirea mediul Delphi, Object Inspector apare în partea din stânga a ecranului. Cu ajutorul lui se pot seta valorile datelor membre ale obiectelor VCL şi, de asemenea, se poate naviga prin sistemul de evenimente al unei aplicaţii.
1.4. Obiectele VCL
Pentru ca obiectele VCL să poată fi manipulate în interiorul mediului Delphi, s-au introdus câteva îmbunătăţiri modelului obiectual standard. Cea mai importantă este introducerea proprietăţilor. O proprietate se comportă ca o dată membră: valoarea ataşată ei poate fi citită sau scrisă într-un mod asemănător cu cel al datelor membre. în schimb o proprietatea nu poate fi transmisă unei proceduri ca şi parametru prin referinţă.
1.5. Componentele
Din prunctul de vedere al programatorului, componentele sunt clase care definesc funcţionalitatea unei aplicaţii. Un element definitoriu pentru componente este acela că toate au un strămoş comun, şi anume clasa TComponent. Această clasă implementează un minim de specificaţii necesare unui obiect pentru a putea fi manipulat vizual în interiorul mediului de programare.
1.6. Cum se programează sub Delphi
Am spus mai înainte că mediul Delphi este un mediu de programare vizual. în limbajul folosit de programatori aceste medii de programare se mai numesc şi RAD (Rapid Application Development), adică Dezvoltare Rapidă a Aplicaţiei.
Ce însemnă mediu de programare vizual? în primul rând înseamnă un mediu în care o parte din aplicaţie se realizează fără a scrie cod sursă ci, spre
13
exemplu, cu ajutorul mouse-ului. în plus, partea construită vizual este disponibilă programatorului în aceeaşi formă în care aceasta va fi afişată la momentul execuţiei. Partea cea mai importantă din aplicaţie care se poate construi cu ajutorul mouse-ului este interfaţa. Sistemul de operare Windows a stabilit un set de reguli pe care trebuie să le respecte fiecare aplicaţie pentru a putea fi executată în acest sistem de operare. Fiecare aplicaţie Windows conţine o fereastră, eventual un meniu, butoane, cutii de editare, ş.a.m.d. Există un set finit de obiecte furnizate de către Windows şi care pot alcătui interfaţa aplicaţiei. Iniţial aceste obiecte puteau fi create folosind funcţii API pe care le- am definit în secţiunile precedente. Mediul Delphi a încapsulat fiecare dintre aceste părţi ale unei aplicaţii în câte o clasă (componentă). Aceste componente se găsesc în Paleta de Componente (Component Palette) şi pot fi manipulate cu ajutorul mouse-ului.
Folosind mediul Delphi interfaţa aplicaţiei se construieşte foarte simplu prin plasarea componentelor din Component Palette pe fereastra (forma) aplicaţiei. Plasarea unei componente se face executând click pe reprezentarea acesteia în Paleta de Componente şi apoi încă un click în poziţia în care se doreşte a fi amplasată pe fereastra aplicaţiei. Odată amplasată pe formă o componentă poate fi manipulată (redimensionată, etc.) cu ajutorul mouse-ului sau cu ajutorul Inspectorului de Obiecte (Object Inspector). în cele ce urmează vom încerca să construim câteva aplicaţii simple în care vom pune în lumină conceptele de bază ale programării sub mediul Delphi.
1.7. Prima aplicaţie
Vom construi o aplicaţie care afişează un text către utilizator. Acest lucru se poate realiza în mai multe moduri, şi anume:
1. Folosind o componentă de tip TLabel,2. Folosind o componentă de tip TEdit3. Folosind o cutie de dialog,4. Desenând textul pe fereastră.
1. Folosind o componentă de tip TLabel
Aceasta este cea mai simplă modalitate de a afişa un text pe o fereastră (formă). Principalul avantaj este acela că programatorul nu trebuie să scrie cod sursă la momentul execuţiei programului, ci trebuie doar să seteze valorile câtorva proprietăţi.Pentru aceasta vom crea o nouă aplicaţie (File\New\Application). Apoi vom amplasa pe formă o etichetă în care vom scrie textul dorit. Compo-
14
nentele se găsesc în Paleta de Componente, aflată în partea dreaptă, sub meniul principal. Din pagina Standard a Paletei de Componente selectăm componenta TLabel. Dacă executăm dublu-click pe această componentă ea va fi amplasată în centrul formei. De acolo ea poate fi mutată de către utilizator, cu ajutorul mouse-ului, în orice altă poziţie de pe formă.în momentul amplasării pe formă, orice componentă de tip TLabel are ataşat un text care i-a fost atribuit implicit de către mediul Delphi. Dacă este prima componentă de tip Tlabel, atunci ea are ataşat textul Label!. Dacă este a doua componentă de tip TLabel de pe formă, atunci are ataşat textul Label2. Textul ataşat unei componente de tip TLabel se găseşte stocat în proprietatea Caption. Putem schimba acest text modificând valoarea acestei proprietăţi cu ajutorul Inspectorului de Obiecte. Să presupunem că am schimbat acest text la valoarea „Hello World!” . Atunci valorile unora dintre proprietăţile obiectelor care constituie aplicaţia sunt:
object Forml: TFormlCaption = 'Afiseaza text' object Labell: TLabel
Left = 224 Top = 152 Width = 58 Height = 13Caption = 'Hello World!'
end endNu ne mai rămâne decât să lansăm aplicaţia în execuţie fie apăsând tasta F9, fie executând click pe itemul Run\Run din meniul principal.
Folosind o componentă TEdit
Principalul dezavantaj al folosirii componentei de tip TLabel este acela că textul afişat nu poate fi schimbat de către utilizator la momentul execuţiei aplicaţiei. în unele situaţii acest lucru nu este necesar, dar dacă dorim ca această modificare să fie posibilă vom folosi o componentă de tip TEdit.Componenta de tip TEdit se găseşte tot în pagina Standard a Paletei de Componente. Selectăm această componentă şi o amplasăm pe formă. Numele implicit pe care îl -va primi această componentă este Editl. Textul ataşat acestei componente este stocat de către proprietatea Text. Modificăm cu ajutorul Inspectorului de Obiecte textul ataşat acestei componente. După modificare, valorile proprietăţilor obiectului Editl sunt:
15
object Editl: TEdit Left = 200 Top = 144 Width = 121 Height = 21 TabOrder = 0 Text = 'Hello World'
endLansăm aplicaţia în execuţie. De data aceasta textul afişat poate fi modificat de către utilizator.
Dacă dorim ca textul să apară la apăsarea unui buton atunci mai amplasăm pe formă încă o componentă. Aceasta este de tipul TButton şi se găseşte tot în pagina Standard a Paletei de Componente.
procedure TForml.ButtonlClick(Sender: TObject); begin
Editl.Text = 'Hello World'; end;
3. Folosind o cutie de dialog
Dacă dorim să afişăm un mesaj pentru utilizator atunci putem folosi procedura ShowMessage care afişează o fereastră în care se află textul trimis ca şi parametru. Fereastra afişată mai conţine şi un buton la a cărui apăsare fereastra este distrusă.Pentru realizarea acestei aplicaţii vom amplasa pe formă un buton la a cărui apăsare dorim să se afişeze textul către utilizator sub forma unei cutii de mesaj.Procedura care se apelează la apăsarea butonului este:
procedure TForml.ButtonlClick(Sender: TObject); begin
ShowMessage('Hello World'); end;
4. Desenând textul pe formă
Această aplicaţie desenează textul dorit pe formă, la o poziţie specificată. Pentru a putea desena pe formă trebuie să folosim proprietatea Canvas a acesteia. Această proprietate este de tip TCanvas şi oferă o modalitate foarte simplă de a accesa suprafaţa de desenare a unei forme. Una dintre metodele lui TCanvas este TextOut care are ca parametri poziţia şi textul care urmează a fi afişat.
16
Amplasăm pe formă un buton la a cărui apăsare dorim să desenăm un text. Procedura care se apelează în momentul în care se apasă butonul este:
procedure TForml.ButtonlClick(Sender: TObject); begin
Canvas.TextOut(100, 100, 'Hello World!'); end;
1.8. Aplicaţii CLX
Una dintre cele mai importante facilităţi oferite de mediul Delphi 7 este posibilitatea de a crea aplicaţii atât pentru sistemul de operare Windows cât şi pentru Linux.
Aceste aplicaţii pot fi create atât în versiunea pentru Windows a mediului Delphi, cât şi în versiunea pentru Linux.
Mediul de programare oferit de către Borland pentru sistemul de operare Linux se numeşte Kylix. Odată create aplicaţiile pot fi deschise şi compilate fie sub Windows, fie sub Linux.
Aceste aplicaţii (care au posibilitatea de a fi importate dintr-un sistem de operare în altul) au fost denumite aplicaţii CLX (Cross-Platform). Trebuie reţinut că această portabilitate nu este a codului executabil (compilat cu mediul Delphi 7 sau Kylix) ci a codului sursă (generat de către Delphi6 sau Kylix). De asemenea, pentru ca o aplicaţie să poată fi portată de pe o platformă pe alta trebuie să nu conţină apeluri de funcţii API specifice celor două sisteme de operare.
1.8.1. Crearea unei aplicaţii CLX
Din meniul File alegem comanda New | CLX Application.Paleta de Componente va afişa doar acele componente care pot fi
folosite într-o aplicaţie CLX. Alte componente nu au voie să fie folosite.
Exemplu:
Codul sursă al unui unit Delphi 7 (destinat doar pentru platforma Windows) este următorul:
unit Unitl;interfaceuses
Windows, Messages, SysUtils, Variants, Classes,
17
Graphics, Controls, Forms,Dialogs, StdCtrls;
typeTForml = class(TForm)Buttonl: TButton;Editl: TEdit;procedure ButtonlClick(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;var
Forml: TForml;
implementation{$R *.dfm)
procedure TForml.ButtonlClick(Sender: TObject); begin
Editl.Text ;= 'Aceasta este o aplicaţie Windows.'; end;end.
Codul sursă al unui unit Delphi 7 (destinat pentru platformele Windows şi Linux) este următorul:
unit Unitl;interfaceuses
SysUtils, Types, Classes, QGraphics, QControls,QForms, QDialogs,QStdCtrls, QMenus, QTypes;
typeTForml = class(TForm)
Editl: TEdit;Buttonl: TButton;procedure ButtonlClick(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;var
Forml: TForml;
18
implementation{$R *.xfm}
procedure TForml. ButtonlClick (SenderTObject); begin
Editl.Text := 'Aceasta este o aplicaţie CLX'; end;end.
1.8.2. Diferenţele dintre un proiect Delphi 7 şi un proiect Kylix
Fişierele cu extensia .dfm din Delphi 7 au extensia .xfm în Kylix. Fişierele cu extensia .dof din Delphi 7 au extensia .kof în Kylix. Oricum
aceste fişiere trebuie resetate deoarece mediile de sub cele două sisteme de operare îşi construiesc fişiere cu opţiuni specifice.
1.8.3. Folosirea funcţiilor APIt
Folosirea funcţiilor API specifice unei platforme se poate face doar utilizând directiva $IFDEF care va indica secţiunile de cod ce se vor apela sub sistemul de operare Windows şi cele care se vor apela sub sistemul de operare Linux.
Exemplu:
{ S IF D E F M SW IN D O W S }// aici se va scrie cod ce se va executa doar sub W indow s.
- { $ E N D IF }{ S IF D E F LIN U X }// a ic i se scrie cod care se va execu ta doar sub Linux.{SE N D IF}
19
2. MEDIUL DE DEZVOLTARE DELPHI
Elementele mediului de dezvoltare (IDE) Delphi sunt:
- Meniul principal;- Editorul de cod;- Editorul de forme;- Paleta cu unelte;- Paleta de componente;- Inspectorul de obiecte.
2.1. Meniul principal
| File £dit Search View Project Run Component Database Tools Help ; ':j<None> ; iŞj*
File
Conţine comenzi pentru a deschide (Open, Open Project, Reopen), crea (New), salva (Save, Save All, Save Project As, Save As), închide (Close, Close AH), tipări (Print) proiecte şi fişiere.
Edit
Conţine comenzi pentru operaţiile cu Clipboard-ul (Cut, Paste, Copy), pentru selectarea tuturor componentelor de pe o formă sau a întregului text din Code Editor (Sellect AII), prelucrare componente (Size, Scale, Creation Order, Tab O rder,...).
Search
Conţine comenzi pentru localizare de text în pagina activă a editorului de cod.
♦
View
Conţine comenzi pentru a afişa sau ascunde elemente ale mediului şi proiectului curent.
20
Project
Conţine comenzi pentru a manipula (Add to Project, Remove from Project), a compila (Compile Unit, Make project, Build project) şi a configura (Options) fişierele ataşate unui proiect.
Run
Conţine comenzi pentru executarea (Run, Parameters), depanarea (Step Over, Tracc Into, Trace To Next Source Line, Run To Cursor, Show Execution Point) şi oprirea unei aplicaţii (Program Pause, Program Reset). De asemenea, cu ajutorul comenzilor: Inspect, Add Watch, Evaluate/Modify se pot inspecta valorile unor variabile.
Component
Conţine comenzi pentru crearea (New Component) şi instalarea (Install Component) de componente. Se pot instala şi componente ActiveX (Import ActiveX Control). De asemenea, comenzile Install Packages şi Configure Pallete permit adăugarea şi configurarea paletei cu componente.
DataBase
Conţine comenzi pentru manipularea bazelor de date.
Workgroups
Este folosit pentru manipularea proiectelor mari şi diferitelor versiuni ale unui proiect.
Tool
Conţine comenzi pentru a rula programele utilitare disponibile, fară a părăsi mediul Delphi. De asemenea, se poate manipula şi seta comportamentul (Enviroment Options) mediului de dezvoltare.
Help
Conţine comenzi pentru afişarea aplicaţiilor de tip Help (Contents, Index), accesarea paginilor WEB în care se găsesc ultimele informaţii despre mediu (Borland Home Page - care accesează pagina: www.borland.com\index.html. şi Borland Products and Services - care accesează pagina vvww.borland.com\programs\index.html) şi afişarea dialogului About.
21
2.2. Editorul de cod
3 s EUniţi | „ . ,
unit Unit-1; -*>
interface
usesWindows, Messages, SysUtils, Classes, Graphics
typeTF^rml = class(TForm) private
i Private declaratiow f-
publicf Public dec2arat i o n s }■
end;
9: 5 Modified Insert
Si Unitl. pas
Ca orice mediu de programare, Delphi matorul poate scrie codul unei aplicaţii. Acesta care poate deschide mai multe fişiere simultan, ataşat, în partea de sus a ferestrei, un buton cu fişier la altul se face prin click pe butonul ataşat fişierului.
La intrarea în Delphi, sau la crearea unui nou project, editorul de cod conţine textul afişat în imaginea de mai sus. In momentul în care adăugăm la proiect, un unit sau o formă, în editorul de cod se creează o nouă fereastră. Numele de fişiere care sunt modificate în editorul de cod dar care nu au fost salvate sunt afişate cu caractere îngroşate (bold).
Prin execuţia unui click dreapta în editorul de cod, Delphi ne pune la dispoziţie un meniu cu comenzile cele mai des folosite de editare, depanare, execuţie a unei aplicaţii.
Alegând Properties avem acces la setările de bază ale editorului, şi anume la culorile, fonturile, etc. folosite.
O componentă poate fi văzută ca şi
are o fereastră unde progra- este un editor ASCII complet Fiecărui fişier deschis îi este
numele lui. Trecerea de la un
Close Page Ctrl+F4
Open File al Cursor Ctrl+Enter
New Edit W indow
Eîrowse Symbol at Cursor
Topic Search F1
Complete class at cursor Shift+Ctrl+C
Add T o*D o I tgm... S hift+Ctrl+T
Toggle Bookmarks
(3oto Bookmarks
Debug
Read Only
Message View
View Explorer Shift+Ctrl+E
Properties
22
cod sursă prin executarea unui click dreapta pe ea şi apoi prin selectarea comenzii View As Text.
2.3. Editorul de forme
HTHTx'i
Este o fereastră în care programatorul aşază componente care vor forma interfaţa vizuală a aplicaţiei. Pentru un mai bun control al poziţiei unde sunt amplasate acestea, Editorul de forme are pe suprafaţa lui o reţea de puncte echidistante.
2.4. Toolbar
închide r <?auRa V izualizare .,- .. muriiue fişiere la VizualizareDeschide proiect proje c i . unit-uri RunProiect ^ j
l i - 0 ; Q*, £» • 11 1 j s
D e s c h id ş /^ , Nfisier / j \
Închide / / \fişier Şterge Trece de ta \ Step
fişiere din forma la unit K*m a |nt0 proiect 51 lnve,s noua
Pauza
StepOver
Toolbar este o scurtătură a comenzilor aflate în meniul principal. în varianta implicită, comenzile pe care le conţine sunt cele specificate în figura de mai sus. Programatorul poate adăuga sau poate şterge butoane din Toolbar prin executarea unui click dreapta pe acesta şi apoi prin bifarea/debifarea itemurilor dorite.
23
2.5. Paleta de componente
Standard | Additional] W in32] Svstemj Internet] Data Access] Data Controls ] Decision Cube ] QReport] D ialo_ii_L
Componentele sunt grupate în pagini. în forma implicită paginile sunt: Standard, Additional, Win32, System DataAccess, DataControl, ADO, InterBase, Midas, InternetExpress, Internet, FastNet, DecisionCube, QReport, Dialogs, Win3.1, Samples, ActiveX, Servers.
Cele mai folosite componente sunt cele din pagina Standard, care conţine cutii de dialog, meniuri, butoane, etc. Pentru a obţine "help" despre fiecare din ele, se execută click pe componenta dorită, iar apoi se apasă F I .
O componentă specială este şi forma. Adăugarea ei la o aplicaţie se face prin comanda File|NewForm.
Programatorul poate crea noi pagini (în Component Palette) şi le poate şterge pe cele existente. Pentru a realiza acest lucru se execută click dreapta pe Component Palette şi se alege Properties.
Aşezarea unei componente pe o formă se poate face în mai multe moduri. Dacă dorim ca amplasarea componentei să fie în mijlocul formei, atunci executăm dublu click pe componenta respectivă. Dacă dorim să plasăm componenta în alt loc decât centrul formei, atunci executăm click pe componentă, iar apoi încă un click în locul dorit pe formă. Colţul din stânga sus al componentei va coincide cu locul unde am executat cel de al doilea click. în aceste două cazuri, dimensiunile componentei vor fi cele implicite. Se pot modifica aceste dimensiuni, fie din Object Inspector (vezi mai jos), fie cu ajutorul mouse-ului.
în cazul în care ştergem o componentă de pe formă, prototipul handlerului de evenimente asociat componentei va rămâne în codul sursă al aplicaţiei deoarece acesta ar putea fi apelat de către alte metode. Ştergerea unui astfel de handler trebuie făcută atât în partea de definiţie a clasei cât şi în implementare. în caz contrar, compilatorul va semnala o eroare.
2.6. Object InspectorObject Inspector face legătura între interfaţa aplicaţiei şi codul scris de
programator. Are două funcţii:
a. setează proprietăţile componentelor aflate pe formă;b. creează şi ajută la navigatul prin handlerele de evenimente. Un
handler de evenimente se execută în momentul în care apare un eve
24
niment (de exemplu, apăsarea unei taste, a unui buton de mouse, etc.).
în partea de sus a lui se află O bject Selector care conţine toate componentele de pe formă împreună cu tipul lor.
Object Inspector are două pagini:
Object inspector H I
Forml J l ] |Form1 ” 3 |Properties ] Events | Properties Events I
Action ▲ Action Jk.
ActiveControl ActiveControlAlign aINone MenuAlphaBlend False ObjectMenulteiAlphaBlendV alt 255 OnActivate
E l Anchors : [akLeft,akT op] QnCanResizeAutoS croll T fu e ........................ _ ] | OnClick 3 3 E H I H 3 HAutoS fee False OnCloseBiDiMode : bdLeftT oRight OnCloseQuery
Q E orde rlco riî j[bi5ystemMenu, OnConstrainedlBorderS tyle i bsSizeable OnContextPopiBorderWidtti ■0 QnCreate
1 Caption mm OnDbiClickClientH eight :206 OnDeactivate
ClienfWidth j'309 OnDestroy• Coioi c iB tn F a c e O nDockD iop
E l Constraints IfTSizeConstraini OnDockOver
CU3D T rue OnDtagDtop
Cursor crDefault OnDtagOver
DefaultMonitor dmActiveFoim OnEndDock
All shown All shown
pagina proprietăţilor pagina evenimentelor
i. Pagina proprietăţilor
Această pagină setează valorile proprietăţilor unei componente, şi anume dimensiunile ei, poziţia în cadrul formei, fonturile folosite, numele ei, etc. Alte proprietăţi pot fi setate la momentul execuţiei programului prin scrierea de cod sursă în cadrul handlerelor de evenimente.
ii. Pagina evenimentelor
Această pagină permite legarea unei componente la evenimentele programului. Prin executarea unui dublu click pe un eveniment, de exemplu pe OnClick, Delphi creează un handler de evenimente, care este, de fapt, o metodă a unei clase şi care se va executa când apare un eveniment particular (în cazul nostru executarea unui click pe buton). în cazul
25
nostru acest handler de evenimente este (am ales componenta TButton din cadrul paginii Standard):
procedure TForml.ButtonlClick(Sender: TObject); begin
// A ici scriem codul sursa, carc se va executa / / î n m om enlul apasarii butonului Button 1
end;în cazul în care alegem evenimentul OnDblClick handlerul de evenimente va arăta în felul următor (am ales în cazul acesta componenta de tip TEdit):
procedure TForml.EditlDblCiick(Sender: TObject); beginend;
Precum se vede şi din cele două exemple, formele şi componentele sunt numerotate (F orm l, Button1, Editl). Dacă am mai fi adăugat pe formă încă o componentă de tip Tbutton, aceasta ar fi fost denumită RadioButton2, etc. Delphi denumeşte automat toate componentele şi handlerele de evenimente. Aceste denumiri pot fi schimbate cu ajutorul lui Object Inspector. Delphi va face schimbări, automat, peste tot unde este necesar (în codul inserat automat de către el, dar nu şi în codul scris de programator).
Atenţie! Object Inspector nu indică valorile proprietăţilor obiectelor în timpul execuţiei şi nici în timpul depanării aplicaţiei. El este folosit doar pentru setarea acestor valori la momentul proiectării programelor.
2.7. Managerul de proiecteIPioject Manager
jimagview.eKe ---------- 71 g X— 1 New Remov
Files Path
J l ProiectGfoupI CAPrograme- imagview.exe CAPrograme
- £ j ] IMAGEWIN CAPrograme; IMAGEWIN.PAS CAPrograme
JHl ImageForm CAPrograme
” ifD CAProgramej g VIEWWIN.PAS CAPrograme"~1 ViewForm CAPrograme
26
Pe măsură ce aplicaţia creşte, numărul de fişiere necesare va fi tot mai mare (de exemplu, pot fi adăugate fişiere multimedia, baze de date, unituri Pascal, etc.) şi deci se va face tot mai simţită nevoia unei manipulări cât mai uşoare a acestor fişiere. Delphi se ocupă de manipularea tuturor acestor fişiere şi totodată pune la dispoziţia programatorului un instrument care îi permite acestuia să navigheze uşor printre fişierele ce alcătuiesc un proiect. Acest instrument este denumit sugestiv Project Manager. Butoanele New şi Remove sunt folosite pentru a adăuga un nou proiect, respectiv pentru a şterge un proiect la/din grupul de proiecte curent. Prin click dreapta pe itemul cu numele proiectului se afişează un m eniu ' ce conţine comenzi pentru manipularea fişierelor componente ale proiectului respectiv.
3. FIŞIERELE PROIECTULUI
în acest capitol sunt prezentate fişierele care alcătuiesc o aplicaţieDelphi.
1. Grupul de proiecte
La un moment dat pot fi deschise mai multe proiecte. Doar unul dintre ele va fi activ. Asupra acestuia se pot face prelucrări (editare, execuţie). Manipularea proiectelor dintr-un grup se face folosind Project Manager descris în capitolul anterior.Un grup de proiecte se salvează cu extensia .bpg.Utilitatea unui grup de proiecte nu este mare, el doar scuteşte programatorul de a deschide şi închide proiecte separate.
2. Proiectul
Un proiect este un grup de mai multe fişiere care împreună alcătuiesc aplicaţia Delphi. Fiecare fişier reprezintă, pentru aplicaţia din care face parte, o “resursă" care necesită setări speciale pentru a putea fi legată la aplicaţia finală (DLL sau EXE). Pentru a vedea ce fişiere intră în alcătuirea unui proiect accesaţi comanda View|Project Manager.
Fişierele care intră în alcătuirea unui proiect sunt următoarele:
3. Fişierul principal al proiectului
Fişierul principal al proiectului are extensia .dpr (şi numele implicit Projectl.dpr) El este punctul central al unei aplicaţii Delphi. El conţine codul principal al unei aplicaţii. Din acest punct îşi începe aplicaţia execuţia. O aplicaţie simplă poate conţine doar acest fişier.
Exemplu:
Codul sursă conţinut în fişierul principal al unei aplicaţii Delphi simple:
program Projectl; uses
Forms,Unitl in 'Unitl.pas' {Forml}; ,
28
{ $R * . RES}
beginApplication.Initialize;Application.CreateForm(TForml, Forml);Application.Run;
end.
4. Fişierul de resurse
Este un fişier care foloseşte formatul standard Windows pentru fişierele de resurse. Are extensia .res. Resursele pot fi icon-uri, bitmap-uri, cursoare, etc. Numele acestui fişier este identic cu cel al proiectului, având însă extensia res. Mediul Delphi manipulează singur acest fişier. Este rareori nevoie ca programatorul să editeze acest fişier.
5. Fişierele ataşate formei
Unei forme îi sunt ataşate două fişiere cu extensiile .pas şi .dfm. Fişierul dfm (Definition Module) conţine imaginea unei forme, adică conţine valorile proprietăţilor ei şi ale componentelor de pe ea. Pentru o formă care conţine o componentă de tip TButton, fişierul dfm este următorul:
object Forml: TForml Left = 315 Top = 242 Width = 275 Height = 226 Caption = 'Forml'Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -3 Font.Name = 'MS Sans Serif'Font.Style = []PixelsPerlnch = 96 TextHeight = 13 object Buttonl: TButton
Left = 128Top = 112 ,Width = 75 Height = 25 Caption = 'Buttonl'TabOrder = 0
end endAceasta poate fi vizualizat cu ajutorul opţiunii View As Text (respectiv View As Form) din meniul de context ataşat unei componente (care apare la click dreapta pe ea).
29
Fişierul .pas conţine declaraţia şi implementarea clasei formei. Pentru o formă vidă (care nu conţine nici o componentă) fişierul .pas este:
unit Unitl;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs;
typeTForml = class(TForm) private
{ P rivate declarations ) public
{ Public declarations ) end;
varForml: TForml;
implementation {$R *.DFM}
end.
6. Fişierele unit
Este vorba despre fişiere care nu au ataşate o formă. Ele au extensia .pas şi pot conţine clase, funcţii şi proceduri care pot fi folosite de un program Delphi.
Observaţii:
1. Majoritatea acestor fişiere sunt create şi manipulate automat de către mediul Delphi.
2. Dacă un fişier ce intră în alcătuirea unui proiect nu se află în acelaşi director cu acesta, atunci Delphi va păstra calea spre el.
3. Programatorul poate folosi P roject M anager pentru a manipula fişierele care alcătuiesc un proiect Delphi. Acesta se poate activa din meniul View, comanda Project M anager, sau apăsând combinaţia de taste <Ctrl> + <Alt> + <F 11 >.
30
4. PROGRAMAREA EXCEPŢIILOR ÎN DELPHI
Printre condiţiile pe care trebuie să le îndeplinească o aplicaţie pentru a putea fi folosită fără probleme se numără şi robusteţea. Mai precis, o aplicaţie este robustă dacă nu generează mesaje de eroare din a căror cauză să se blocheze şi să se întrerupă. Aceste blocaje pot duce deseori la pierderi de date.
Delphi pune la dispoziţie un mecanism prin care i se permite unei aplicaţii să-şi revină după apariţia unei erori şi să se comporte ca atare, în funcţie de situaţia ivită.
în acest scop s-a introdus noţiunea de excepţie, definită ca fiind o mulţime de condiţii care pot genera o eroare care va întrerupe cursul normal al execuţiei unei aplicaţii.
Exemplu:
O situaţie clasică care poate genera o eroare (adică apariţia unei excepţii) este împărţirea la 0:
var a, b, c : integer;
a : = 0 ;b := 2;c : = b div a; { în această linie execuţia aplicaţiei se va o p ri |
{ şi va fi afişat un m esaj de eroare)
Interceptarea excepţiilor are ca scop tocmai evitarea opririi aplicaţiilor şi rezolvarea erorilor apărute prin intermediul blocurilor de protecţie. Un astfel de bloc de protecţie este alcătuit din instrucţiuni care se execută în cazul în care a apărut o excepţie. Pentru o bună rezolvare a excepţiilor trebuie cunoscută natura acesteia. Totuşi acest lucru nu este necesar, excepţiile putându-se prelucra şi la modul general (în acest caz spunem că avem de-a face cu un cod de curăţire).
Când o eroare apare, aplicaţia generează o excepţie, adică, mai precis, este creat un obiect al excepţiei.
Observaţii:
1. Executând aplicaţia din interiorul mediului Delphi, aceasta se va întrerupe în blocul în care apare excepţia, semnalând-o. Dacă există blocul pentru tratarea excepţiei respective atunci aplicaţia va fi doar
31
întreruptă nu şi terminată. Programatorul poate continua execuţia (cu tasta <F9> sau folosind comanda Run\Run).
2. Executând aplicaţia în afara mediului (deci sub formă de executabil), interceptarea şi rezolvarea excepţiei se va face invizibil pentru utilizator. în acest caz, execuţia se va desfăşura ca şi cum nu ar fi existat nici o eroare.
Object Pascal oferă două mecanisme pentru tratarea excepţiilor: unul care nu ţine cont de natura erorii, iar al doilea care ţine cont de această natură.
4.1. Construcţia try - finally
Este folosită de obicei în cazul alocării unor resurse: alocarea unei zone de memorie care, apoi, datorită apariţiei unei excepţii, nu mai este eliberată, deschiderea unui fişier care, apoi tot din cauza apariţiei unei erori, nu mai este închis, etc.
Sintaxa unei construcţii try - finally este următoarea:
try{instrucţiuni în care e posibil să apară o eroare}
finally{lista cu instrucţiuni care se execu ta indiferent daca a apăru t sau nu o excepţie}
end
Felul în care funcţionează o astfel de construcţie este următorul: se execută instrucţiunile din secţiunea try. Dacă nu a apărut nici o excepţie, atunci se continuă cu execuţia instrucţiunilor din partea finally. Dacă a apărut o excepţie, se sare la partea finally şi se execută instrucţiunile de acolo, iar apoi excepţia este din nou activată.
Exemplul 1:
Apariţia unei erori de împărţire la zero este rezolvată astfel:
a : = 0 ; b := 0 ; try
c : = a div b ; {în m od norm al aici execu ţia aplicaţiei){ar fi încctat, dar acum nu m ai încetează...}
finallyc : = 0 ; {şi c va prim i valoarea zero}
end;
32
Exemplul 2:
Să considerăm acum cazul în care un fişier nu putea fi închis datorită apariţiei unei erori care oprea execuţia aplicaţiei:
Reset(f); b := 0; try
c : = a div b ;{în m od norm al ap licaţia s-ar b loca aici }{şi fişierul f nu ar fi închis}
finallyc : = 0;CloseFile ( f ) ; {acum el este în să închis}
end;
Exemplul 3:
Este posibil ca la un moment dat, în blocul finally să nu rezolvăm toate excepţiile apărute. De exemplu, să presupunem că avem de-a face cu două excepţii de împărţire la zero:
procedure TForml.ButtonlClick(Sender: TObject); var
x, y, b, c, d : integer; begin
d := 0; c:=l; b:=5; try
X : = C div d; y:=b div d;
finally x : = 0 ;
end; end;
în acest caz nu primim nici un mesaj de eroare. Această regulă se respectă doar dacă ulterior (fie în această procedură sau în alta) nu ne folosim de valoarea lui y (de exemplu, afişând-o).
Exemplul 4:
Dacă în schimb avem excepţii de mai multe tipuri şi rezolvăm doar unele dintre ele, atunci vom primi mesaje de eroare şi aplicaţia se va întrerupe:procedure TForml.ButtonlClick(Sender: TObject); var x, b, c, d : integer;
f ; file of char;begin
d:=0; c:=l; b:=5;
33
X :=c div d;CloseFile(f)
end;
ltvallyX:=0;
I Aici ni s e v a sem nala) ţo excepţie de in trare/ieşire)
4.2. Construcţia try-exceptEste folosită atunci când se cunoaşte clar natura erorii apărute. Sintaxa
unei c o n s t a try-except este următoarea:try
^listâ cu instrucţiuni} xc.en<j °c de excepţie}
unde blocm ^ exCepţii este format din instrucţiuni de tipul:
011 identificator: Tip do instrucţiune
Exemplu;*m t*&rţirea la zero, iniţial rezolvată clasic, iar apoi folosind excepţii:
fuţ,^tion M e d i a A r i t m e t i c a (Suma, NumarDeNumere: Integer): be&in Integer;
NumarDeNumere o 0 then Result := Suma div NumarDeNumere. else Result := 0;
Iar 3cum rezolvată folosind excepţii:
fUtv' S t i o n MediaAr i t m e t i c a ( S u m a , NumarDeNumere: Integer)-.Integer;
ba*int r y Result := Suma div NumarDeNumere ex cep ton EDivByZero do Result 5= Ojend ;
M Q(1u1 care * executa construcţia tr,-e*cep . eSte următorul:
34
Lista de instrucţiuni din blocul try se execută în ordine. Dacă nu apare nici o eroare blocul except este ignorat, continuându-se execuţia cu prima instrucţiune aflată după end. Dacă a apărut o excepţie, controlul este dat celui mai interior handler de excepţie existent. Dacă nu există, atunci el va fi căutat înspre exterior, în alt bloc try-except neterminat încă. Dacă nici aici nu este găsit, se continuă în acest fel până la epuizarea blocurilor try-except, sau până la găsirea handlerului de excepţie corespunzător. Dacă nu este găsit nici unul se generează un mesaj de eroare.
4.3. Generarea unei excepţii
Este utilă în cazul în care dorim să semnalăm ceva care nu apare printre clasele de excepţii cunoscute. Spre exemplu, dorim să semnalăm faptul că un număr nu este într-un interval dat.
Sintaxa generării unei excepţii este următoarea:
raise I n s t a n ţ ă a E x c e p ţ i e i ;
Instanţă a Excepţiei este un obiect şi nu o clasă şi este generat, de obicei, direct la faţa locului prin apelul constructorului clasei din care face parte obiectul.
Exemplu:
Dorim să generăm o excepţie dacă un număr nu este în intervalul dat:
function StrToIntRange(const S: string; Min, Max: Longint):Longint;
beginResult := StrToInt(S);if (Result < Min) or (Result > Max)
then raise ERangeError.CreateFmt( '%d nu este înintervalul %d..%d', [Result, Min, Max]);
end;
4.4. Clase de excepţii
Excepţiile sunt încapsulate în clase care au ca strămoş comun clasa Exception, definită astfel:
typeException = class(TObject) public
constructor Create(const Msg: string); constructor CreateFmt(const Msg: string;
35
const Args: array of const); constructor CreateRes(Ident: Integer); constructor CreateResFmt(Ident: Integer;
const Args: array of const); constructor CreateHelp(const Msg; string;
HelpContext: Integer); constructor CreateFmtHelp(const Msg: string;
const Args: array of const; HelpContext: Integer);
constructor CreateResHelp(Ident, HelpContext: Integer); constructor CreateResFmtHelp(Ident: Integer;
const Args: array of const; HelpContext: Integer);
property HelpContext: Integer; property Message: string;
end;
Această clasă are două proprietăţi care specifică un mesaj descriptiv pentru excepţie (Message) şi un context help pentru un eventual help on-line.
Constructorii diferă între ei prin felul în care este furnizat mesajul descriptiv al excepţiei. Astfel, constructorii care au în cadrul lor secvenţa “res” trebuie să-şi construiască mesajul dintr-o resursă de tip string având identificatorul Ident. Constructorii care au în componenţa numelor secvenţa “Fmt” trebuie să-şi construiască mesajul pe baza unui format. Constructorii care au în componenţa numelui secvenţa “Help” trebuie să furnizeze un parametru suplimentar contextul pentru help-ul on-line al excepţiei.
în unitu] SysUtils sunt definite câteva clase de excepţii utile, dintre care amintim cele mai importante:
C la să de excep ţii C a u z a
E A bortE rori care nu trebu ie să afişeze un m esaj de eroare. A ceste erori se m ai num esc erori silenţioase. O eroare silen ţioasă poate fi generată cu Abort.
E A ccessV iola tion Erori de acces invalid al m em oriei.
EC lassN otF ound Erori care sunt cauzate de negăsirea unei clase.
E D atabase E rror Erori la iucrul cu bazele de date.
E D ateT im eE rror Erori la lucrul cu com ponenta TD ateTim e.
E D ivB yZ ero Erori la îm părţirea cu zero a întregilor.
E F C reateE rror Erori la crearea unui fişier.
E F O penE rror Erori la deschiderea unui fişier.
E ln tO verflowErori cauzate de depăşirea num ărului de octeţi a locaţi pentru un în treg în cazul în care se e fectuează calcule.
E ln tfC astE rror Erori la conversia unei interfeţe.
E lnva lidA rgum en t Erori Ia specificarea unui a rgum ent invalid unei funcţii.
36
i l f P M l s jfl» ;
C la să de excep ţii C au z a
E lnva lidC ast Erori la conversii.
E lnva lidG raphic Erori la încărcarea unui tip de grafic necunoscut.
Ehw alidG raphic.O peration Erori la m anipularea im agin ilo r grafice.
E lnva lidG ridO pera tion Erori la m anipularea grid-urilor.
Elii va lidP ointer Erori la folosirea poin terilor invalid.
E U stE rro r Erori la m anipularea listelor (clasele TList, TS tringL ist etc.).
E M enuE rror Erori la m anipulare item -urilor de m eniu.
E O leC trlE rror E rori specifice controale lor A ctiveX .
EO le Exception Erori care apar în m etodele sau p roprietăţile unui obicct OLE.
E O leSysE rror Erori specificc lui ID ispatch.
E O utO fM em ory Erori de m em orie insuficientă la alocare.
E P ackageE rror Erori legate de m anipularea pachetelor.
E P rin ler Erori legate de m anipularea im prim antei.
ET hread Erori legate de m anipularea firelor de execuţie.
E T ree View Error Erori legate de m anipulare com ponentei TTreeView .
E V arian tE rror Erori la m anipularea variant-urilor.
E W in32E rror Erori ale sistem ului de operare.
Exemplul 1:
Dorim să convertim un şir de caractere la un număr întreg. în caz de excepţie atribuim numărului valoarea 0.
procedure TForml.ButtonlClick(Sender: TObject);var nr : integer;
begin trynr := StrToInt(Editl.Text);
excepton EConvertError do nr := 0;
end;ShowMessage(IntToStr(nr));
end;
Exemplul 2:
Rezolvarea excepţiilor generate de accesarea unui nod inexistent dintr-o listă se face astfel:
37
procedure TForml .ButtonlClick(Sender: TObject); var
lista : TList; p : pointer;
beginlista := TList.Create; tryp := lista. Items [lista .Count]
excepton EListError do p := nil
end;end;
Exemplul 3:
Următoarea aplicaţie interceptează şi rezolvă două excepţii de clase EConvertError şi EDivByZero.procedure TForml.ButtonlClick(Sender: TObject);
varnr : integer; x : integer;
beginx := 25; trynr := StrToInt (Editl .Text) ; // s-ar putea sa apara eroare de conversie x : = x div nr; // s-ar putea sa apara impartire la 0
excepton EConvertError do nr := 1; on EDivByZero do x := 0;
end;ShowMessage(IntToStr(x));
end;
5. OBIECTE GENERALE
în acest capitol sunt prezentate principalele clase "strămoş" ale obiectelor VCL. Aceste clase nu sunt proiectate pentru a fi instanţiate direct. Din ele trebuie derivate alte clase cu o funcţionalitate precisă.
TObject este clasa strămoş a tuturor obiectelor care alcătuiesc ierarhia VCL. Această clasă defineşte funcţionalităţile de bază precum crearea şi alocarea memoriei necesare, iniţializarea datelor membre, accesarea, distrugerea ctc. a obiectelor VCL.
Obiectele VCL necesită metode speciale pentru atribuirea valorilor proprietăţilor unui alt obiect. Mai mult decât atât, majoritatea obiectelor VCL îşi stochează valorile proprietăţilor pe disc în fişiere cu extensia .dfm (aceste fişiere au fost binare până la versiunea 6, de atunci fiind fişiere text simple). Metodele necesare pentru a citi şi scrie pe/de pe disc sunt definite în clasa TPersistent.
Clasa TComponent introduce metode şi proprietăţi care permit ca obiectele care derivă din această clasă să poată fi manipulate în interiorul mediului Delphi. Obiectele care derivă din TComponent au primit denumirea de componente. O componentă este selectată din Paleta de Componente, aşezată pe formă şi manipulată cu ajutorul Inspectorului de Obiecte.
Clasa TControl este o clasă din care derivă obiectele ce au reprezentare pe formă la momentul execuţiei aplicaţiei. Aceasta înseamnă că aceste obiecte au o dimensiune şi o poziţie stabilă pe formă la momentul execuţiei aplicaţiei. Componentele care derivă din TControl se mai numesc şi controale.
Componentele care derivă din TWinControl au o fereastră proprie şi un identificator la această fereastră. De aceea ele pot primi focus (sunt active). Acesta se manifestă în diverse forme în funcţie de componentă. Spre exemplu, pe un buton care are focus este desenat un dreptunghi punctat.
5.1. TObject
TObject este strămoşul comun al tuturor obiectelor VCL.
Ierarhie
TObject.
39
Definit în
system.pas
Metode_________________________________________ __ _________ __
Ml. Create
constructor Create;
Construieşte un obiect şi iniţializează datele ataşate lui. Clasele care derivă din TObject îşi definesc proprii constructori.
M2. Free
procedure Free;
Distruge un obiect şi eliberează zona de memorie alocată pentru el. Free apelează automat destructorul obiectului.
M3. ClassName
class function ClassName: ShortString;
Returnează, sub formă de şir de caractere, tipul unui obiect referit de o variabilă, şi nu tipul acelei variabile.
Exemplu:
Următoarea aplicaţie afişează tipul variabilei referită de parametrul Sender al unui handler de evenimente. în cazul particular al aplicaţiei prezentate mai jos va fi afişat mesajul TButton.procedure TForml.ButtonlClick(Sender: TObject); begin
ShowMessage(Sender.ClassName); end;
M4. ClassType
function ClassType: TClass;
Returnează tipul unei clase. TClass este referinţă la o clasă şi este definită astfel:
TClass = class of TObject;
Exemplu:
Următoarea procedură afişează numele clasei obiectului stocat în variabila Sender.
procedure TForml.ButtonlClick(Sender: TObject); begin
ShowMessage(Sender.ClassType.ClassName); end;Aplicaţia va afişa mesajul 'TButton'.
M5. ClassParent
class function ClassParent: TClass;
Returnează tipul părintelui obiectului. Pentru un obiect de tip TObject se returnează nil, deoarece acesta nu are nici un strămoş.
Exemplu:
Următoarea procedură afişează numele clasei şi al tuturor claselor strămoş ale unui buton:
procedure TForml.ButtonlClick(Sender: TObject); var
Ref_la_Clasa: TClass; begin
ListBoxl.Clear;Ref_la_Clasa := Sender.ClassType; while Ref_la_Clasa <> nil do begin ,
ListBoxl.Items.Add(Ref_la_Clasa.ClassName);Ref_la_Clasa := Ref_la_Clasa.ClassParent;
end; end;
5.2. TPersistent
Persistenţa este proprietatea obiectelor de a fi salvate şi apoi reîncărcate.TPersistent este strămoşul comun al acelor obiecte care au capacitatea
de a fi atribuite. Spre exemplu, instrucţiunea Destinaţie := Sursa, nu înseamnă neapărat că întreg conţinutul obiectului Sursa va fi copiat în Destinaţie. Spre exemplu, în cazul pointerilor după atribuirea de mai sus Destinaţie şi Sursa vor referi acelaşi obiect. De aceea, TPersistent introduce metodele Assign şi AssignTo pentru a efectua corect această atribuire.
41
Ierarhie
TObject -> TPersistent.
Definit în
classes.
Metode
Ml. Assign
virtual void fastcall Assign(TPersistent* Source);
Copiază conţinutul unui obiect în alt obiect. Apelul standard este:
Destination. Assign(Source);
Exemplu:
Următoarea aplicaţie atribuie cutiei de editare Edit2 obiectul de tip TFont ataşat cutiei de editare Editl.Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Buttonl: TButton Caption = 'AtribuieFont'
endobject Editl: TEdit Font.Height = -19 Font.Name = 'Courier New'Font.Style = [fsBold, fsltalic]
endobject Edit2: TEdit
Font.Height = -27 Font.Name = 'Arial'Font.Style = [fsUnderline, fsStrikeOut]
endHandlerele de evetiimente ale obiectelor de pe forma Forml sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
Edit2 .Font.Assign(Edi tl.Font) ; end;
M2. AssignTo
virtual void fastcall AssignTo(TPersistent* Dest);
Copiază conţinutul unui obiect în alt obiect. Cele două obiecte pot să nu aibă acelaşi tip. Apelul standard este:
42
Source. AssignTo(Destinatie);
Observaţie:
Nu toate obiectele implementează ambele metode Assign şi AssignTo.
5.3. TComponent
Este strămoşul comun al componentelor VCL. Toate componentele aflate în Component Palette derivă direct sau indirect din TComponent. Clasele care nu îl au pe TComponent ca strămoş (direct sau indirect) sunt clase non- componente.
Principala caracteristică a instanţelor de tip TComponent este faptul că unele proprietăţi ale lor (cele declarate în secţiunea published) pot fi prelucrate la momentul proiectării aplicaţiei prin intermediul lui Object Inspector.
Ierarhie_________________________________________________________
TObject -> TPersistent -> TComponent.
Definit în
classes.pas
Proprietăţi______________________________________________________
PI. ComponentCount
property ComponentCount: integer;
Indică numărul de componente care au componenta curentă drept proprietar.
P2. Components
property Componentsflndex : integer] : TComponent;
Reprezintă vectorul cu toate componentele care au ca şi proprietar componenta curentă. Astfel, acestea pot fi accesate indexat.Variabila Index este cu o unitate mai mică decât ComponentCount, deoarece componentele sunt numerotate de la zero.
P3. Component Index
property Componentlndex : integer;
43
Indică poziţia componentei în vectorul de componente. Prima componentă are indexul zero, iar ultima are indexul cu o unitate mai mic decât numărul indicat de ComponentCount.
P4. Name
property Name : AnsiString;
Name conţine numele componentei.
Exemplu:
Următorul cod afişează (la apăsarea butonului Button1) numele componentelor aflate pe forma Form l a aplicaţiei:procedure TForml .ButtonlClick(Sender: TObject);
vari : integer;
beginfor i := 0 to ComponentCount - 1 do
ShowMessage(Components[i].Name);end;
P5. Owner
property TComponent* Owner;
Indică componenta proprietară a componentei curente.
Observaţii:
1. Forma este componenta proprietar a tuturor componentelor de pe ea. La distrugerea ei vor fi distruse toate componentele de pe ea.
2. Forma, la rândul ei, se află în proprietatea aplicaţiei. De aceea, în momentul în care aplicaţia este distrusă (eliberată din memorie) şi forma este distrusă.
5.4. TControl
Este clasa de bază pentru componentele vizuale - care sunt văzute de utilizator la momentul execuţiei. Defineşte metode, proprietăţi şi evenimente comune pentru toate componentele vizuale, precum: Top, Left, Width, sau Height. Totodată TControl introduce proprietăţi care definesc modul în care apar sau sunt accesibile instanţierile lui. Dintre acestea amintim: Visible, Enabled, Color, Font.
TControl introduce primele evenimente cerute de controalele vizuale: OnClick, OnDblClick, OnMouseDown, OnMouseMove, OnMouseUp, OnDragOver, OnDragDrop, şi OnEndDrag. Aceste evenimente sunt declarate
44
în secţiunea protected a lui TControl, şi, din această cauză, nu se pot accesa decât în clasele derivate din TControl.
Ierarhie_________________________________________
TObject -> TPersistent -> TComponent -> TControl.
Definit î n ________________________________________________
controls.
Proprietăţi______________________________________________________
1*1. BoundsRect
property BoundsRect: TRect;
Returnează dreptunghiul care încadrează controlul. Sistemul de axe de coordonate la care este raportat dreptunghiul are originea în colţul din stânga sus al controlului părinte.
Observaţie:
Valorile câmpurilor Right, Left, Top, Bottom pot fi aflate şi prin intermediul proprietăţilor cu acelaşi nume:
property Top : integer; property Bottom : integer; property Left : integer; property Right : integer;
P2. ClientRect
property ClientRect: TRect;
Returnează dimensiunile (în pixeli) dreptunghiului care reprezintă zona client a controlului. Câmpurile Top şi Left au valoarea 0, iar câmpurile Right şi Bottom indică dimensiunea zonei client a controlului. Valorile pentru ultimele două câmpuri pot fi aflate şi cu ajutorul proprietăţilor:
property ClientHeight : Integer; property ClientWidth : Integer;
Pentru un obiect de tip Tcontrol, ClientHeight are aceeaşi valoare cu Height. Alte clase derivate pot implementa diferit ClientHeight. Pentru o formă avem:
ClientHeight = Height - înălţimea barei de titlul -- marginea redimensionabilă - înălţimea scrolibar-urilor.
45
P3. Caption
property Caption: string;
Specifică titlul controlului. Titlul este folosit pentru identificarea controlului de către utilizator. Putem schimba titlul unui buton cu ajutorul următorului cod:
procedure TForml.ButtonlClick(Sender : TObject) begin
Buttonl.Caption := 'AltTitlu'; end;La apăsarea butonului Buttonl se va schimba titlul acestuia (ceea ce se vede scris pe el) cu “AltTitlu”.
P4. Name
property Name: string;
Specifică numele controlului curent. Schimbarea numelui unui control trebuie făcută doar la momentul proiectării aplicaţiei.
P5. PopupMenu
property PopupMenu: TPopupMenu;
Indică meniul popup ataşat controlului. Acest meniu apare în momentul în care utilizatorul execută click cu butonul din dreapta al mouse-ului pe componentă. Pentru mai multe informaţii despre meniuri citiţi capitolul despre meniuri.
P6. Color
property Color: TColor;
Indică culoarea fundalului unui control. Studiaţi tipul TColor pentru mai multe informaţii.
Observaţie:
Pentru a schimba culoarea unui control se ţine cont de următoarea indicaţie: Un control îşi poate modifica culoarea doar dacă are proprietatea Color. La schimbarea culorii unui control trebuie să se ţină cont şi de valoarea proprietăţii ParentColor. Dacă valoarea proprietăţii ParentColor pentru componentele de pe formă este setată la true, atunci toate componetele de pe acea formă îşi vor schimba culoarea odată cu schimbarea culorii formei. Dacă, în schimb, proprietatea ParentColor este setată la false pentru unele componente, acestea nu îşi vor schimba
46
culoarea chiar dacă forma (părintele) şi-o schimbă. Implicit ParentColor este setată de Object Inspector la true.
Kxcmplu:
Să presupunem că pe formă avem un buton (Buttonl) şi o componentă de tip TLabel (Labell). Următorul program, la apăsarea butonului, va schimba culoare formei şi a componentei de tip TLabel în roşu:
procedure TForml.ButtonlClick(Sender : TObject); begin
Forml.Color := clRed; end:Dacă setăm ParentColor pentru Labell la false, atunci la apăsarea butonului Buttonl îşi schimbă culoarea doar forma:
procedure TForml.ButtonlClick(Sender: TObject); begin
Labell.ParentColor := false;Forml.Color := clRed;
end;
1*7. Cursor
property Cursor: TCursor;
Specifică imaginea folosită pentru a reprezenta un cursor de mouse, atunci când acesta trece pe deasupra unui control. Valorile standard (furnizate de către TScreen) sunt următoarele constante întregi: crNone, crArrow , crCross, crIBeam, crSize, crSizeNESW, crSizeNS, crSizeNWSE, crSizeWE, crUpArrow, crHourGlass, crDrag, crNoDrop, crHSplit, crVSplit, crMultiDrag, crSQLWait, crNo, crAppStart, crHelp şi crHandPoint.
1*8. Enable
property Enabled: boolean;
Specifică dacă controlul mai răspunde la mouse, tastatură, sau sisteme de timere. Pentru a bloca un buton (de exemplu Buttonl) să mai răspundă Ia astfel de evenimente, scriem instrucţiunea:Buttonl.Enable := false;
47
P9. Font
property Font: TFont;
Specifică atributele fontului cu care este scris textul pe sau într-un control. Detalii despre clasa TFont se pot găsi în capitolul despre grafica în mediul Delphi.
P10. Hint
property Hint: string;
Specifică textul care apare când cursorul de mouse este trecut pe deasupra controlului. Pentru ca acest text să apară trebuie ca proprietatea ShowHint să fie setată la true.
P i l . ShowHint
property bool ShowHint;
Stabileşte dacă Help Hint-u\ va apărea în momentul în care cursorul mouse-ului poposeşte pentru puţin timp pe control. Trebuie ţinut cont şi de valoarea proprietăţii ParentShowHint şi anume, dacă ParentShowHint este setat la true, atunci fiecare componentă va afişa propriul ei Help Hint (indiferent de valoarea lui ShowHint), în caz contrar fiecare componentă se va conforma propriului ei ShowHint.
Exemplu:
Să realizăm o aplicaţie care constă dintr-un buton (Button]) şi o cutie de editare (Editl) care să aibă fiecare câte un Help Hint. Valorile proprietăţilor obiectelor de pe formă vor fi:
object Buttonl: TButton Hint = 'Apasati-ma'ParentShowHint = False ShowHint = True
endobject Editl: TEdit
Hint = 'Introduceti un text'ParentShowHint = False ShowHint = True
end
P12. Text
property Text: string;
Text conţine textul ataşat unui control. Cu ajutorul acestei proprietăţi poate fi citit textul ataşat unui control, sau se poate ataşa controlului un
48
text. Implicit Text are ca valoare numele controlului. Spre exemplu, într- o componentă de tip TEdit se află înscris iniţial un text reprezentând numele componentei: de exemplu Editl.
P13. Visible
property Visible: boolean;
Specifică dacă un control este vizibil pe ecran la momentul execuţiei aplicaţiei.
Observaţie:
O componentă care derivă doar din TComponent nu poate fi vizibilă la momentul execuţiei deoarece nu are proprietatea Visible. Exemplu de astfel de componentă (care nu este control) este TTimer.
P14. Align
property Align: TAlign;
Indică modul în care se aliniază controlul în cadrul părintelui. Valori posibile pentru Align sunt:
V a lo a re S em n ifica ţie
alN one D im ensiunile şi poz iţia com ponentei răm ân neschim bate.
alT op
C om ponenta se m ută în partea de sus a com ponentei părinte.
Lăţim ea ei devine egală cu lăţim ea com ponentei părinte,
înă lţim ea nu se m odifică *
alB ottom
C om ponenta se m u tă în partea de jo s a com ponentei părinte.
Lăţim ea ei devine egală cu lăţim ea com ponentei părinte.
Înă lţim ea nu se m odifică.*
a l Le ft
C om ponenta se m u tă în partea stângă a com ponentei părinte,
înă lţim ea ei devine egală cu înălţim ea com ponentei părinte.
L ăţim ea nu se m odifică .*
alR igh t
C om ponenta se m ută în partea s tângă a com ponentei părinte,
înă lţim ea ei devine egală cu înălţim ea formei.
Lăţim ea nu se m odifică.*
alC lien t
C om ponen ta se redim ensioneazâ astfel încâ t să um ple zona clien t a com ponentei părinte.
D acă o a ltă com ponentă a ocupat deja o parte din această zonă (are seta tă o valoare d iferită de alN one pentru p roprietatea A lign), atunci com ponenta curentă o cupă restul suprafeţei răm ase neacoperite .
49
* Dacă mai există şi alte componente având setată aceeaşi valoare (dintre: alTop, alBottom, al Left, al Right) pentru proprietatea Align, atunci ele se vor alinia una după alta în ordinea atribuirii valorii pentru această proprietate. Spre exemplu, dacă există două componente având proprietatea Align setată la valoarea alTop, atunci una dintre ele (cea căreia i-a fost setată prima dată valoarea alTop) se va lipi de marginea superioară a componentei părinte, iar cealaltă de marginea inferioară componentei deja amplasată.
P15. Anchors
property Anchors: TAnchors;
Indică felul în care componenta este ancorată de părinte. Ancorarea se realizează faţă de una (sau mai multe) dintre marginile componentei părinte. Această operaţie ne asiigură că poziţia componentei - faţă de marginile de care a fost ancorată în cadrul părintelui - nu se modifică. Valori posibile pentru Anchors sunt o submulţime a:
V a lo a re S e m n ifica ţie
akTop C om ponenta este anco rată de m arg inea superioară a com ponentei părinte.
akB ottom C om ponen ta este anco rată de m arg inea in ferioară a com ponentei părinte.
akL eft C om ponenta este a nco rată de m arg inea din stânga a com ponentei părinte.
akR ightC om ponen ta este anco rată de m arg inea din d reapta a com ponentei părinte.
Observaţie:
Dacă o componentă este ancorată de două margini opuse (spre exemplu akTop şi akBottom) atunci, în cazul redimensionării componentei părinte, se vor modifica şi dimensiunile ei astfel încât distanţa la marginile de care este legată să nu se schimbe.
PI 6. AutoSize
property AutoSize: Boolean;
Indică dacă controlul se redimensionează sau nu automat când conţinutul lui se schimbă.Exemplu de control având proprietatea AutoSize este TEdit. Setând valoarea proprietăţii AutoSize la true, cutia de editare se va acomoda cu înălţimea textului introdus în ea.
50
P17. DragCursor
property DragCursor: TCursor;
Indică tipul de cursor care este afişat în momentul în care controlul curent este tras (este executată asupra lui o operaţie de tip drag). Implicit are valoarea crDrag.
P18. DragMode
property DragMode: TDragMode;
Determină comportamentul drag and drop al controlului. Valori posibile pentru DragMode sunt:
Valoare Semnificaţie
dmMtmuo/ Controlul nu poate fi tras decât după ce aplicaţia apelează metoda BeginDrag.
dmAutomatic Controlul este gata spre a fi tras. Utilizatorul poate executa în orice moment această operaţie.
P19. Parent
property Parent: TWinControl;
Indică controlul părinte în interiorul căruia este afişat cel curent.
Exemplu:
Următoarea aplicaţie afişează părinţii unui buton, ştiind că acesta este aşezat pe o componentă TPanel.
procedure T F o rm l. B u t t o n l C l i c k {S e n d e r : T O b je c t ) ;var c o n t r o l : T C o n t r o l ;
begin// părinţii unui control ii afişam intr-un LislBox cate unul pe linieL i s t B o x l . C l e a r ;c o n t r o l := S e n d e r as T C o n tr o l ; // converteşte controlul la TControlwhile c o n t r o l <> nil dobegin
L i s t B o x l . I te m s .A dd ( c o n t r o l .Name) ; / / adaugă numele in ListBox c o n t r o l := c o n t r o l . P a r e n t ; / / determină părintele controlului
end; end;în urma execuţiei programului, în ListBoxl vor fi afişate liniile:
Button 1 Panel 1 Form l
51
Metode
Ml. Hide
procedure Hide;Face un control să devină invizibil. Proprietăţile şi metodele controlului sunt disponibile şi dacă acesta nu mai este vizibil. în schimb, un control invizibil nu poate recepţiona mesaje generate de apăsarea tastelor sau a mouse-ului.
M2. Show
procedure Show;
Face ca un control să fie vizibil.
M3. Refresh
procedure Refresh;
Redesenează imediat controlul.
Observaţie:
Dacă nu se apelează această metodă redesenarea controlului se va face doar după procesarea mesajelor trimise de aplicaţie înainte de mesajul de redesenare.
Exemplu:
Dacă dorim să implementăm un contor care afişează într-o căsuţă de editare numerele de la 1 la 1000 (câte unul la un moment dat) atunci următorul cod va afişa în Editl doar numărul 1000:
procedure TForml.ButtonlClick(Sender: TObject);var i: integer;
beginfor i := 1 to 1000 do
Editl.Text := IntToStr(i);end;
Codul corect este următorul:procedure TForml.ButtonlClick(Sender: TObject);var i: integer;
beginfor i := 1 to 1000 do begin
Editl.Text := IntToStr(i);Editl.Refresh;
52
end; end ;
M4. ClientToScreen
function ClientToScreen(const Point: TPoint): TPoint;
Converteşte coordonatele unui punct din zona client a controlului în coordonate ecran. Coordonatele ecran sunt stabilite faţă de colţul din stânga sus a ecranului. Acel punct (din colţul din stânga sus al ecranului) are coordonatele (0, 0).
Evenimente
E l. OnClick
property OnClick: TNotifyEvent;
Apare când utilizatorul execută click pe control. Mai poate apărea când:
• utilizatorul selectează un item dintr-o grilă, listă sau combo box prin apăsarea unei săgeţi;
• utilizatorul apasă tasta <Space> în timp ce butonul sau cutia de control are focus;
• utilizatorul apasă <Enter> când forma activă are un buton Default',• utilizatorul apasă <Esc> când forma activă are un buton Cancel-,• utilizatorul apasă o tastă accelerator pentru un buton sau o cutie de
control.
Proprietatea Checked a unui buton radio este setată la true.Valoarea proprietăţii Checked a unei cutii TCheckBox este schimbată. Este apelată metoda Click pentru un item de meniu.
Tipul TNotifyEvent este tipul cel mai simplu de eveniment. El are funcţia de a notifica (a informa) o componentă de o schimbare apărută în sistem. De exemplu, evenimentul OnClick este de tip TNotifyEvent. El doar indică faptul că asupra unei componente s-a executat un click de mouse. Nu se precizează nici poziţia mouse-lui, nici dacă apăsarea butonului a fost însoţită de apăsarea unei taste.Tipul TNotifyEvent este definit în unitul classes astfel:
TNotifyEvent =procedure (Sender: TObject) of object;
unde Sender este obiectul notificat (informat) despre schimbarea apărută în sistem.
53
,#***■ «m irtufff,
E2. OnDblClick
property OnDblClick: TNotifyEvent;
Apare când utilizatorul execută dublu click pe un control.
E3. OnStartDrag
property OnStartDrag: TStartDragEvent;
Operaţia drag-drop constă în apăsarea butonului stâng al mouse-ului pe un control, iar apoi "tragerea" (cu mouse-ul apăsat) controlul într-o altă poziţie, unde butonul de mouse este eliberat.Evenimentul OnStartDrag apare când utilizatorul a început o operaţie de tip drag-drop.Tipul TStartDragEvent este definit astfel:
TStartDragEvent = procedure (Sender: TObject;var DragObject: TDragObject) of object;
unde Sender este obiectul care a început să fie “tras”, iar DragObject este un obiect care conţine informaţii despre operaţia drag-drop curentă. Spre exemplu, DragObject poate conţine informaţii despre cursorul de mouse folosit în această operaţie.
E4. OnDragOver
property OnDragOver: TDragOverEvent;
Apare când utilizatorul trage un obiect pe deasupra unui control. Controlul pe deasupra căruia se trage obiectul va primi acest eveniment. Tipul TDragOverEvent este definit astfel:
TDragOverEvent = procedure(Sender, Source: TObject;X, Y: Integer; State: TDragState; var Accept: Boolean) of object;
Source este obiectul care este tras. Sender este obiectul pe deasupra căruia se trage obiectul Source, iar variabila booleană Accept indică dacă Source poate fi lăsat să cadă (operaţia drop) peste Sender. TDragState este un tip enumerare care conţine valorile:
Valoare Semnificaţie
dsD ragE nter C ursorul dc m ouse intră în suprafaţa de desupra Sem /er-ului.
dsD ragM ove C ursorul de m ouse este plim bat pe deasupra Sevirfer-ului.
dsD ragLeave C ursorul de m ouse părăseşte suprafaţa Sender-u\xu.
54
E5. OnDragDrop
property OnDragDrop: TDragDropEvent;
Apare când utilizatorul “lasă să cadă” obiectul care a fost “tras” .Tipul TDragDropEvent este definit astfel:
TDragDropEvent = procedure(Sender, Source: TObject;X, Y: Integer) of object;
unde Sender este obiectul peste care a fost “tras” Source. (X,Y) este punctul în care butonul mouse-ului este eliberat.
E6. OnEndDrag
property OnStartDrag: TStartDragEvent;
Apare când “tragerea” unui obiect încetează, fie prin lăsarea lui să cadă, fie printr-o metodă de Cancel.Tipul TEndDragEvent este definit astfel:
TEndDragEvent = procedure(Sender, Target: TObject;X, Y: Integer) of object;
unde Sender este obiectul “tras” , iar Target este obiectul care ar putea accepta operaţia drop.
Exemplul 1:
Următoarea aplicaţie permite plimbarea cu ajutorul mouse-ului a unei etichete pe o formă.Valorile proprietăţilor obiectelor de pe forma Forml sunt:object Labell: TLabel Caption = 'Labell'DragMode = dmAutomatic
endHandlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml.Label1StartDrag(Sender: TObject;var DragObject: TDragObject);
beginDragObject := nil;
end;procedure TForml.FormDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
beginAccept := true;(Source as TLabel).Top := Y;(Source as TLabel).Left := X;
55
end ;
procedure TForml.FormDragDrop(Sender, Source; TObject;X, Y: Integer);
begin(Source as TLabel).Left := X;(Source as TLabel).Top : = Y;
end;
Exemplul 2:
Următoarea aplicaţie constă dintr-o formă pe care se află 5 etichete (componente de tip TLabel) şi o componentă TListBox. Etichetele au ca text ataşat numerele de la 1 la 5. Utilizatorul trebuie să tragă fiecare etichetă în Listboxl. Dacă eticheta este acceptată atunci textul ataşat ei va fi adăugat ca item al lui Listboxl. Nu orice ordine de adăugare a textelor în ListBoxl este permisă. Adăugare etichetelor trebuie să înceapă cu numărul 1 şi trebuie să se continue succesiv cu numerele 2, 3,4 ,5 .Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Labell: TLabel Caption = '1'DragMode = dmAutomatic OnStartDrag = LabellStartDrag
endobject Label2: TLabel
Caption = '2'DragMode = dmAutomatic OnStartDrag = LabellStartDrag
endobject Label3: TLabel
Caption = '31 DragMode = dmAutomatic OnStartDrag = LabellStartDrag
endobject Label4: TLabel
Caption = '4'DragMode = dmAutomatic OnStartDrag = LabellStartDrag
endobject Label5: TLabel
Caption = '5’DragMode = dmAutomatic OnStartDrag = LabellStartDrag
end
Handlerele de evenimente ale obiectelor de pe forma Forml sunt:
56
curent : byte; // care eticheta tichuie adaugata la momentul actual
procedure TForml.FormCreate(Sender: TObject); begincurent := 1;
end;procedure TForml.LabellStartDrag(Sender: TObject;
var DragObject: TDragObject);begin
DragObject := nil; end;procedure TForml.ListBoxlDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
beginAccept := (Source as TLabel). Caption = IntToStr(curent);
end;procedure TForml.ListBoxlDragDrop(Sender, Source: TObject;
X, Y: Integer);begin
(Sender as TListBox).Items.Add((Source as TLabel).Caption); inc (curent) ; // urmatoarea eticheta de acceptat
end;
v a r
E7. OnMouseDown
property OnMouseDown: TMouseEvent;
Apare când un buton al mouse-ului este apăsat.Tipul TMouseEvent este definit astfel:
TMouseEvent = procedure (Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer) of object;
unde Sender este controlul pe a cărui suprafaţă este apăsat mouse-ul. (X, Y) sunt coordonatele pixel-ului unde cursorul de mouse a fost apăsat.
TMouseButton este un tip enumerare:
TMouseButton = (mbLeft, mbRight, mbMiddle);
şi indică butonul de mouse care a fost apăsat.
TShiftState este o mulţime:TShiftState = set of (ssShift, ssAlt, ssCtrl,
ssLeft, ssRight, ssMiddle, ssDouble);
57
care indică ce taste de control sau ce butoane ale mouselui au fost apăsate în timpul apariţiei acestui eveniment.
E8. OnMouseMove
property OnMouseMove: TMouseMoveEvent;
Apare când cursorul de mouse este mişcat.
Tipul TMouseMoveEvent este definit astfel:TMouseMoveEvent = procedure(Sender: TObject;
Shift: TShiftState;X, Y: Integer) of object;
Parametrii sunt aceeaşi ca la OnMouseDown (schimbând "apăsat" cu "mişcat").
Exemplu:
Următoarea aplicaţie constă dintr-o formă pe care se află o cutie de editare (Editl). La trecerea cursoului de mouse pe deasupra cutiei Editl, culoarea textului înscris în ea va deveni roşie. La ieşirea mouselui de pe cutia de editare culoarea textului înscris în aceasta va fi setată la culoare standard.procedure TForml.EditlMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);begin
Editl.Font.Color := clRed; end;procedure TForml.FormMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);begin
Editl.Font.Color := clWindowText; end;
E9. OnMouseUp
Apare când un buton de mouse este eliberat,
property OnMouseUp: TMouseEvent;
Tipul TMouseUpEvent este definit astfel:
TMouseEvent = procedure (Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer) of object;
Parametrii sunt ca şi la OnMouseDown (schimbând apăsat cu eliberat).
58
E10. OnCanResize
property OnCanResize: TCanResizeEvent;
Apare când se încearcă redimensionarea unui control.
Tipul TCanResizeEvent este definit astfel:
TCanResizeEvent = procedure(Sender: TObject;var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;
unde NewWidth şi NewHeight sunt noile dimensiuni ale obiectului. Resize indică dacă modificarea dimensiunilor este acceptată sau nu.
Exemplu:
Să se realizeze o aplicaţie care nu permite redimensionarea formei principale peste valoarea 300 pentru înălţime şi lăţime. Iniţial forma are ambele dimensiuni (Height şi Width) mai mici decât 300.
Handlerul pentru evenimentul OnCanResize al formei Form l este următorul:
procedure TForml. ForinCanResize (Sender: TObject;var NewWidth, NewHeight: Integer; var Resize: Boolean);
beginif (NewWidth > 300) or (NewHeight > 300)
then Resize := false else Resize := true;
end;
O altă posibilitate de a realiza această aplicaţie (fără a folosi evenimentul OnCanResize) este de a seta valorile proprietăţii Constrains astfel:
object Forml: TForml Width = 289 Height = 239 Caption = 'Forml'Constraints.MaxHeight = 300 Constraints.MaxWidth = 300
end
E ll. OnResize
property OnResize: TNotifyEvent;
Apare după ce controlul a fost redimensionat.Acest eveniment poate fi utilizat pentru a ajusta dimensiunile obiectului după redimensionare.
59
Exemplu:
Să se realizeze o aplicaţie care nu permite ca dimensiunile formei principale să nu fie multiplu de 10.Rezolvăm cerinţa problemei implementând handlerul pentru evenimentul OnResize al formei Forml:
procedure TForml.FormResize(Sender: TObject); begin
Height := Height - Height mod 10;Width := Width - Width mod 10;
end;
5.5. TWinControl
Este o clasă abstractă pentru toate controalele care au ataşată o fereastră. O importantă caracteristică a lor este faptul că pot primi focus (deci pot interacţiona cu utilizatorul prin intermediul tastaturii).
Ierarhie_______________________________ ________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl.
Definit în______________________________ _________
controls.pas
Proprietăţi___________________________________________________
P I. Brush
property Brush: TBrush;
Specifică ce culoare şi ce model este folosit pentru a desena fundalul unui control.
P2. ClientOrigin
property ClientOrigin: TPoint;
Determină coordonatele colţului din stânga sus al controlului.
P3. ClientRect
property ClientRect: TRect;
Indică dimensiunile ferestrei controlului, în număr de pixeli.
60
P4. ControlCount
property ControlCount: Integer;
Indică numărul de componente care sunt copii ai componentei care a apelat această metodă.
P5. Controls
property Controls)Index: Integer]: TControl;
Este un vector care conţine controalele care sunt fii ai controlului care apelează această proprietate.
P6. CtlJD
property Ctl3D: Boolean;
Indică dacă controlul este afişat sau nu 3D. Acest lucru depinde şi de valoarea proprietăţii ParentCtUD.
P7. ParentCtUD
property ParentCtl3D: Boolean;
Este folosită pentru a specifica dacă felul în care arată o componentă(2D sau 3D) depinde sa nu de felul în care arată componenta părinte. Dacă ParentCtl3D este true, atunci felul în care arată o componentă este identic cu felul în care arată componenta părinte. Dacă ParentCtl3D este false, atunci componenta îşi va folosi propria proprietate Ctl3D.
P8. TabOrder
property TabOrder: TTabOrder;
Indică ordinea în care se trece de la un control la altul în cazul în care se apasă tasta <Tab>. Pentru aceasta fiecare control are un număr unic ataşat (TabOrder). Dacă TabOrder este -1 , atunci controlul respectiv nu poate fi accesat cu ajutorul tastei <Tab>. Iniţial, această ordine este ordinea în care sunt aşezate controalele pe formă.
Itxemplu:
Să se realizeze o aplicaţie care afişează Tab-ordinea componentelor de pe o formă.Folosim o componentă TListBox în care afişăm numele componentelor (câte unul pe o linie) şi numărul lor de ordine (conform cu Tab-ordinea).
61
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); var i : integer;
s : string;begin
ListBoxl.Clear,-for i := 0 to ControlCount - 1 do
if Controls[i] is TWinControl //testu l acesta este necesar then begin / / deoarece pe o form a se po t afla
// si com ponente care nu deriva din TW inC ontro l // spre exem plu T L abel sau TT im er
s := Controls[i].Name; s : = s + ' 1 +
IntToStr((Controls[i] as TWinControl).TabOrder); ListBoxl.Items.Add(s);
end;end;
Metode
M l. CanFocus
function CanFocus: Boolean;
Determină dacă un control poate deveni activ (poate primi focus). Un control invizibil (care are proprietatea Visible setată la false) nu poate primi focus.
M2. Focused
function Focused: Boolean;
Indică dacă controlul este activ (are focus).
M3. SetFocus
procedure SetFocus;
Face ca un control să devină activ (să primească focus).
M4. ControlAtPos
function ControlAtPos(const Pos: TPoint;AllowDisabled: Boolean, AllowWinControls:Boolean=False):
TControl;
Returnează controlul fiu aflat la poziţia Pos.
62
MS. GetTabOrderList
procedure GetTabOrderList(List: TList);
Returnează ordinea Tab într-o listă. Ordinea Tab indică felul în care sunt parcurse controalele prin apăsarea tastei <Tab>.
M6. Repaint
procedure Repaint;
Redesenează controlul.
M7. ScrollBy
procedure ScrollBy(DeltaX, DeltaY: Integer);
Defilează conţinutul ferestrei controlului cu DeltaX pixeli orizontal (spre dreapta) şi DeltaY pixeli vertical (în jos). DeltaX şi D eltaY pot avea şi valori negative, asta însemnând că conţinutul ferestrei va defila spre stânga, respectiv în sus.
M8. ScaleBy
procedure ScaleBy(M, D: Integer);
Redimensionează un control împreună cu toate controalele conţinute în acesta. M reprezintă factorul cu care va fi multiplicată dimensiunea oricărui control, iar D reprezintă numărul cu care va fi împărţită dimensiunea fiecărui control.Dacă dorim să micşorăm dimensiunea unui control la 75%, atunci M va primi valoarea 3 iar D va primi valoarea 4.
Exemplu:
Reducerea cu un sfert a dimensiunilor tuturor componentelor de pe o formă se face prin următorul cod:
procedure TForml.ButtonlClick(Sender: TObject); begin
ScaleBy(3,4); end;
63
Evenimente
E l. OnEnter
property OnEnter: TNotifyEvent;
Apare când o fereastră-control devine activă (când primeşte focus).
E2. OnExit
property O nE xit: TNotifyEvent;
Apare când o fereastră-control devine inactivă (pierde focus-ul).
E3. OnKeyDown
property OnKeyDown: TKeyEvent;
Apare dacă utilizatorul apasă o tastă în timp ce controlul (pentru care se activează acest eveniment) este activ. Tipul TKeyEvent este definit astfel:
TKeyEvent = procedure (Sender: TObject;var Key: Word; Shift: TShiftState) of object;
Apăsarea unei taste poate fi acompaniată şi de apăsarea unui buton de mouse sau de apăsarea tastelelor <Ctrl>, <Shift>, <Alt>, aceste lucruri fiind specificate în parametrul Shift. Valori posibile pentru Shift sunt o submulţime din următoarele valori constante: ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble. Semnificaţia acestor constante este:
Valoare Semnificaţie
ssShift T asta <Shift> este apăsată.
ssAlt T asta <Alt> este apăsată.
ssClrl T asta <Ctrl> este apăsată.
ssLeft B utonul stâng al m ouse-ului este ţinu t apăsat.
ssRight B utonul drept al m ouse-ului este ţinu t apăsat.
ssMiddle B utonul din m ijloc al m ouse-ului este ţinut apăsat.
ssDouble A fost execu tat un dublu-click.
E4. OnKeyUp
property OnKeyUp: TKeyEvent;
64
Apare în momentul în care utilizatorul eliberează o tastă pe care a apăsat-o într-un moment anterior. Semnificaţia parametrilor este ca şi la OnKeyDown.
E5. OnKeyPress
property OnKeyPress: TKeyPressEvent;
Apare când utilizatorul apasă o singură tastă care are codul ASCII normal, deci, de exemplu, tastele <Shift>, <Ctrl> sau <F1> nu pot genera acest eveniment. Tipul TKeyPressEvent este definit astfel:
TKeyPressEvent = procedure (Sender: TObject; var Key: Char)of object;
Key reprezintă tasta apăsată.
Exemplu:
Următoarea aplicaţie constă dintr-o formă (Form l). Utilizatorul poate scrie un text în bara de titlu a formei prin apăsarea tastelor în timp ce focusul este la forma Form l şi nu la una din componentele ei.
procedure TForml.FormKeyPress(Sender: TObject; var Key: Ch a r ) ; begin
Caption := Caption + Key; end;
65
6. FERESTRELE APLICAŢIEI - COMPONENTATForm '
O aplicaţie W indows constă din una sau mai multe forme (ferestre). Una dintre ele este fereastra principală care va fi afişată în momentul lansării aplicaţiei în execuţie.
Componenta care implementează caracteristicile şi comportamentul unei forme se numeşte TForm.
Această componentă nu are reprezentare în Component Palette şi, de aceea, adăugarea unei noi forme la aplicaţie se realizează prin accesarea comenzii File\NewForm.
O fereastră este împărţită în două zone principale:
- bara de titlu;- zona client.
Bara de titlu se află în partea de sus a formei şi conţine de la stânga spre dreapta:
- meniul sistem;- titlul ferestrei;
trei butoane (Minimizare, Maximizare şi închidere).
Zona client are cea mai mare suprafaţă. Pe ea programatorul aşează controale cu ajutorul cărora defineşte funcţionalitatea unei aplicaţii.
6.1. TForm
Ie ra rh ie ____________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TScrollingWinControl -> TForm.
Definit î n _______________________________________
form s.pas
66
Proprietăţi
PI. Active
property Active: Boolean;
Determină dacă o formă este activă sau nu (daca are sau nu focus). La un moment dat, doar o formă poate avea focus. O formă activă este aceea asupra căreia utilizatorul acţionează la momentul curent. Se deosebeşte de toate celelalte forme prin culoare barei de titlu.
P2. ActiveControl
property ActiveControl: TWinControl;
Indică controlul activ care are focus de pe o formă. La un moment dat, doar un singur control poate avea focus. Dacă forma nu este activă, atunci ActiveControl indică componenta care va primi focus în momentul în care forma primeşte.
P3. Borderlcons
property BorderIcons:TBorderIcons;
Indică tipurile de iconuri ce pot să apară în bara de titlu a unei forme. TBorderlcons este o mulţime, deci poate lua mai multe valori dintre următoarele:
V a lo a re S em n ifica ţie
BiSystemMenuForm a are un m eniu num it System , care este a fişat Ia apăsarea iconului (din colţul din stânga sus) cu ajutorul căru ia form a poate fi închisă, m axim izată, m inim izată etc.
BiMinimize F orm a are un buton de m inim izat(în colţul din d reap ta sus).
BiMaximize F orm a are un bu ton de m axim izat(în colţul din d reap ta sus).
BiHelp Form a are un buton de help care are desenat pe el un sem n de întrebare.
P4. BorderStyle
property BorderStyle: TFormBorderStyle;
Specifică tipul de margine pentru o formă. Valorile posibile pentru BorderStyle sunt:
67
V a lo a re S em n ifica ţie
BsDiatogForm a nu poale fi redim ensionată. M arginea este în form ă standard.
BxSingle Form a nu poate fi redim ensionată. 0 singură linie ca m argine.
BsNune Form a nu poate fi redim ensionată. N ici o linie viz ib ilă ca m argine.
BsSizeable Form a poate 11 redim ensionată.
BsToolWindow La fel ca şi bxSingle d ar cu un titlu mai mic.
BsSizel'oolWin La fel ca şi bsSizeahle d ar cu un titlu mai mic.
Apare aici termenul de “formă redimensionabilă” . Este vorba de schimbarea dimensiunilor formei cu ajutorul mouse-ului în timp ce aplicaţia este în execuţie. Oricum, schimbarea dimensiunilor formei poate fi făcută şi în timpul execuţiei aplicaţiei, dar fără ajutorul mouse-ului, ci cu ajutorul proprietăţilor ClientHeight şi ClientWidth.
Exemplu:
Să presupunem că la lansarea în execuţie a aplicaţiei forma nu putea fi redimensionată, dar dorim ca la apăsarea unui buton (B uttonl) aceasta să poată fi redimensionată. Atunci handlerul de evenimente ataşat butonului Buttonl şi evenimentului OnClick trebuie să conţină linia:
procedure TForml.ButtonlClick(Sender: TObject); begin
Forml.BorderStyle:=bsSizeable; end;
P5. ClientHeight
property ClientHeight: Integer;
Specifică înălţimea, în pixeli, a zonei client a formei. Pentru a determina întreaga înălţime a formei (+ zona de titlu) citiţi valoare proprietăţii Height a lui TControl.
P6. ClientWidth
property ClientWidth: Integer;
Specifică lăţimea, în pixeli, a zonei client a formei.
Exemplu:
Următoarea aplicaţie interschimbă, la apăsarea butonului Buttonl, valoarea lăţimii cu valoarea înălţimii zonei client a unei forme (Forml):
68
procedure TForml.ButtonlClick(Sender: TObject);var h :integer;
beginh := Forml.ClientHeight;Forml .ClientHeight := Forml.ClientWidth;Forml.Clientwidth := h;
end;La apăsarea cu număr de ordine par, forma va avea dimensiunile ei originale.
P7. Position
property Position: TPosition;
Specifică dimensiunile şi poziţia pe care o va avea o formă pe ecran. Valorile posibile pentru Position sunt:
V a lo a re S em n ifica ţie
poD esigned Form a va apare pe ecran în aceeaşi poziţie şi cu aceleaşi d im ensiuni ca şi cele setate la tim pul proiectării ei.
poD efault W indow s-ul alege poz iţia şi d im ensiunea formei.
poDefauhPosOnly W indow s-ul va alege doar p oz iţia fo rm ei, d im ensiunile răm ânând cele setate la tim pul pro iectării ei.
poDefaultSizeOnly W indow s-ul va alege doar dim ensiunile form ei, poziţia răm ânând cea de la proiectare.
poScreenCenter Form a va avea poziţie centrală pe ecran şi d im ensiunile pe care le avea de la proiectare.
P8. Visible
property Visible: Boolean;
Specifică dacă o formă este vizibilă sau nu. Dacă Visible este true, atunci forma este vizibilă (asta în cazul în care nu este acoperită parţial sau total de către o altă formă). Dacă o aplicaţie are mai multe forme, atunci cele care au proprietatea Visible setată la true, vor fi vizibile (sau parţial vizibile dacă sunt acoperite de alte forme), iar cele cu proprietatea Visible setată la false nu sunt vizibile.
P9. Menu
property Menu: TMainMenu;
Specifică meniul unei forme. Dacă pe formă sunt adăugate mai multe componente TMainMenu, atunci Menu va avea ca valoare prima dintre acestea.
69
P10. Icon
property Icon: TIcon;
Specifică iconul formei.
P ll . WindowState
property WindowState: TWindowState;
Specifică modul în care o formă apare pe ecran. Valori posibile pentru WindowState sunt:
V a lo a re S em n ifica ţie
wsNormal F orm a apare în stare norm ală (nici m in im izată nici m axim izată).
wsMinimized Form a apare în stare m inim izată.
wsMaximized Form a apare în stare m axim izată.
P12. FormStyle
property FormStyle: TFormStyle;
Indică stilul unei forme. Valori posibile pentru FormStyle sunt:
V a lo a re S em n ifica ţie
FsNormal Form a nu este nici o fereastră M DI părin te , nici M DI copil.
FsMDIChild Form a este o fereastră M DI copil.
FsMDIForm Form a este o fereastră M DI părinte.
FsStayOnTopForm ă răm âne afişată pe desktop deasupra tu tro r celorlalte form e care nu au p roprietatea FormStyle seta tă la această valoare.
P13. M odalResult
property ModalResult: TModalResult;
Specifică o valoare pentru care forma va fi închisă dacă este afişată ca modală. Pentru a închide forma, această valoare trebuie să fie mai mare decât 0 (mrNone). Valori posibile pentru ModalResult sunt:
V a lo a re S em n ifica ţie
mrNone V aloare im plicită. Nu are nici o sem nificaţie.
mrOk U tilizatorul a ieşit apăsând un buton de tip Ok.
mrCancel U tilizatorul a ieşit apăsând un buton de tip Cancel.
mrAbort U tilizato ru l a ieşit apăsând un buton de tip Abort.
mrRetry U tilizatorul a ieşit apăsând un buton de tip Retry.
70
V a lo a re S em n ifica ţie
mrIgnore U tilizatorul a ieşit apăsând un buton de tip Ignore.
mrYe.s U tilizatorul a ieşit apăsând un buton de tip Yex.
mrNo U tilizatorul a ieşit apăsând un buton de tip No.
mrAll U tilizatorul a ieşit apăsând un buton de tip AII.
P15. Canvas
property Canvas: TCanvas;
Furnizează acces la suprafaţa de desenare a formei.
Exemplu:
Următoarea aplicaţie desenează pe forma F orm l, la apăsarea butonului Buttonl, un segment de dreaptă:
procedure TForml.ButtonlClick(Sender: TObject); begin
Canvas.MoveTo(10, 10);Canvas.LineTo(100, 200);
end;
P16. PrintScale
property PrintScale: TPrintScale;
Indică modul în care va fi scalată forma pentru a fi tipărită la imprimantă. Valori posibile pentru PrintScale sunt:
V a lo a re S em n ifica ţie
PoNone N u are loc nici o scalare.
PoProportional Form a este scala tă astfel încâ t tipărită să a ibă cam aceleaşi dim ensiuni ca şi pe ecran.
PoPrintToFit Form a este scala tă astfel încât să încapă în pag ina pe care este tipărită.
P17. TransparentColor
property TransparentColor: Boolean;
Indică dacă una din culorile folosite la desenarea suprafeţei formei va fi afişată drept transparentă. Aceasta înseamnă că unele porţiuni din formă vor fi transparente, prin ele fiind vizibile alte ferestre. Această facilitate nu funcţionează însă decât pentru versiunile mai noi ale sistemului de operare (cel puţin Windows 2000).
71
P18. TransparentColorValue
property TransparentColorValue: TColor;
Indică culoarea transparentă a formei. Dacă se foloseşte o paletă pe 16 biţi atunci se pot folosi doar culori neamestecate.
PI 9. AlphaBlend
property AlphaBlend: Boolean;
Indică dacă forma este translucidă sau nu. Se permit grade diferite de transluciditate a formei (cu ajutorul proprietăţii AlphaBlendValue).
P20. AlphaBlendValue
property AlphaBlendValue: Byte;
Indică gradul de transluciditate al unei forme. Valoarea 255 indică o formă plină, iar valoarea 0 indică o formă complet invizibilă.
Metode___________________________________________
M l. Show
procedure Show;
Afişează forma. Show setează proprietatea Visible la true.
M2. Hide
procedure Hide;
Ascunde forma. Hide setează proprietatea Visible la false.
Exemplu:
Avem o aplicaţie cu două forme. Aceste forme vor fi create în ordinea adăugării lor la aplicaţie, iar în momentul în care lansăm aplicaţia în execuţie va deveni vizibilă prima formă creată (conform cu ordinea Z). Pe fiecare formă avem la dispoziţie câte un buton la a cărui apăsare forma pe care se află devine invizibilă, iar cealaltă devine vizibilă (activă). Handlerele de evenimente pentru cele două butoane vor arăta astfel:
72
Pentru Unit 1.p as handlerele de evenimente sunt:
procedure TForml.ButtonlClickfSender: TObject); begin
Hide;Form2.Show;
end;Pentru Unit2.pas handlerele de evenimente sunt:
procedure TForm2.ButtonlClick(Sender: TObject); begin
Hide;Forml.Show;
end;
M3. ShowM odal
function ShowModal: Integer;
Afişează forma ca formă modală. Asta înseamnă că utilizatorul trebuie să închidă această formă pentru ca aplicaţia să poată continua.
Exemplu:
Avem o aplicaţie care are două forme. Pe prima formă se află un buton la a cărui apăsare forma Form2 va fi afişată ca modală. Pe a doua formă se află o cutie de editare în care utilizatorul va introduce un text. După închiderea formei Form2, textul aflat în cutia de editare de pe ea va fi introdus în cutia de editare de pe forma F orm l:
Handlerele de evenimente din Unit 1.pas sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
Form2.ShowModal ;Editl.Text:=Form2.Editl.Text;
end;iar din unitl.pas sunt:
procedure TForm2.FormShow(Sender: TObject); begin
Editl.Clear;Editl.SetFocus;
end;Unit2.pas trebuie inclus în Unit 1.pas.
M4. CloseQuery
function CloseQuery: Boolean;
73
Returnează o valoare booleană pentru a specifica dacă o formă poate fi închisă sau nu.
M5. Close
procedure Close;
închide o formă. Dacă CloseQuery pentru o formă returnează false, atunci operaţia de închidere a formei nu este posibilă. în caz contrar este apelat evenimentul OnClose.
Observaţie:
închiderea formei principale a unei aplicaţii duce la terminarea aplicaţiei.
M6. Release
procedure Release;
Distruge o formă şi eliberează spaţiul de memorie ocupat de ea. Spre deosebire de Free, Release aşteaptă până în momentul în care execuţiile tuturor handlerelor de evenimente de pe formă sunt terminate.
M7. FocusControl
procedure FocusControl(Control: TWinControl);
Componenta Control devine noua valoare a proprietăţii ActiveControl.
M8. SetFocus
procedure SetFocus;
Face ca forma să devină activă. SetFocus apelează metoda SetFocus a controlului indicat de proprietatea ActiveControl.
M9. Print
procedure Print;
Tipăreşte forma.
Exemplu:
Următorea aplicaţie numără câte componente sunt pe formă. Pentru fiecare componentă se va afişa numele ei şi indexul în cadrul listei de componente.
74
Pentru a realiza acest program ne vom folosi de două cutii de editare: E d itl-pentru a afişa numărul componentelor, ListBoxl- pentru a afişa numele şi indexul unei componente în cadrul vectorului de componente (al formei). Afişările descrise mai sus se vor face la apăsare unui buton (Buttonl).
Unit 1.pas va fi conţine următoarele handlere de evenimente:
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;
beginEditl.Text:=IntToStr(ComponentCount); for i:=0 to ComponentCount doListBoxl.Items.Add(Components[i].Name+' '+IntToStr(Components[i].Componentlndex));
end;
Evenimente
El. OnActivate
property OnActivate: TNotifyEvent;
Apare când forma este activată (primeşte focus).
E2. OnDeactivate
property OnDeactivate: TNotifyEvent;
Apare când forma pierde focus-ul (nu mai este activă).
E3. OnShow
property OnShow: TNotifyEvent;
Apare când proprietatea Visible este setată la valoarea true.
E4. OnHide
property OnHide: TNotifyEvent;
Apare când proprietatea Visible este setată la valoarea false.
E5. OnResize
property OnResize: TNotifyEvent;
Apare când forma este redimensionată.
75
E6. OnClose
property OnClose: TCloseEvent;
Apare când forma este închisă. Tipul TCloseEvent este definit astfel:
TCloseEvent = procedure{Sender: TObject;var Action: TCloseAction) of object;
Action indică ce acţiune va fi întreprinsă în momentul în care forma este închisă. Valori posibile pentru Action sunt:
V a lo a re S em n ifica ţie
caNone Form a nu este închisă.
vaHide Form a nu este înch isă ci doar ascunsă.
caMinimize Form a nu este înch isă ci doar m inim izată.
caFree Form a este închisă şi m em oria a locată este eliberată.
O bservaţie:
Dacă forma care se închide nu este forma principală a aplicaţiei atunci, la închidere, Action are valoarea cciHide.
Exemplu:
Dorim să realizăm o aplicaţie care să nu poată fi închisă decât dacă cutia de editare E ditl conţine şirul de caractere ‘12345’. Pentru aceasta handlerul de evenimente OnClose va conţine:
procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);
beginif Editl.Text <> '12345'
then Action := caNone;end;
E8. OnCreate
property OnCreate: TNotifyEvent;
Apare când forma este creată.
E9. OnDestroy
property OnDestroy: TNotilylivent;
Apare când forma este distrusă.
76
E10. OnPaint
property OnPaint: TNotifyEvent;
Apare când forma este redesenată.
7. BUTOANE
Butoanele sunt cele mai frecvente componente utilizate într-o aplicaţie Windows.
Cel mai simplu tip de buton este TButton. El are o etichetă definită de proprietatea Caption. Cele mai multe operaţii şi acţiuni sunt executate la apăsarea unui buton. Codul care se execută la apăsarea unui buton trebuie scris în interiorul handlerului de evenimente OnClick.
TBitBtn este un buton pe suprafaţa căruia se poate desena o imagine. Aceasta va fi specificată prin intermediul proprietăţii Glyph.
Butoanele de tip TSpeedButton pot fi grupate în aşa fel încât, la un moment dat, mai multe dintre ele să se găsească în starea apăsat.
TUpDown este o componentă alcătuită din două butoane folosite pentru a incrementa şi decrementa o valoare numerică. Această valoarea poate fi afişată într-o cutie de editare ataşată controlului prin intermediul proprietăţii Associate.
Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TButtonControl -> TButton.
Definit în_____________________________________________________
stdctrls.pas
Pagina_______________________________________________________
Standard.
Proprietăţi___________________________________________________
PI. Cancel
property Cancel: Boolean;
Indică dacă butonul este sau nu de tip Cancel. Dacă este un buton Cancel, atunci la apăsarea tastei d is c • se execută handlerul de eveni
78
mente asociat lui OnClick. Mai multe butoane de pe o aceeaşi formă pot fi în acelaşi timp butoane Cancel. în acest caz, la apăsarea tastei <Esc>, primului buton de tip Cancel vizibil i se va executa handlerul de evenimente asociat evenimentului OnClick.
P2. Default
property Default: Boolean;
Indică dacă butonul este sau nu de tip Default. Dacă este un buton Default, atunci la fiecare apăsare a tastei Enter, se execută handlerul de evenimente asociat lui OnClick. Excepţie de la aceasta se face în momentul în care un alt buton are focus (pe el este desenat punctat un dreptunghi), în acest caz executându-se handlerul asociat butonului selectat. Dar, în cazul în care nici un buton nu este selectat, sau un alt control este activ, la apăsarea tastei Enter se execută handlerul de evenimente asociat butonului Default. Cazul cu mai multe butoane Default este tratat ca şi cazul cu mai multe butoane Cancel.
P3. M odalResult
property ModalResult: TModalResult;
Indică dacă şi cum închide butonul forma (modală) părinte. Când butonul este apăsat, proprietatea ModalResult a formei părinte este setată la aceeaşi valoare ca şi proprietatea ModalResult a butonului.
Metode
M l. Click
procedure Click;
Simulează execuţia unui click pe care utilizatorul l-ar fi executat. Han- dlerele asociate cu evenimentul OnClick sunt de asemenea executate.
Exemplu:
Următoarea aplicaţie foloseşte un buton TButton şi o cutie TColorDialog. La apăsarea butonului, cutia va fi deschisa. Se va putea alege o culoare care va deveni culoarea formei.
79
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
if ColorDialogl.Execute then Forml.Color:=ColorDialogl.Color;
end;
7.2. TBitBtn
Este un buton pe suprafaţa căruia se poate desena o imagine.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TButtonControl -> TButton -> TBitBtn.
Definit în_____________________________________________________
buttons.pas
Pagina______________________________________________________
Additional.
Proprietăţi___________________________________________________
PI. Glyph
property Glyph: TBitmap;
Specifică imaginea de pe suprafaţa unui buton. Glypli poate conţine un bitmap care, la rândul lui, poate conţine maxim patru imagini care vor fi puse pe buton în cele patru situaţii în care acesta se poate găsi:
• prima imagine din listă se va pune pe buton atunci când acesta este neselectat;
• a doua imagine va li pusă pe bulon atunci când acesta nu este accesibil utilizatorului;
• a treia imagine va li pusă atunci când butonul este apăsat;• a patra imagine este pusă când butonul se allă în starea apăsat,
indicând că respectiva opţiune esle încă selectată.
Cele maxim patru imagini pe care le poale conţine bitmap-ul ataşat lui Glyph sunt de aceeaşi dimensiune şi sunt dispuse pe orizontală în cadrul bitmap-ului respectiv.
80
P2. NumGlyphs
property NumGlyphs: TNumGlyphs;
Indică numărul de imagini care se găsesc în bitmap-ul proprietăţii Glyph.
P3. Kind
property Kind: TBitBtnKind;
Indică tipul butonului. Valorile pe care le poate lua Kind împreună cu descrierea, eticheta, ModalResult şi descriere imagine sunt următoarele:
Valoare bkA bort
Semnificaţie Buton de tip Cancel.
Etichetă A bort
ModalResult m rA bort
Descriere imagine Un X roşu apare lângă titlu.
Valoare bkAll
SemnificaţieB uton OK. cu e ticheta AII. Toate schim bările apărute pe form a care conţine acest buton sunt acceptate, iar apoi fo rm a este închisă.
Etichetă AII
ModalResult m rA ll
Descriere imagine Un sem n dublu de bifare apare lângă titlu.
Valoare bkC ancel
Semnificaţie B uton de tip Cancel.
Etichetă C ancel
ModalResult m rC ancel
Descriere imagine Un X roşu apare lângă etichetă.
Valoare bkC lose
Semnificaţie B uton de tip Default.
Etichetă Close
ModalResult m rC lose
Descriere imagine O uşă de culoarea levănţicii cu un sem n verde de ieşire deasupra.
Valoare bklgnore
81
SemnificaţieC rează un buton fo losit pentru a ignora schim bările şi pentru a con tinua cu o acţiune specificată.
Etichetă Ignore
ModalResult m rlgnore
Descriere imagine U n om co lo ra t în verde p lecând.
Valoare bkH elp
Semnificaţie
Buton cu e tichcta Help. C ând u tilizatorul apasă acest buton fişierul help ataşat acestei aplicaţii devine activ. F işierul de H elp este specificat în p roprietatea HelpFile a lui TAplication.
Etichetă Help
ModalResult m rH elp
Descriere imagineUn sem n de întrebare albastru apare lângă titlu. Folosiţi handlerul de evenim ente al acestui buton pen tru a apela un fişier Help.
Valoare bkC ustom
Semnificaţie0 puteţi folosi pentru a vă crea propriul dum neavoastră buton, pe care să specificaţi o im agine.
Etichetă
ModalResult
Descriere imagine
Valoare bkR etry
SemnificaţieForm a nu este închisă, datele introduse de utilizator fiind incorecte.
Etichetă Retry
ModalResult m rR etry
Dcscricre imagine O săgeată circu lară verde.
Valoare bkOK
Semnificaţie Bulon dc lip Default.
Etichetă OK
ModalResult mrOK
Descriere imagine Un sem n verde dc hilare.
82
Valoare bkN o
SemnificaţieButon de tip Cancel. N ici una d in sch im bările care au in tervenit pe form a care conţine acest buton nu sunt acceptate, iar form a este închisă.
Etichetă No
ModalResult m rN o
Descriere imagine Un cerc roşu tăiat.
Valoare bkY es
Semnificaţie B uton de tip Default.
Etichetă Yes
ModalResult m rY es
Descriere imagine Un sim plu sem n de bifare.
Exemplul 1:
Să creăm o aplicaţie cu două forme. Pe prima formă se află un singur buton (B utton l) la a cărui apăsare forma Form2 este afişată modală. Dorim să determinăm cum a fost închisă forma Form2.
Handlerul de evenimente pentru evenimentul OnClick al butonului Buttonl de pe forma F orm l este următorul:
procedure TForml.ButtonlClick(Sender: TObject);var a:integer;
begina;=Form2.ShowModal; case a ofmrOk : ShowMessage('Form2 a fost inchisa prin Ok.1); mrCancel : ShowMessage(1Form2 a fost inchisa
prin Cancel.');end;
end;Pe forma Form2 am aşezat două butoane de tip TButton. La apăsarea primului buton (B utton l) forma Form2 va primi valoarea modală mrOk, iar la apăsarea lui Button2 va primi valoarea modală mrCancel. După atribuirea uneia dintre cele două valori forma Form2 se va închide.
Handlerele de evenimente pentru forma Form l sunt:
procedure TForm2.ButtonlClick(Sender; TObject); beginModalResult:=mrOk;
end;
83
procedure TForm2.Button2Click(Sender: TObject); begin
ModalResult:=mrCancel ; end;
Exemplul 2:
Dacă foloseam butoane de tip TBitBtn pentru forma Form2 din Exemplul 1, nu mai trebuia să scriem nici un rând de cod sursă pentru forma Form2. în locul butoanelor Buttonl şi Button2 folosim două butoane de clasă TBitBtn la care setăm proprietatea Kind astfel:
object BitBtnl: TBitBtn Kind = bkOK
endobject BitBtn2: TBitBtn Kind = bkCancel
end
P4. Layout
property Layout: TButtonLayout;
Indică amplasamentul imaginii faţă de textul afişat pe buton. Valori posibile pentru Layout sunt:
Valoare Semnificaţie
BIGlyphLef Im aginea apare la stânga textului.
BIGlyphRight Im aginea apare la d reapta textului.
BlGlypliTop Im aginea apare deasupra textului.
BtGlyphBollimi Im aginea apare sub text.
P5. Spacing
property Spacing: Integer;
Indică numărului de pixeli dintre textul şi imaginea de pe buton. Dacă este selectat 0 atunci imaginea începe chiar lângă text. Dacă va fi selectat -1 sau numere mai mici decât -1 atunci imaginea şi textul vor fi centrate.
P6. Margin
property Margin: Integer;
Indică numărului de pixeli dintre margine şi imaginea de pe buton. Dacă este selectat 0 atunci imaginea începe chiar din margine. Dacă va fi selectat -1 sau numere mai mici decât I atunci imaginea va li centrată.
Este un buton care introduce proprietăţi ce permit lucrul în comun a mai multor componente de acest tip.
Ierarhie _____________ ____________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TSpeedButton.
Definit în __________ ____________________________________
buttons.pas
Pagina __________________________________________
Additional.
Proprietăţi___________________________________________________
PI. Glyph
property Glyph: TBitmap;
Specifică imaginea de pe suprafaţa unui buton. Glyph poate conţine un bitmap care, la rândul lui, poate conţine maxim patru imagini, care vor fi puse pe buton în cele patru situaţii în care acesta se poate găsi:
• prima imagine din listă se va pune pe buton atunci când acesta este neselectat;
• a doua imagine va fi pusă pe buton atunci când acesta nu este accesibil utilizatorului;
• a treia imagine va fi pusă atunci când butonul este apăsat;• a patra imagine este pusă când butonul se află în starea apăsat,
indicând că respectiva opţiune este încă selectată.
Cele maxim patru imagini pe care le poate conţine bitmap-ul ataşat lui Glyph sunt de aceeaşi dimensiune şi sunt dispuse pe orizontală în cadrul bitmap-ului respectiv.
P2. NumGlyphs
property NumGlyphs:
Indică numărul de imagini care se găsesc în bitmap-ul proprietăţiiGlyph.
85
P3. Layout
property Layout: TButtonLayout;
Indică poziţia imaginii faţă de textul afişat pe buton. Valori posibile pentru Layout sunt:
Valoare Semnificaţie
BIGlyphLeft Im aginea apare la stânga textului.
BIGlyphRight Im aginea apare la d reap ta textului.
BIGlyphTop Im aginea apare deasupra textului.
BIGlyphBottom Im aginea apare sub text.
P4. Margin
property Margin: Integer;
Indică numărului de pixeli dintre margine şi imaginea de pe buton. Dacă este selectat 0, atunci imaginea începe chiar din margine. Dacă va fi selectat -1 sau numere mai mici decât -1 atunci imaginea va fi centrată.
P5. Spacing
property Spacing: Integer;
Indică numărului de pixeli dintre textul şi imaginea de pe buton. Dacă este selectat 0 atunci imaginea începe chiar lângă text. Dacă va fi selectat -1 sau numere mai mici decât -1 atunci imaginea şi textul vor fi centrate.
P6. Grouplndex
property Grouplndex: Integer;
Permite butoanelor să lucreze împreună ca un grup. Dacă Grouplndex este 0, atunci butonul se comportă independent de celelalte butoane. Dacă Grouplndex este mai mare decât zero, atunci butoanele vor fi grupate. Apăsarea unuia dintre acestea va duce automat la deselectarea (ridicarea) celorlalte din acelaşi grup. Mai multe informaţii găsiţi la proprietatea AllowAllUp.
P7. AllowAllUp
property AllowAllUp: Boolean;
Indică dacă toate butoanele din acelaşi grup pot fi neselectate în acelaşi timp. Dacă AllowAllUp este false, atunci, în fiecare moment, cel puţin
86
un buton din grup este apăsat (jos). Setarea valorii lui AllowAllUp pentru un buton din grup va duce la setarea, cu aceeaşi valoare, a proprietăţii AllowAllUp, pentru toate butoanele din grup.
P8. Down
property Down: Boolean;
Indică dacă un buton este jos.
7.4. TUpDown
Este un control ce conţine două săgeţi folosite pentru a incrementa sau decrementa o valoare numerică. Acest control se poate asocia cu alt control, de exemplu cu o cutie de editare, pentru ca valoarea numerică (care poate fi incrementată sau decrementată) să poată fi vizualizată.
I e r a r h i e __________________________________________
TObject -> TPersistent ->TComponent->TControl-> TWinControl ->-> TCustomUpDown -> TUpDown.
Definit în_____________________________________________________
comctrls.pas
Pagina_______________________________________________________
Win32
Proprietăţi___________________________________________________
PI. AlignButton
property AlignButton: TUDAlignButton;
Determină poziţia controlului UpDown faţă de controlul cu care este asociat. Valori posibile pentru AlignButton sunt:
udLeft - controlul UpDown se aliniază la partea din stânga a controlului asociat lui;
udRight - controlul UpDown se aliniază la partea din dreapta a controlului asociat lui.
87
P2. Associate
property Associate: TWinControl;
Specifică un control (de tip fereastră) care este asociat cu controlul UpDown. în această fereastră se va afişa valoarea numerică pe care controlul UpDown o poate modifica (incrementa sau decrementa). De exemplu, pentru a asocia un control UpDown (U pD ow nl) cu o cutie de editare (E d itl) scriem linia (sau lucrăm de la Object Inspector):
U pD ow n->A ssociate=E ditl;
Astfel, la lansarea în execuţie a aplicaţiei, în partea dreaptă (implicit) a cutiei de editare (E ditl) ne va apare un control de tip UpDown, iar în interiorul cutiei Editl va apare cifra 0 (implicit) care poate fi mărită sau micşorată la fiecare apăsare a săgeţilor controlului UpDown.
P3. Position
property Position: Smalllnt;
Indică valoare curentă care este reglată de controlul TUpDown. Dacă controlul are asociată o cutie de editare, atunci valoarea lui Position este cea afişată în respectiva cutie de editare, deci din interiorul cutiei poate fi prelucrată prin intermediul proprietăţii Text a Jui TEdit.
P4. Increment
property Increment: Integer;
Indică numărul de unităţi adăugate sau scăzute la valoarea lui Position , în urma unei apăsări a săgeţilor controlului TUpDown. Valoarea implicită este 1.
P5. Max
property Max: Smalllnt;
Indică valoarea maximă pe care o poate lua Position.
P6. Min
property Min: Smalllnt;
Indică valoarea minimă pe care o poate lua Position.
88
P7. Orientation
property Orientation: TUDOrientation;
Specifică orientarea controlului. Valori posibile pentru Orientation sunt:
V a lo a re S em n ifica ţie
UdHorizontal C ontro lu l este a lin ia t orizontal.
UdVertical C ontro lu l este am plasat vertical.
Exemplu:
Următorul exemplu foloseşte o cutie TfileListBox (care listează fişierele din directorul curent), o cutie de editare (Edit2) care conţine numele fişierului selectat, un control TUpDown şi o cutie de editare E ditl (care este ataşată controlului TUpDown). Fişierul curent selectat este cel cu numărul de ordine egal cu valoarea proprietăţii Position, deci la apăsarea butoanelor controlului TUpDown se modifică fişierul selectat. Totodată utilizatorul poate selecta el însuşi un fişier (cu ajutorul mouse-ului) modificând astfel valoarea lui Position.
Valorile proprietăţilor obiectului U pDownl sunt:
object UpDownl: TUpDown Associate = Editl Min = 0 Position = 0
end
Handlerele de evenimente pentru Form l sunt:
procedure TForml .UpDownlClick(Sender: TObject;Button: TUDBtnType);
beginFileListBoxl.Itemlndex:=StrToInt(Editl.Text);Edit2.Text:=
FileListBoxl.Items.Strings[FilelistBoxl.Itemlndex];end;
procedure TForml.FormCreate(Sender: TObject); beginUpDownl.Max:=FileListBoxl.Items.Count-1;Edit2.Text:=FileListBoxl.Items.Strings[ 0 ] ;FileListBoxl.Itemlndex:= 0;
end;
procedure TForml.FileListBoxlClick(Sender: TObject); beginUpDownl.Position:=FileListBoxl.Itemlndex;Edit2.Text:=
FileListBoxl.Items.Strings [FileListBoxl .Itemlndex]
89
end;
P8. Wrap
property Wrap: Boolean;
Specifică ce se întâmplă cu valoarea lui Position dacă aceasta este incrementată peste valoarea lui Max, sau decrementată sub valoarea lui Min. Dacă Wrap este true, atunci Position - dacă este incrementat peste valoarea lui Max - ia valoarea lui Min, - iar dacă este decrementat sub valoarea lui Min - ia valoarea lui Max. Dacă Wrap este false, atunci incrementarea/decrementarea valorii lui Position peste/sub Max/Min nu va duce la modificarea acesteia.
P9. ArrowKeys
property ArrowKeys: Boolean;
Specifică dacă controlul reacţionează la comenzile lansate de la săgeţile tastaturii. Dacă este selectat true, atunci - în cazul în care este asociat cu un alt control (de exemplu cu TEdit) - controlul răspunde la comenzile săgeţilor sus-jos ale tastaturii. Dacă este selectat false, atunci asupra controlului se poate acţiona doar cu mouse-ul.
90
8. ETICHETE
Sunt componente folosite pentru afişarea unui text pe formă. Şirul afişat este stocat de proprietatea Caption.
Etichetele sunt folosite şi pentru a indica utilitatea altor componente. Spre exemplu, etichetele se pot amplasa lângă (deasupra sau la stânga) componentelor TEdit pentru a indica utilizatorului ce trebuie introdus în cutia de editare TEdit.
Există două tipuri de etichete: TLabel şi TStciticText.TLabel derivă din TGrapliicControl deci programatorul are acces la
suprafaţa de desenare a acesteia.TStaticText derivă din TWinControl şi deci are un handle de fereastră.
8.1. TLabel A
Este un control fără fereastră folosit pentru a afişa text pe o formă. Acest text poate fi folosit pentru a eticheta alte componente.
Atribuirea unei valori proprietăţii Caption este echivalentul desenării unui text pe componenta părinte.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TCustomLabel -> TLabel.
Definit în_____________________________________________________
stdctrls.pas
Pagina_______________________________________________________
Standard
Proprietăţi___________________________________________________
PI. Alignment
property Alignment: TAlignment;
91
Controlează aliniamentul textului faţă de marginile din stânga respectiv dreapta ale etichetei. Valori posibile pentru Alignment sunt:
V a lo a re S em n ifica ţie
taLeftJustify T extu l apare a lin ia t de-a lungul m arginii stângi a etichetei.
taRiglitJustify T extul apare alin iat de-a lungul m arginii d rep te a etichetei.
taCenter T extul apare centra t faţă de etichetă.
P2. AutoSize
property AutoSize: Boolean;
Indică dacă dimensiunile etichetei se modifică automat, în funcţie de dimensiunea textului. Dacă AutoSize este false, atunci eticheta are dimensiuni fixe, în caz contrar aceasta se poate acomoda în funcţie de înălţimea şi lăţimea textului.
P3. FocusControl
property FocusControl: TWinControl;
Indică componenta asociată cu această etichetă. Dacă este specificat un accelerator pentru etichetă, atunci, la apăsarea lui, controlul FocusControl va primi focus. Un accelerator se specifică prin amplasarea unui ampersand (&) înainte de un caracter din textul ataşat etichetei. Acest caracter va fi subliniat.
P4. ShowAccelChar
property ShowAccelChar: Boolean;
Indică cum este interpretat un ampersand. Dacă ShowAccelChar este true, atunci orice caracter precedat de un ampersand va fi afişat subliniat, iar ampersandul respectiv nu va fi afişat. Pentru a afişa un ampersand când ShowAccelChar este true, scrieţi doi ampersanzi unul lângă altul (&&). Dacă FocusControl are atribuită o valoare, atunci, la apăsarea literei subliniate, controlul va fi trecut la FocusControl.
Exemplu:
Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate un buton (Buttonl), o cutie de editare (Edit l ) şi două etichete (L abel!, Label2) folosite pentru a trece focus-ul de la E ditl la Buttonl (cu ajutorul acceleratorului lui Labei!) şi invers (cu ajutorul acceleratorului lui Label2). Titlurile etichetelor vor fi Label1 şi Label2; la prima etichetă vom avea subliniată litera 'L', iar la cea de-a doua litera 'a'.
92
D acă focus-ul se află la cutia de editare şi utilizatorul doreşte să treacă controlul la buton, atunci o simplă apăsare a literei subliniate (în cazul nostru este litera 'L') nu este suficientă, deoarece acest lucru va fi interpretat ca introducerea unui text în cutia de editare. Pentru ca totuşi controlul să fie transferat la buton este necesară apăsarea combinaţiei de taste Alt+LiteraSubliniată. Dacă controlul se află la buton şi se doreşte trecerea la cutia de editare, atunci simpla apăsare a literei subliniate va produce schimbarea focus-ului.
Valorile proprietăţilor componentelor Labell şi Label2 sunt:object Labell: TLabel
Caption = 'iLabell'FocusControl = Buttonl
endobject Label2: TLabel Caption = 'L&abel2'FocusControl = Editl
end
Observaţie:
De obicei, un buton nu are nevoie de o etichetă separată, proprietatea Caption fiind propria lui etichetă. Dacă dorim să executăm codul ataşat evenimentului unui buton, atunci setăm unul dintre caracterele din şirul proprietăţii Caption ca tastă de accelerare. La apăsarea acelei taste (sau a combinaţiei Alt+Tastă dacă focusul se află curent într-o cutie de editare) se va executa handlerul de evenimente al butonului respectiv. Spre exemplu, considerând valorile proprietăţilor obiectelor de pe formă setate astfel:
object Label2: TLabel Caption = '&Label2'FocusControl = Editl
endobject Buttonl: TButton Caption = '&Buttonl'OnClick = ButtonlClick
endiar handlerul evenimentului OnClick al butonului B u tton l:
procedure TForml.ButtonlClick(Sender: TObject); begin
ShowMessage('Am fost apasat'); end;
atunci la apăsarea tastei <b>, respectiv <Alt>+<b>, se va executa handlerul pentru evenimentul OnClick.
93
P5. Transparent
property Transparent: Boolean;
Specifică dacă ceea ce se află în spatele etichetei poate fi văzut de utilizator prin aceasta. Această proprietate este utilă la desenarea unui text pe o imagine. Se poate folosi fie metoda TextOut a lui Canvas, fie se poate aşeza o etichetă care are proprietatea Transparent setată la valoarea false.
Exemplu:
Deoarece TLabel derivă din TGraphicControl, înseamnă că avem acces la suprafaţa ei de desenare (Canvas). Următoarea aplicaţie desenează - la apăsarea unui buton - o elipsă delimitată de marginile etichetei.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Label1: TLabel Width = 134
endobject Buttonl: TButton
Caption = 'Deseneaza!' end
Handlerele de evenimente ale componentelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
with Label1.Canvas do begin
Pen.Color := clRed;Ellipse(0,0,Label1.Width,Label1.Height);Canvas.Pen.Color := clBlack;
Este un control care afişează un text pe o formă. Spre deosebire de TLabel, componenta TStaticText are propria ei fereastră (adică derivă din TWinControl).
end;end;
8.2. TStaticText
Ierarhie
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomStaticText -> TStaticText.
94
Definit în
stdctrls.pas
Pagina
Additional
Proprietăţi___________________________________________________
PI. Alignment
property Alignment: TAlignment;
Controlează aliniamentul textului faţă de marginile din stânga respectiv dreapta ale etichetei. Valori posibile pentru Alignment sunt:
V a lo a re S em nifica ţie
taLeftJustify Textul apare a lin iat de-a lungul m arginii stângi a etichetei.
taRightJustify T extul apare aliniat de-a lungul m arginii drepte a etichetei.
taCenter Textul apare centrat faţă de etichetă.
P2. AutoSize
property AutoSize: Boolean;
Indică dacă dimensiunile etichetei se modifică automat, în funcţie de dimensiunea textului. Dacă AutoSize este false, atunci eticheta are dimensiune fixe, în caz contrar aceasta se poate acomoda în funcţie de înălţimea şi lăţimea textului.
P3. BorderStyle
property BorderStyle: TStaticBorderStyle;
Indică felul în care apar marginile controlului. Valori posibile pentru BorderStyle sunt:
V a lo a re S em n ifica ţie
sbsNone Nu apare nici o m argine.
sbsSingle M argine form ată d intr-o singură linie.
sbsSunken M argine scufundată.
P4. FocusControl
property FocusControl: TWinControl;
95
Este controlul asociat cu această etichetă. Dacă este specificat un accelerator pentru etichetă, atunci, la apăsarea lui, controlul FocusControl va primi focus. Un accelerator (sau tastă de accelerare) se specifică prin amplasarea unui ampersand înainte de un caracter din textul ataşat etichetei. Acest caracter va fi subliniat.
ShowAccelChar
property ShowAccelChar: Boolean;
Indică cum este interpretat un ampersand. Dacă ShowAccelChar este true, atunci orice caracter precedat de un ampersand (&) va fi afişat subliniat, iar ampersandul respectiv nu va fi afişat. Pentru a afişa un ampersand când ShowAccelChar este true, scrieţi doi ampersanzi unul lângă altul (&&). Dacă şi FocusControl are atribuită o valoare, atunci, dacă utilizatorul apasă litera subliniată, controlul va fi trecut la FocusControl.
9. CUTII DE EDITARE
Cutiile de editare sunt componente folosite pentru preluarea unui text introdus de către utilizator. Uneori sunt folosite pentru afişarea unui text ce poate fi apoi editat.
Cutiile de editare pot fi împărţite după mai multe criterii:
a. După numărul de linii în care se introduce textul:
- cu o singură linie (TEdit, TMaskEdit)
Utilizatorul poate introduce un text pe o singură linie. Se poate accesa textul afişat în cutia de editare folosind proprietatea Text.
- multilinie (TMemo, TRichEdit)
Utilizatorul poate introduce text pe mai multe linii. Textul din cutia de editare este stocat sub forma unei liste de şiruri (obiecte de tipul TStrings).
b. După felul textului:
- neformatat (TEdit, TMemo, TMaskEdit);
- formatat (TMaskEdit, TRichEdit)
Utilizatorul poate specifica atributele unei porţiuni din textul introdus.
9.1. TStrings
Este o clasă abstractă reprezentând o listă de şiruri de caractere.Metodele şi proprietăţile abstracte introduse de TStrings sunt implemen
tate în clasa TStringList.
Ierarhie______________________________________________________
TObject -> TPersistent -> TStrings.
Definit în____________________________________________________
classes.pas
97
Proprietăţi___________________________________________________
P I. Count
property Count: Integer;
Indică numărul de şiruri din listă. Este o proprietate abstractă care trebuie implementată de către clasele derivate.
P2. Strings
property Strings[/ndex: Integer]: string;
Strings referă şirul cu numărul de ordine Index din listă. Primul şir are indexul 0.
P3. Text
property Text: string;
Text este un şir obţinut prin concatenarea tuturor şirurilor din listă. Şirurile componente sunt delimitate între ele prin CR (Carriage Return) şi LF (Line Feed).
P4. CommaText
property CommaText: string;
CommaText concatenează toate şirurile în unul singur în format SDF (System Data Format). în formatul SDF, şirurile sunt despărţite prin virgulă.
Exemplu:
Pentru a evidenţia diferenţa dintre proprietăţile Text şi CommaText, vom considera următorul exemplu: la apăsarea unui buton, vom afişa într-o cutie de editare conţinutul unei componente TMemo folosind, la alegere dintr-un TRadioGroup, aceste două proprietăţi.
Valorile proprietăţilor obiectelor de pe formă sunt:
object Memol: TMemo Lines.Strings = (
'Istorie''Geografie''Limba Romana''Informatica 1 'Educaţie Fizica')
end
98
object Editl: TEdit Text = 'Editl'
endobject BitBtnl: TBitBtn OnClick = BitBtnlClick
endobject RadioGroupl: TRadioGroup Caption = 'Proprietatea folosita'Items.Strings = (
'Text''CommaText')
TabOrder = 3 end
Când folosim proprietatea Text în cutia de editare ne va apare:
Istorie||Geografie||Limba Romana||Informatica||Educatie Fizica,
unde '||' semnifică caracterele CR şi LF.Dacă folosim proprietatea CommaText, în cutia de editare ne va apare:
Istorie,Geografie,"Limba Romana",Informatica,"Educaţie Fizica".
O bservaţie:
Spre deosebire de proprietatea Text, proprietatea CommaText separă prin virgula şirurile existente, iar dacă unul dintre şiruri este format din mai mult de un cuvânt (chiar şi un cuvânt urmat de caracterul spaţiu) îl încadrează între ghilimele. De asemenea, dacă în şir sunt conţinute ghilimele, acestea se vor dubla. Dacă două virgule apar una după alta, înseamnă că acolo se afla un şir vid, iar dacă după virgulă apare un spaţiu, acesta este ignorat.
Metode
M l. Add
function Add(const 5: string): Integer; virtual;
Adaugă un şir la sfârşitul listei şi întoarce numărul lui de ordine în această listă.
M2. AddStrings
procedure AddStrings(5îwigj: TStrings); virtual;
Adaugă o mulţime de şiruri (un alt obiect de tip TStrings) la sfârşitul listei curente.
99
M3. Append
procedure Append(const S: string);
Adaugă un şir la sfârşitul listei. Această metodă este asemănătoare cu Add, singura diferenţă este că Append nu returnează numărul de ordine al şirului adăugat.
M4. Clear
procedure Clear; virtual; abstract;
Goleşte o listă cu stringuri. Descendenţii lui TStrings trebuie să implementeze această metodă pentru a şterge şirurile din listă.
M5. Delete
procedure Delete(Index: Integer); virtual; abstract;
Şterge şirul cu numărul de ordine Index din listă.
M6. Equals
function Equals(S'm/ig.v: TStrings): Boolean;
Determină dacă două liste de şiruri sunt egale. întoarce true dacă cele două sunt identice. întoarce false în următoarele cazuri:
- numărul de şiruri din liste diferă,- două şiruri de pe aceeaşi poziţie diferă.
M7. Exchange
procedure Exchange(Indexl, Index2: Integer); virtual;
Schimbă între ele două şiruri din listă. Acestea sunt identificate prin poziţiile lor (Indexl şi Index2) în cadrul listei de şiruri.
M8. IndexOf
function IndexOf(const S: string): Integer; virtual;
Returnează numărul de ordine al unui şir în cadrul listei. Primul şir din cadrul listei are numărul de ordine 0. Dacă şirul nu se găseşte în listă se returnează valoarea -1.
100
M9. Insert
procedure Insert {Index: Integer; const S: string); virtual; abstract;
Inserează şirul S pe poziţia Index în cadrul listei.
M10. Move
procedure Move.(CurIndex, Newlndex: Integer); virtual;
Mută stringul de pe poziţia Curlndex pe poziţia Newlndex.
M II . LoadFromFile
procedure LoadFromFile(const FileName: string); virtual;
încarcă o listă de şiruri cu liniile unui fişier având numele FileName. Fiecare linie din fişier va fi un şir din listă.
M 12. SaveToFile
procedure SaveToFile(const FileName: string); virtual;
Salvează şirurile dintr-o listă într-un fişier cu numele FileName. Fiecare string din listă va fi pus pe o linie nouă în fişier.
9.2. TStringList
Implementează metodele şi proprietăţile abstracte ale lui TStrings. Totodată introduce metode şi proprietăţi noi.
Ierarhie
TObject -> TPersistent -> TStrings -> TStringList.
Definit în_____________________________________________________
classes.pas
Proprietăţi___________________________________________________
P I. Sorted
property Sorted: Boolean;
Indică dacă lista de şiruri este sortată automat. Dacă Sorted este false, atunci şirurile pot fi sortate crescător folosind metoda Sort. Dacă Sorted
101
este tru e atunci metoda Insert îşi pierde valabilitatea, în acest caz însă putând fi folosită metoda A dd care adăugă şirul pe poziţia corectă astfel încât listă să rămână tot ordonată.
P2. Duplicates
property Duplicates: TDuplicates;
Specifică dacă şiruri dubluri pot fi adăugate la o listă sortată. Valori posibile pentru această proprietate sunt:
V a lo a re S em n ifica ţie
duplgnore N u este perm isă adăugarea de duplicate în listă.
dupErrorA dăugarea în listă a unui şir de ja ex isten t generează o excepţie de clasă ElÂslError.
dupAccept Sunt acceptate dubluri de şiruri ale listei.
Metode______________________________________________________
M l. Sort
procedure Sort; virtual;
Sortează şirurile dintr-o listă care are proprietatea Sorted setată la valoarea false.
9.3. TEdit
Este un control care permite afişarea de text către utilizator sau permite preluarea textului pe care utilizatorul îl tastează.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomEdit -> TEdit.
Definit în_______________________________________________ _
stdctrls.pas
Pagina______________________________________________________
Standard
102
Proprietăţi
P I. Auto Select
property AutoSelect: Boolean;
Dacă AutoSelect este true, atunci în momentul în care cutia de editare devine activă, tot textul conţinut în ea va fi marcat (selectat), în caz contrar textul nu va fi marcat.
P2. AutoSize
property AutoSize: Boolean;
Determină dacă înălţimea cutiei de editare se acomodează cu textul din ea. Dacă AutoSize este true, dimensiunea cutiei se modifică dacă apare un eveniment care ar determina-o să facă acest lucru (de exemplu schimbarea mărimii fontului). Dacă AutoSize este false, atunci înălţimea cutiei este fixă.De exemplu, dacă AutoSize este false, schimbând mărimea fontului cu care este scris textul din interiorul cutiei (de exemplu la 20), aceasta va arăta în felul următor:
iar dacă AutoSize este true, la mărirea fontului cutia s-ar acomoda şi ea:
EditlP3. CharCase
property AutoSize: Boolean;
Determină tipul textului dintr-o cutie de editare. Valori permise pentru CharCase sunt:
Valoare Semnificaţie
ecLowerCa.se T extul este convertit au tom at la caractere mici.
ecUpperCase T extul este convertit la caractere mari.
ecNormal T extul este m ixt (caractere m ari şi mici).
Dacă proprietatea CharCase este setată la ecLowerCase, atunci tentativa de a scrie cu litere mari eşuează, caracterele fiind automat convertite la litere mici.
103
P4. HideSelection
property HideSelection: Boolean;
Indică dacă marcajul unui text mai este vizibil, după ce controlul este trecut la altă componentă. Dacă HideSelection este false, atunci chiar dacă controlul este la altă componentă, marcajul unui text din cutia de editare este în continuare vizibil.
P5. MaxLength
property MaxLength: Integer;
Specifică lungimea maximă pe care o poate avea un text dintr-o cutie de editare. Dacă această valoare este 0, atunci nu există limită privitoare la lungimea textului. în cazul în care lungimea textului introdus înainte de lansarea în execuţie a aplicaţiei care conţine cutia de editare cu pricina este mai mare decât MaxLength, textul nu va fi trunchiat. Dacă încercaţi să introduceţi un text de lungime mai mare decât MaxLength nu veţi fi lăsat. Folosiţi această facilitate pentru a copia text într-un şir de lungime fixă.
P6. M odified
property Modified: Boolean;
Indică dacă textul dintr-o cutie de editare a fost modificat.
P7. PasswordChar
property PasswordChar: Char;
Indică caracterul care va fi folosit pentru a fi afişat în locul altor caractere. Dacă PasswordChar conţine caracterul vid, atunci va fi afişat textul normal, în caz contrar fiecare caracter va fi înlocuit cu caracterul din PassswordChar. Această facilitate este folosită pentru ca un anumit text (parola) să nu fie văzut şi de alte persoane. Textul tastat poate fi manipulat, bineînţeles, cu proprietatea Text.
Exem plu:
Următoarea aplicaţie constă dintr-o cutie de editare (E ditl) în care utilizatorul trebuie să introducă o parolă. Pentru ca textul introdus să nu fie descifrabil setăm proprietatea PasswordChar a lui E ditl la valoarea
La apăsarea lui Buttonl se face validarea parolei.
104
Obiectele de pe forma Form l au setate următoarele proprietăţi:
object Editl: TEdit PasswordChar = ' * '
endobject Buttonl: TButton Default = True OnClick = ButtonlClick
endHandlerele de evenimente pentru Form l sunt:
procedure TForml.FormActivate(Sender: TObject) begin
Editl.Clear;Editl.SetFocus;
end;procedure TForml.ButtonlClick(Sender: TObject); begin
if Editl.Text=112345' then ShowMessage('Parola corecta') else ShowMessage('Parola incorecta');
end;După lansarea în execuţie a aplicaţiei controlul este trecut la cutia de editare E ditl în care trebuie introdusă parola.
P8. ReadOnly
property ReadOnly: Boolean;
Specifică dacă utilizatorul poate modifica textul dintr-o cutie de editare. Dacă ReadOnly este true, atunci utilizatorul poate doar citi acel text, fară a-1 putea modifica.
P9. SelLength
property SelLength: Integer;
Indică numărul de caractere care vor fi marcate (selectate), începând cu poziţia SelStart. Dacă SelLength + SelStart depăşeşte numărul de caractere existente, atunci vor fi marcate toate până la sfârşitul textului.
P10. SelStart
property SelStart: Integer;
Indică poziţia primului caracter ce va fi marcat. Primul caracter din text are poziţia 0. Dacă nu se atribuie lui SelLength o valoare, atunci SelStart va conţine poziţia cursorului.
105
P i l . SelText
property SelText: string;
SelText indică textul marcat. Citiţi această valoare pentru a afla textul marcat sau setaţi această valoare pentru ca textul marcat să fie înlocuit cu noul text.
Exemplu:
Următorul program foloseşte două cutii de editare (E ditl şi Edit2) şi un buton (Buttonl). La apăsarea acestuia, se selectează a doua jumătate a textului din cutia de editare E ditl şi se copiază în Edit2. La crearea formei se videază textele celor două cutii de editare.
Valorile proprietăţilor obiectelor de pe Form l sunt următoarele:
object Editl: TEdit Text = 'Editl'
endobject Edit2: TEdit Text = 'Edit2'
endobject Buttonl: TButton
Caption = 'Muta text selectat'OnClick = ButtonlClick
endHandlerele de evenimente pentru obiectele de pe forma Form l sunt:
procedure TForml.FormActivate(Sender: TObject); begin
Edi tl. Clear; II se videază prima cutie de editare ■Edit2 . Clear; // se videază a doua cutie de editareEditl. SetFocus; IIprim a cutie devine activa
end;procedure TForml.ButtonlClick(Sender: TObject); begin
Editl.SelStart:=(Length(Editl.Text)) div 2;/ / se poziţionează cursorul Ia jumatatea
II textului din prima cutie de editare Editl.Se1Length:=Length(Editl.Text);/ / se selectează a doua jum atate a textului Edit2 .Text: =edi tl . se.l text ;II se copiază textul selectat in a doua cutie de editare Editl.SelText:='';II din prima cutie de editare se şterge a II doua jum atate a textului
end;
106
Metode
M l. Clear
procedure Clear; virtual;
Şterge tot textul din cutia de editare.
M2. ClearSelection
procedure ClearSelection;
Şterge tot textul marcat din cutia de editare.
M3. CopyToClipboard
procedure CopyToClipboard;
Copiază textul marcat în ClipBoard.
M4. CutToClipboard
procedure CutToClipboard;
Copiază textul marcat în ClipBoard, iar apoi îl şterge din cutia de editare.
M5. PasteFrom Clipboard
procedure PasteFromClipboard;
înlocuieşte textul marcat cu textul din ClipBoard. Dacă nu există text marcat, atunci textul din ClipBoard este inserat la poziţia actuală a cursorului. Dacă în ClipBoard nu există nimic, atunci PasteFrom Clipboard nu face nimic.
Exem plu:
Următorul exemplu execută aceeaşi operaţie ca şi precedentul, dar de data aceasta transferul textului de la o cutie de editare la alta se face prin intermediul Clipboard-ului:
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g i n
Editl.SelStart:=Length(Editl.Text) d i v 2; IIselecţia incepe de laII juniatatea şirului
Editl. SelLength: =Length (Editl. Text) ; // se selectează textul pana la sfarsit Editl .CutToClipboard; IIse muta textul selectat in ClipBoardEdit2.Clear;Edit2 . PasteFromClipboard; // se muta textul din ClipBoard in Edit2
107
end;jTTll
procedure TFc? '''ormActivate (Sender: TObject); begin
E d i t l .Cle&{',Edit2 .Clea/^us.E d i t l . SetFt?
e n d ;
M 8. S e le c t^
p ro c e d ă H c tA ll ;
S e le c te d Marchează) tot textul dintr-o cutie de editare.
Exem plu:
Să con^c-Jî1' o aplicaţie care conţine un buton (B utton l) şi o cutie de editare^ fiecare având un Help Hint. Dacă dorim să atribuim câte un Helf componentelor E ditl şi Buttonl atunci trebuie să setăm valorile ^oarelor proprietăţi:
obiect i TEditHint # introduceţi un text’Text ^itl'
end 0u kobject , °nl: TButton Hint, 0n pasaţi 'Capt^ " 'Buttonl'
end
M 9. Undo
proced(,r ^ndo;
Reface ^ O cările stocate în buferul Undo.
M 10. C le a r l f l<l
proced1* ^-learUndo;
Şterge ^ 6fl)l Undo. Apelarea metodei Undo nu mai are nici un efect.
Exem plu:
U r m ă t / ^ aplicaţie implementează lucrul cu metodele Undo şi Clearl}1 forma aplicaţiei există o cutie de editare (E d itl) şi două butoan^ şi Buttonl). La apăsarea butonului Buttonl sunt refăcute *c£rile asupra textului din cutia de editare E ditl. La apăsarea
108
butonului Button2 este şters buferul Undo. în componenta StatusBarl sunt afişate stările buferului Undo.
object Editl: TEdit Text = 'Editl'
OnChange = EditlChangeendobject Buttonl: TButton Caption = 'Undo'Enabled = False OnClick = ButtonlClick
endobject StatusBarl: TStatusBar
Panels = o SimplePanel = True
endobject Button2: TButtonCaption = 'Clear Undo Buffer'Enabled = False OnClick = Button2Click
end
Handlerele de evenimente pentru obiectele de pe forma Form l sunt:var
NrSchimbari : integer;
procedure TForml.EditlChange(Sender: TObject); begin
inc (NrSchimbari ) ; //incrementez numărul schimbărilor din Editl / / si care sunt retinute in buferul Undo
StatusBarl.SimpleText := IntToStr(NrSchimbari) + ' Schimbări1;/ / afişez acest numărButtonl.Enabled := Editl.CanUndo;
/ / butonul de Undo devine disponibil pentru apasare Button2.Enabled := Editl.CanUndo;// cel puţin o modificare a avut loc, deci se poate şterge buferul Undo
end;
procedure TForml.ButtonlClick(Sender: TObject); begin
Edi 11. Undo; // anuleaza toate modificările din buferul UndoEdi 11. C1 earUndo; // si şterg continutul buferului UndoNrSchimbari := 0;StatusBarl.SimpleText := IntToStr(NrSchimbari)+ ' Schimbări'; Buttonl.Enabled := Editl.CanUndo;
//butonul de Undo nu mai este disponibil pentru apasare Button2.Enabled := Editl.CanUndo;// butonul pentru ClearlJndo nu mai este disponibil
end;procedure TForml.Button2Click(Sender: TObject); begin
Editl .ClearUndo; //golesc bufferul Undo
109
NrSchimbari := O;StatusBarl.SimpleText := IntToStr(NrSchimbari)+ ' Schimbări'; Buttonl.Enabled := Editl.CanUndo;
/ / butonul de Undo nu mai este disponibil pentru apasare Button2.Enabled ;= Editl.CanUndo;/ / butonul de ştergere a buferului Undo nu mai este disponibil
end;
Evenimente
E l. OnChange
property OnChange: TNotifyEvent;
Apare când textul din cutia de editare se schimbă.
Labei
9.4. TLabeledEdit ^
Reprezintă o cutie de editare care are asociată o etichetă.
Ierarhie_________________________________________________ ____
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomLabeledEdit->TLabeledEdit.
Definit în________________________________________________ _
ExtCtrls.pas
Pagina______________________________________________________
Additional.
Marea majoritate a proprietăţilor sunt comune cu ale componentelor TEdit şi TLabel. Câteva proprietăţi specifice doar componentei TLabeledEdit sunt descrise în continuare.
Proprietăţi_________________________________________________
PI. EditLabel
property EditLabel: TBoundLabel;
Este folosită pentru a specifica proprietăţile etichetei care este asociată
110
unei cutii de editare etichetate. Proprietăţi referitoare Ia titlul care apare în etichetă, la poziţia titlului în etichetă, la fontul utilizat, etc., pot fi setate din O bject Inspector.
P2. LabelPosition
property LabelPosition: TLabelPosition;
Specifică poziţia etichetei relativă la cutia de editare pentru o cutie de editare etichetată.Sunt posibile următoarele valori:
V a lo a re S em n ifica ţie
IpAbove E ticheta va fi poziţionată deasupra cutiei de editare.
IpBelow Eticheta va fi poziţionată sub cutia de editare.
IpLeft E ticheta va fi poziţionată în s tânga cutiei de editare.
IpRight E ticheta va fi poziţionată în d reapta cutiei de editare.
P3. LabelSpacing
p roperty LabelSpacing: Integer;
Indică distanţa în pixeli între etichetă şi cutia de editare.
Exemplu:
Să se scrie un program pentru rezolvarea ecuaţiei de gradul doi.
Pentru aceasta vom folosi trei cutii de editare: L abeledE ditl, LabeledEdit2, LabeledEdit3 în care vom introduce coeficientul lui x2, coeficientul lui x şi coeficientul termenului liber. Pentru afişarea soluţiilor ecuaţiei folosim o componentă ListBoxl. Mai folosim un buton Button1 la apăsarea căruia se va afişa rezultatul. Dacă ecuaţia nu are soluţii reale se va afişa un mesaj corespunzător. Vom folosi o etichetă “Soluţia” deasupra componentei ListBoxl pentru a indica faptul că în acea cutie va fi afişată soluţia.
Proprietăţile obiectelor de pe forma Form l sunt:
object Label1: TLabel Caption = 'SOLUŢIA'
endobject LabeledEditl: TLabeledEdit
EditLabel.Caption = 'Coeficientul lui x patrat'endobject LabeledEdit2: TLabeledEdit
EditLabel.Caption = 'Coeficientul lui x'end
U I
object LabeledEdit3: TLabeledEditEditLabel.Caption = 'Coeficientul termenului liber'
endobject ListBoxl: TListBox endobject Buttonl: TButton
Caption = 'Afiseaza1 OnClick = ButtonlClick
endHandlerele de evenimente ale obiectelor de forma Form l sunt:
procedure citire_parametri; begin
a := StrToFloat(Forml.LabeledEditl.Text); b := StrToFloat(Forml.LabeledEdit2.Text); c := StrToFloat(Forml.LabeledEdit3.Text);
end;In procedura citire_param etri sunt citiţi:
a - coeficientul lui x2,
b - coeficientul lui x şi
c - coeficientul termenului liber.
procedure TForml.ButtonlClick(Sender: TObject); begin
citire_parametri;delta : = b * b - ( 4 * a * c ) ;if' delta < 0then ShowMessage('Ecuaţia nu are rădăcini reale!1) else begin
ListBoxl.Items.Add(FloatToStr((-b+sqrt(delta))/(2*a))) ; ListBoxl.Items.Add(FloatToStr((-b-sqrt(delta))/(2 *a)));
end;end
9.5. TMaskEdit ^
Specifică o mască pentru o cutie de editare. Acest tip de control validează textul introdus de către utilizator.
Ierarhie_____________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCtistomMaskEdit -> TMaskEdit.
Definit în
mask.pas
112
Pagina
Additional
Proprietăţi ______________________________
PI. Edit Mask
property EditMask: string;
Reprezintă forma textului valid pentru o cutie de editare cu mască. Acest text va fi validat în momentul introducerii lui. Proprietatea EditMask este folosită pentru a restricţiona textul introdus de utilizator. Dacă acesta va introduce un caracter invalid, cutia de editare nu va accepta acel caracter.O mască reprezintă trei şiruri de caractere (câmpuri) separate prin "(;)". Prima parte reprezintă masca însăşi. A doua parte este un caracter care specifică dacă literalii unei măşti sunt salvaţi împreună cu aceasta. A treia parte reprezintă un caracter care este folosit pentru a specifica caracterele neintroduse (încă) din mască.Caracterele folosite în prima parte a EditMask-u\u\ sunt:
Caractcr Semnificaţie
t
D acă acest caracter apare în m ască atunci caracterele opţionale sunt representate în proprietatea EditText ca şi spaţii la începutu l secvenţei caracterelor opţionale. D acă acest caracter nu apare în m ască atunci caracterele opţionale sun t reprezentate ca şi spaţii la sfârşitul secvenţei caracterelor opţionale.
>D acă acest caracter apare intr-o m ască, atunci toate caracterele care urm ează (până în m om entul în care apare caracterul <) trebuie să iîe litere m ari.
<D acă acest caracter apare în tr-o m ască, atunci toate caracterele care urm ează (până în m om entul în care apare caracterul <) trebu ie să fie litere mici.
o D acă aceste două caractere apar îm preună, atunci textul va fî reprezentat aşa cum îl introduce utilizatorul (cu litere m ari şi m ici)
\C aracteru l care urm ează acestui caracter este un literal. A cest caracter este fo losit pentru a se putea utiliza oricare din caracterele speciale ale m ăştii.
L D acă acest caracter apare într-o m ască, atunci utilizatorul trebuie să in troducă (pe poziţia respectivă) o literă:A -Z , a-z.
1D acă acest caracter apare într-o m ască, a tunci u tilizatorul poate să in troducă (pe poz iţia respectivă) o literă:A -Z , a-z. N u este necesară in troducerea literei.
A D acă acest caracter apare în tr-o m ască, atunci utilizatorul trebu ie să in troducă (pe poziţia respectivă) un caracter a lpha-num eric adică o literă:
113
C a r a c te r S em n ifica ţie
A-Z, a-z, sau o c ifră 0-9.
aD acă acest caracter apare în tr-o m ască, atunci utilizatorul poate să in troducă (pe poziţia respectivă) un caracter a lpha-num eric adică o literă: A-Z, a-z, sau o c ifră 0-9. N u este necesară in troducerea caracterului.
C U tilizatorul trebuie să introducă un caracter arb itrar pe această poziţie.
cU tilizatorul poate să introducă un caracter a rb itrar pe această poziţie. N u este necesară in troducerea caracterului.
0 U tilizatorul trebu ie să in troducă o cifră pe poziţia respectivă.
9U tilizatorul poate să in troducă o c ifră pe poz iţia respectivă. N u este neapăra t necesară in troducerea cifrei.
#U tilizatorul poate să in troducă pe poziţia respectivă o cifră sau sem nele + sau -. N u este neapărat necesară introducerea lor.
/ Este fo losit pentru a separa zilele lunile şi anii.
Este folosit pentru a separa orele, m inutele şi secundele.
Este fo losit pentru a separa cele trei câm puri ale unei măşti.
-A cest caracter inserează autom at spaţii în tr-un text. C ând u tilizatorul in troduce caractere, cursorul trece autom at peste caracteru l _.
Caracterele care nu apar mai sus sunt literale şi ele sunt inserate automat, cursorul trecând peste ele în momentul editării. Caracterele care sunt folosite de o mască pot să apară şi ele ca şi literali, dar cu condiţia să fie precedate de caracterul
Exemple:
M asc a E x em p lu
!\00009 0000099; 1;_ 04543 5345542
190/90/00; 1;_ 27/01/97
!90:00:00>L L ;1;_ 09:34:23PM
> A A A a ;l;_ 1 P2a
10000-190-90; 1;_ 1997-11-06
!99 > L < L L \1 \9 0 0 ;1 ;_ 13 lan 1997
P2. EditText
property EditText: string;
Indică textul care apare în fereastra cutiei de editare cu mască.
114
P3. IsMasked
property IsMasked: Boolean;
Indică dacă există o mască pentru cutia de editare cu mască. Dacă nu există nici o mască, atunci cutia respectivă se va comporta ca o cutie de editare normală.
Metode______________________________________________________
M l. ValidateEdit
procedure ValidateEdit; virtual;
Determină dacă textul curent introdus este în conformitate cu regulile din EditMask.
Evenimente__________________________________________________
E l. OnChange
property OnChange: TNotifyEvent;
Apare când conţinutul cutiei se schimbă.
9.6. TMemo ^
Este un editor multilinie, deci care dă utilizatorului posibilitatea să introducă mai multe linii de text.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomMemo -> TMemo.
Definit în
stdctrls.pas
Pagina
Standard
115
P ro p rie tă ţi____________________________________________________________
P I. Alignment
property Alignment: TAlignment;
Specifică aliniamentul textului în cadrul cutiei. Valori posibile pentru Alignment sunt:
V a lo a re S em n ifica ţie
taLeftJustify Textili este alin iat în partea stângă a cutiei
taCenterTextul este a lin ia t centra t faţă de m argin ile din stânga şi d reap ta ale cutiei.
laRightJuslify T extul este alin iat în partea d reap tă a cutiei.
P2. Lines
property Lines: TStrings;
Lines conţine textul din cutie, sub forma unei liste de stringuri.
P3. Scollbars
property ScroIIBars: TScroIIStyle;
Indică dacă controlul are scrollbar-uri. Valori posibile pentru Scrollbars sunt:
V a lo a re S em n ifica ţie
s.sNone C ontro lu l nu are nici un scrollbar
ssHorizontalC ontrolul are un singur scro llbar la m arginea inferioară a cutiei. A cesta va perm ite defilarea o rizon tală a textului (în cazul în care lă lim ca sa este mai m are decât a cutiei).
ss VerticalC ontrolul are un singur scro llbar la partea d reap tă a cutiei. A cesta va perm ite defilarea pe verticală a textului din cutie (în cazul în care ex istă mai m ulte linii decât pot li afişate odată în cutie).
ssBoth C ontro lu l arc două scrollbar-uri (orizontal şi vertical).
Exemplu:
Următorul exemplu foloseşte o cutie de editare mulţi linie (M emo!) şi o componentă TListBox în care, pentru fiecare linie în parte, se va afişa numărul de caractere din ea la apăsarea butonului Buttonl:
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;begin
116
for i:=0 to Memol.Lines.Count-1 do ListBoxl.Items.Add(
inttostr(Length((Memol.lines.Strings[i])) ) ) ;
procedure TForml.FormActivate(Sender: TObject); begin
Memol.Clear;ListBoxl.Clear;Memol.ScrollBars:=ssBoth;
end;
P4. WantReturns
property WantReturns: Boolean;
Indică dacă utilizatorul mai poate introduce caracterul sfârşit de linie prin apăsarea tastei <Enter>. Dacă WantReturns este false, atunci utilizatorul nu mai poate introduce sfârşit de linie tastând <Enter>,. ci tastând Ctrl+Enter, iar apăsarea tastei <Enter> este tratată ca un eveniment pentru formă.
Exemplu:
Următoarea aplicaţie constă dintr-o formă pe care se află o cutie de editare simplă {E ditl), o cutie de editare multi-linie (M em ol) şi un buton (Buttonl) de tip Default. Utilizatorul introduce text în cutia M em ol, iar la apăsarea tastei <Enter> prima linie a acestui text va fi copiată în E d itl.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Buttonl: TButton Default = True
endobject Memol: TMemo WantReturns = False ScrollBars = ssBoth
endobject Editl: TEdit
Text = 'Editl' end
I Iandlerele de evenimente pentru forma Forml sunt:
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;
beginEditl.Text:=Memol.Lines.Strings[0];
end;
end;
117
procedure TForml.FormActivate(Sender: TObject); begin
Memol.Clear;Editl.Clear;Memol.ScrollBars:=ssBoth;Memol.SetFocus;
end;
P5. WantTabs
property WantTabs: Boolean;
Indică dacă utilizatorul poate insera tab-uri în text. Dacă WantTabs este false, atunci la apăsarea tastei Tab, controlul este trecut la altă componentă de pe formă.
P6. WordWrap
property WordWrap: Boolean;
Specifică dacă textul care atinge marginea din dreapta a cutiei este rupt pentru a fi trecut la linia următoare. Procedeul de rupere a rândurilor constă în introducerea unor “soft carriage returns", care nu modifică numărul de caractere de sfârşit de linie reale (introduse de utilizator). Dacă WordWrap este true, atunci şirurile de caractere mai lungi decât lăţimea cutiei vor fi rupte la partea dreaptă şi trecute pe rândul următor. Dacă cutia are scrollbar orizontal, această rupere nu se va mai produce.
Evenimente
E l. OnChange
property OnChange: TNotifyEvent;
Apare când textul din cutia de editare multilinie se schimbă.
9.7. TRichEdit H
Este un control care afişează un text, în format rich text, pe o formă.
Ierarhie ____________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomMemo -> TCustomRichEdit ->-> TRichEdit.
118
Definit în
com ctrls.pas
Pagina _____________________________________________
Win32
Proprietăţi___________________________________________
P I. HideScrollBars
property HideScrollBars;
Nu mai afişează scrollbar-ul atunci când nu este nevoie de el (deci textul încape într-o pagină).
P2. Lines
property Lines: TStrings;
Conţine liniile unei cutii cu text rtf.
P3. Paragraph
property Paragraph: TParaAttributes;
Specifică atributele pentru paragraful curent. Paragraful curent este acela care conţine textul selectat. Dacă nu există text selectat, atunci paragraful curent este acela care conţine cursorul.
P4. SelAttributes
property SelAttributes: TTextAttributes;
Specifică atributele textului selectat. Tipul TText Attributes este definit mai jos.
Metode______________________________________________________
M 1. FindText
function FindText(const SearchStr: string; StartPos, Length'. Integer; Options: TSearchTypes): Integer;
Caută textul SearchStr în subsecvenţa de lungime Length şi care începe cu litera StartPos.
119
Se poate face o căutare mai specială folosind Options, care este o variabilă de tip mulţime, deci poate conţine o submulţime de valori din următoarele posibile: stWholeWord, stMatchCase.
M 2. Print
procedure Print(const Caption: string); virtual;
Formatează şi tipăreşte conţinutul unei cutii RichEdit.
Evenimente
E l. OnSelectionChange
property OnSelectionChange: TNotifyEvent;
Apare când o altă porţiune de text este selectată.
E2. OnProtectChange
property OnProtectChange: TRichEditProtectChange;
Apare când utilizatorul încearcă să modifice un text protejat.Tipul TRichEditProtectChange este definit astfel:
type TRichEditProtectChange =procedure(Sen</er: TObject; StartPos, EndPos: Integer;
var AllowChange: Boolean) of object;
StartPos şi EndPos indică porţiunea de text care va fi supusă modificării. AllowChange indică dacă este permisă sau nu efectuarea de modificări asupra textului.
9.8. TTextAttributes
Reprezintă caracteristicilc fontului textului marcat dintr-o cutie TRichEdit. Aceast obiect poate fi folosit doar în componente care derivă din TCustomRichEdit.
Ierarhie
TObject -> TPersistent -> 77'ext Attributes.
Definit în
com ctrls.pas
Proprietăţi _________________________________________________
PI. Color
property Color: TColor;
Specifică culoarea textului.
P2. Protected
property Protected: Boolean;
Indică dacă textul reprezentat de TTextAttributes este sau nu protejat împotriva modificărilor. în caz afirmativ, dacă utilizatorul încearcă să îl modifice va fi apelat evenimentul OnProtectChange care poate dezafecta protecţia. Dacă acest handler de eveniment nu există, textul respectiv este de tip read-only.
P3. Size
property Size: Integer;
Specifică înălţimea fontului în număr de puncte.
P4. Height
property Height: Integer;
Specifică înălţimea fontului în număr de pixeli. Relaţia dintre Size şi Height este următoarea:
Height := Size * ScreenPixelsPerlnch / 72.
P5. Style
property Style: TFontStyles;
Specifică modul în care sunt desenate caracterele fontului. Style este o variabilă de tip mulţime, deci are ca valoare o submulţime din următoarele elemente:
Valoare Semnificaţie
fslio ld T ext îngroşat.
J'sHaUc T ext înclinat.
121
V a lo a re S em n ifica ţie
fsU nderline T exl subliniat.
fsStrikeout T ext tă ia t cu o linie orizontală pe la jum ăta te .
P6. Pitch
property Pitch: TFontPitch;
Indică dacă toate caracterele fontului au aceeaşi lăţime. Valorile permise pentru Pitch sunt:
V a lo a re S em n ifica ţie
fp FixedToate caracterele au aceeaşi lăţim e. A cest lucru este folosit la coduri sursă.
fp Variable C aracterele au lăţim e variabilă. A cest lucru este util la editare de texte.
fpD efault L ăţim ea caracterelor depinde de font.
P7. ConsistentAttributes
property ConsistentAttributes: TConsistentAttributes;
Indică care dintre proprietăţile obiectului TTextAttributes sunt valabile pentru textul curent selectat. Tipul TConsistentAttributes este definit astfel:
typeTConsistentAttribute = (caBold, caColor, caFace, caltalic, caSize,
caStrikeout, caUnderline, caProtected); TConsistentAttributes = set of TConsistentAttribute;
ConsistentAtributes poate avea ca valori o submulţime din mulţimea celor enumerate mai jos:
V a lo a re S em n ifica ţie
caBold Toate caracterele sun t fie îngroşate fie neîngroşate.
caColor Toate caracterele au aceeaşi culoare.
caFace Tipul caracterelor este acelaşi pentru în treg textul.
caltalic Toate caracterele sunt fie italice fie neitalice.
caSize Toate caracterele au aceeaşi m ărim e.
caStrikeout 'Toate caracterele sunt fie tăiate fie netăiate.
caUnderline C aractere le suni fie loale subliniate, fie toate nesubliniate.
caProtected T extul este pro tejat sau neprotejet.
122
Exem plul 1:
Următorul exemplu preia un fişier pas, care conţine un program Turbo Pascal, şi boldează toate cuvintele rezervate. Pe formă se află o cutie RichEdit, două cutii de dialog (OpenDialogI şi SaveD ialogl), trei butoane: Buttonl pentru deschis un fişier cu extensia pas de pe disc, Button2 pentru salvarea fişierului cu extensia r t f curent pe disc, şi Button3 la a cărui apăsare se vor bolda toate cuvintele rezervate.
Valorile proprietăţilor obiectelor de pe forma F orm l sunt:
object Buttonl: TButton Caption = 'Open'OnClick = ButtonlClick
endobject Button2: TButton
Caption = 'Save'OnClick = Button2Click
endobject Button3: TButton
Caption = ’Boldeaza'OnClick = Button3Click
endobject RichEditl: TRichEdit
Lines.Strings = ('RichEditl')
ScrollBars = ssBoth endobject OpenDialogI: TOpenDialog
Filter = 'Programe Pascal|*.pas' endobject SaveDialogl: TSaveDialog
Filter = 'RichTextFormat|*.rtf' end
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
constrezervate : array[1..49] of string =
('program','uses','type','var','if',’then','else','for','do','to','while','repeat','until','begin','end','case','of','with','set','array','record','asm','and','or', 1 not', 'or1, 'const', 'constructor','destructor','div','downto','file','function', 'goto','implementation','in','inline',1 interface’, 'label', 'mod', 'nil', 'object','packed','procedure','shl','shr','string','unit','with');
procedure TForml.ButtonlClick(Sender: TObject); beginif OpenDialogI.Execute
123
then RichEditl.Lines.LoadFromFile(OpenDialogl.FileName); end;procedure TForml.Button2Click(Sender: TObject); begin
if SaveDialogl.Executethen RichEditl.Lines.SaveToFile(SaveDialogl.FileName);
end;procedure TForml.Button3Click(Sender: TObject); var
poz, LungText : integer;i : byte;
begin//lungimea textului in care fa c cautarea
LungText:=length(RichEditl.Lines.Text); for i := 1 to 49 do
/ / pentru fiecare cuvânt rezervat / / il caut in tot textul
beginpoz : =
RichEditl.FindText(rezervate[i],0,LungText,[stWholeWord]); while (poz o -1) do begin
RichEditl.SelStart := poz;RichEditl.SelLength := length(rezervate[i]);RichEditl.SetFocus;RichEditl.SelAttributes.Style := [fsBold];
II si il fac bold// apoi continui cautarea mai departe in text
poz := RichEditl.FindText(rezervate[i],poz+1,LungText-poz,[stWholeWord]);
end;end;
end;
Exem plul 2:
Următoarea aplicaţie afişează proprietăţile selecţiei curente de text dintr-o cutie de editare TRichEdit. Sunt folosite trei butoane de tip TSpeedButton pentru a afişa care sunt caracteristicile textului selectat. Sunt căutate proprietăţile Bold, Italic şi Underline. Butoanele corespunzătoare proprietăţilor textului selectat vor fi în starea apăsat.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object SpeedButtonl: TSpeedButton AllowAllUp = True Grouplndex = 1 Caption = 'B'Font.Style = [fsBold]
end
124
object SpeedButton2: TSpeedButton AllowAllUp = True Grouplndex = 2 Caption = 'I'Font.Style = [fsltalic]
endobject SpeedButton3: TSpeedButton AllowAllUp = True Grouplndex = 3 Caption = 'U'Font.Style = [fsUnderline]
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.RichEditlSelectionChange(Sender: TObject); beginwith RichEditl.SelAttributes do beginif fsBold in Stylethen if caBold in ConsistentAttributes
then SpeedButtonl.Down := true else SpeedButtonl.Down := false
else SpeedButtonl.Down := false;
if fsltalic in Stylethen if caltalic in ConsistentAttributes
then SpeedButton2.Down := true else SpeedButton2.Down := false
else SpeedButton2.Down := false;if fsUnderline in Stylethen if caUnderline in ConsistentAttributes
then SpeedButton3.Down := true else SpeedButton3.Down := false
else SpeedButton3.Down := false; end;
end;
9.9. TParaAttributes
Este o dată care verifică atributele textului dintr-o cutie TRichEdit.
Proprietăţi______________________________________________
1*1. Alignment
property Alignment: TAlignment;
Indică felul în care se aliniază textul în cadrul paginii.
125
Valoare Semnificaţie
taLeftJustify T extu l este a lin ia t la stânga paragrafului.
taCenter T extul este centrat.
taRightJustify T extul este a lin ia t la dreapta paragrafului.
P3. Leftlndent
property Leftlndent: Longint;
Indică distanţa în pixeli a paragrafului faţă de marginea din stânga a paginii.
P4. Rightlndent
property Rightlndent: Longint;
Indică distanţa în pixeli a paragrafului faţă de marginea din dreapta a paginii.
Exemplu:
Următoarea aplicaţie formatează paragraful curent dintr-o componentă TRichEdit. Este folosită o a doua formă (Form2) pe care sunt amplasate două cutii de editare în care utilizatorul este solicitat să introducă valorile pentru marginile din stânga, respectiv dreapta ale paragrafului curent.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Buttonl: TButtonCaption = 1Seteaza Paragraf'
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
uses unit2;procedure TForml.ButtonlClick(Sender: TObject); begin
/ / setez valorile cu tiilo r de editare E d itl si E dit2 la ti valorile cu ren te ale proprietăţilo r L eftlndent si R ightlndentForm2.Editl.Text := IntToStr(RichEditl.Paragraph.Leftlndent); Form2.Edit2.Text := IntToStr(RichEditl.Paragraph.Rightlndent);
/ / afişez form a Form 2 m odala if Form2.ShowModal = mrOk then begin
/ / daca s-a apasat bu tonul O k form atez paragraful corespunzătorRichEditl.Paragraph.Leftlndent := StrToInt(Form2.Editl.Text); RichEditl.Paragraph.Rightlndent :=
126
end;
Valorile proprietăţilor obiectelor de pe forma Form2 sunt:
object Labell: TLabelCaption = 'Marginea stanga'
endobject Label2: TLabel
Caption = 'Marginea dreapta' endobject Editl: TEdit Text = '0'
endobject Edit2: TEdit
Text = '0' endobject BitBtnl: TBitBtn
Kind = bkOK endobject BitBtn2: TBitBtn
Kind = bkCancel end
1*5. Firstlndent
property Firstlndent: Longint;
Specifică distanţa în pixeli a primei linii a paragrafului faţă de marginea din stânga a paginii. Această distanţă este relativă la valoarea proprietăţii Left Indent.
1*6. Numbering
property Numbering: TNumberingStyle;
StrToInt(Form2.Edit2.Text);end;
Valori posibile pentru Numbering sunt:
V a lo a re S em n ifica ţie
nsNone Nici o num erotare nu există la stânga.
nsBullct in faţa fiecărui p a rag ra f este desenată o bilă de culoare neagră.
Kxcmplu:
Următoarea aplicaţie setează şi afişează numerotarea paragrafului curent din cutia de editare R ichE ditl. Este folosită o componentă TCheckBox care va fi în starea bifat dacă paragraful curent este numerotat şi nebifat în caz contrar. Tot cu ajutorul aceste componente se poate schimba starea unui paragraf (din numerotat în ne-numerotat şi invers).
127
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:procedure TForml.RichEditlSelectionChange(Sender: TObject); begin
// afişez starea paragrafuluiCheckBoxl.Checked := RichEditl.Paragraph.Numbering = nsBullet
end;procedure TForml.CheckBoxlClick(Sender: TObject); begin
II setez starea paragrafului if CheckBoxl.Checked
then RichEditl.Paragraph.Numbering := nsBullet else RichEditl.paragraph.Numbering := nsNone;
end;
128
10. BUTOANE RADIO
Butoanele radio oferă posibilitatea utilizatorului de a alege dintr-un grup de opţiuni care se exclud reciproc. Butoanele radio pot fi grupate în mai multe moduri. Cele mai utilizate posibilităţi de grupare sunt:
- gruparea pe o formă;- gruparea într-un TRadioGroup.
Dintr-un grup de butoane radio la un moment dat doar unul poate fi în starea bifat.
In cazul grupării folosind componenta TRadioGroup itemurile sunt doar grafic desenate ca butoane radio, în realitate ele fiind şiruri de caractere. Accesarea unui item particular dintr-o componentă TRadioGroup se face folosind proprietatea Items.
10.1. TRadioButton — J
I e r a r h i e ____________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TButtonControl -> TRadioControl.
Definit în
stdctrls.pas
Pagina______________________________________________________
Standard
Proprietăţi___________________________________________________
P I. Alignment
property Alignment: TLeftRight;
Determină poziţia textului ataşat butonului faţă de acesta. Posibile valori pentru Alignment sunt:
129
V a lo a re S em n ifica ţie
laLefJtustify Textul apare în partea stângă a butonului.
taRightJustify T extul apare în partea dreaptă a butonului.
P2. Checked
property Checked: Boolean;
Determină dacă un buton este selectat. Valori posibile pentru proprietatea Checked sunt:
V a lo a re S em n ifica ţie
t ru eU n disc negru apare în interiorul butonului, indicând faptul că acesta a fost selectat.
fa lseNici un disc negru nu apare în interiorul butonului, deci acesta nu este selectat.
Un singur buton de radio neselectat (Checked este false) poate fi selectat (Checked să devină true) la executarea unui click pe el. Un buton de radio selectat (Checked este true) nu poate fi deselectat (Checked să fie false) la executarea unui click pe el.
10.2. TRadioGroup iiz ii
Reprezintă un grup de butoane care funcţionează împreună. Pentru a adăuga butoane la TRadioGroup folosiţi proprietatea Items. Prin intermediul acesteia se specifică textul ataşat fiecărui buton de radio.
Contrar unei impresii de moment, proprietatea Items nu pointează spre elemente de tip TRadioButton. Elementele ei nu sunt decât nişte simple şiruri de caractere ce identifică eticheta ataşată fiecărui buton radio. Cu ajutorul proprietăţii Itemlndex se poate determina care buton este activ la un moment dat.
Butoanele de radio, de obicei, sunt grupate. Ele pot fi grupate în cinci moduri:
- pe o formă;- într-un TRadioGroup;- într-un TGroupBox\- într-un TScrollBox;- într-un TPanel.
Mai multe butoane aflate în acelaşi grup nu pot avea statutul de activ (un punct negru apare în mijlocul butonului respectiv) în acelaşi timp. Doar unul
130
, t i ft?f H if»H*»*♦»**•******» TTi*i j î •> t ? i ; • •
dintre ele se poate afla în starea de setat, celelalte fiind în starea nesetat. Două butoane de pe o formă se pot afla în acelaşi timp în starea setat, dacă fac parte din grupuri diferite.
Ierarhie_________ ________________ ___________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGroupBox ->-> TCustomRadioGroup -> TRadioGroup.
Definit în_____________________________________________________
stdctrls.pas
Pagina
Standard
Proprietăti
1*1. Columns
property Columns: Integer
Specifică numărul de coloane pe care sunt aşezate butoanele de radio. Columns poate avea valori de la 1 la 16. Dacă Columns este 1, atunci toate butoanele sunt aranjate pe o singură linie verticală.
P2. Itemlndex
property Itemlndex: Integer
Specifică numărul de ordine al itemului (butonului radio) selectat. Primul buton are numărul de ordine 0. Dacă nici un buton nu este selectat, atunci Itemlndex are valoarea -1.
P3. Items
property Items: TStrings
în Items este reţinută lista butoanelor de radio din TRadioGroup. Prelucrarea butoanelor înseamnă de fapt prelucrarea unei componente TStrings.
Exemplul 1:
Următoarea aplicaţie conţine un TRadioGroup cu trei butoane radio care au fost inserate cu ajutorul proprietăţii Items la momentul proiectării aplicaţiei. Pe formă mai există o cutie de editare E ditl care va afişa care buton de radio este selectat.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object RadioGroupl: TRadioGroup Caption = 'RadioGroupl'Items.Strings = (
'primul''al doilea1 'al treilea’)
OnClick = RadioGrouplClick endobject Editl: TEdit
Text = 'Editl1 end
Handlerele de evnimente pentru obiectele de formă sunt:procedure TForml.FormCreate(Sender: TObject); begin
RadioGroupl. Itemlndex: = -1 Editl.Text:='Nici un buton selectat';
end;procedure TForml.RadioGrouplClick(Sender: TObject); begincase RadioGroupl.Itemlndex of
0 : Editl.text:='S-a selectat primul buton';1 : Editl.Text:='S-a selectat al doilea buton';2 : Editl.Text:='S-a selectat al treilea buton'
end;end;
Exemplul 2:
Următoarea aplicaţie adaugă unei componente numărul de itemuri înscris în cutia de editare Edit2. în cutia de editare E ditl se află numărul de coloane pe care vor fi dispuse itemurile din componenta TRadioGroup. Etichetele itcmurilor sunt numere în intervalul 0. .strToint (Editl.Text) . La apăsarea unui item se va afişa eticheta lui.
Valorile proprietăţilor componentelor de pe formă sunt:
object Editl: TEdit Text = '4'
endobject Edit2: TEdit
132
Text = '12' endobject RadioGroupl: TRadioGroup
Caption = 'Butoane radio' endobject Buttonl: TButton
Caption = 'Creeaza butoane1 OnClick = ButtonlClick
end
llandlerele de evenimente ale componentelor de pe forma Forml sunt:
procedure TForml.ButtonlClick(Sender: TObject);var i:in teger; begin
RadioGroupl.Items.Clear;RadioGroupl.Columns := StrToInt(Editl.Text); for i:=l to StrToInt(Edit2.Text) do RadioGroupl.Items.Add(IntToStr(i));
end;
133
11. COMPONENTE PENTRU OPŢIUNI»
Componente de opţiuni oferă posibilitatea utilizatorului de a alege dintr- un grup de opţiuni. Spre deosebire de butoanele radio, opţiunile pot să nu se excludă reciproc, la un moment fiind posibilă selectarea mai multor opţiuni.
Componentele de opţiune pot apărea singure pe o formă (TCheckBox) sau grupate (TCheckListBox). Proprietăţile Checked şi State reflectă starea unui item. Checked poate avea două valori: bifat (valoarea true) şi nebifat (valoarea false). State poate avea trei valori: bifat (valoarea cbCheked), nebifat (valoarea cbUnchecked) şi nedecis sau gri (valoarea cbGrayed).
11.1. TCheckBox — -
Este o componentă ce constă dintr-o cutie de bifare etichetată care oferă utilizatorului posibilitatea de a alege sau nu o opţiune a aplicaţiei.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TButtonControl -> TCustomCheckBox -> TCheckBox.
Definit în_____________________________________________________
stdctrls.pas
Pagina______________________________________________________
Standard
Proprietăţi_______ ____________________________________________
PI. Alignment
property Alignment: TLeftRight;
Specifică poziţia textului ataşat cutiei faţă de cutie. Valori posibile pentru Alignment sunt:
134
V a lo a re S em n ifica ţie
talxftJusUfy Textul apare în partea stângă a butonului.
taRightJustijy Textul apare în partea d reap tă a butonului.
P2. AllowG rayed
property AllowGrayed: Boolean;
Indică dacă cutia de control permite şi starea “gri”. Dacă AllowG rayed este true, atunci cutia de control poate avea trei valori: check (bifat), uncheck (nebifat), grayed (bifat, dar pe fundal gri). Dacă AllowGrayed este false, atunci cutia de control poate avea doar două stări: check şi uncheck.
1*3. Checked
property Checked: Boolean;
Indică dacă cutia de control a fost selectată. Dacă Checked este true, atunci semnul de marcare apare în cutie, în caz contrar cutia se poate găsi în starea nebifat sau în starea gri (dacă AllowGrayed este true).
1*4. State
property State: TCheckBoxState;
Indică starea cutiei de opţiuni. Valori posibile pentru State sunt:
V a lo a re S em n ifica ţie
cbChecked Specifică dacă cutia de control este b ifa tă (u tilizatorul a se lecta t o opţiune). în ea v a apare un sem n de bifare.
cbUnchecked C utia de control nu este bifată.
cbCrayedCutia de control nu se a flă nici în starea bifată, nici în s tarea nebifată, în cu tie apare un sem n de bifare având culoare d iferită (gri) de culoarea sem nului fo losit penlru stare bifat.
Kxcmplu:
Următoare aplicaţie foloseşte componentele:
• cutie de control (CheckBoxl)-,• cutie de editare (E ditl) care va afişa starea lui CheckBoxl;• un grup de butoane radio (RadioG roupl) care conţine butoanele
"Permite stare gri" şi "Nu perm ite stare gri" folosite pentru a specifica dacă este permisă sau nu starea "gri" pentru CheckBoxl.
135
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object CheckBoxl: TCheckBox Caption = 'CheckBoxl'Checked = True State = cbChecked OnClick = CheckBoxlClick
endobject RadioGroupl: TRadioGroup Caption = 'Starea gri'Items.Strings = (
'Permite stare gri''Nu permite stare gri')
OnClick = RadioGrouplClick endobject Editl: TEdit Text = 'Editl'
endHandlerele de evenimente pentru forma Form l sunt:
procedure TForml.CheckBoxlClick(Sender: TObject); begin
case CheckBoxl.State ofcbChecked: Editl.Text := 'Checked'; cbUnchecked: Editl.Text := 'Unchecked'; cbGrayed: Editl.Text := 'Grayed'
end; end;procedure TForml.RadioGrouplClick(Sender: TObject); begin
if RadioGroupl.Itemlndex = 0 then CheckBoxl.AllowGrayed := true else begin
CheckBoxl.AllowGrayed := false; if CheckBoxl.State = cbGrayed then begin
CheckBoxl.State := cbChecked;Editl.Text := 'Checked';
end;end;
end;
11.2. TCheckListBox
Afişează o listă cu itemuri care au câte un semn de bifare la stânga lor. Un item este un şir de caractere. Accesarea acestora se face prin intermediul proprietăţii Items.
136
Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomListBox -> TListBox.
Definit în___________________________________________________
stdctrls.pas
Pagina_____________________________________________________
Standard
Proprietăţi__________________________________________________
P I. Items
property Items: TStrings;
Items conţine lista cu itemurile dintr-un TCheckListBox.
P2. State
property State[Index: Integer]: TCheckBoxState;
Tipul TCheckBoxState este dat de:
TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed);
Pentru fiecare item din vectorul Items, State indică starea acestuia. Valori posibile pentru State sunt (cbChecked, cbUnchecked, cbGrayed). Când Checked este true, State este cbChecked. Când Checked este False, State poate fi fie cbUnchecked, fie cbGrayed.Când State este cbGrayed, ItemEnabled este False. Mai mult, ItemEnabled poate fi, de asemenea, false când State este cbUnchecked sau cbChecked.
P3. Checked
property Checked [Index: Integer]: Boolean;
Pentru fiecare item din vectorul Items, Checked indică starea acestuia. Valori posibile pentru Checked sunt: cbChecked, cbUnchecked. Pentru valoarea cbGrayed a lui State, valoarea lui Checked va fi false.
137
Exemplu:
Următoarea aplicaţie afişează numărul itemurilor bifate componentă TCheckListBox.procedure TForml .ButtonlClick (Sender ■. TObject); var
nr, i : integer; begin
nr := 0;for i := 0 to checkListBoxl.Items.Count - 1 do if CheckListBoxl.Checked[i] then nr := nr + 1;
ShowMessage(IntToStr(nr)); end;
P4. AllowGrayed
property AllowGrayed: Boolean;
Indică dacă este permisă starea gri.
Evenimente _______________ _________________
E l. OnClickCheck
property OnClickCheck: TNotifyEvent;
Apare cânt utilizatorul bifează sau debifează un item.
dintr-o
138
12. PROGRESUL EXECUŢIEI - COMPONENTA TProgressBar
în acest capitol este prezentată componenta TProgressBar care permite vizualizarea grafică a evoluţiei unui proces în execuţie.
im i112.1. TProgressBar -__I
O componentă TProgressBar indică în mod vizual progresul unei aplicaţii în execuţie. Pe măsură ce aplicaţia se execută, componenta TProgressBar se colorează, de la stânga la dreapta, cu culoarea standard exprimată de constanta clHighLight.
Ierarhie
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TProgressBar.
Definit în _______________________
com ctrls.pas
Pagina______________________
Win32
Proprietăţi ________________________
PI. Position
property Position: Integer;
Reprezintă poziţia curentă a componentei de progres.
P2. Max
property Max: Integer;
Reprezintă valoarea maximă pe care o poate lua proprietatea Position.
139
im .M uahwM M i^H a.------- m i l l ii ii n mi 11) i . iiii.
P3. Min
property Min: Integer;
Reprezintă valoarea minimă pe care o poate lua proprietatea Position.
Exemplul 1:
Vom face o aplicaţie care generează combinările mulţimii Aceste combinări vor fi afişate ca şi item-uri ale lui ListBoxl. Numărul n va fi citit dintr-o cutie de editare {E ditl). Numărul de poziţii pe care le are componenta ProgressBarl este egal cu:
4 _ n - ( n - l ) - ( ; i - 2 ) - ( / t - 3 )24
Procesul de generare al combinărilor începe la apăsarea butonul Buttonl.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Buttonl: TButton Caption = 'Genereaza'
endobject Editl: TEdit Text = '6'
endHandlerele de evenimente pentru obiectele de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); var
n, i, j, k, g : byte; s : string;
beginListBoxl.Clear;
n := StrToInt(Editl.Text);ProgressBarl.Max := n*(n~l)*(n-2)*(n-3) div 24 - 1;ProgressBarl.Position := 0;
for i := 1 to n - 3 dofor j := i + 1 to n - 2 dofor k := j + 1 to n - 1 dofor g := k + 1 to n do begin
s := inttostr (i) + ’ ' ■* inttostt (j ) -i-' ' + inttostr (k) + 1 ’ t i nt I osl. r (y ) i-■' ';
ListBoxl . 1 . Add (:;) ;I., i Kt lîoxl . Ro I: r o.".h ;
I« « « * » m i i . a m M W W r t H H i i i ) i »«?»i»1111 i <»*• H i*t i n I
I
ProgressBarl.Position : = ProgressBarl.Position + 1; ProgressBarl.Refresh;
end;end;
Exemplul 2:
Următoarea aplicaţie încarcă sau salvează un fişier în/din cutia de editare multilinie M em ol. Numele fişierului este obţinut cu ajutorul unei componente TOpenDialog sau TSaveDialog. Pentru a se pune în evidenţă utilitatea TProgressBar-ul, fişierul este citit octet cu octet. Componenta TProgressBar va avea atâtea poziţii câţi octeţi are fişierul. Pe formă se află şi o componentă TMainMenu care are în bara principală un singur item - File - şi două subitemuri: Open, respectiv Save.
Valorile proprietăţilor obiectelor de pe forma F orm l sunt:
object MainMerml: TMainMenu object Filei: TMenuItem
Caption = 'File' object Openl: TMenuItem
Caption = 'Open'•ndobjact Savel: TMenuItem
Caption = 'Save'•nd
•nd•ndobj«ot OpenDialogl: TOpenDialog
K liter = 'Fişiere Text|*.txt'•ndobjact SaveDialogl: TSaveDialog
Kiltor - 'Fişiere Text | * . txt' and
I Inndlercle dc evenimente ale obiectelor de pe forma Form l sunt:
varI ih : T F i l e S t r e a m ;< li momii u nc : i n t e g e r ; m m : string;P : I ’C h a r ;
procedura Tl-'orml . O p r n l C l i c k {S e n d e r : T O b j e c t ) ; v«r
l I 111 i m |- > l ;h au l n
If ' || U Ml I) I , I I < " I 1 . V.y.i'i 'Ut f-i t h an b n g i n
Ml Mill >1 . (' I «*< i r ;I i : i ; TK i I «?NI r t ■> i m . ('. r cu \t <* (OponI) i îi 1 o q l . K i 1 < ‘N n m o ,
1 tnOponH<‘ml) ;
I A I
dimensiune := f is. Size; //dimensiunea fişierului ProgressBarl.Max := dimensiune; sir := ''; getmem(p,1);ProgressBarl.Position : = 0; for i : = 1 to dimensiune do begin
f is .Read (p~, 1) ;sir := sir + string(p"); //pun fişierul intr-un sir ProgressBarl.Position := ProgressBarl.Position + 1;
end;Memol.Lines.Text := sir; fis.Free;
end; end;procedure TForml.SavelClick(Sender: TObject); var
i : integer begin
if SaveDialogl.Execute then begin
fis := TFileStream.Create(SaveDialogl.FileName,fmCreate); dimensiune := length(Memol.Lines.Text);ProgressBarl.Max ;= dimensiune;// setez numărul poziţiilor progressbar-ului ProgressBarl.Position := 0; getmem(p,1);for i := 1 to dimensiune do beginp[0] := Memol.Lines.Text[i];fis .Write (p~, 1) ; // scriu in fişier un octetProgressBarl.Position := ProgressBarl.Position + 1;
end;fis.Free;
end;end;
Exem plul 3:
Se cere să se scrie într-un fişier toate numerele de ia 1 la 1.000.000. Progresul procesului de scriere în fişier va fi afişat folosindu-se o componentă ProgressBar.
Pentru a realiza această aplicaţie vom folosi o componentă ProgressBar cu ajutorul căreia vom afişa progresul execuţiei operaţiei de scriere în fişier şi un buton la apăsarea căruia aplicaţia va fi lansată în execuţie. Dacă proprietatea Smooth a componentei ProgressBar este setată true, atunci progresul execuţiei va fi marcat printr-o linie continuă, altfel printr-o linie discontinuă.
142
în momentul în care toate numerele au fost scrise în fişier se va afişa mesajul „S-a terminat de scris în fişier” De asemenea, procesul poate fi oprit (scrierea în fişier poate fi întreruptă) prin apăsarea tastei Escape.
Proprietăţile obiectelor de pe forma Form l sunt:
object Buttonl: TButton Caption = 'Start'OnClick = ButtonlClick
endobject ProgressBarl: TProgressBar
Max = 1000000 Smooth = True
endHandlerele de evenimente ale obiectelor de forma Formlsunt:
varapasat_escape : boolean;
procedure TForml.ButtonlClick(Sender: TObject); var
i : integer;beginapasat_escape := false; assignfilelf, 'fişier.txt'); rewrite(f);Progressbarl.Position := 0; for i := 1 to 100000 do
beginApplication.ProcessMessages; if apasat_escape then begin
closefile(f); exit;
end; writeln(f,i );Progressbarl.Position := ProgressBarl.Position + 1; if i = 100000then ShowMessage('S-a terminat de scris in fişier');
end;closef ile (f) ,-
end;
procedure TForml.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
beginif key = VK_Escape then apasat_escape := true;
end;
143
j p M H M t t ****»»** •
Exem plul 4:
Programul următor afişează într-un ListBox toate permutările primelor n numere naturale. Valoarea lui n este selectată dintre cele 20 de valori posibile (1 până la 20) prezente într-un ComboBox. Este folosit şi un ProgressBar care afişează evoluţia procesului de determinare a soluţiei.
Proprietatea Smooth a componentei ProgressBar poate fi true sau false; atunci când este setată true, bara de progres este continuă, iar când este setată false, bara de progres este segmentată.
Proprietăţile obiectelor de pe forma Form l sunt:
object ComboBoxl -. TComboBoxItems.Strings = ('2' '3' ‘4 ’ '5' ' 6' ' 7 ' '8' '9' '10' '11'
'12' '13' '14' '15' '16' ’17' '18' ’19’ '20')endobject ListBoxl: TListBox endobject ProgressBarl: TProgressBar
Min = 0 Max = 100 Step = 1
endobject BitBtnl: TBitBtn
Caption = 'afiseaza'OnClick = BitBtnlClick
end
Pentru a determina toate permutările numerelor naturale mai mici sau egale decât un număr n dat vom folosi metoda backtracking.
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
varsoluţie, n : integer; a : array[1..100] of integer,-
function continuare(poz,v : integer) : boolean; var
i : integer; begin
continuare true; for i := 1 to poz - 1 do
if a[i] = vthen continuare := false;
end;procedure tipar; var
i : integer; s : string;
144
begins : = 1 1 ;for i := 1 to n do
s := s + IntToStr (a [i] ) + ' ';Forml.ListBoxl.Items.Add(s);
end;
procedure back Ik : integer); var
i : integer; s : string;
beginif k > n then begin
inc(soluţie); tipar;Forml .ListBoxl.Refresh;Forml.ProgressBarl.Position := soluţie;
endelse for i := 1 to n do
if continuare(k,i) then begin
a[k] := i; back(k+1);
end;end;
function factorial(x: integer) : integer; var
f : integer; i : integer;
begin f := 1;for i := 2 to x do
f := f * i; factorial := f;
end;
procedure TForml.BitBtnlClick(Sender: TObject); begin
ListBoxl.Clear;n := StrToInt(ComboBoxl.Items.Strings[ComboBoxl.Itemlndex]); ProgressBarl.Min := 0;ProgressBarl.Max:=Factorial(StrToInt(ComboBoxl.Items.Strings [ComboBoxl.Itemlndex]));ProgressBarl.Step := 1; soluţie := 0; back(l);
end;
13. BARĂ DE STATUT
în acest capitol sunt prezentate obiectele care definesc funcţionalitatea unei bare de statut. Acestea sunt: TStatusBar, TStatusPanels, TStatusPanel.
TStatusBar este componenta care reprezintă bara de statut. O bară de statut poate avea mai multe panouri. Pe fiecare dintre ele se poate afişa text sau imagine. Colecţia de panouri ale unei bare de statut este reprezentată de clasa TStatusPanels. Un panou din colecţie este obiect de clasă TStatusPanel.
13.1. TStatusBar
Reprezintă o bară - amplasată de obicei în partea de jos a ferestrei - şi care afişează informaţii despre aplicaţia în curs de execuţie. Spre exemplu, în bara de acest tip, aplicaţia M icrosoft W ord afişează: numărul paginii curente, numărul de pagini din documentul curent, poziţia cursorului etc.
Ierarhie________________________________________
TObject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TStatusBar.
Definit în_______________________________________
comctrls.pas
Pagina_______________________________________ _
Win32
Proprietăţi_____________________________________
P I. Panels
property Panels: TStatusPanels;
Informaţia pe un TStatusBar este afişată în panouri (engl. panels) aliniate de obicei la stânga. Proprietatea Panels este o colecţie de astfel de panouri. La momentul proiectării aplicaţiei se poate seta numărul panourilor şi caracteristicile lor, folosind proprietatea Panels din Object
146
Inspector. Pe ecran va apare un editor de panouri cu ajutorul căruia se pot manipula panourile deja existente. Tot cu ajutorul acestui panou se pot adăuga noi panouri sau se pot şterge unele dintre panourile deja existente.
P2. Canvas
property Canvas: TCanvas;
Furnizează acces la suprafaţa de desenare a unei componente de tip TStatusBar.
Exem plu:
Următoarea aplicaţie exemplifică modul de lucru cu proprietatea Canvas a TStatusBar-\i\u\: suprafaţa de desenare va fi colorată la apariţia evenimentului OnTimer - al unei componente TTimer - cu o culoare aleatoare.
procedure TForml. TirnerlTimer (Sender: TObject); var
r : TRect; begin
StatusBarl.Canvas.Brush.Color := random($FFFFFF + 1);// include-ti stdlib.hr := Rect(0,3,100,StatusBarl.Height-1) ;StatusBarl.Canvas.FillRect(r);
end;
P3. SimplePanel
property SimplePanel: Boolean;
Indică dacă componenta de tip TStatusBar are unul sau mai multe panouri.
P4. SimpleText
property SimpleText: string;
Reprezintă textul care va afişat în panoul componentei de tip TStatusBar, când aceasta are proprietatea SinglePanel setată la true.
Evenimente
E l. On Resize
property OnResize: TNotifyEvent;
Apare când componentă de tip TStatusBar este redimensionată la momentul execuţiei aplicaţiei.
E2. OnDrawPanel
property OnDrawPanel: TDrawPanelEvent;
Apare când un o componentă de tip TStatusPanel trebuie redesenată. Tipul TDrawPanelEvent este definit astfel:
TDrawPanelEvent = procedure(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect) of object;
Rect reprezintă noua dimensiune a componentei de Panel de tip TStatusPanel.Acest eveniment apare doar dacă proprietatea Style a componentei Panels este setată la psOwnerDraw.
13.2. TStatusPanels
Este o colecţie de obiecte de tip TStatusPanel.
Ierarhie ______________________________________ _____________
TObject -> TPersistent -> TCollection -> TStatusPanels.
Definit în_____________________________________________________comctrls
Proprietăţi___________________________________________________
P I. Items
property \{ems[Index\ Integer]: TStatusPanel; default;
Este o listă indexată cu panourile din colecţie. Pentru a afla numărul acestora se poate folosi proprietatea Count a lui TCollection.
148
Metode__________________
M l. TStatusPanels
Este constructorul clasei.
M2. Add
function Add: TStatusPanel;
Adaugă o componentă de tip TStatusPanels la o componentă de tip TStatusBar. Sunt atribuite valori implicite pentru noul panou. Proprietăţile lui pot fi setate mai târziu, accesându-1 prin intermediul vectorului Items.
13.3. TStatusPanel
Reprezintă un singur panou dintr-o componentă de tip TStatusBar.
IerarhieTObject -> TPersistent -> TCollectionltem -> TStatusPanel.
Definit în_____________________________
com ctrls.pas
Proprietăţi
PI. Alignment
p roperty Alignment: TAlignment;
Specifică cum este afişat textul în interiorul unui panou. Valori posibile pentru această proprietate sunt: taLeftJustify, taRightJustify, taCenter.
N um e S c in n ilic a ţie
taLeftJustify A liniază textul în partea stângă a panoului.
TaRiţ’luJtixtify A liniază textul în partea dreaptă a panoului.
TaCenter C entrează textul în panou.
P2. Bevcl
property Bevel: TStatusPanelBevel;
Indică tipul marginii panoului. Valori posibile pentru Bevel sunt:
149
N u m e S em n ifica ţie
PbNone Panou! nu are nici o m argine şi pare plat.
phLowered Panoul are o m argine care crează im presia că panoul este scobit.
pbRaised Panoul are o m argine care crează im presia că panoul este ridicat.
P3. Text
property Text: string;
Indică textul afişat în panou, dacă valoarea proprietăţii Style este psText.
P4. Style
property Style: TStatusPanelStyle;
Indică felul în care este afişat textul din panou. Valori posibile pentru Style sunt:
N u m e S em n ifica ţie
PsText în panou este afişat şirul ataşat proprietăţii Text.
PsOwnerDrawC onţinutu l panoului va fi desenat la m om entul execuţie aplicaţiei prin interm ediul liandlerului de even im ent TSlatusBar.OnDrawPanel.
P5. Width
property Width: Integer;
Indică dimensiunea, în număr de pixeli, (pe orizontală) a panoului.
Exem plul 1:
Următoarea aplicaţie constă dintr-o formă pe care sunt plasate 3 controale: o cutie de editare de tip TEdit, un buton de tip TButton şi o componentă de tip TStatusBar. în momentul creării formei, barei de statut îi sunt create două panouri în care se va afişa poziţia cursorului de mouse. Dacă mouse-ul trece pe deasupra celor două componente (TButton şi TEdit), atunci bara de statut va deveni simplă şi va afişa un text sugestiv.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object StatusBarl: TStatusBar Panels = <
itemText = 'X = 'Width = 50
itemText = 'Y='Width = 50
end>SimplePanel = False
endHandlerele de evenimente ale obiectelor de pe forma F orm l sunt:
procedure TForml.ButtonlMouseMove(Sender: TObject;Shift: TShiftState; X,Y: Integer);
beginStatusBarl.SimplePanel := true;StatusBarl.SimpleText := 'Trec pe deasupra unui buton';
end ;
procedure TForml.EditlMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
beginStatusBarl.SimplePanel := true;StatusBarl.SimpleText :=
'Trec pe deasupra unei cutii de editare';end;
procedure TForml.FormMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
beginStatusBarl.SimplePanel := false;StatusBarl.Panels.Items[0].Text := 'X = '+IntToStr(X);StatusBarl.Panels.Items[l].Text ;= ' Y= '+IntToStr(Y);
end;
Exem plul 2:
Următoarea aplicaţie creează unei componente TStatusBar două panouri. Pe cel de al doilea se vor afişa - cu ajutorul unui tim er - numerele de la 1 la 10. Pe primul panou se va afişa un text sugestiv când s-a ajuns la 10.
vari : integer;
procedure TForml.FormCreate(Sender: TObject); beginTimerl .Enabled -. = true;i := 0; / / d e cate ori s-a apelat evenim entul O nT im er
end;
procedure TForml.TimerlTimer(Sender: TObject); begin
StatusBarl.Panels.Items[1].Text := IntToStr(i);
151
p ţ < j i M ) ii i)iw t i i> ii i |W II» l l T i i i r w i i i i i i i w i W i l l l i iiiii ...............
if i = 10 then begin
StatusBarl.Panels.Items[0].Text := 'Am ajuns la 10! Timerl .Enabled := false; //opresc tim er-ul
end; inc(i);
end;
152
14. MANIPULATOR DE PANOURI
în acest capitol sunt prezentate două componente: TPageControl şi TTabSheet.
TPageControl este o componentă ca permite utilizatorului să afişeze multiple panouri (pagini) într-o aceeaşi fereastră. Fiecare pagină este o componentă de tip TTabSheet. Paginile sunt total suprapuse, iar la un moment dat una singură este vizibilă. Pe suprafaţa ei se pot amplasa componente. Fiecare pagină are ataşat un buton amplasat pe marginea componentei TPageControl. Trecerea de la o pagină la alta se face cu ajutorul butoanelor ataşate.
14.1. TPageControl
Este un control care permite utilizatorului să folosească multiple pagini (ferestre) într-o aceeaşi suprafaţă. în fiecare moment o singură pagină este visibilă. Fiecare pagină se comportă ca o formă, adică pe suprafaţa ei se pot amplasa componente. Pentru fiecare pagină apare în partea de sus (de obicei) a lui TPageControl câte un buton prin a cărui apăsare pagina ataşată lui va deveni vizibilă. O pagină este un obiect de tipul TTabSheet.
La momentul proiectării aplicaţiei crearea unei noi pagini se realizează prin click dreapta pe componenta TPageControl iar apoi prin selectarea comenzii NewPage.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomTabControl -> TPageControl.
Definit în_____________________________________________________
comctrls.pas
Pagina_______________________________________________________
Win32
153
Proprietăţi__________________________________________ _________
PI. ActivePage
property ActivePage: TTabSheet;
Indică pagina activă. Prin setarea acestei proprietăţi ActivePage va deveni pagina vizibilă.
P2. PageCount
property PageCount: Integer;
Indică numărul de pagini din TPageControl.
P3. Pages
property Pages[Index: Integer]: TTabSheet;
în Pages se află toate paginile lui PageControl. Prin intermediul lui Index se poate accesa fiecare pagină în parte.
P4. HotTrack
property HotTrack: boolean;
Indică dacă textul înscris pe un tab se luminează când cursorul de mouse trece pe deasupra lui.
P5. MultiLine
property MultiLine: Boolean;
Indică dacă este permisă afişarea tab-urilor pe mai multe linii. în caz contrar şi dacă lungimea totală a tab-urilor este mai mare decât cea a TPageControl-u\u\, două săgeţi îi vor permite utilizatorului să navigheze printre tab-uri.
P6. TabPosition
property TabPosition: TTabPosition;
Indică poziţia în care să apară tab-urile unui TPageControl. Valori posibile pentru TabPosition sunt tpTop şi tpBottom.
154
Exemplu:
Următoarea aplicaţie setează dimensiunea şi stilul textului din cutia de editare E ditl. Pentru aceasta este folosită o componentă TPageControl cu două pagini (create la momentul proiectării programului).Pe prima pagină se află o cutie de editare Edit2, în care utilizatorul introduce dimensiunea textului cutiei de editare E ditl şi un buton de tip Default (Default := true), la a cărui apăsare se setează dimensiunea textului din cutia E ditl la valoarea conţinută în Edit2.Pe a doua pagină se află 4 cutii de control (componente de tip TCheckBox) corespunzând celor patru stiluri de font: bold (îngroşat), italic (înclinat), underline (subliniat), strikeout (tăiat).
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object PageControll: TPageControl object TabSheetl: TTabSheet
Caption = 'Dimensiune' object Edit2: TEdit
Text = '12' endobject Buttonl: TButton
Caption = 'executa'Default = True
end endobject TabSheet2: TTabSheet
Caption = 'Font' object CheckBoxl: TCheckBox
Caption = 'bold' object CheckBox2: TCheckBox
Caption = 'italic' endobject CheckBox3: TCheckBox
Caption = 'underline' endobject CheckBox4: TCheckBox
Caption = 'strikeout' end
end endobject Editl: TEdit
Text = '2B or not 2B = F F ' end
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
varstil,bold,italic,underline,strikeout:TFontStyles;
155
procedure TForml .FormActivate (Sender TObject); begin
bold := [fsbold];italic := [fsitalic]; underline := [fsunderline]; strikeout := [fsstrikeout];
end;
procedure TForml.ButtonlClick(Sender: TObject); begin
Editl.Font.Size := StrToInt(Edit2.Text); end;
procedure TForml.CheckBoxlClick(Sender: TObject) begin
if CheckBoxl.Checkedthen stil := stil + [fsbold] else stil := stil - [fsbold];
Editl.Font.Style := stil; end;procedure TForml.CheckBox2Click(Sender: TObject) begin
if CheckBox2.Checkedthen stil := stil + [fsitalic] else stil := stil - [fsitalic];
Editl.Font.Style := stipend;procedure TForml,CheckBox3Click(Sender: TObject) beginif CheckBox3.Checked
then stil := stil + [fsunderline] else stil := stil - [fsunderline];
Editl.Font.Style := stil; end;
procedure TForml.CheckBox4Click(Sender: TObject) beginif CheckBox4.Checked
then stil := stil + [fsstrikeout] else stil := stil - [fsstrikeout];
Editl.Font.Style := stil; end;procedure TForml.TabSheetlEnter(Sender: TObject) begin
Edit2.SetFocus; end;
156
Metode
M l. FindNextPage
function FindNextPage^CMrPage: TTabSheet;GoForward, CheckTabVisible: Boolean):
TTabSheet;
Returnează următoarea (precedenta) pagină din cadrul lui TPageControl. Dacă GoForward este true, se va returna o pagină aflată după pagina curentă, în caz contrar una aflată înaintea celei curente. Dacă CheckTabVisible este true se va căuta printre paginile care au proprietatea TabVisible true , în caz contrar luându-se în calcul toate paginile existente.
M2. Select Next Page
procedure SelectNextPage(Go/wiwi/Yi: Boolean);
Permite utilizatorului să selecteze următoarea pagină. GoForward are aceeaşi însemnătate ca la proprietatea precedentă.
Evenimente__________________________________________________
E l. OnChange
property OnChange: TNotifyEvent;
Apare când un nou tab (componentă de tip TTabSheet) este selectat.
E2. OnChanging
property OnChanging: TTabChangingEvent;
Apare exact înainte de a se selecta o nouă pagină. Tipul TTabChangingEvent este definit astfel:
type TTabChangingEvent = procedure (Sender: TObject;var AllowChange: Boolean) of object;
AllowChange indică dacă este permisă sau nu selectarea acelei pagini.
14.2. TTabSheet
Este o pagină dintr-o componentă TPageControl.
157
Ierarhie
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TTabSheet.
Definit în_____________________________________________________
com ctrls.pas
Proprietăţi___________________________________________________
P I. Pagelndex
property Pagelndex: Integer;
Furnizează acces la numărul de ordine al unei pagini din cadrul lui PageControl.
P2. PageControl
property PageControl: TPageControl;
Indică componenta de tip TPageControl care conţine TTabSheet-u\.
P3. Tablndex
property Tablndex: Integer;
Indică numărul de ordine al tabului paginii curente din cadrul unui vector de tab-uri vizibile.
P4. TabVisible
property TabVisible Boolean;
Indică dacă tab-ul obiectului TTabSheet este vizibil în TPageControl.
Metode__________________________________ ___________________
M l. Create
constructor Cred.tc(A Owner: TComponent);
Este constructorul clasei.
158
Evenimente
E l. OnHide
property OnHide: TNotifyEvent;
Apare când proprietatea Visible a paginii este setată la false.
E2. OnShow
property OnShow: TNotifyEvent;
Apare când proprietatea Visible a paginii este setată la true.
Exemplu:
Următoarea aplicaţie creează la momentul execuţiei 10 pagini de tip TTabSheet. Apoi, cu ajutorul unei componente TUpDown, navighează printre ele.
Handlerele de evenimente pentru forma Form l sunt:
procedure TForml.FormCreate(Sender: TObject); var i: integer;
pPage; TTabSheet; begin for i .-= 0 to 9 do begin
pPage := TTabSheet.Create(Forml) ; pPage.PageControl := PageControll; pPage.Caption := 'Pagina'+IntToStr(i);
end; end;
procedure TForml.UpDownlClick(Sender: TObject;Button: TUDBtnType);
beginPageControll.SelectNextPage(Button = btNext);
end;
159
15. RIGLE
în acest capitol este prezentată componenta TTrackBar care constă dintr- un cursor ce se poate deplasa de-a lungul unei rigle marcate.
15.1. TTrackBar _i_i
Este o componentă ce conţine un cursor care se poate deplasa de-a lungul unei rigle marcate. La momentul execuţiei, mişcarea (deplasarea) cursorului se poate face cu ajutorul mouse-ului, cu ajutorul tastelor <Up>, <Down>, <PgUp>, <PgDown> sau prin atribuirea unei valori proprietăţii Position.
ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TTrackBar.
Definit în___________________________________________ ______ __
comctrls.pas
Pagina __________ _______ _
Win32
Proprietăţi___________________________________________
P I. Position
property Position: Integer;
Indică poziţia curentă a cursorului pe riglă. Poziţia cursorului poate lua valori în intervalul [Min..Max].
P2. Max
property Max: Integer;
Indică valoarea poziţiei maxime pe care o poate avea cursorul.
160
property Min: Integer;
Indică valoarea poziţiei minime pe care o poate avea cursorul.
P4. Frequency
property Frequency: Integer;
Specifică din câte în câte unităţi apar marcajele pe riglă. O riglă este împărţită în Max - Min + 1 unităţi. Dacă Frequency este 1, atunci pentru fiecare unitate este desenat câte un marcaj. Dacă Frequency este 2, atunci câte un marcaj este desenat la fiecare două unităţi.
P5. LineSize
property LineSize: Integer;
Specifică numărul de poziţii cu care se va mişca cursorul când sunt apăsate tastele săgeată în sus (<Up>) sau săgeată jos (<Down>).
P6. PageSize
property PageSize: Integer;
Specifică numărul de poziţii cu care se va mişca cursorul când sunt apăsate tastele <PageUp>, sau <PageDown>.
P7. Orientation
property Orientation: TTrackBarOrientation;
Specifică aşezarea componentei TTrackBar. Valori posibile pentru Orientation sunt:
P3. Min
V a lo a re S em n ifica ţie
IrHorizotilal C om ponenta TTrackBar este orientată orizontal. Poziţia Min se a flă la s tânga poziţiei Max.
trVerticalC om ponenta TTrackBar este orientată vertical. Poziţia Min se află deasupra poziţiei Max.
P8. TickStyle
property TickStyle: TTickStyle;
Indică tipul marcajelor riglei. Valori posibile pentru TickStyle sunt:
161
V a lo a re S em n ifica ţie
tsAuto M arcajele sun t autom at afişate pe riglă. Pasul cu care sun t afişate este da t de p roprietatea Frequency.
tsManualIm plicit nu este afişat nici un m arcaj, dar acestea pot fi am plasate cu a ju to ru l m etodei SetTick.
tsNone N ici un m arcaj nu este afişat pe riglă.
P9. TickMarks
property TickMarks: TTickMark;
Un cursor poate fi însoţit opţional de o riglă marcată. TickMarks specifică poziţia riglei faţă de cursor. Valori posibile pentru TickMarks sunt:
V a lo a re S em n ifica ţie
tmBottoniRiglUM arcajele se află sub cursor sau la dreapta cursorulu i, acest lucru depinzând de p roprietatea Orientation.
tniTopLeftM arcajele se află deasupra sau la stânga cursorulu i, acest lucru depinzând de p roprietatea Orientation.
tiuBolh M arcajele se a flă de am bele părţi ale cursorului.
Metode
M l. SetTick
procedure SetTick(Va/Me: Integer);
Amplasează un semn de marcare pe riglă la poziţia Value e [Min .. Max]. Această metodă se apelează doar când valoarea proprietăţii TickStyle este tsManual.
Exemplu:
Următoarea aplicaţie generează la apăsarea butonului Buttonl 10 marcaje pe rigla componentei TrackB arl. Marcajele sunt amplasate în poziţii aleatoare.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object TrackBarl: TTrackBar Max = 20Orientation = trHorizontal Frequency = 1 Position = 0TickMarks = tmBottomRight
162
TickStyle = tsManual endobject Buttonl: TButton Caption = 'Marcaje'
end1 landlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); varpoz, i : integer;
beginfor i := 1 to 10 do beginpoz := TrackBarl.Min +
random(TrackBarl.Max-TrackBarl.Min + 1);TrackBarl.SetTick(poz);
end; end;
Evenimente
E l. OnCliange
property OnChange: TNotifyEvent;
Apare când poziţia cursorului se schimbă.
Exem plul 1:
Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate o componentă TTrackBar şi o componentă TlmageList. Aceasta din urmă conţine imagini introduse de către programator la momentul proiectării aplicaţiei. După lansarea aplicaţiei în execuţie, numărul poziţiilor TrackBar-ului va fi setat la numărul imaginilor din listă. în acest fel, fiecărei poziţii a cursorului îi va corespunde o imagine din listă. Prin mişcarea cursorului se va desena pe ecran imaginea corespunzătoare din listă.
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.FormCreate(Sender: TObject);begin
TrackBarl.Max := ImageListl.Count;TrackBarl.Min := 0;TrackBarl.Position := 0;
end;
163
procedure TForml.TrackBarlChange(Sender: TObject); begin
ImageListl.Draw(Canvas,0,0,TrackBarl.Position); end;
Exemplul 2:
Următoarea aplicaţie afişează în cutia de editare E ditl numere aleatoare din intervalul 1..100. Numerele sunt afişate la evenimentul OnTimer al obiectului TimerI. Viteza de afişare (valoarea proprietăţii Interval a lui TTimer) este modificată cu ajutorul unei componente TTrackBar. Valori mici ale proprietăţii Position înseamnă viteză mare de generare. Valori mari ale proprietăţii Position înseamnă viteză mică de generare.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Editl; TEdit Text = 'Editl'
endobject TrackBarl: TTrackBar
Orientation = trHorizontal Frequency = 1 Position = 1
endobject Timerl: TTimer
Interval = 200 end
Handlerele de evenimente ale obiectelor de pe formă sunt:
procedure TForml.TimerlTimer(Sender: TObject); begin
Editl.Text:=IntToStr(1 + random(100)); end;
procedure TForml.TrackBarlChange(Sender: TObject); begin
Timerl.Interval:=TrackBarl.Position*200;/ / o gradaţie pe scala lui TTrackBar valorează 200 de milisecunde //pen tru intervalul lui Timerl
end;
Exemplul 3:
Următoarea aplicaţie setează cu ajutorul unei componentei TrackBarl dimensiunea fontului etichetei L a b ell.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Labell: TLabel Caption = ’Labell'Font.Height = -13 Font.Name = 'Courier New'
164
endobject TrackBarl: TTrackBar Max = 2 0Orientation = trVertical Frequency = 1 Position = 0TickMarks = tmBottorciRight TickStyle = tsAuto
endI l;mdlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.TrackBarlChange(Sender: TOfcnect); begin
I,.ibel 1. Font. Size := TrackBarl. Position + 10; and;
16. MENIURI
Componentele de meniu permit ataşarea unui meniu unei forme (componenta TMainMenu) sau unei componente (TPopUpMenu).
Componenta TMainMenu încapsulează bara principală de meniu împreună cu meniurile drop-down ataşate ei.
Componenta TPopUpMenu încapsulează un meniu popup (care apare la click dreapta pe o componentă).
Un meniu este alcătuit din itemuri de meniu care sunt obiecte de clasă TMenuItem. Accesarea unui item de meniu se face cu ajutorul proprietăţii Items a lui TMainMenu şi TPopUpMenu.
La sfârşitul acestui capitol sunt prezentate câteva funcţii utile în manipularea şi prelucrarea meniurilor la momentul execuţiei aplicaţiei.
16.1. TMenu
Este clasa de bază pentru meniuri Windows. Din ea derivă TMainMenu şi TPopupMenu.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TMenu.
Definit în
menus.pas
Proprietăţi___________________________________________________
P I. Items
property Items: TMenuItem;
Specifică item-urile unui meniu. Această proprietate este utilă dacă dorim să prelucrăm meniul la timpul execuţiei programului. La momentul proiectării aplicaţiei proprietatea poate fi editată din O bject Inspector.
166
1*2. Handle
property Handle: HMENU;
Este handle-ul la meniu.
1*3. WindowHandle
property WindowHandle: HWnd;
Este handle-ul la fereastra care foloseşte acest meniu.
Metode
M l. Findltem
function Findltem(l/fl/«e: Word; Kind: TFindltemKind): TMenuItem;
Găseşte un item şi îl returnează. Această metodă este utilă pentru a căuta un anumit item într-un meniu (inclusiv în submeniuri). Meniul poate fi identificat prin unul dintre următoarele trei lucruri: scurtătură (shortcut), identificatorul mesajului WM COMMAND şi handle. Valori posibile pentru Kind sunt:
V a lo a re S e m n ifica ţie
fkCommand M eniul este căutat după m esajul W M _C O M M A N D .
JkHandle M eniul este căutat după identificatorul W indows.
jkShortC ut M eniul este cău tat după scurtătură.
Exemplu:
Următoarea aplicaţie realizează căutarea unui item de meniu după scurtătura ataşată lui. Este folosită o componentă de tip THotKey în care utilizatorul este solicitat să introducă combinaţia de taste după care se va realiza căutarea.
procedure TForml.ButtonlClick(Sender: TObject);var meniu : TMenuItem;
beginmeniu := MainMenul.FindItem(HotKeyl.HotKey, fkShortCut); if meniu = nil
then ShowMessage('Meniul nu exista!')©Îs© ShowMessage('Meniul are eticheta ' + meniu.Caption);
end;
167
16.2. TMainMenu r
încapsulează o bară de meniu împreună cu meniurile drop-down. Unitatea de bază la un meniu sunt item-urile. De exemplu, bara principală de meniu a Delphi -ului are item-urile (File, Edit, Search, View, Project, Run, Component, DataBase, Tools şi Help), iar meniul File are item-uri precum: New, Open, Save, Save A s ,...
Pentru a ataşa un meniu unei forme, Ia timpul proiectării aplicaţiei, amplasaţi pe formă o componentă de tip TMainMenu, iar apoi executaţi dublu click pe ea. Pe ecran va apărea un utilitar care vă va ajuta la crearea unui meniu:
f ţ j Forml.MainMenul
Precum vedeţi, există un câmp marcat, unde puteţi introduce un nume de item (meniu) principal. Să-l denumim File (în O bject Inspector setaţi proprietatea Caption la valoarea 'File'). Pe ecran va apărea:
•g" Forml.M ainM enul H0E3File j..........j
Există un câmp marcat pentru adăugare de item-uri (submeniuri) la meniul File, şi un câmp pentru adăugarea unui nou item în bara de meniu, deci pe acelaşi nivel cu File. Lucrurile evoluează de aici încolo tot aşa, la fiecare pas aveţi posibilitatea fie să adăugaţi un nou item la bara principală, fie să adăugaţi un item (submeniu) la unul din meniurile existente. Pentru a adăuga un subitem la un item existent executaţi click dreapta pe respectivul submeniu şi alegeţi Create Submenu. Pentru a insera un item se execută click dreapta pe itemul
168
înaintea căruia se doreşte inserarea şi apoi se alege Insert. Pentru a şterge un item poziţionaţi-vă pe el şi apoi apăsaţi tasta Delete.
Item-urile din bara principală de meniu se accesează cu ajutorul proprietăţii Menu (care este de tip TMainMenu) a lui TForm. Item-urile (sub- meniurile) se accesează cu ajutorul proprietăţii Items a lui TMainMenu.
Fiecare item este o componentă Delphi, deci acesta îi va da automat un nume. Acest nume se formează adăugând la titlu un număr. De exemplu, dacă pe l'ormă nu mai există altă componentă cu numele File, atunci item-ul care se vede mai sus va primi numele de F ilei. Dacă există mai multe item-uri (componente) cu acelaşi titlu, ele vor primi în ordinea creării numele F ile i, F ile i,...
Ierarhie
TObject -> TPersistent t> TComponent -> TMenu -> TMainMenu.
Definit în
menus
Pagina______
Standard.
Proprietăţi
1*1. AutoMerge
property AutoMerge: Boolean;
Indică dacă meniurile de pe alte forme pot fuziona cu meniul de pe forma principală. Dacă doriţi ca un meniu de pe o altă formă să fuzioneze, în momentul în care această formă devine activă, cu meniul de pe forma principală, atunci setaţi proprietatea acestuia (de pe forma secundară) la true. In toate cazurile aveţi grijă ca proprietatea AutoM erge pentru meniul formei principale să rămână false.Modul în care fuzionează meniurile este controlat cu ajutorul proprietăţii Grouplndex a lui TMenuItem.
Kxeinplul 1:Să presupunem că pe forma principală (F orm l) avem o bară de meniu cu item-urile File, Run, Edit, View şi Help, iar pe forma secundară (F orm l) avem o bară de meniu cu item-urile Run, Compile, Tools şi Window. Aceste meniuri le-am creat la momentul proiectării aplicaţiei. Pe forma Form l mai avem un buton Buttonl care va face forma Form l
169
activă. în urma execuţiei programului de mai jos, meniul formei Form l după apăsarea butonului Buttonl va avea următoarele item-uri astfel: File, Run, Compile, Tools, Window.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Buttonl: TButton Caption = 'Buttonl'
endobject MainMenul: TMainMenu object Filei: TMenuItem
Caption = 'File'Grouplndex = 1
endobject editl: TMenuItem
Caption = 'Edit'Grouplndex = 2
endobject Viewl: TMenuItem Caption = 'View'Grouplndex = 2
endobject Helpl: TMenuItem
Caption = 'Help'Grouplndex = 4
end end
iar pentru forma Form2:
object MainMenul: TMainMenu obj ect Runl: TMenuItem Caption = 'Run'Grouplndex = 1
endobject Compilai: TMenuItem
Caption = 'Compile'Grouplndex = 2
endobject Toolsi: TMenuItem
Caption = 'Tools'Grouplndex = 3
endobject Windowl: TMenuItem
Caption = 'Window'Grouplndex = 3
end end
Handlerele de evenimente ale componentelor formei Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject);begin
Form2.SUow;end;
170
Exemplul 2:
Următorul exemplu permite editarea unui text. Este permisă modificarea culorii textului şi a fundalului, boldarea, italicizarea şi sublinierea textului, aplicarea de bullets and numbering prin selectarea opţiunii corespunzătoare care va apare la execuţia unui click dreapta. Vom folosi mai întâi o componetă TRichEditl în care vom putea edita text. O altă componentă folosită este TMainMenuJ care conţine trei meniuri:
• meniul File cu submeniurile:
- Open - care permite deschiderea unui fişier existent pentru care vom folosi o componentă O penD ialogI;
- Save - care permite salvarea documentului curent realizată cu ajutorul unei componente SaveD ia log l;
- Close - care permite închiderea aplicaţiei;
• meniul Format care cuprinde submeniurile:
- B old ;- Italic',- Bullets and numbering;- Size.
• meniul Help.
Submeniurile Bold şi Italic permit boldarea şi italicizarea textului selectat, submeniul Bullets and numbering permite numerotarea unor secvenţe de text, iar submeniul Size permite setarea dimensiunii textului. Meniul Help determină apariţia unei a doua forme, F orm l, în care poate fi scris un text privitor la utilizarea aplicaţiei. Vom mai folosi o componentă PopUpM enul care să ne permită selectarea uneia dintre opţiunile ce vor fi afişate la realizarea unui click dreapta. Vom mai folosi şi o componentă ColorD ialogl care va fi disponibilă în momentul în care dorim setarea unei culori pentru fundal sau text.
Proprietăţile obiectelor de pe forma F orm l sunt:
object RichEditl: TRichEdit PopupMenu = PopupMenul
endobject MainMenul: TMainMenu object Filei: TMenuItem
Capfion = 'File' object Closel: TMenuItem
Caption = 'Close'Shortcut = 16451
171
endobject Savel: TMenuItem
Caption = ’Save'Shortcut = 16467 OnClick = SavelClick
endobject openl: TMenuItem
Caption = 'Open 1 Shortcut = 16463
end endobject Optionsl: TMenuItem
Caption = 'Format' object Boldl: TMenuItem
Caption = 'Bold'Shortcut = 16450
endobject Italici: TMenuItem Caption = 'Italic'Shortcut = 16457
endobject Bulletsandnumberingl: TMenuItem
Caption = 'Bullets and numbering' endobject Sizel: TMenuItem
Caption = 'Size'OnClick = SizelClick
end endobject helpl: TMenuItem
Caption = 'help'Shortcut = 112 OnClick = helplClick
end endobject PopupMenul: TPopupMenu
MenuAnimation = [maTopToBottom] object Colori: TMenuItem
Caption = 'Color' object Backgroungl: TMenuItem
Caption = 'Backgroung'OnClick = BackgrounglClick
endobject extl: TMenuItem
Caption = 'Text'OnClick = extlClick
end endobject Fontl: TMenuItem
Caption = 'Font' object Bold2: TMenuItem
Caption = 'Bold'OnClick = Bold2Click
end
172
object Italic2: TMenuItem Caption = 'Italic'OnClick = Italic2Click
endobject Underlinel: TMenuItem
Caption = 'Underline'OnClick = UnderlinelClick
endobject Strickeoutl: TMenuItem Caption = 'Strickeout’OnClick = StrickeoutlClick
end end
endobject ColorDialogl: TColorDialog endobject OpenDialogI: TOpenDialog •ndobject SaveDialogl: TSaveDialog and
I Iandlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.BackgrounglClick(Sender: TObject); begin
if ColorDialogl.Executethen RichEditl.Color: ColorDialogl.Color;
•nd;procedure TForml.extlClick(Sender: TObject); beginif ColorDialogl.Executethen RichEditl.SelAttributes.Color := ColorDialogl.Color;
end;
procedure TForml.SizelClick(Sender: TObject);var s : string;
begins : = 11 ;if InputQuery('Input Box', ’size', s) then RichEditl.SelAttributes.Size := StrToInt(s);
end;
procedure TForml.SavelClick(Sender: TObject); begin
If SaveDialogl.Executethen RichEditl.Lines.SaveToFile(SaveDialogl.FileName);
end;
procedure TForml.Bold2Click(Sender: TObject); beginif RichEditl.SelAttributes.Style * [fsbold]<>[] then RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style-[fsBold] else RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style+[fsBold];end;
procedure TForml.Italic2Click(Sender: TObject);beginif RichEditl.SelAttributes.Style * [fsitalic]o [] then RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style-[fsitalic) else RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style+[fsitalic];end;procedure TForml.UnderlinelClick(Sender: TObject);beginif RichEditl.SelAttributes.Style * [fsunderline]<>[] then RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style-[fsUnderline] else RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style+[fsUnderlin e];end;procedure TForml.StrickeoutlClick(Sender: TObject);begin
if RichEditl.SelAttributes.Style * [fsStrikeOut]o [] then RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style - [fsStrikeOut] else RichEditl.SelAttributes.Style :=
RichEditl.SelAttributes.Style + [fsStrikeOut];end;procedure TForml.helplClick(Sender: TObject);begin
f orm2 . ShowModal ;end;
Metode
M l. Merge
procedure Merge(A/e/iw: TMainMenu);
Combină meniul principal al unei forme cu meniul principal al altei forme. Menu este meniul celei de-a doua forme.
M2. Unmerge
procedure Unmerge(Menu: TMainMenu);
Este inversa operaţiei Merge.
174
16.3. TPopUpMenu
Un meniu TPopUp este asemănător cu un TMainMenu. Apar însă unele
diferenţe:
• când utilizatorul execută click dreapta pe o formă sau pe un control;
• item-urile din “bara principală” de meniu sunt dispuse nu orizontal
ci vertical.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TMenu -> TPopupMenu.
Definit în_____________________________________________________
menus
Pagina_______________________________________________________
Standard
Proprietăţi___________________________________________________
IM. Alignment
property Alignment: TPopupAlignment;
Specifică poziţia unde apare meniul când utilizatorul execută click
dreapta pe un control. Valori posibile pentru Alignment sunt:
Valoare Semnificaţie
paLeft Colţul din stânga sus al meniului apare pe poziţia cursorului de mouse.
paCenter Centrul marginii de sus a meniului apare pe poziţia cursorului de
mouse.
paRight Colţul din dreapta sus al meniului apare pe poziţia cursorului de mouse.
Implicit este paLeft.
P2. AutoPopup
property AutoPopup: Boolean;
Specifică dacă meniul popup apare când se execută click dreapta pe o
componentă.
Exemplu:
Următorul exemplu conţine un meniu TPopUp care se activează la
executarea unui click dreapta pe butonul Buttonl. Item-urile acestui
meniu sunt Înălţime, Latime şi FontMare şi au fost create în momentul
proiectării aplicaţiei. La selectarea itemului Înălţime, cutia de editare
Editl devine activă şi utilizatorul este solicitat să introducă înălţimea
butonului Buttonl. La selectarea itemului Latime, cutia de editare Edit2
devine activă şi utilizatorul este solicitat să introducă lăţimea butonului
Buttonl. La apăsarea itemului FontMare, fontul titlului butonului
Buttonl este mărit la 15, iar apoi, la o nouă apăsare, este readus la
mărimea iniţială (8). Pe formă mai există două butoane - Button2 şi
Button3 - care sunt de tip Default pentru cele două cutii de editare.
Valorile proprietăţilor obiectelor de forma Forml sunt:
object Buttonl: TButton PopupMenu = popupMenul
endobject Button2: TButton
Caption = 'Schimba latime'Default = True Enable = False
endobject Button3: TButton
Caption = 'Schimba inaltime'Default = True Enabled = False
endobject Editl: TEdit
Visible = False endobject Edit2: TEdit
Visible = False endobject PopupMenul: TPopupMenu
object Inaltimel: TMenuItem Caption = 'Inaltime'OnClick = InaltimelClick
endobject Latimel: TMenuItem
Caption = 'Latime'OnClick = LatimelClick
endobject FontMarel: TMenuItem
Caption = 'FontMare'OnClick = FontMarelClick
end end
176
I Imullcrelc de evenimente ale obiectelor de forma Forml sunt:
limuadure TForml. LatimelClick (Sender: TObject); liauin
Kc 11 I 1 . Show;
hi 11 I ori2 . Enabled: =true ;Mut I on î.Enabled;=false;I :. I i l 1 . SetFocus;
and;
inocodure TForml.InaltimelClick(Sender: TObject); liagln
l '.i III A . Show;
Mul l.on3 .Enabled: =true; luii t on2 .Enabled: =false; l-'.i Iii 2 . SetFocus ;
aud;
procedure TForml.Button2Click(Sender: TObject); var
Uit. : integer; bagin
1 ,i\ : strtoint (Editl .Text) ;Itui tor,] .Width:=lat;
and ;procedure TForml.Button3Click(Sender: TObject);
varinalL : integer;
bagini ii,i 1 r : =strtoint (Edit2 .Text) ; lint Lonl. Height: =inalt ;
and ;procedure TForml.FontMarelClick(Sender: TObject); begin
KontMarel.Checked:=not(FontMarel.Checked);Hui: toni. Font .Size: =15- (Buttonl .Font. Size-8) ;
and,
1*3. PopupComponent
property PopupComponent: TComponent;
Indică ultima componentă care a afişat meniul popup. Un meniu popup
poate fi ataşat la mai multe controale, cu ajutorul proprietăţii
PopupMenu a lui TControl.
177
Metode
M l. Popup
procedure Pop up (A-, Y: Integer);
Afişează un meniu de tip PopUp în locul specificat de coordonatele X şi
Y.
Evenimente______________________________________________
E l. OnPopup
property OnPopup: TNotifyEvent:
Apare înainte ca meniul PopUp să fie afişat.
16. 4. TMenuItem
Conţine proprietăţile metodelor necesare pentru a prelucra un item de
meniu.
Ierarhie________________________________________________ _____
TObject -> TPersistent -> TComponent -> TMenuItem.
Definit în________________________________________________ __
menus
PI. Caption
property Caption: string;
Indică textul ataşat unui item de meniu.
P2. Items
property Itemsl/ne/ex: Integer]: TMenuItem; default;
Furnizează acces la subitem-urile (submeniurile) unui meniu.
property Count: Integer;
Indică numărul de subitem-uri ale unui meniu.
Exemplu 1:
Următoarea aplicaţie tipăreşte etichetele ataşate tuturor itemurilor de
meniu din meniul principal al formei.
Procedurile şi handlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml.TiparesteMeniuri(meniu : TMenuItem);//tipăresc in ListBox submeniurile itemului meniu
vari : integer;
beginListBoxl.Items.Add(meniu.Caption); i := 0;while i < meniu.Count do begin
TiparesteMeniuri(meniu.Items[i]); i : = i + 1 ;
end; end;
procedure TForml.ButtonlClick(Sender: TObject); var
i : integer; begin
i := 0;while i < MainMenul.Items.Count do begin
TiparesteMeniuri(MainMenul.Items[i]); i : = i + 1 ;
end; end;
Exemplu 2:
Următoarea aplicaţie construieşte - într-o componentă TTreeView - un
arbore care reflectă structura arborescentă dintr-un meniu.
Procedurile şi handlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml.AfiseazaMeniuri(meniu : TMenuItem;nod : TTreeNode);
//afiseaza submeniurile itemului meniu in subarborele de rădăcină nod
vari : integer; fiu : TTreeNode;
begin
P3. Count
179
i := 0;// pentru fiecare submcniu
while i < meniu.Count dobegin
// creez un fiu in arbore
fiu := TreeViewl. Items . AddChild (nod, meniu.Items[i].Caption);// apelez recurşi v
AfiseazaMeniuri(meniu.Items[i], fiu); i := i + 1;
end; end;
procedure TForml.ButtonlClick(Sender: TObject); var
i : integer; nod : TTreeNode;
begini := 0;while i < MainMenul.Items.Count do begin
// pentru fiecare meniu din bara principala de meniu
// creez cate un nod in arbore
nod := TreeViewl.Items.Add(nil,MainMenul.Items[i].Caption);// si apelez recursiv pentru submcniuri
AfiseazaMeniuri(MainMenul.Items[i], nod); i := i + 1;
end; end;
P4. Hint
property Hint: string;
Specifică textul care apare când cursorul mouse-ului trece pe deasupra
item-ul de meniu.
P5. Checked
property Checked: Boolean;
Indică dacă un meniu este selectat sau nu. Dacă Checked este true,
atunci lângă numele meniului apare un semn de bifare.
P6. Enabled
property Enabled: Boolean;
Indică dacă un meniu este sau nu disponibil la un moment dat.
180
VI. Break
property Break: TMenuBreak;
Indică dacă itemul de meniu generează o nouă coloană în meniu. Valori
posibile pentru Break sunt:
Valoare Semnificaţie
mbNone Nu apare nici o ruptură în meniu. Această situaţie este implicită.
mbBarBreak
Meniul părinte este rupt încă într-o coloană. Itemul curent va fi pus
în capul noii coloane. 0 bară separă noua coloană de cele deja
existente.
mbBreakMeniul părinte este rupt încă într-o coloană. Itemul curent va fi pus
în capul noii coloane.
P8. Menulndex
property Menulndex: Integer;
Indică numărul de ordine al unui item (meniu) în cadrul meniului
părinte. Numărul de ordine al primului item (meniu) este 0.
P9. Parent
property Parent: TMenuItem;
Specifică itemul părinte al unui meniu.
P10. ShortCut
property ShortCut: TShortCut
Determină combinaţia de taste pe care utilizatorul trebuie să o tasteze
pentru a accesa un meniu mai rapid. De obicei, această combinaţie apare
scrisă la dreapta item-ului de meniu.
P il. Visible
property Visible: Boolean;
Determină dacă un item (meniu) este vizibil sau nu. Dacă nu este vizibil
utilizatorul nu îl poate selecta.
PI 2. Grouplndex
property Grouplndex: Byte;
Specifică modul în care meniurile diferitelor forme ale unei aplicaţii
fuzionează.
181
Această proprietate este utilă atunci când aplicaţia are mai multe forme
fiecare dintre acestea având un meniu propriu. Dacă proprietatea
AutoMerge pentru meniul unei forme diferită de forma principală este
true atunci la activarea acestei forme (formă secundară) meniul acesteia
va dispărea de pe ea şi va fuziona cu meniul de pe forma principală.
Dacă AutoMerge pentru meniul de pe o formă secundară este false,
atunci la activarea acesteia meniul de pe ea nu va dispărea şi nu va
fuziona cu meniul de pe forma principală.
Fiecare item al meniului are propriul lui Grouplndex. Pentru fuzionarea
a două meniuri nu sunt luate în considerare decât item-urile din bara
principală a meniurilor, celelalte item-uri secundare ne-intrând în calcul,
deci fuzionarea se face doar la nivel de meniuri principale.
Implicit, fiecare item din bara principală de meniu are Grouplndex egală
cu 0. Dacă doriţi să le schimbaţi trebuie să ştiţi că un item din bara
principală de meniu are valoarea lui Grouplndex mai mare sau egală
decât valoarea Grouplndex a precedentului item. De aici rezultă şi
modul în care două meniuri fuzionează:
• toate itemurile din bara principală a meniului formei secundare sunt
inserate în bara principală de meniu a formei principale, respectân-
du-se ordinea crescătoarea a valorilor Grouplndex;
• dacă unele item-uri din bara de meniu a formei secundare au acelaşi
Grouplndex cu unele item-uri din bara de meniu a formei princi
pale, atunci toate aceste item-uri (din meniul formei principale) vor
dispărea şi vor fi înlocuite cu item-urile din forma secundară.
P13. Radioltem
property Radioltem: Boolean;
Indică dacă item-ul de meniu se exclude reciproc cu celelalte itemuri de
meniu din acelaşi grup. în caz afirmativ, doar un item din grup poate fi
selectat la un moment dat. în faţa lui va apărea un cerculeţ.
Metode
M l. Add
procedure Add (Item: TMenuItem);
Adaugă un item de meniu la sfârşitul vectorului Items.
procedure Add(constÂfems: array of TMenuItem);
Adaugă mai multe itemuri la sfârşitul vectorului Items.
182
M2. Delete
procedure Delett(Index: Integer);
Şterge item-ul cu numărul de ordine Index, din cadrul meniului curent.
M 3. Remove
procedure Remove(ltem: TMenuItem);
Şterge itemul Item din meniu.
M4. Insert
procedure Insert {Index: Integer; Item: TMenuItem);
Inserează Item pe poziţia Index.
M5. IndexOf
function IndexOf(/?em: TMenuItem): Integer;
Returnează numărul de ordine al unui item în cadrul listei de itemuri a
părintelui său.
M6. Click
procedure Click;
Simulează execuţia unui click de mouse ca şi cum utilizatorul l-ar fi
executat. Handlerele de evenimente corespunzătoare acestui eveniment
sunt executate şi ele.
Evenimente__________________________________________________
E l. OnClick
property OnClick: TNotifyEvent;
Apare când se execută click pe un item de meniu.
Exemplu:
Următorul program construieşte o bară principală de meniu. Pentru
aceasta el foloseşte o componentă TMainMenu (care reprezintă meniul
în sine), o cutie de editare (în care utilizatorul introduce numele Hem
urilor din meniu) şi un buton (denumit Add, la a cărui apăsare se adaugă
183
la meniul existent un nou item având ca nume textul din cutia de
editare).
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Editl: TEdit TabOrder = 0 Text = 'Editl'
endobject Buttonl: TButton
Caption = 'Add'Default = True TabOrder = 1 OnClick = ButtonlClick
endobject MainMenul: TMainMenu end
Handlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin
nou := TMenuItem.Create(MainMenul) ;nou.Caption:=Editl.Text;Menu.11 ems.Add(nou);Editl.Clear;Editl.SetFocus;
end;Să presupunem că avem construită bara principală a meniului:
File Edit Tools Help
; [Edit?
Acum dorim să adăugăm submeniuri la unul dintre meniurile deja cre
ate. Dorim să adăugăm itemuri la meniul File. Vom folosi aceleaşi componente
ca şi la exemplul anterior, doar atât că aici vom adăuga la meniul File:
procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin
nou := TMenuItem.Create(Filei); nou.Caption:=Editl.Text;Filei.Add(nou);
184
Editl.Clear;Editl.SetFocus;
end;
De schimbat, s-a schimbat doar părintele, noului meniu adăugat, care nu
mai este MainMenul, ci este File i, şi linia în care se adaugă meniul.
Adăugarea în continuare de subitemuri la (sub)itemurile curente se face
la fel şi va genera meniuri cu mai multe nivele ca în imaginea următoare:
View ►
Customize (his Folder...
Arrange icons ►
Line Up Icons
Refresh
Paste
Un item din bara principală a meniului poate fi şters (la momentul
execuţiei) în două moduri:
1. Folosind metoda Delete:
Forml.Menu.Items.Delete(1);
care va şterge itemul cu numărul de ordine 1, adică, de exemplu, pentru
meniul din forma de mai sus va şterge Editl.
2. Folosind metoda Remove:
Forml.Menu.Items.Remove(Edit2);
este Edit2 deoarece Editl este cutia de editare.
Un subitem al unui meniu poate fi şters (la momentul execuţiei) tot în
două moduri. Presupunem că meniul File are item-urile: Open, Save, New,
Close.
Properties
3 _ l i Folder
Shortcut
W irZ ip File
J j] Text Document
r /1 Bitmap Image
' i j W ave Sound
y | Microsoft Word Document
j? ] Other Office Documents...
185
■ o w n i i i H u i i i i u i u i »« « w w n t K tw im n n m n t ! « » » » * « *
1. Folosind metoda Delete:
Filei.Delete(1);
care va şterge itemul cu numărul de ordine 1, adică în cazul nostru Save.
2. Folosind metoda Remove:
Filei.Remove(Savel);
Inserarea unui item la bara principală a meniului se face astfel:
procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin
nou := TMenuItem.Create(Forml) ; nou.Caption:=Editl.Text;Menu.Items.Insert(2,nou);
end;
Inserarea unui item la meniul File se face în felul următor:
procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin
nou := TMenuItem.Create(Filei) ; nou.Caption:=Editl.Text;Filei.Insert(0,nou);Editl.Clear;Editl.SetFocus;
end;
Exemplu:
Următoarea aplicaţie simulează un editor de text rudimentar. Acest
editor constă dintr-o cutie de editare multilinie (Memol). Pe lângă
aceasta, pe formă mai există şi un meniu cu două item-uri principale
(File, Edit) şi 4 item-uri secundare (New, Open, Save-pentru File res
pectiv Find-pentru Edit). New este folosit pentru a crea un nou fişier gol,
Open este folosit pentru a deschide un fişier pentru editare, Save este
folosit pentru a salva în fişier textul aflat la momentul actual în cutie, iar
Find este folosit pentru a ne indica dacă un şir de caractere este sau nu
subşir pentru textul din cutie.
Dacă a fost creat un nou fişier cu comanda New, atunci comenzile Save
şi New devin inoperante până în momentul în care o schimbare intervine
în cutia Memol (evenimentul OnChange).
Pe formă vom avea următoarele componente:
• un meniu construit cu itemurile specificate anterior, în care utiliza
torul poate introduce text;
• o cutie de editare multilinie (Memo]);
186
• o componentă TOpenDialog în care utilizatorul introduce numele
fişierului încărcat;
• o componentă TSaveDialog în care utilizatorul introduce numele
fişierului salvat;
• o componentă TFindDialog în care utilizatorul introduce şirul pe
care acesta să-l caute.
Handlerele de evenimente ale obiectelor de pe formă sunt:
procedure TForml.OpenlClick(Sender: TObject); begin
if OpenDialogI.Executethen Memol.Lines.LoadFromFile(OpenDialogI.FileName);
end;procedure TForml.SavelClick(Sender: TObject); begin
if SaveDialogl.Executethen Memol.Lines.SaveToFile(SaveDialogl.FileName);
end;procedure TForml.NewlClick(Sender: TObject); begin
Memol.Clear;Memol.SetFocus;Savel.Enabled:=false;Newl.Enabled:=false;
end;
procedure TForml.FindlClick(Sender: TObject); begin
if FindDialogl.Execute then; end;
procedure TForml.MemolChange(Sender: TObject); begin
Newl.Enabled:=true ;Savel.Enabled:=true;
end;
procedure TForml.FindDialoglFind(Sender: TObject); var i:integer;
ok:boolean;begin
for i:=0 to Memol.Lines.Count doif Pos(FindDialogl.FindText, Memol.Lines.Strings[i]) <>0 then ok:=true;
if not okthen ShowMessage('Nu exista1i else ShowMessage(1 Exista');
end;
187
16.5. Funcţii care prelucrează meniuri
F I. NewMenu
function Ne\vMenu(0uwr: TComponent; const AName: string;
Items: array of TMenuItem): TMainMenu;
Creează un meniu principal. Owner este componenta proprietară care va
fi responsabilă de eliberarea memoriei, AName este numele meniului, iar
Items este un vector cu itemurile din bara principală.
F2. NewPopupMenu
function NewPopupMenu(Ovv/(er TComponent; const AName: string;
Alignment: TPopupAlignment; AutoPopup: Boolean;
Items’, array of TMenuItem): TPopupMenu;
Creează un meniu popup.
Owner este componenta proprietară responsabilă cu eliberarea memoriei
ataşată meniului.
AName este numele meniului aşa cum va fi el referit în cod.
Alignment specifică unde trebuie să apară meniul relativ la poziţia
mouse-ului.
AutoPopup este true dacă meniul apare la click - dreapta pe componenta
ataşată lui.
Items este vectorul cu itemurile principale ale meniului.
F3. Newltem
function NewItem(const ACaption: string; AShortCut: TShortCut;
AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent;
hCtx: Word; const AName\ string): TMenuItem;
Creează un nou item de meniu.
ACaption este eticheta ataşată lui.
AShorCut este combinaţia de taste folosită pe post de scurtătură.
AChecked indică dacă itemul de meniu este sau nu bifat.
AEnabled indică dacă itemul de meniu este sau nu disponibil pentru a fi
apăsat.
AOnClick este handlerul evenimentului OnClick ataşat itemului.
AName este numele meniului aşa cum apare el în cod.
I
188
F4. NewSubMenu
function Ne wSubMenufconst A Caption: string; hCtx: Word;
const AName: string; Items: array of TMenuItem;
AEnabled: Boolean): TMenuItem;
Creează un item de meniu împreună cu subitemurile ataşate.
ACaption este eticheta ataşată lui.
AEnabled indică dacă itemul de meniu este sau nu disponibil pentru a fi
apăsat.
AName este numele meniului aşa cum apare el în cod.
Items este vectorul cu itemurile de pe primul nivel al submeniului.
Exemplu:
Următoarea aplicaţie construieşte la momentul execuţiei aplicaţiei un
meniu principal având trei itemuri de meniu. Metoda Eveniment repre
zintă handlerul de evenimente al itemurilor de meniu şi trebuie declarată
în secţiunea public a clasei TForml.
usesmenus ,-
varMeniul_Principal : TMainMenu; bara_principala : array of TMenuItem;
procedure TForml.Eveniment(Sender : TObject); begin// acest eveniment se executa la apasarea unui item de meniu
ShowMessage('A fost apasat meniul cu titlul ' +(Sender as TMenuItem).Caption +' si numele ' + (Sender as TComponent).Name);
end;
procedure TForml.ButtonlClick(Sender: TObject); var
i : integer; begin
SetLength (bara_principala, 3) ; //bara principala de meniu are 3 itemuri for i ;= 0 to 2 do
bara_principala[i] := Newltem('File’+IntToStr(i), 0,false, true, Eveniment, 0, 'Meniu'+IntToStr(i));
Meniul_Principal := NewMenu(Forml,'Meniu',barajprincipala);end;
procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);
vari : integer;
begin
' 189
// eliberez memoria alocata for i := 0 to 2 do
bara_principala[i].Free;Finalize(bara_principala);Meniul_Principal.Free;
end;
Exemplul 2:
Următoarea aplicaţie construieşte o bară principală de meniu împreună
cu submeniurile drop-down ataşate. Ataşarea unui subitem la un item de
meniu s-a făcut cu ajutorul metodei Add a itemului părinte.
usesmenus;
varMeniul_Principal : TMainMenu; bara_principala : array of TMenuItem; bara_secundara : array of array of TMenuItem;
procedure TForml.Eveniment(Sender : TObject); begin// acest eveniment se executa la apasarea unui item de meniu
ShowMessage('A fost apasat meniul cu titlul ' +(Sender as TMenuItem).Caption +' si numele ' + (Sender as TComponent).Name);
end;procedure TForml.ButtonlClick(Sender: TObject);
vari, j : integer;
begin/ / bara principala de meniu are 3 itemuri SetLength(bara_principala, 3);//fiecărui item din bara principala
// ii corespunde un sir de subite muri
// acestea sunt stocate in vectorul bara_secundara
SetLength(bara_secundara, 3);for i := 0 to 2 dobegin
SetLength (bara_secundara [ i ] , 2) ; // fiecare subitem de meniu arc doua itemuri for j := 0 to 1 do
bara_secundara[i][j] := Newltem('SubM'+IntToStr(j), 0,false, true, Eveniment, 0, 'SubMeniu'+IntToStr(j));
bara_principala[i] := Newltem('File 1+IntToStr(i) , 0,false, true, nil, 0, 'Meniu1+IntToStr(i));;
/ / ataşam submeniul itemului părinte
bara_principala[i].Add(bara_secundara[i]); end;Meniul_Principal := NewMenu(Forml,'Meniu',bara_principala);
end;
190
procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);
vari,j : integer;
begin// eliberez memoria alocata for i := 0 to 2 do begin
for j := 0 to 1 dobara_secundara[i][j].Free;
bara_principala[i].Free;Finalize(bara_secundara[i]) ;
end;Finalize(bara_principala);Finalize(bara_secundara) ;Meniul_Principal.Free ;
end;
Exemplul 3:
Următoarea aplicaţie construieşte o bară principală de meniu împreună
cu submeniurile drop-down ataşate. Ataşarea unui subitem la un item de
meniu s-a făcut cu ajutorul funcţiei NewSubMenu.
usesmenus;
varMeniul_Principal : TMainMenu; bara_principala : array of TMenuItem; bara_secundara : array of array of TMenuItem;
procedure TForml.Eveniment(Sender : TObject); begin
// acest eveniment se executa la apasarea unui item de meniuShowMessage('A fost apasat meniul cu titlul 1 +
(Sender as TMenuItem).Caption +' si numele ' + (Sender as TComponent).Name);
end;
procedure TForml.ButtonlClick(Sender: TObject); var
i, j : integer; begin
SetLength (bara_principala, 3) ; //bara principala de meniu are 3 itemuri SetLength(bara_secundara, 3); for i := 0 to 2 do begin
SetLength (bara_secundara (i ] , 2) ; //fiecare subitem de meniu are doua itemuri for j := 0 to 1 do
bara_secundara[i][j] := Newltem('SubM'+IntToStr(j), 0,false, true, Eveniment, 0, ' SubMeniu ' +IntToStr (j ) )
// ataşarea submeniului la meniu s-a făcut cu ajutorul metodei SubMenu
191
bara_principala[i] := NewSubMenu('File'+IntToStr(i) , 0,'Meniu'+IntToStr(i), bara_secundara[i])
end;Meniul_Principal := NewMenu(FormlMeniu' , bara_principala);
end ;
procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);
vari,j : integer;
begin// eliberez memoria alocata for i := 0 to 2 do begin
for j := 0 to 1 dobara_secundara[i] [j] .Free;
bara_principala[i].Free;Finalize(bara_secundara(i]);
end;Finalize(bara_principala);Finalize(bara_secundara);Meniul_Principal.Free;
end ;
192
17. SCURTĂTURI
O scurtătură este o combinaţie de taste pe care utilizatorul o foloseşte
pentru a efectua rapid o acţiune (spre exemplu, apăsarea unui item de meniu). O
combinaţie de taste constă din una sau mai multe taste modificator (<Ctrl>,
<Shift>, <Alt>) şi o altă tastă oarecare (spre exemplu, <Ctrl> + A).
Hemurile de meniu (obiecte de tip TMenuItem) au proprietatea ShortCut
care indică combinaţia de taste la apăsarea căreia se va executa handlerul eveni
mentului OnClick.
17.1. TShortCut
Tipul TShortCut oferă o modalitate de a reprezenta aceste combinaţii de
taste sub forma unui număr întreg.
Tipul TShortCut este definit în unit-ul classes astfel:
TShortCut = Low(Word) .. High(Word);
17.2. THotKey m
Este un control care permite utilizatorului să introducă şi să vizualizeze
o combinaţie de taste ce va fi folosită ulterior pe post de scurtătură.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->
-> TWinControl -> TCustomHotKey -> THotKey.
Definit în_____________________________________________________
comctrls.pas
Pagina______________________________________________________
Win32
193
Proprietăţi___________________________________________________
PI. Hot Key
property HotKey: TShortCut;
Conţine combinaţia curentă de taste.
P2. ln.valid.Keys
property InvalidKeys: THKInvalidKeys;
Permite specificarea anumitor combinaţii de taste care vor fi considerate
invalide. Valori posibile pentru InvalidKeys sunt din mulţimea:
Valoare Semnificaţie
kcNone Tastele simple, ftră modificatori, nu pot fi folosite pe post de hotkey.
hcShift Combinaţiile <Shift>+Tastă sunt invalide.
hcCtrl Combinaţiile <Ctrl>+Tastă sunt invalide.
hcAlt Combinaţiile <Alt>+Tastă sunt invalide.
hcShiftCtrl Combinaţiile <Shift>+<Ctrl>+Tastă sunt invalide.
hcShiftAlt Combinaţiile <Shift>+<Alt>+Tastă sunt invalide.
hc.CtrlAlt Combinaţiile <Ctrl>+<Alt>+Tastă sunt invalide.
licShiftCtrlAlt Combinaţiile <Shift>+<Ctrl>+<Alt>+Tastă sunt invalide.
P3. Modifiers
property Modifiers: THKModifiers;
Specifică tastele care vor fi folosite pe post de modificatori. Utilizatorul
nu va mai fi obligat să introducă întreaga combinaţie de taste, ci doar
tasta nemodificator. Valori posibile pentru Modifiers sunt una sau mai
multe din următoarea mulţime:
Valoare Semnificaţie
hkShift Tasta <Shift> va fi folosită drept modificator.
hkCtrl Tasta <Ctrl> va fi folosită drept modificator.
hkAlt Tasta <Alt> va fi folosită drept modificator.
194
17.3. Funcţii şi Proceduri
F I. ShortCut
function ShortCut(/ve>’: Word; Shift: TShiftState): TShortCut;
Creează şi returnează un shortcut (scurtătură) pe baza combinaţiei de
taste Key + Shift.
F2. ShortCutToKey
procedure ShortCutToKey(5AortCw/: TShortCut; var Key. Word;
var Shift: TShiftState);
Returnează combinaţia de taste (sub forma perechii Key, Shift) care alcă
tuieşte scurtătura ShortCut.
F3. ShortCutToText
function ShortCutToText(5/îortC«f: TShortCut): string;
Converteşte o scurtătură într-un şir de caractere.
Exemplu:
Următoarea aplicaţie tipăreşte în componenta ListBoxl toate scurtăturile
itemurilor de meniu ale meniului principal al formei.
procedure TForml.TiparesteShortCut(meniu : TMenuItem); var
i : integer; begin
ListBoxl.Items.Add(meniu.Caption + ' ' +ShortCutToText(meniu.Shortcut));
i := 0;while i < meniu.Count do // pentru fiecare submeniu begin
TiparesteShortCut (meniu. Items [i] ) ; //apelam recursiv i := i + 1;
end; end;procedure TForml.ButtonlClick(Sender: TObject);
vari : integer;
begin i := 0;while i < MainMenul.Items.Count do begin
/ /pentru fiecare item din meniul principal TiparesteShortCut(MainMenul.Items[i]);
195
i := i + 1; end;
end;
F4. TextToShortCut
function TextToShortCut(7eA7: string): TShortCut;
Converteşte şirul Text (care conţine o combinaţie validă de taste) într-o
scurtătură.
196
18. LISTE, COZI Şl STIVE
în acest capitol sunt prezentate patru clase care implementează lucrul cu
liste. Elementele listei pot fi de orice tip. Această flexibilitate în manipulare se
datorează faptului că lista reţine doar pointeri la zonele de memorie în care sunt
alocate elementele.
TList este o clasă care implementează o listă generală. Se pot face adău
gări, inserări, ştergeri de elemente în orice poziţie. Elementele listei pot fi acce
sate în orice ordine folosind proprietatea Items.
TOrderedList este o clasă abstractă care implementează o listă în care
accesarea elementelor se face secvenţial. Din această clasă derivă TQueue şi
TStack care definesc liste de tip FIFO şi respectiv LIFO.
18.1. TList
Este o clasă care implementează o listă de obiecte de tip nespecificat. Se
pot face adăugări, inserări, ştergeri, căutări, sortări, etc. de elemente.
Ierarhie______________________________________________________
TObject -> TList.
Definit în_____________________________________________________
classes.pas.
Proprietăţi___________________________________________________
PI. Items
property ltems[lndex\ Integer]: Pointer;
Items este lista cu pointerii la obiecte.
P2. Count
property Count: Integer;
Returnează numărul de obiecte din listă.
197
Metode
M l . Add
function Add (Item: Pointer): Integer;
Adaugă un nou obiect la sfârşitul listei.
M2. Assign
procedure Assign(L«M: TList;
AOperator. TListAssignOp = laCopy; ListB: TList = nil);
Copiază elementele unei liste în altă listă.
Dacă parametrul ListB lipseşte, atunci procedura Assign combină lista
curentă (referită prin Seif) cu lista List A. Combinarea se face în funcţie
de valoarea parametrului AOperator.
Dacă parametrul ListB este prezent, atunci procedura Assign înlocuieşte
toate elementele listei curente (referită prin Seif) cu elementele listei
ListA, iar apoi combină lista curentă cu lista ListB. Combinarea se face
în funcţie de valoarea parametrului AOperator.
Modurile posibile de combinare a două liste (valorile parametrului
AOperator) sunt:
Valoare Explicaţie
laAnd Lista destinaţie conţine intersecţia cclor două liste.
laCopy Suprascrie lista destinaţie cu valorile listei sursă.
laDestUnique E lim ină elementele listei destinaţie care apar şi în lista sursă.
laOr Lista destinaţie conţine reuniunea celor două liste.
laSrcUniqueînlocuieşte elementele listei destinaţie cu elementele listei sursă care
nu apar în destinaţie.
laXor Lista destinaţie conţine diferenţa simetrică celor două liste.
M3. Insert
procedure Ins&rtdndex: Integer; Item: Pointer);
Inserează un obiect pe poziţia Index în listă. Primul element are numărul
de ordine 0.
M 4. Delete
procedure De\ete(Index: Integer);
Şterge din listă elementul de pe poziţia Index.
198
function Remove(Item: Pointer): Integer;
Şterge din listă prima apariţie a obiectului Item.
M6. Clear
procedure Clear; virtual;
Şterge toate obiectele din listă.
M7. IndexOf
function IndexOf(/rem: Pointer): Integer;
Returnează numărul de ordine al primei apariţii a obiectului Item în listă.
Dacă lista nu conţine un asemenea obiect, atunci se returnează-1.
M8. Move
procedure M o v e( Q< rind ex, Newltidex: Integer);
Schimbă poziţia itemului de pe poziţia Curlndex pe poziţia Newlndex.
M9. Exchange
procedure Exchange(/n<r/<?x/, Index2: Integer);
Schimbă între ele două elemente aflate pe poziţiile Indexl şi lndex2 în
listă.
Exemplu:
Următoarea aplicaţie generează, la apăsarea butonului Buttonl, o listă cu
10 elemente. La apăsarea butonului Button2, sunt interschimbate două
elemente alese aleator din listă.
procedure TForml.B u t to n lC lic k (Sender: TObject); var
i : in te g e r ; p : ''in teg e r;
beginL is ta := T L is t.C rea te ;// adaug 10 elemente aleatoare la lista for i := 1 to 10 do begin
new(p ) ;p~ := random (100);L is t a .Add(p ) ;
end;
M5. Remove
199
// afiseaza lista
ListBoxl.Clear;for i := 0 to lista.Count - 1 do
ListBoxl.Items.Add(IntToStr(integer(Lista.Items[i]~))); Buttonl.Enabled := false;Button2.Enabled := true;
i, il, i2 : integer; begin
// aleg doua elemente la intamplare si le interschimb
11 := random(Lista.Count);12 := random(Lista.Count);Lista.Exchange(il, 12);
// afiseaza lista
ListBoxl.Clear;for i := 0 to lista.Count - 1 do
ListBoxl.Items.Add(IntToStr(integer(Lista.Items[i]~)));
M10. Sort
procedure Sort (Compare: TListSortCompare);
Aplică algoritmul de sortare Quicksort asupra elementelor unei liste.
Funcţia care compară două obiecte din listă are tipul TListSortCompare
şi trebuie furnizată de către programator. Tipul ei este:
TListSortCompare =function (Iteml, Item2: Pointer): Integer;
Funcţia de comparare trebuie să întoarcă:
• valoare mai mică decât zero dacă Iteml este mai mic decât Item2,
• zero dacă Iteml este egal cu Item2,
• valoare mai mare decât zero, dacă Iteml este mai mare decât Item2.
Următoarea aplicaţie construieşte o listă care conţine numere. La
apăsarea butonului Buttonl lista va fi construită şi afişată în ListBoxl.
La apăsarea lui Button2 lista va fi sortată, afişată în ListBox2 şi apoi
distrusă.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Buttonl: TButton Caption = 'Adauga'
endobject Button2: TButton
Caption = 'Sorteaza'
end;
procedure TForml.Button2Click(Sender: TObject);var
end;
200
Enabled = False endI Iandlerele de evenimente ale obiectelor de pe forma Forml sunt:
varLista : TList;
function Compara(iteml, item2 : pointer) : Integer; begin
Result ;= integer (iteml'') - integer (item2~) ; end;
procedure TForml.Button2Click(Sender: TObject); var
i : integer; begin
Lista.Sort(Compara);ListBox2.Clear;// afiseaza lista sortatafor i := 0 to lista.Count - 1 do
L istBox2 . Items .Add( In tT o S tr (in te g e r (L is t a . Ite m s [ i]~) ) ) ;
L is ta . C lear; // goleşte lista
L i s ta . Free; //distruge lista end;
procedure TForml.ButtonlClick(Sender; TObject); var
i -• integer; p : ^integer;
beginLista := TList.Create; for i := 1 to 10 do begin
new(p );p^ ;= random(lOO);Lista.Add(p);
end;// afiseaza lista ListBoxl.Clear;for i := 0 to lista.Count - 1 do
ListBoxl.Items.Add(IntToStr(integer(Lista. Items[i]~))) ; Buttonl.Enabled := false;Button2.Enabled := true;
end;
18.2. TOrderedList
Este o clasă abstractă care implementează o listă în care elementele sunt
accesate secvenţial. Din această clasă sunt derivate clasele TQueue şi TStack
care implementează o listă FIFO respectiv LIFO.
201
Ierarhie
TObject -> TOrderedList.
Definit în__________________________________________________
contnrs.pas
Metode____________________________________________________
M l. Count
function Count: Integer;
Indică numărul de elemente ale listei.
18.3. TQueue
Este o clasă care implementează o coadă (listă FIFO).
Ierarhie____________________________________________________
TObject -> TOrderedList -> TQueue
Definit în__________________________________________________
contnrs.pas
Metode____________________________________________________
M l. Push
procedure Push(Â//e/;;: Pointer);
Adaugă un item la sfârşitul cozii.
M2. Peek
function Peek: Pointer;
Returnează un pointer la primul element din coadă.
M3. Pop
function Pop: Pointer;
Returnează un pointer la primul element din coadă după care îl şterge.
202
Exemplu:
Următoarea aplicaţie construieşte şi afişează conţinutul unei cozi.
usescontnrs;
procedure TForml.ButtonlClick(Sender: TObject); var
c : TQueue; p : ^integer; i : integer;
begin// constructia cozii
c := TQueue.Create; for i := 1 to 10 do begin
new(p);p~ := random(lO); c .Push(p);
end;// afişarea si ştergerea cozii
while c .Count > 0 do begin
p : = c . Pop;ShowMessage(IntToStr (p~ ) ) ; dispose(p);
end; c .Free;
end;
18.4. TStack
Este o clasă care implementează o stivă (listă LIFO).
Ierarhie
TObject -> TOrderedList -> TStack
Definit în
contnrs.pas
Metode
M l. Push
procedure Push (Altern.-. Pointer);
203
Adaugă un item în vârful stivei.
M2. Peek
function Peek: Pointer;
Returnează un pointer la elementul din vârful stivei.
M3. Pop
function Pop: Pointer;
Returnează un pointer la elementul din vârful stivei după care îl şterge.
Exemplu:
Următoarea aplicaţie construieşte şi afişează o stivă.
usesc o n tn r s ;
procedure T Form l. B u t t o n lC l ic k (S ender: T O b jec t);
vars : TStack;
p : ' ' in te g e r ;
i : in te g e r ; begin
// constructia stivei
s := T S ta c k .C re a te ; for i := 1 to 10 do begin
new( p ) ;
p~ := random (10 ); s .Push(p);
end;// afişarea si ştergerea stivei
while s .C ou n t > 0 do begin
p : = S . Pop;ShowMessage(In tT o S tr ( p A) ) ;
d is p o s e ( p ) ;
end; s .F ree ;
end;
204
19. FIŞIERE, DIRECTOARE Şl DISCURI
în pagina Win3.1 a Paletei de Componente, există un grup de compo
nente destinate navigării printre discurile, directoarele şi fişierele existente în
sistem.
Componenta TDriveComboBox permite selectarea unui disc local. Dis
cul curent selectat este stocat de proprietatea Drive.
Componenta TDirectoryComboBox permite selectarea unui (sub)
director al discului curent. (Sub)directorul curent selectat este proprietatea
Directory.
Componenta TFileListBox permite selectarea unui fişier din directorul
curent. Proprietatea FileName stochează numele şi calea fişierului curent selec
tai.
Componenta TFilterListBox permite specificarea unui filtru pentru fişi
erele afişate într-o componentă TFileListBox.
Aceste componente pot fi conectate între ele, astfel încât modificările
executate în una din ele să se reflecte în celelalte. Spre exemplu, componenta
TDriveComboBox are proprietatea DirList care va indica numele componentei
de tip TDirectoryListBox care va afişa structura de directoare din discul curent
selectat.
Observaţie:
Aceste componente permit doar navigarea prin structura de discuri,
directoare şi fişiere, dar nu permit manipulare acestora (spre exemplu nu
permit ştergerea, redenumirea, adăugarea de fişiere).
19.1. TFileListBox f i i
Este o cutie folosită pentru afişarea fişierelor dintr-un director.
Ierarhie
TObject -> TPersistent -> TComponent -> TControl ->
-> TWinControl -> TCustomListBox -> TFileListBox.
205
Definit în
filectrl.pas
Pagina______________________________________________________
Win3.1
Proprietăţi___________________________________________________
PI. Directory
property Directory: string;
Determină directorul curent pentru cutia cu lista de fişiere. Pentru a afişa
fişierele din directorul dorit, modificaţi proprietatea Directory.
P2. Drive
property Drive : char;
Specifică pentru care unitate de disc se afişează fişierele. Dacă se schim
bă unitatea, se va schimba şi directorul curent ale cărui fişiere sunt
afişate.
P3. FileEdit
property FileEdit: TEdit;
Indică cutia de editare (componentă de tip TEdit) în care sunt afişate
numele fişierelor selectate.
Exemplu:
Următoarea aplicaţie foloseşte componentele:
• TFileListBox, pentru afişarea tuturor fişierelor dintr-un director;
• cutie de editare {Editl), care va fi valoarea proprietăţii FileEdit,
• cutie de editare (Edit2), în care utilizatorul va introduce directorul
pentru care se listează conţinutul);
• un buton (Buttonl) de tip Default, cu ajutorul căruia se schimbă
directorul curent.
Valorile proprietăţilor componentelor de pe forma Forml sunt:
object Forml: TFormlobject FileListBoxl: TFileListBox
FileEdit = Editl end
206
object Editl: TEdit Text = 1 *.*'
endobject Buttonl: TButton
Caption = 'Schimba Directorul'Default = True
endobject Edit2: TEdit
Text = 'c :\' end
endI landlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml.FormCreate(Sender: TObject); begin
FileListBoxl.Directory := 'C:\'; end;procedure TForml.ButtonlClick(Sender: TObject); begin
FileListBoxl.Directory := Edit2.Text; end;
P4. FileName
property FileName : string;
Indică numele şi calea fişierului selectat.
P5. FileType
property FileType: TFileType;
Specifică atributele fişierelor care vor fi afişate într-o cutie cu lista de
fişiere. Deoarece FileType este o mulţime, valorile ei vor fi submulţimi
ale următoarei mulţimi:
Valoare Semnificaţie
ftReadOnly Se afişează fişierele cu atributul read-only.
/[Hidden Se afişează fişierele cu atributul hidden.
ftSystem Se afişează doar acele fişiere cu atributul system.
ftVolumeID Se afişează doar numele de volum.
ftDirectory Se afişează directoare.
ft Archive Se afişează fişierele cu atributul archive.
/[Normal Se afişează fişiere fără nici un atribut special.
207
P6. Mask
property Mask : string;
Specifică fişierele care pot fi afişate. Mask este o mască pentru fişiere,
ce poate include şi caractere speciale (spre exemplu *.cpp). Se pot
specifica mai multe măşti, care trebuie să fie despărţite prin (spre
exemplu *.cpp;*.pas).
Observaţie:
Specificarea unei măşti pentru fişiere se poate realiza mai simplu,
folosind componenta TFilterComboBox.
P7. ShowGlyphs
property ShowGlyphs : boolean;
Indică dacă lângă numele fişierului poate apărea şi un bitmap care să
indice tipul fişierului.
Observaţie:
Pe lângă aceste proprietăţi TFileListBox moşteneşte o parte din proprie
tăţile lui TCustomListBox, proprietăţi pe care le-am întâlnit şi la
TListBox.
Atenţie: Numele fişierelor dintr-un TFileListBox nu pot fi prelucrate (şterse,
create, sau modificate) cu ajutorul proprietăţii Items.
Metode______________________________________________________
M l. Update
procedure Update;
Redesenează lista cu fişiere afişate în componenta TFileListBox curentă.
Această operaţie este necesară atunci când un fişier este şters sau creat,
cu ajutorul unei alte aplicaţii (spre exemplu Windows Explorer).
Evenimente
E l. OnChange
property OnChange: TNotifyEvent;
208
Apare când conţinutul cutiei se schimbă. Spre exemplu, acest eveniment
este generat când se schimbă directorul pentru care componenta
TFileListBox afişează conţinutul.
Exemplu:
Următoarea aplicaţie setează tipul fişierelor afişate într-o componentă
TFileListBox.
Vom folosi o componentă TCheckListBox care are itemurile ReadOnly,
Hidden, System, VolumeID, Directory, Archive, Normal indicând care
dintre atribute sunt active pentru fişierele afişate de FileListBoxl.
V;ilori le proprietăţilor componentelor de pe forma Forml sunt:
object C heckL is tB o x l: TCheckListBox
I te m s . S tr in g s = (
' Read-Only'1 H id d e n '
' System ''VolumeID'1 D ir e c to r y '
1 A r c h iv e '
1 N orm a l1)end
I landlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure T Form l. Form Create (S ender: T O b je c t); begin
F i le L is tB o x l . F ileT ype := [ftN orm al] ;C h e ck L is tB o x l. Checked[6] := true;
end;procedure T Form l. C h eckL is tB o x lC lic kC he ck (S ender: T O b je c t);
vars ta re : T F ileType;
begins ta re := [];
if C h e ck L is tB o x l. Checked! 0] II daca itemul ReadOnly este bifat then s ta re := s ta re + tf tR e a d O n ly ] ;
if C heckL is tB ox l .C hecked[1] //daca itemul Hidden este bifat
then s ta re := s ta re + [ ftH id den ] ;
if C heckL is tB ox l .Checked[2] // daca itemul System este bifat
then s ta re := s ta re + [ ftSystem ];
if C h e c k L is tB o x l. Checked [3 ] // daca itemul VolumeID este bifat then s ta re := s ta re + [ftV o lum e lD ];
209
ii i i i i
if CheckListBoxl .Checked[4] //daca itemul Directory este bifat then stare := stare + [ftDirectory];
if CheckListBoxl .Checked[5] //daca itemul Archive este bifat then stare := stare + [ftArchive];
if CheckListBoxl .Checked[6] //daca itemul Normal este bifat then stare := stare + [ftNormal];
FileListBoxl-FileType := stare; end;
19.2. TDirectoryListBox
Afişează structura de directoare a discului curent şi permite navigarea
prin aceasta.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->
-> TCustomListBox -> TDirectoryListBox.
Definit în_____________________________________________________
filectrl.pcis
P a g i n a ____________________________________________ _____
Wild. 1
Proprietăţi
PI. Directory
property Directory : string;
Indică directorului a cărui structură este afişată.
P2. DirLabel
property DirLabel : TLabel;
Numele directorului curent este titlu pentru eticheta DirLabel.
210
P3. Drive
property Drive : char;
Determină unitatea de disc pentru care este afişată structura de
directoare.
P4. FileList
property F ileList: TFileListBox;
Leagă o cutie cu lista de directoare (TDirectoryListBox) cu o cutie cu
lista de fişiere (TFileListBox). După realizarea unei asemenea legături,
în TFileListBox vom avea fişierele din directorul curent selectat în
TDirectoryListBox.
Metode______________________________________________________
M l. GetltemPath
function GetItemPath(int Index) : string;
Returnează calea unui director care are, în lista cu directoare (a cutiei
TDirectoryListBox), numărul de ordine Index. Primul director din listă
are indicele 0.
M2. OpenCurrent
procedure OpenCurrent;
Deschide directorul curent. Metoda este echivalentă cu executarea unui
dublu click pe directorul respectiv.
M3. Update
procedure Update;
Reafişează lista cu directoare pentru a reflecta ultimele modificări.
Evenimente__________________________________________________
E l. OnChange
property OnChange : TNotifyEvent;
Apare când un nou director este selectat.
211
Exemplu:
Următoarea aplicaţie conţine o componentă TDirectoryListBox, o com
ponentă TFileListBox ataşată componentei TDirectoryListBox, o etichetă
Labell care afişează numele şi calea directorului curent şi o cutie de
editare multilinie care afişează conţinutul fişierului selectat din cadrul
cutiei TFileListBox.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object DirectoryListBoxl: TDirectoryListBox DirLabel = Labell FileList = FileListBoxl
endobject Memol: TMemo
ScrollBars = ssBoth end
Handlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml.FileListBoxlClick(Sender: TObject); begin
if FileListBoxl.Itemlndex <> -1then Memol.Lines.LoadFromFile(FileListBoxl.FileName);
end;
19.3. TDriveComboBox
Afişează unităţile de disc disponibile în sistem şi permite selectarea
uneia dintre unităţi.
TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->
-> TCustomComboBox -> TDriveComboBox.
Ierarhie
Definit în
jilectrl.pcis
Pagina
Win 3.1
Proprietăţi___________________________________________________
P I. DirList
property DirList TDirectoryListBox;
Face legătura între o cutie cu lista de directoare şi o cutie de drivere
('TDriveComboBox). Când o nouă unitate este aleasă, este afişată struc
tura de directoare a noului disc selectat.
P2. Drive
property Drive : char;
In Drive se află unitatea de disc curentă.
Evenimente__________________________________________________
E l. OnChange
property OnChange: TNotifyEvent;
Apare când utilizatorul alege o nouă unitate.
E2. OnDropDown
property OnDropDown : TNotifyEvent;
Apare când utilizatorul apasă săgeata din dreapta a componentei afişând
astfel o listă drop-down.
Exemplu:
Aplicaţiei prezentate mai sus îi ataşăm o componentă TDriveComboBox
pe care o vom lega de componenta DirectoryListBoxl. Pentru aceasta
vom seta (la momentul proiectării aplicaţiei) proprietatea DirList la
valoarea DirectoryListBoxl'.
object DriveComboBoxl: TDriveComboBox DirList = DirectoryListBoxl
endIn urma acestei operaţii navigarea se poate face prin toate discurile
disponibile în sistem.
213
19.4. TFilterComboBox
Oferă posibilitatea utilizatorului să afişeze şi să manipuleze filtre pentru
fişiere.
Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->
-> TCustomComboBox -> TFilterComboBox.
Definit în
filectrl.pas
Pagina
Win3.1
Proprietăţi
P I. FileList
property FileList: TFileListBox;
Conectează o cutie filtru cu o cutie cu listă de fişiere (TFileListBox).
P2. Filter
property Filter : TFileListBox;
Specifică un filtru de fişiere. Pentru a crea un asemenea filtru sunt
necesari următorii paşi:
• introduceţi un text semnificativ pentru tipul de fişiere pe care îl
doriţi (de exemplu Fişiere PAS),
• introduceţi caracterul | . Nu lăsaţi nici un spaţiu între ceea ce este
înainte sau ceea ce este după acest caracter, tastaţi masca de fişiere
(de exemplu *.pas). De exemplu, pentru fişierele de tip cpp Filter
poate conţine următorul şir: “Fişiere PAS|*.pas”
Dacă doriţi mai multe măşti, separaţi-le prin intermediul caracterului ;
(De exemplu, în Delphi, la deschiderea unui fişier (meniul Open) avem
o TComboListBox care poate deschide mai multe tipuri de fişiere ce pot
avea extensiile *.pas,*.bpg,*.dpr,*.dpk. Pentru a realiza acest lucru
Filter trebuie să conţină textul “Delphi files|*.pas;*.bpg;*.dpr;*.dpk”.
214
Dacă doriţi mai multe filtre, atunci separaţi-le cu caracterul | (de exem
plu, dacă dorim să avem două filtre, una pentru fişiere Delphi (cu
extensiile *.pas,*.bpg,*.dpr,*.dpk) şi una cu fişiere text (cu extensia
(.txt).), atunci Filter trebuie să conţină şirul “Delphi
files|*.pas;*.bpg;*.dpr;*.dpk]Text files|*.txt”
Exemplu:
Aplicaţiei de la exemplul precedent îi mai adăugăm pe formă o compo
nentă TComboListBox la care setăm proprietatea FileList la valoarea
FileListBoxl.
object FilterComboBoxl: TFilterComboBox FileList = FileListBoxl
end
Observaţie:
Extensia implicită este *.*.
P3. Mask
property Mask : string;
Returnează şirul folosit drept filtru.
Evenimente
E l. OnChange
property OnChange : TNotifyEvent;
Apare când un nou filtru este ales.
Exemplul 1:
Următoarea aplicaţie constă dintr-un sistem de navigare prin structura de
fişiere, directoare şi discuri a calculatorului curent. Componenta
TFileListBox are ataşată o componentă de tip TPopUp care are un singur
item cu numele Delete1. La apăsarea acestuia fişierul selectat este şters.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object DirectoryListBoxl: TDirectoryListBox DirLabel = Labell FileList = FileListBoxl
end
215
object FileListBoxl: TFileListBox PopupMenu = PopupMenul
endobject FilterComboBoxl: TFilterComboBox
FileList = FileListBoxl endobject DriveComboBoxl: TDriveComboBox
DirList = DirectoryListBoxl endobject PopupMenul: TFopupMenu
object Deletel: TMenuItem Caption = 'Delete'
end endHandlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure TForml. DeletelClick (Sender TObject); begin
If FileListBoxl.Itemlndex = -1 then ShowMessage(1 Nici un fişier selectat') else if DeleteFile(FileListBoxl.FileName)
then beginFileListBoxl.Update;ShowMessage('Fişierul a fost sters cu succes');
endelse ShowMessage('Fişierul nu a putut fi sters');
end;
Exemplul 2:
Dacă dorim să ştergem mai multe fişiere selectate, atunci va trebui să
setăm proprietatea MultiSelect la valoarea true. în această situaţie nu
avem la dispoziţie o proprietate care să ne returneze itemurile selectate,
de aceea le parcurgem pe toate şi testăm care sunt selectate şi care nu
(proprietatea Selected):
Noul handler de evenimente pentru itemul Delete este:
procedure TForml.DeletelClick(Sender: TObject);var i : integer
beginif FileListBoxl.Itemlndex = -1then ShowMessage(1 Nici un fişier selectat')else begin
for i := 0 to FileListBoxl.Items.Count - 1 do if FileListBoxl.Selected[i]then if not DeleteFile(FileListBoxl.Items.Strings[i])
then ShowMessage(’Fişierul ' +FileLdstBoxl.Items.Strings[i] +' nu a putut fi sters!');
FileListBoxl.Update; end;
end;
216
19.5. TFileStream
Este o clasă care implementează metode pentru citirea şi scrierea datelor
într-un fişier pe disc.
Ierarhie______________________________________________________
TObject -> TStream -> THandleStrecim -> TFileStream.
Definit în____________________________________________________
classes.pas
Proprietăţi___________________________________________________
P I. Position
property Position : integer;
Specifică poziţia capului de citire/scriere în cadrul fişierului. Primul
octet din fişier are Position = 0 .
P2. Size
property Size : integer;
Indică lungimea fişierului în octeţi.
Metode______________________________________________________
M l. Read
function Read(var Bujfer; Count: Longint): Longint;
Citeşte Count octeţi din fişier în şirul Bujfer. Octeţii sunt citiţi începând
din poziţia indicată de proprietatea Position. După citire Position se va
mări cu Count (în cazul în care nu se ajunge la sfârşit de fişier).
M2. Write
function Write(const Bujfer; Count: Longint): Longint;
Scrie în fişier Count octeţi din şirul Buffer.
217
M3. Seek
procedure ScekiOffset: longint, Origin : Word);
Schimbă valoarea lui Position. Origin indică felul în care trebuie inter
pretată valoarea din Offset. Valori posibile pentru Origin sunt:
Valoare Semnificaţie
SoFromBeginningOffset este mai mare sau egal cu 0 şi este luat de la începutul
fişierului. Position va avea valoarea lui Offset.
SoFromCurrent Position va deveni Position + Offset.
SoFromEndOffset este mai m ic sau egal decât 0 şi este luat faţă de sfârşitul
fişierului, deci Position va deveni Size-Offset.
M4. Create
constructor Create(const FileName: string; Mode: Word);
Este constructorul clasei. FileName este numele fişierului care urmează
să fie prelucrat. Mode este tipul prelucrării şi are ca valoare rezultatul
aplicării operatorului or între modul de deschidere şi modul de partajare.
Modul de deschidere poate lua una dintre valorile:
Valoare Semnificaţie
FmCreate Creează un fişier. Dacă acest fişier există, atunci este deschis la
scriere.
FmOpenRead Deschide un fişier la citire.
FmOpenWrite Deschide un fişier la scriere. Un fişier deschis la scriere este mai
întâi vidat.
fmOpenReadWrite Deschide un fişier şi pentru citire şi pentru scriere.
Modul de partajare poate lua una din valorile:
Valoare Semnificaţie
FinShare Exclusive Alte aplicaţii nu pot deschide fişierul.
fmSha re Deny WriteAlte aplicaţii pot deschide fişierul la citire dar nu şi pentru
scriere.
finShareDenyReadAlte aplicaţii pot deschide fişierul pentru scriere, dar nu şi
pentru citire.
finShareDenyNoneAlte aplicaţii pot citi sau scrie în acest fişier fără nici o
restricţie
Observaţie:
Manipularea fişierelor şi a conţinutului lor se mai poate face şi cu
ajutorul funcţiilor FileCreate, FileOpen, FileWrite, FileRead, FileClose.
218
Aceste funcţii sunt definite în unitul system.pas.
O altă categorie de funcţii specializate pentru manipularea datelor unui
fişier sunt cele clasice din Turbo Pascal: AssignFile, Reset, Rewrite, Read,
Write, CloseFile.
Exemplu:
Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate două
butoane. La apăsarea lui Buttonl, în fişierul numere.txt sunt tipărite
numerele de la 0 la 10. La apăsarea lui Button2, sunt citite şi afişate
numerele din fişierul numere.txt.
procedure TForml.ButtonlClick(Sender: TObject); var
f : TFileStream; sir : string i : integer; p : Pointer;
beginf := TFileStream.Create('c :\numere.t x t fmCreate);for i := 0 to 9 dobegin
sir := IntToStr(random(10)) + ' '; p := PChar(sir); f.Write(p~, length(sir));
end; f.Free;
end;
procedure TForml.Button2Click(Sender: TObject); var
f : TFileStream; sir : string; i : integer p : PChar;
beginf := TFileStream.Create('c :\numere.txtfmOpenRead); getmem(p, 2);while f.Position < f.Size do begin
£ . Read (p'1, 2 ) ; sir := string(p^);sir := trim(sir); // elimin spatiile de la inceputul si sfarsitul şirului ListBoxl.Items-Add(sir);
end; f.Free;
end;
219
19.6. Structuri şi funcţii utile pentru lucrul cu fişiere, directoare şi discuri
în acest subcapitol sunt prezentate funcţii şi structuri de date utile pentru
manipularea fişierelor şi a numelor de fişiere.
19.6.1. Structuri
S I. TSearchRec
TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: string;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;
unde:
Time - reprezintă ştampila de timp a fişierului.
Size - este lungimea, în octeţi, a fişierului.
Name - este numele fişierului în format 8.3.
Attr - sunt atributele fişierului; un fişier poate avea unul sau mai
multe atribute dintre următoarele (se combină cu ajutorul
operatorului AND):
ValoareValoare
num ericăSemnificaţie
FaReadOnly $00000001 Fişier Read-Only.
FaHidden $00000002 Fişier ascuns.
FaSysFiie $00000004 Fişier sistem.
faVotumeID $00000008 Identificator de volum.
FaDirectoiy $00000010 Director
FaArchive $00000020 Fişier arhivă.
FaAnyFile $0000003F Orice alt fişier.
FindData - include informaţii suplimentare la fişier.
19.6.2. Atributele fişierelor
F I. FileAge
function FileAge(const FileName: string): Integer;
Returnează data creării fişierului FileName. Valoarea întoarsă de această
funcţie poate fi convertită la tipul TDateTime cu ajutorul funcţiei
FileDateToDateTime.
F2. FileDateToDateTime
function FileDateToDateTime(F('/eDar<?: Integer): TDateTime;
Converteşte o valoare întreagă (timpul în format DOS) într-un obiect de
clasă TDateTime.
F3. FileGetAttr
function FileGetAttr(const FileName: string): Integer;
Returnează atributele fişierului FileName. Dacă a apărut o eroare se
returnează -1.
F4. FileSetAttr
function FileSetAttr(const FileName: string; At ir. Integer): Integer;
Setează atributele fişierului FileName la valoarea Attr.
19.6.3. Căutare de fişiere
F5. FileExists
function FileExists(const FileName: string): Boolean;
Returnează true dacă există fişierul FileName.
F6. FindFirst
function FindFirst(const Path: string; Attr: Integer;
var F: TSearchRec): Integer;
Returnează primul fişier din calea Path, care are atributele specificate de
Attr. Rezultatul este returnat în F. Dacă a fost găsit un fişier cu atributele
specificate atunci funcţia returnează valoarea 0. în caz contrar este
returnată o eroare Windows.
221
function FindNext(var F: TSearchRec): Integer;
Returnează următoarea apariţie a unui fişier care are atributele specifi
cate de anteriorul apel al lui FindFirst.
F8. FindClose
procedure FindClose(var F: TSearchRec);
Termină o secvenţă de instrucţiuni FindFirst / FindNext. După
FindClose, apelul lui FindNext este invalid.
Exemplu:
Următoarea aplicaţie numără câte fişiere cu extensia pas se află în
directorul curent.
procedure TForml.ButtonlClick(Sender: TObject); var
NrFis : integer;F : TSearchRec; dir: string;
beginNrFis := 0;dir := GetCurrentDir;if FindFirst(dir+'\*.pas', faAnyFile, F) = 0 then begin
inc(NrFis);while FindNext(F) = 0 do
inc(NrFis);end;
FindClose(F);ShowMessage(IntToStr(NrFis));
end ;
F9. FileSearch
function FileSearch(const Name, DirList: string): string;
Caută fişierul cu numele Name în lista de directoare DirList. Direc
toarele din această listă trebuie să fie separate între ele prin Dacă
este găsit un fişier, atunci este returnat împreună cu calea completă spre
el.
F7, FindNext
222
19.6.4. Manipulări de fişiere
FIO. DeleteFile
function DeleteFile(const FileName: string): Boolean;
Şterge fişierul cu numele specificat. Returnează true dacă operaţia
reuşeşte.
F I I . RenameFile
function RenameFile(const OldName, NewName: string): Boolean;
Redenumeşte numele fişierul OldName în NewName. Returnează true
dacă operaţia se încheie cu succes.
19.6.5. Manipulări de extensii
F12. ChangeFileExt
function ChangeFileExt(const FileName, Extension: string): string;
Schimbă extensia fişierului FileName la Extension.
F13. ExtractFileExt
function ExtractFileExt(const FileName: string): string;
Returnează extensia unui fişierului cu numele FileName.
Exemplu:
Următoarea aplicaţie afişează într-o componentă TListBox toate exten
siile fişierelor aflate în directorul curent.
procedure TForml-ButtonlClick(Sender: TObject); var
F : TSearchRec; dir: string;
begindir := GetCurrentDir;if FindFirst(dir+'\*.*', faAnyFile, F) = 0 then begin
ListBoxl.Items .Add(ExtractFileExt(F.Name)); while FindNext(F) = 0 do
ListBoxl.Items.Add(ExtractFileExt(F.Name));end;
FinaClose (F) end;
223
19.6.6. Manipulări de căi
F14. ExtractFilePath
function ExtractRelativePath(const BaseName, DestName: string):
string;
Returnează calea fişierului FileName, inclusiv caracterele (:) şi (\).
F15. ExtractFileDir
function ExtractFileDir(const FileName: string): string;
Returnează calea fişierului FileName. Ultimele caractere vor fi diferite
de (:) şi (\).
F16. ExtractFileDrive
function ExtractFileDrive(const FileName: string): string;
Returnează driverul pe care se află fişierul FileName.
F17. ExtractFileName
function ExtractFileName(const FileName: string): string;
Returnează numele unui fişier dintr-un şir ce conţine şi calea şi drive-ul.
F18. ExpandFileName
function ExpandFileName(const FileName: string): string;
Returnează numele şi calea completă a fişierului FileName. Acest lucru
se face prin concatenarea directorului curent la numele fişierului dat ca
parametru.
F19. ExtractRelativePath
function ExtractRelativePath(const BaseName, DestName: string):
string;
Returnează calea relativă a fişierului DestName la calea BaseName.
Acest lucru se face prin eliminarea subşirului comun lui DestName şi
BaseName şi înlocuirea lui cu şirul '..V.
224
F20. ExtractShortPathName
function ExtractShortPathName(const FileName: string): string;
Converteşte calea şi numele fişierului la formatul 8.3, adică numele
fişierelor şi directoarelor au cel mult 8 caractere, iar extensiile au cel
mult 3 caractere.
19.6.7. Operaţii asupra directoarelor
F21. GetCurrentDir
function GetCurrentDir: string;
Returnează directorul curent.
F22. SetCurrentDir
function SetCurrentDir(const Dir. string): Boolean;
Setează directorul curent la Dir. Funcţia returnează valoarea true dacă
operaţia de schimbare a directorului a reuşit.
F23. CreateDir
function CreateDir(const Dir: string): Boolean;
Creează directorul Dir.
F24. ForceDirectory
function ForceDirectories(Dir: string): Boolean;
în mod normal, sistemele de operare DOS şi Windows nu permit crearea
decât a unui singur director la un moment dat. Funcţia ForceDirectories
creează întreaga cale de directoare specificată în şirul Dir.
F25. RemoveDir
function RemoveDir(const Dir: string): Boolean;
Şterge directorul Dir. Funcţia returnează true dacă operaţia de ştergere a
reuşit.
Atenţie!
Directorul trebuie să fie vid înainte de a fi şters!
225
i *•*♦?* \ i î ‘ ; -f H i i j
F26. Directory Exist
function DirectoryExists(/V«me: string): Boolean;
Determină dacă directorul cu numele Name există.
F27. ChDir
procedure ChDir(5': string);
Schimbă discul şi directorul curent la noua cale stocată în şirul S.
19.6.8. Manipulări de discuri
F28. DiskSize
function DiskSizs(Drive: Byte): Int64;
Returnează capacitatea, în octeţi, a discului Drive. Funcţia returnează -1
dacă discul nu există.
F29. DiskFree
function DiskFree(Drive: Byte): Int64;
Returnează numărul de octeţi liberi de pe discul Drive. Funcţia retur
nează -1 dacă discul nu există.
226
20. ITEMURI
Cuvântul “item” etichetează o largă categorie de obiecte: şiruri de
caractere, imagini, etc. Mediul Delphi pune la dispoziţia programatorului
componente cu ajutorul cărora acesta poate prelucra şi afişa aceste item-uri.
Dintre acestea amintim: TListBox, TComboBox, TListView, TTreeView.
TListBox este o componentă care afişează itemuri dintr-o listă de şiruri
de caractere. Accesarea itemurilor se face cu ajutorul proprietăţii Items. Se
poate specifica numărul de coloane pe care acestea vor fi afişate cu ajutorul
proprietăţii Columns.
TComboBox combină o cutie de editare cu o listă drop down. Lista drop
down se accesează prin apăsarea butonului - pe care este desenată o săgeată -
aflat la dreapta cutiei. Utilizatorul poate selecta un item din listă sau poate scrie
direct în cutia de editare.
TListView permite afişarea de itemuri în mai multe moduri. TListView
manipulează lista cu itemuri prin intermediul clasei TListltems. Fiecare element
al listei este un obiect de tip TListltem.
20.1. TListBox
Este un control care permite afişarea şi prelucrarea unei liste cu item-uri.
Aceste itemuri pot fi prelucrate atât la momentul proiectării aplicaţiei (cu
Objectlnspector care va afişa un String List Editor), prin intermediul pro
prietăţii Items, cât şi la momentul execuţiei aplicaţiei, tot cu ajutorul acestei
proprietăţi.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->
-> TCustomListBox -> TListBox.
Definit în_______ _____________________________________________
stdctrls.pas
Pagina
Standard
227
Proprietăţi
PI. Columns
property Columns: Integer;
Specifică numărul de coloane vizibile fără a avea un scrollbar orizontal.
Implicit este 0, ceea ce înseamnă că nu este permisă afişarea pe mai
multe coloane. Dacă Columns este diferit de zero, atunci nu mai este
nevoie de scroller vertical, itemurile fiind grupate pe coloane. De
exemplu, pentru Columns=2, ListBox-ul va arăta în felul următor:
^na RaulCristina CosminMaria Timealoana CorinaMarcel DanBianca Marius
<1 1
P2. Items
property Items: TStrings;
Specifică itemurile sub forma unor şiruri de caractere. Această proprie
tate este folosită pentru a adăuga, insera, şterge itemuri dintr-o listă de
itemuri. Folosiţi proprietăţile şi metodele lui TString pentru a manipula
aceste itemuri.
Exemplu:
Următoarea aplicaţie constă dintr-o formă pe care se află o cutie TEdit, o
cutie TListBox şi un buton de tip TButton. Butonul este de tip Default şi
are titlul Add. Utilizatorul poate introduce itemuri în ListBox prin
intermediul cutiei de editare. La apăsarea tastei <Enter>, textul aflat în
cutia de editare va deveni un item al ListBox-ului.
procedure TForml.ButtonlClick(Sender: TObject); begin
Buttonl.Default:=true;Buttonl.Caption:='Add';ListBoxl.Items.Add(Editl.Text);Editl.Clear;Editl.SetFocus;
end;
228
Exemplu:
Următoarea procedură inserează într-un TListBox zece item-uri repre
zentând numerele de la 1 la 10:
procedure TForml.ButtonlClick(Sender: TObject); var
i : integer; begin
for i := 1 to 10 doListBoxl.Items.Add(IntToStr(i)) ;
end;
P3. Sorted
property Sorted: Boolean;
Specifică dacă item-urile din listă sunt sortate alfabetic. Folosiţi ^orted
pentru a sorta alfabetic item-urile din lista de item-uri. Dacă Sorte4 este
true, atunci adăugarea sau inserarea unui item se va face cu respectarea
ordonării alfabetice existente.
P4. IntegralHeight
property IntegralHeight: Boolean;
Specifică dacă se pot afişa şi itemuri parţiale. Dacă IntegralHeight este
false atunci se poate afişa doar o parte din Item', de exemplu, dacg un
item nu încape să fie afişat întreg în partea de jos a cutiei, atunci e| va fj
afişat doar parţial, putând fi făcut în întregime vizibil prin acţio^ ,.^
scrollbar-ului vertical.
P3. Itemlndex
property Itemlndex: Integer;
Indică numărul de ordine al itemului selectat (marcat) din lista <je
itemuri. Dacă nici un item nu este selectat, atunci Itemlndex retumeaz^ _
1. Primul item din listă are indexul 0. Dacă atribuiţi o valoare juj
Itemlndex (în timpul execuţiei programului), atunci itemul având numă
rul de ordine specificat va fi selectat. Dacă sunt permise Multi-se|ectjj
atunci Itemlndex va întoarce numărul de ordine al itemului activ.
P4. Toplndex
property Toplndex: Integer;
Indică numărul de ordine al celui mai de sus item afişat.
229
P5. MultiSelect
property MultiSelect: Boolean;
Specifică dacă utilizatorul poate selecta la un moment dat mai multe
item-uri.
P6. ExtendedSelect
property ExtendedSelect: Boolean;
Specifică dacă utilizatorul poate selecta mai multe item-uri consecutive.
Dacă MultiSelect este false, atunci ExtendedSelect nu are nici un efect.
P7. SelCount
property SelCount: Integer;
Returnează numărul de item-uri selectate, dacă sunt permise multi-
selecţii. SelCount este ReadOnly.
P8. Selected
property Selected|7/it/ex: Integer]: Boolean;
Determină dacă itemul cu numărul de ordine Index este selectat. în caz
afirmativ se returnează true, iar în caz contrar se returnează false.
Exemplu:
Pentru a utiliza operaţiile de inserare respectiv ştergere de item-uri, vom
realiza următorul program care conţine două forme. Pe prima formă se
găsesc:
• o componentă ListBox 1 la care vom adăuga, insera şi şterge item
uri;
• o cutie de editare Editl prin intermediul căreia vom introduce item
urile;
• un buton Buttonl care are titlul Add şi la a cărui apăsare conţinutul
cutiei de editare va fi adăugat ca ultim item al lui ListBox;
• un buton Button2 care are titlul Delete şi la a cărui apăsare itemul
selectat va fi şters;
• un buton Button3 care are titlu Insert şi la a cărui apăsare va fi
afişată o nouă formă (Form2) care conţine o cutie de editare în care
utilizatorul introduce poziţia în care va fi inserat (în ListBox)
conţinutul cutiei de editare de pe forma Forml. Butonul Buttonl de
pe forma a doua va avea titlul Ok şi va fi un buton Default la a cărui
230
apăsare se va produce operaţia de inserare. Butonul Button2 de pe
forma a doua va fi un buton numit Cancel folosit în cazul în care nu
se mai doreşte inserarea.
La inserare se mai face un test: dacă poziţia pe care se inserează este
mai mare decât numărul total de item-uri din ListBox, atunci această
operaţie nu se mai execută.
Unitl.pas va conţine următoarele handlere de evenimente.
procedure TForml.FormCreate(Sender: TObject); var
ok : boolean; begin
if not ok then begin
Buttonl.Default:=true;Buttonl.Caption;='Add1;Button2 .Caption: = 1 Delete ' ;Button3 .Caption: = 'Insert' ;ListBoxl.Clear;Editl.Clear;Editl.setFocus; ok:=true;
end;end;procedure TForml.Button3Click(Sender: TObject); begin
Form2 .Show;Form2 .Editl.SetFocus;
end;
procedure TForml.Button2Click(Sender: TObject); begin
ListBoxl.Items.Delete(ListBoxl.Itemlndex);Editl.SetFocus;
end;
iar Unit2.pas va arăta astfel:
procedure TForm2 .ButtonlClick(Sender: TObject); var
nr ; integer; begin
nr := StrToInt(Editl.Text); if nr <= Forml.ListBoxl.Items.Count
then beginForml.ListBoxl.Items.Insert(nr,Forml.Editl.Text);Form2 .Hide;Forml.Edi tl.SetFocus;
endelse Form2 .Editl.SetFocus;
231
Editl.Clear; end;
procedure TForm2.Button2Click(Sender: TObject); begin
Form2.Hide;Forml.Editl.SetFocus;
end;
Exemplu:
Următoarea aplicaţie şterge item-urile selectate (în acest caz este permisă selectarea mai multor item-uri). Avem pe o formă două butoane, unul intitulat Add, iar celălalt intitulat Delete. Mai avem, de asemenea, şi o cutie de editare E ditl şi o cutie ListBoxl. La apăsarea primului buton, conţinutul cutiei E ditl va fi adăugat ca item al cutiei ListBoxl. Vom selecta mai multe itemuri; la apăsarea celui de-al doilea buton, itemurile selectate vor fi şterse.
procedure TForml.ButtonlClick(Sender: TObject); begin
ListBoxl.Items.Add(Editl.Text); end;
procedure TForml,Button2Click(Sender: TObject); var
i : integer; begin
ListBoxl.ExtendedSelect := true;ListBoxl.MultiSelect := true; i := 0;while i < ListBoxl.Items.Count do
if ListBoxl.Selected[i] then ListBoxl.Items.Delete(i) else i := i + 1;
end;
Metode
M l. Clear
procedure Clear;
Şterge toate item-urile dintr-o cutie de listare (ListBox).
M2. ItemRect
function ItemRect(/fem: Integer): TRect;
232
Returnează dreptunghiul ce înconjoară itemul cu numărul de ordine Index.
M 3. ItemAtPos
function ItemAtPoslTo.y: TPoint; Existing'. Boolean): Integer;
Specifică indexul itemului aflat la punctul Pos. Dacă punctul Pos este mai jos de ultimul item şi dacă Existing este true, atunci ItemAtPos returnează -1 , iar dacă Existing este false, atunci se returnează indexul ultimului item + 1.
Exem plu:
Următorul exemplu foloseşte o componentă TListBox. Itemurile din ea se pot adăuga la momentul proiectării aplicaţiei. La trecerea cursorului de mouse pe deasupra unui item, acesta devine selectat.
Folosind programul precedent, vom mai scrie acum doar următoarea procedură:
procedure TForml.ListBoxlMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
varp : Tpoint; nr : integer;
beginListBoxl.MultiSelect := false; p.x := X; p.y := Y;nr := ListBoxl.ItemAtPos(p,true);ListBoxl.Itemlndex := nr;
end;
Evenimente
E l. OnDrawItem
property OnDrawItem: TDrawItemEvent;
Apare când un item trebuie afişat.
Tipul TDrawItemEvent este definit astfel:
TDrawItemEvent = procedure(Control: TWinControl;Index: Integer Rect: TRect;State: TOwnerDrawState) o f object;
233
TDrciwItemEvent include următorii parametri:
P a ra m e tru S em n ifica ţie
Control R eferire le controlul conţinând itemul
Index Indexul item ului
Rect C oordonatele dreptunghiulu i care include item ul
StateStarea item ului, care indică dacă item ul este selectat, b ifa t, focalizat, etc.
E2. OnMeasureltem
property OnMeasureltem: TMeasureltemEvent;
Apare când un item trebuie afişat. Tipul TMeasureltemEvent este definit astfel:
TMeasureltemEvent = p rocedur^(Control: TWinControl;Index: Integer; var Height: Integer) of object;
OnMeasureltem este de tipul TMeasureltemEvent care conţine următorii trei parametri:
P a r a m e tr u S em n ifica ţie
Control Specifică controlul conţinând itemul.
Index S pecifica indexul item ului
Height Specifică înă lţim ea item ului
Parametrul Index identifică poziţia itemului în ListBox.Parametrul Height specifică înălţimea în pixeli pe care itemul dat o ocupă în control.
20.2. TComboBox
Combină o cutie de editare cu o listă de item-uri care se poate defila. Utilizatorul poate alege un item din listă, sau poate scrie direct în cutia de editare.
Ierarhie
TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomComboBox -> TComboBox.
234
stdctrls.pas
Pagina_____________________________________________________
Standard
Proprietăţi____________________________________________
PI. DropDownCount
property DropDownCount: Integer;
Indică numărul maxim de item-uri care pot fi afişate fără a fi nevoie de un scrollbar vertical.
P2. DroppedDown
property DroppedDown: Boolean;
Indică dacă lista drop-down este afişată. La momentul execuţiei ea poate fi afişată prin execuţia unui click pe săgeata din dreapta controlului.
P3. Itemlndex
property Itemlndex: Integer;
Indică numărul de ordine al itemului curent selectat (cel care este afişat în cutia de editare). Primul item din listă are indicele 0. Dacă nici un indice nu este selectat, atunci Itemlndex returnează -1.
P4. Items
property Items: TStrings;
Specifică itemurile din lista ce apare în ComboBox. Se pot adăuga sau şterge itemuri folosind proprietăţile lui TStrings.
Exemplu:
Următoarea aplicaţie adaugă zece item-uri (constând din primele 10 numere naturale) la o componentă TComboBox:
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;begin
ComboBoxl.Clear; for i:=0 to 10 do
Definit în________________________________________ ___
235
P5. Style
ComboBoxl.Items.A d d (IntToStr(i)) ;end;
property Style: TComboBoxStyle;
Specifică modul de comportare a componentei ComboBox. Valorile pe care le poate lua Style sunt:
V a lo a re S em n ifica ţie
csDropDown C rează o listă drop-dow n cu o cutie de editare, utilizatorul având posib ilita tea introducerii de text în cu tia de editare.
csDropDownList C rează o listă drop-dow n având o cutie de editare în care utilizatoru l nu poate in troduce m anual un text.
csSimpleC rează o cutie de editare cu o com ponen tă TLislBox sub ea. D im ensiunea acesteia dep inde de proprietatea Height.
csOwnerDrawFixed
C rează o listă drop-dow n cu o cutie de editare, u tilizatorul având posib ilitatea introducerii de tex t în cu tia de editare. Item urile au d im ensiunea specificată de proprietatea hemHeight. Când trebuie să fie afişată lista drop-dow n cu item uri, apare even im entu l OnDrawItem.
csOwnerDrawVariăble
C rează o listă drop-dow n cu o cutie de editare, u tilizatorul având posib ilita tea in troducerii de tex t în cu tia de editare. Item urile au dim ensiune variabilă. C ând trebuie să fie afişată lista drop-dow n, cu item uri, apar evenim entele OnDrawItem şi OnMensureltem.
Exemplu:
Următoarea aplicaţie construieşte şi gestionează afişarea unei componente TComboBox. Pentru aceasta folosim o componentă TPopupMenu ataşată componentei TComboBox. Componenta TPopupMenu are item-urile:
• A dd - folosit pentru a adăuga un nou item la lista drop-down;• Delete - pentru a şterge item-ul curent selectat;• View care conţine două subitem-uri (DropDown şi DropDownList)
folosite pentru a seta modul de comportare a TComboBox-ului.
La adăugarea unui item se va afişa o nouă formă, Fonn2, pe care se află o cutie de editare în care utilizatorul va introduce numele noului item şi un buton de tip TBitBtn la a cărui apăsare se va închide forma Form2.
236
I landlerele de evenimente de pe forma Form l sunt:
procedure TForml.AddlClick(Sender: TObject); begin
if Form2.ShowModal = mrOkthen ComboBoxl.Items.Add(Form2.Editl.Text);
«nd;
procedure TForml.DeletelClick(Sender: TObject); begin
if ComboBoxl.Itemlndex <> -1then ComboBoxl.Items.Delete(ComboBoxl.Itemlndex);
end;
procedure TForml.DropDownlClick{Sender: TObject); begin
<\miboBoxl. Style := csDropDown;©nd,
procedure TForml.DropDownListlClick(Sender: TObject); begin
('oinboBoxl. Style := csDropDownList; end;
Handlerele de evenimente de pe forma Form2 sunt:
procedure TForm2.FormShow(Sender: TObject); begin
Rdi tl.Clear;F.ditl .SetFocus;
end;
P6. Sorted
property Sorted: Boolean;
Indică dacă item-urile din lista Items sunt sortate alfabetic. Setarea acestei proprietăţi la true va sorta alfabetic aceste item-uri.
VI. MaxLength
property MaxLength: Integer;
Indică numărul maxim de caractere pe care utilizatorul le poate introduce în cutia de editare a componentei TComboBox.
231
iM ti ,
P8. SelText
property SelText: string;
Reprezintă textul selectat din cutia de editare ataşată componentei TComboBox. Poziţia primului caracter selectat precum şi numărul de caractere selectate sunt returnate cu ajutorul proprietăţilor SelStart, respectiv SelLength.
P9. Canvas
property Canvas: TCanvas;
Furnizează accesul la suprafaţa de desenare în momentul în care proprietatea Style are una din valorile csOwnerDrawVariable sau csOwnerDraw Fixed.
Metode ___________________________________________________
M l. Clear
procedure Clear;
Şterge toate item-urile din lista drop-down.
M2. SelectAll
procedure SelectAll;
Selectează întregul text al cutiei de editare.
Evenimente__________________________________________________
E l. OnChange
property OnChange: TNotifyEvent;
Apare în momentul în care un alt item este selectat sau un text este introdus în cutia de editare.
E2. OnDropDown
property OnDropDown: TNotifyEvent;
Apare când se execută click pe săgeata din dreapta a unei componente TComboBox. în acest moment se deschide lista drop-down.
238
E3.
property OnDrawItem: TDrawItemEvent;
Apare când un item trebuie afişat.Tipul TDrawItemEvent este definit astfel:
TDrawItemEvent = procedure( Cont rol: TWinControl;Index: Integer Rect: TRect; State: TOwnerDrawState) of object;
Semnificaţia parametrilor acestui eveniment este:
OnDrawItem
P a r a m e tr u S em n ifica ţie
Control C ontrolul care conţine item -ul.
Index Indexul item -ului.
Rect D reptunghiul care încon joară item -ul.
State Starea item ului. Poate fi selectat, b ifat sau are focus.
E4. OnMeasureltem
property OnMeasureltem: TMeasureltemEvent;
Apare când un item trebuie afişat. Evenimentul OnMeasureltem apare înaintea evenimentului OnDrawItem. Tipul TMeasureltemEvent este definit astfel:
TMeasureltemEvent = p rocedure(Control: TWinControl;Index: Integer; v ar Height: Integer) of object;
Semnificaţia parametrilor acestui eveniment este:
P a r a m e tr u S em n ifica ţie
Control C ontrolul care conţine item -ul.
Index Indexul item -ului.
H eight Înălţim ea dreptunghiul care înconjoară item -ul.
20.3. TColorBox m
TColorBox reprezintă un combo box din care utilizatorul poate selecta o culoare.
Ierarhie
TObject- > TPersistent- > TComponent- > TControl- >Twin Control
239
- >TCustomListControl- >TCustomCombo-> ->TCustomComboBox->TCustomColorBox->TColorBox
Definit în_____________________________________________________
System.pas
Pagina_______________________________________________________
Additional
Proprietăţi __________________________________________________
P I. ColorsName
property ColorNames[/Wei': Integer]: string;
ColorNames este folosită pentru a obţine numele uneia dintre culorile din lista de culori existentă în ColorBox. Proprietatea ne dă numele culorii aflată pe poziţia Index +1 (0 este indexul primei culori din listă). Proprietatea Style specifică numele folosit pentru fiecare culoare şi, de asemenea, specifică care culori vor fi incluse în listă.
P2. Colors
property Colors [Index-. Integer]: TColor;
Color este folosită pentru a obţine valoarea culorii din ColorBox. Index reprezintă indexul culorii (0 este indexul primei culori din cutie, 1 este indexul celei de-a d o u a , ş.a.m.d.).
Exem plul 1:
La apăsarea unui buton să se coloreze forma în culoarea al cărei indice va fi specificat.
Vom folosi un buton Buttonl, o cutie ColorBox! şi o cutie de editare E ditl în care vom menţiona indicele culorii.
Handlerele de evenimente ale obiectelor de pe forma Form l sunt date de:
procedure TForml.ButtonlClick(Sender: TObject) begin
Editl.SetFocus;Forml.Color:=ColorBoxl.Colors[strtoint(Editl.Text) ] ;
end;
240
P3. Style
property Style: TColorBoxStyle;
Controlează care culori vor fi incluse în listă şi care este formatul lor. Style poate să nu includă nici una sau mai multe dintre:
Style Sem nificaţie
cbStandardColors ColorBox afişează prim ele 16 culori constante din unitul G raphics. A cestea sunt constan te (ex. clRed, clBlue) ce rep rez in tă valori fixe RGB.
cbExtendedColors ColorBox include clMoneyGreen, clSkyBlue, clCream, şi clMedGray.
cbSystemColors ColorBox include constan ta sim bolică a culorii care reflectă va loarea specificată în W indow s C ontrol Panel.
cblncludeNone ColorBox include clNone. A ceastă op ţiune are efect num ai dacă Style include cbSystemColors
cblncludeDefault ColorBox include clNone. A ceastă opţiune are efect num ai dacă Style include cbSystemColors
cbCustomColor
Prim a în reg istra re conţine o culoare Custom (obişnuită).
C ând utilizatorul selectează în reg istra rea Custom, ColorBox afişează un Color Dialog din care u tilizatorul să poată alege o culoare pentru Custom.
cbPrettyNames ColorBox afişează culorile în cuvinte şi nu ca şi constantă, culoare de tip string. D e exem plu, va afişa Red în loc de clRed.
P4. Selected
property Selected: TColor;
Specifică culoarea curentă selectată.
Exem plul 2:
La apăsarea unui buton să se coloreze forma în culoarea selectată din ColorBox.
Vom avea pe formă un buton Buttonl şi o cutie ColorBoxl.
Handlerele de evenimente ale acestor obiecte sunt:
procedure TForml.BitBtnlClick(Sender: TObject); begin
Forml.Color:=ColorBoxl.Selected;end;
241
Metode
M l. Addltem
procedure Addltem (Item'. String; A O bject: TObject);
Adaugă un item în lista drop-down de itemi.
M2. Clear
procedure Clear; override;
Şterge tot textul din cutia de editare şi toţi itemii din lista de itemi.
M3. ClearSelection
procedure ClearSelection; override;
Deselectează orice item selectat din lista drop-down.
M4. CopySelection
procedure CopySelection (Destination: TCustomListControl);override;
Copiază itemul selectat din lista drop-down într-o altă listă.
M5. D eleteSelected
procedure DeleteSelected; override
Şterge itemul selectat din lista drop-down.
20.4. TListView
Este o componentă care permite afişarea de item-uri într-o varietate de moduri.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> ->TCustomListView -> TListView.
Definit în_____________________________________________________
com ctrls.pas
242
Pagina
Win32
Proprietăţi_______________________________________________
PI. Column
property Co\umn{Index: Integer]: TListColumn;
Indică coloana cu numărul de ordine Index.
P2. ColumnClick
property ColumnClick: Boolean;
Specifică dacă headerul unei coloane se comportă ca un buton.
P3. Columns
property Columns: TListColumns;
Facilitează lucrul cu coloane. Pentru a se permite lucrul cu coloane, trebuie ca proprietatea ViewStyle să fie setată la vsReport. Coloanele pot fi adăugate şi la momentul proiectării aplicaţiei cu ajutorul lui ListView Columns Editor care apare pe ecran la dublu click pe proprietatea Columns din Objectlnspector.
P4. ItemFocusedproperty ItemFocused: TListltem;ItemFocused conţine itemul care este selectat şi este înconjurat de un dreptunghi din linie punctată (item-ul care are focus) Dacă nici un item nu-este selectat atunci se returnează nil. La un moment dat un singur item poate avea această proprietate.
P5. Items
property Items: TListltems;
Items conţine lista itemurilor unei componente TListView. Aceste itemuri pot fi prelucrate şi la momentul proiectării aplicaţiei prin dublu click pe proprietatea Items din Objectlnspector. Pe ecran va apare ListView Items Editor:
243
aItems Item Properties
New Item Caption:
Image Index:
State Index:
OK Cancel Help
P6. Largelmages
property Largelmages: TCustomlmageList;
Specifică care listă cu imagini este ataşată ListView-ului curent. Această proprietate este valabilă doar când proprietatea ViewStyle este setată la vslcon. Dacă Largelmages este nevidă, atunci fiecare item are ataşată o imagine.
P7. Smalllmages
property Smalllmages: TCustomlmageList;
Specifică care listă cu imagini este ataşată ListView-ului curent. Această proprietate este valabilă doar când proprietatea ViewStyle este setată la vsSmalllcon. Dacă Smalllmages este nevidă, atunci fiecare item are ataşată o imagine.
P8. MultiSelect
property MultiSelect: Boolean;
Indică dacă utilizatorul poate selecta mai multe item-uri la un moment dat. Implicit este false.
P9. SelCount
property SelCount: Integer;
Indică numărul de item-uri selectate la un moment dat.
P10. Selected
property Selected: TListltem;
244
Returnează primul item selectat dintr-o componentă TListView.
P i l . ShowColumnHeaders
property ShowColumnHeaders: Boolean;
Este valabilă doar dacă ViewStyle are valoarea vsReport şi indică dacă taburile reprezentând capete de coloane sunt afişate.
P12. Topltem
property Topltem: TListltem;
Returnează cel mai de sus item vizibil. Acesta poate să nu fie cel mai de sus item al TListView, dacă acela nu este vizibil.
P13. ViewStyle
property ViewStyle: TViewStyle;
Specifică modul în care sunt afişate item-urile unei ListView. Valori posibile pentru ViewStyle sunt:
V a lo a re S em n ifica ţie
vslcon Fiecare item apare ca un icon cu textul ataşat lui sub el. U tilizatorul îl poate m uta în orice a ltă poziţie în interiorul TListView-uM curent.
vsSmalllconFiecare item apare ca un icon cu textul a taşat la d reap ta lui. U tilizatorul îl poate m u ta în orice altă poziţie în interiorul TListView- ului curent.
vsListFiecare item apare ca un icon cu o e tichetă la d reap ta lui. Item -urile sun t aranjate în coloane şi nu po t fi m utate în orice loc d in cadrul TListView-ului curent.
vsReport
Fiecare item este a fişat pe p rop ria lui linie. C ea m ai din stânga co loană conţine icon-ul item -ului îm preună cu tex tu l a taşa t lut. Iar apoi, urm ătoarele coloane conţin urm ătoarele sub item uri (se ştie că un subitem nu poate avea la rândul său subitem -uri).
P14. SortType
property SortType: TSortType;
Indică felul în care sunt aranjate item-urile dintr-un TListView. Valori posibile pentru SortType sunt:
V a lo a re S em n ifica ţie
stNone N ici o sortare nu are loc.
stData Item -urile su n t sorta te crescător pe baza proprietăţii Data a lui TListltem. V a trebui im plem entat evenim entul OnCompare.
245
Îiîîitiţfiiii iii ?5 i i {-f rţ
V a lo a re S em n ifica ţie
stText Item -urile sunt sortate conform proprietăţii Caption a lui TListltem.
stBothItem -urile sunt sortate crescător pe baza proprietăţilo r Data şi Caption a lui TListltem. D acă evenim entul OnCompare nu este im plem enta t atunci el va fi ignorat.
P15. HotTrack
property HotTrack: Boolean;
Indică dacă item-urile sunt luminate în momentul în care cursorul de mouse trece pe deasupra lor.
Metode
M l. Arange
procedure Arrange(CWe: TList Arrangement);
Aranjează item-urile într-o ListView. Valori posibile pentru Code sunt:
V a lo a re S em n ifica ţie
arAlignBottom A lin iază item -urile de-a lungul m uchiei in ferioare a ferestrei.
arAlignLeft A lin iază item -urile de-a lungul m uchiei d in s tânga a ferestrei.
arAlignRight A lin iază item -urile de-a lungul m uchiei din d reap ta a ferestrei.
arAlignTop A lin iază item -urile de-a lungul m uchiei superioare a ferestrei.
M2. FindCaption
function ¥'mdCwption(StartIndex: Integer; Value: string;Partial, Inclusive, Wrap: Boolean): TListltem;
Returnează item-ul care are ataşată eticheta Value. Căutarea se face începând de la item-ul Startlndex. Dacă item-ul nu este găsit, atunci se returnează nil. Dacă Wrap este true, atunci, dacă item-ul nu este găsit, căutarea se continuă de la începutul listei.
M 3. GetltemAt
function GetItemAt(X, Y?Integer): TListltem;
Returnează item-ul aflat la poziţia (X, Y) faţă de colţul din stânga sus al cutiei TListView-ului.
246
M4. GetNearestltem
function GetNearestItcm(Po//i?: TPoint; Direction : TSearchDirection):TListltem;
Returnează cel mai apropiat item de punctul Point. Căutarea se poate face în direcţiile: sus (sdAbove), jo s (sdBellow), dreapta (sdRigth), stânga (sdLeft) sau în toate direcţiile(srM//).
M 5. Scroll
procedure ScrolKDX, DY: Integer);
Defilează conţinutul ferestrei cu DX respectiv D Y pixeli.
M6. Updateltem
procedure Updatcltem s( First Index, Lastlndex: Integer);
Redesenează item-urile având indexul în intervalul [Firstlndex, Lastlndex].
M7. IsEditing
function IsEditing: Boolean;
Indică dacă un item oarecare este în curs de editare.
Evenimente__________________________________________________
E l. OnChange
property OnChange: TLVChangeEvent;
Apare când un nou item este selectat sau proprietăţile State, Text, Image ale unui item sunt modificate. Tipul TLVCChangeEvent este definit astfel:
TLVChangeEvent = procedure(Sender: TObject;Item: TListltem; Change: TItemChange) of object;
E2. OnDeletion
property OnDeletion: TLVDeletedEvent;
Apare când un item este şters. Tipul TLVDeletedEvent este definit astfel:
TLVDeletedEvent = procedure(Sender: TObject;Item: TListltem) of object;
247
E3. Onlnsert
property Onlnsert: TLVDeletedEvent;
Apare când un nou item este inserat.
E4. OnCompare
property OnCompare: TLVCompareEvent;
Apare când două item-uri trebuie comparate pentru sortare. Tipul TLVCompareEvent este definit astfel:
TLVCompareEvent = pvocedurc(Sender: TObject;Item l, Item2: TListltem; D ata: Integer; var Com pare: Integer) of object;
Item-urile comparate sunt Item l şi Item2. Dacă Item l este mai mic decât Item2, atunci valoarea lui Compare trebuie setată la o valoare negativă. Dacă Item l este egal cu ltem 2 , atunci valoarea lui Compare trebuie setată la valoarea zero. Dacă Item l este mai mare decât Item2, atunci valoarea lui Compare trebuie setată la o valoare strict pozitivă.
E5. OnEditing
property OnEditing: TLVEditingEvent;
Apare când utilizatorul începe să editeze eticheta ataşată unui item. Tipul TLVEditingEvent este definit astfel:
TLVEditingEvent = procedure(Se/iekr: TObject;hem: TListltem; var AllowEdit: Boolean) of object;
Pentru a preveni editarea unui item, setaţi la false valoarea lui AllowEdit.
E6. OnEdited
property OnEdited: TLVEditedEvent;
Apare după ce utilizatorul a editat eticheta unui item. Tipul TLVEditedEvent este definit astfel:
TLVEditedEvent = procedur^(Sender: TObject;Item: TListltem; var S: string) of object;
E7. OnlnfoTip
property OnlnfoTip: TLVInfoTipEvent;
248
Apare când utilizatorul staţionează câteva momente deasupra unui item. Tipul TLVlnfoTipEvent este definit astfel:
TLVInfoTipEvent = procedure(Sender: TObject;Item. TListltem; v ar InfoTip: string) of object;
E8. OnData
property OnData: TLVOwnerDataEvent;
Apare înainte ca un item să fie afişat. Tipul TLVOwnerDataEvent este definit astfel:
LVOwnerDataEvent = procedure(Sender: TObject;hem: TListltem) of object;
Pentru ca acest eveniment să apară trebuie ca proprietatea OwnerData să fie true.
20.5. TListltems
Este lista de item-uri ce apar într-o componentă TListView.
Ierarhie______________________________________________________
TObject -> TPersistent -> TListltems
Definit în_____________________________________________________
com ctrls.pas
Proprietăţi___________________________________________________
P I. Count
property Count: Integer;
Indică numărul de item-uri din cadrul vectorului Item.
P2. Item
property ltem[Index: Integer]: TListltem;
Furnizează acces la item-urile unei liste prin intermediul numărului de ordine al item-ului. Primul item are numărul de ordine 0.
249
P3. Owner
property Owner: TCustomListView;
Returnează componenta TListView care manipulează item-urile din TListltems.
Metode____________________________________________ __
M l. Add
function Add: TListltem;
Adaugă un item la sfârşitul listei.
M2. Delete
procedure Delete(Index: Integer);
Şterge item-ul cu numărul de ordine Index, din cadrul listei curente.
M3. Clear
procedure Clear;
Şterge toate item-urile din cadrul listei curente.
M4. Insert
function Jnscrt(I/idex: Integer): TListltem;
Inserează un item pe poziţia Index. Acesta va putea fi apoi accesat cu ajutorul proprietăţii Items.
M5. IndexOf
function IndexOMValue: TListltem): Integer;
Returnează numărul de ordine al item-ului Value în cadrul listei de itemuri.
250
20.6. TListltem
Este o clasă care încapsulează proprietăţile, metodele şi evenimentele specifice unui item dintr-o listă TListltems.
Ierarhie______________________________________________________
TObject -> TPersistent -> TListltem
Definit în_____________________________________________________
com ctrls.pas
Proprietăţi___________________________________________________
PI. Caption
property Caption: string;
Indică textul care etichetează un item.
P2. Data
property Data: Pointer;
Reprezintă datele asociate item-ului.
P3. Checked
property Checked: Boolean;
Indică dacă un semn de bifare apare în stânga item-ului.
P4. Focused
property Focused: Boolean;
Indică dacă item-ul are focus.
P5. Imagelndex
property Imagelndex: TImageIndex;
Specifică numărul de ordine a imaginii (în cadrul unei componente TImageList) care este ataşată ca icon item-ului curent. Dacă proprietatea TListView. ViewStyle este vslcon, atunci Imagelndex este indicele imaginii din lista ataşată proprietăţii TListView.Largelmages, în caz contrar indicele este din lista TListView.Smalllmages.
251
P6. Index
property Index: Integer;
Indică numărul de ordine al unui item în cadrul TListltems. Primul item are numărul de ordine 0.
P7. Selected
property Selected: Boolean;
Specifică dacă item-ul este selectat.
P8. Subitems
property Subitems: TStrings;
Specifică lista de subitem-uri ataşată item-ului curent. Folosiţi proprietăţile lui TStrings pentru a manipula această listă.
P9. ListView
property ListView: TCustomListView;
Indică componenta de tip TListView care conţine item-ul curent. Proprietatea este ReadOnly.
P10. Owner
property Owner: TListltems;
Indică componenta de tip TListltems care conţine item-ul curent. Proprietatea este ReadOnly.
P i l . Statelndex
property Statelndex: TImageIndex;
Indică care imagine din TListView: :Statelmages este asociată cu item-ul curent.
Metode_____________________________________________________ _
M l. Delete
procedure Delete;
Şterge item-ul care o apelează.
252
M2. GetPosition
function GetPosition: TPoint;
Returnează coordonatele colţului din stânga sus al unui item în cadrul unei componente TListView.
M3. SetPosition
procedure SetPosition(const Value: TPoint);
Setează colţul din stânga sus al item-ului la poziţia Value în cadrul componentei TListView. Controlul trebuie să aibă proprietatea ViewStyle setată la vslcon sau vsSmalllcon.
M4. M akeVisible
procedure MakeVisibleffYzrZ/a/OA': Boolean);
Defilează lista cu item-uri până când item-ul care apelează această metodă devine vizibil/parţial vizibil.
M 5. Update
procedure Update;
Redesenează un item. Acest lucru este necesar dacă item-ul şi-a schimbat proprietăţile (Icon, Caption . ..)
M 6. DisplayRect
function DisplayRect(Coafe: TDisplayCode): TRect;
Returnează dreptunghiul care mărgineşte item-ul. Valori posibile pentru Code sunt:
V a lo a re S e m n ifica ţie
drBoundsR eturnează dreptunghiul care m ărgineşte în treg item -ul inclusiv icon-ul şi eticheta.
d rlro n R eturnează dreptunghiul care m ărgineşte icon-ul item -ului.
drL abel R eturnează dreptunghiul care m ărgineşte e ticheta item -ului.
drSelectBoundsR eturnează dreptunghiul care m ărgineşte în treg item -ul inclusiv icon-ul şi eticheta , excluzând coloanele. în cazu l ViewStyle este vsReport.
253
20. 7. TTreeView
Permite afişarea unei structuri ierarhice de item-uri, ca de exemplu structura de directoare de pe un disc. Fiecare nod din structură are asociat un text şi eventual un bitmap. Totodată un nod poate avea subnoduri care pot fi expandate, sau colapsate printr-un click pe părintele lor.
Arborele reprezentat într-o componentă TTreeView poate fi accesat cu ajutorul proprietăţii Items care este de tipul TTreeNodes. Această clasă manipulează arborele ca un tot. Accesarea unui nod particular din arbore se face cu ajutorul proprietăţii Item a clasei TTreeNodes. Fiecare nod al arborelui este un obiect de tipul TTreeNode.
Un nod din arbore are ataşat un text (proprietatea Text) şi eventual o imagine (proprietatea Imagelndex - care indică numărul de ordine al unei imagini din cadrul unei componente TImageList).
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomTreeView -> TTreeView.
Definit în__________________________________________________ _
com ctrls.pas
Pagina_______________________________________________________
Win32
Proprietăţi ____________________________________________
PI. Indent
property In d en t: integer;
Indică numărul de pixeli care sunt folosiţi pentru indentare în cazul expandării unor subnoduri. Implicit este 19.
P2. Items
property Items : TTreeNodes;
Items este lista nodurilor care sunt reprezentate într-un TTreeView. Aceste noduri sunt obiecte de tipul TTreeNode.Un arbore poate fi construit şi la momentul proiectării aplicaţiei cu
254
ajutorul TreeView Item s Editor, care este afişat la dublu click pe proprietatea Items din O bject Inspector:
OK j ..-Cancel'■■"■■■j-1- | Heip j
Butoanele Newltem şi NewSubltem adaugă câte un nod frate/fiu la nodul curent selectat.
Exem plul 1:
Următoarea procedură afişează în ListBoxl textul ataşat nodurilor arborelui reprezentat în componenta TreeView 1:
procedure TForml.ButtonlClick(Sender: TObject); var
i : integer; begin
for i := 0 to TreeViewl.Items.Count - 1 doListBoxl.Items.Add(TreeViewl.Items.Item[i].Text);
end;
Exem plul 2:
Următorul exemplu pune la dispoziţia utilizatorului - în momentul în care acesta execută click pe un nod al arborelui - informaţii despre acest nod, şi anume:
• textul ataşat;• numărul fiilor;• indicele absolut;• indicele relativ (în cadrul listei fiilor părintelui);• nivelul pe care se află în arbore;• nodul părinte (pentru nodurile de pe nivelul 0 părinte este considerat
chiar T reeV iew l.
Aceste informaţii sunt afişate într-o cutie de tip TListBox.Un nod poate fi selectat şi cu ajutorul tastelor <Up>, <Down>, deci dacă
255
doriţi ca aceste informaţii să le obţineţi şi când vă plimbaţi prin arbore cu ajutorul săgeţilor, copiaţi conţinutul acestui handler în handlerul ataşat evenimentului OnKeyPres (înlocuind bineînţeles linia
nod := TreeViewl.GetNodeAt(X,Y);cu linia
nod := TreeViewl.Selected;
)•
procedure TForml.TreeViewlMouseDown(Sender: TObj ect;Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var
nod, părinte : TTreeNode; begin
nod := TreeViewl.GetNodeAt(X, Y); if nod = nilthen ShowMessage('Nici un nod selectat!') else begin
ListBoxl.Clear;ListBoxl.Items.Add('Text 1 + nod.Text);ListBoxl. Items .Add ( 'Numar f ii : ' + IntToStr (nod. Count) ) ,- ListBoxl.Items.Add('Index relativ:'+IntToStr(nod.Index)); ListBoxl.Items.Add('Index absolut:'+
IntToStr(nod.Absolutelndex)); .ListBoxl.Items.Add('Nivel:'+IntToStr(nod.Level)); părinte := nod.Parent; if părinte <> nilthen ListBoxl.Items.Add('Părinte:'+parinte.Text) else ListBoxl.Items.Add('Părinte: TreeViewl');
end;end;
P3. Selected
property S e lec ted : TTreeNode;
Specifică nodul selectat dintr-o componentă TTreeView. Nodul selectat este încadrat într-un dreptunghi colorat.
P4. RightClickSelect
property RightClickSelect: boolean;
Indică dacă proprietatea Selected returnează noduri selectate cu butonul din dreapta al mouse-ului.
256
P5. ShowButtons
property ShowButtons : boolean;
Indică dacă butoanele (+), (-) apar în partea stângă a fiecărui nod cmc are subnoduri. Dacă ShowButtons este true, atunci acesie Iniiiuiiii' vor apărea şi la apăsarea lor nodul respectiv se va expanda sau colapsn.
P6. ShowLines
property ShowLines : boolean;
Indică dacă sunt afişate liniile care leagă un nod părinte de nodurile fii.
P7. ShowRoot
property Show R oot: boolean;
Indică dacă sunt afişate liniile care leagă nodul root de restul nodurilor.
P8. Topltem
property T op ltem : TTreeNode;
Indică cel mai de sus nod vizibil.
P9. Images
property Images : TImageList;
Reprezintă lista cu bitmap-urile ce se afişează la stânga nodurilor unui TTreeView. Unui nod i se poate ataşa o imagine fie la momentul proiectării aplicaţiei (prin intermediul lui TreeView Item s Editor) fie la momentul execuţiei aplicaţiei prin intermediul proprietăţii TTreeNode:: Imagelndex.
Exemplu:
Să exemplificăm puţin lucrul cu aceste proprietăţi. Construim un arbore (în componenta TreeViewl) Ia momentul proiectării aplicaţiei. Tot la momentul proiectării aplicaţiei construim şi un meniu Popup (cu meniurile AfiseazaLinii, AfiseazaRadacina, AfiseazaButoane, Indent, NodulSelectat, NodulDinVarf, care corespund proprietăţilor ShowLines, ShowRoot, ShowButtons, Indent, Selected şi Topltem) pe care îl ataşăm la TreeV iew l.Itemurile de meniu NodulSelectat şi NodulDinVarf vor afişa valorile proprietăţilor Selected şi Topltem, iar meniul Indent va afişa o fereastră de dialog în care uilizatorul este solicitat să introducă o valoare pentru
257
proprietatea Indent.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object PopupMenul: TPopupMenuobject AfiseazaRadacinal: TMenuItem
Caption = 'AfiseazaRadacina'Checked = True
endobject AfiseazaLiniil: TMenuItem
Caption = 'AfiseazaLinii’Checked = True
endobject AfiseazaButoanel: TMenuItem
Caption = 'AfiseazaButoane1 Checked = True
endobject Indent1: TMenuItem Caption = 'Indent'
endobject Noduldinvarf1: TMenuItem
Caption = 'Nodul din varf’ endobject NodulSelectatl: TMenuItem
Caption = 'Nodul Selectat' end
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.AfiseazaRadacinalClick(Sender: TObject); beginAfiseazaRadacinal.Checked := not AfiseazaRadacinal.Checked; TreeViewl.ShowRoot := not TreeViewl.ShowRoot;
end;
procedure TForml.AfiseazaLiniilClick(Sender: TObject); beginAfiseazaLiniil.Checked := not AfiseazaLiniil.Checked; TreeViewl.ShowLines := not TreeViewl.ShowLines;
end;procedure TForml.AfiseazaButoanelClick(Sender: TObject); begin
AfiseazaButoanel.Checked := not AfiseazaButoanel.Checked; TreeViewl.ShowButtons := not TreeViewl.ShowButtons;
end;procedure.TForml.IndentlClick(Sender: TObject);
varNrSir : string;
beginInputQuery('Cutie de dialog',
'Introduceti numărul de pixeli pentru indent', nrSir);
258
TreeViewl.Indent := StrToInt(NrSir); end;
procedure TForml.NoduldinvarflClick(Sender: TObject); var
nod : TTreeNode; begin
nod := TreeViewl.Topltem; if nod = nilthen ShowMessage('Arbore vid')else ShowMessage('Nodul din varf are eticheta ' + nod.Text);
end;procedure TForml.NodulSelectatlClick(Sender: TObject);
varnod : TTreeNode;
beginnod := TreeViewl.Selected; if nod = nilthen ShowMessage('Nici un nod selectat!')else ShowMessage('Nodul selectat are eticheta ’ + nod.Text);
end;
Metode
M l. AlphaSort
function A lphaSort: boolean;
Sortează nodurile în ordine alfabetică după eticheta ataşată fiecăruia.
M2. FullCollapse
procedure FullCollapse;
Colapsează toate nodurile dintr-o structură arborescentă. Vor rămâne afişate doar nodurile de pe primul nivel.Instrucţiunea:
TreeViewl.FullCollapse;
va colapsa arborele din cutia TreeV iew l.
M3. FullExpand
procedure FullExpand;
Expandează toate nodurile. Fiecare (sub)nod apare sub nodul părinte. Dacă ShowButtons este true, atunci toate caracterele (+) sunt transformate în (-).
259
Instrucţiunea:
TreeViewl.FullExpand; va expanda arborele din cutia T reeV iew l.
M4. LoadFromFile
procedure Lo ad F ro m F i I e (F(7e Afa/ /1 e : string);
încarcă o structură de noduri dintr-un fişier cu numele FileName.
M5. SaveToFile
procedure SaveToFile(FileName : string);
Salvează o structură de noduri într-un fişier cu numele FileName. Forma în care se salvează un arbore este următoarea (un fiu apare indentat faţă de părintele lui):
aaaab
abaabbabc
ac
M6. GetNodeAt
function GetNodeAt(X, Y : integer) : TTreeNode;
Returnează nodul găsit la poziţia (X, Y). Coordonatele sunt calculate faţă de colţul din stânga sus al cutiei TtreeView (care are coordonatele (0,0)).
Exem plu:
Următoarea aplicaţie returnează eticheta ataşată nodului aflat la poziţia în care este apăsat butonul mouse-ului. Veţi observa că un nod va fi detectat chiar dacă punctul unde mouse-ul este apăsat este la dreapta nodului sau la stânga lui:
procedure TForml.TreeViewlMouseDown(Sender: TObject;Button: TMouseButton,-
Shift: TShiftState; X, Y: Integer); var
nod : TTreeNode; beginnod := TreeViewl.GetNodeAt(X, Y); if nod <> nil
260
then ShowMessage('A fost selectat nodul cu eticheta 1 + nod. Text)
M 7. GetHitTestlnfoAt
function GetHitTestInfoAt(X, Y: Integer): THitTests;
Returnează poziţia punctului de coordonate (X,Y) faţă de controlul TTreeView şi faţă de nodurile din arborele pe care îl conţine. Valorile returnate de funcţie sunt:
end;
V a lo a re S em n ifica ţie
htAbove Punctul se găseşte deasupra contro lu lu i TTreeView.
htBelow Punctul se găseşte sub controlul TTreeView.
htToRight Punctu l se găseşte la d reap ta controlului TTreeView.
htToLeft Punctul se găseşte la s tânga contro lu lu i TTreeView.
htN ow here Punctul se găseşte în interiorul controlul TTreeView, d ar sub ultim ul nod.
htO nhem Punctul se găseşte pe b itm ap-ul sau pe e ticheta asoc ia tă unui nod
htOnButton Punctul se găseşte pe butonul asociat nodului.
htO nlcon Punctul se găseşte pe bitm ap-ul asociat unui nod.
htO nlndent Punctul se găseşte pe indentarea unui nod.
htO nLabel Punctu l se găseşte pe e ticheta (textul) ataşat unui nod.
htOnRight Punctul se găseşte la d reap ta unui nod.
Evenimente__________________________________________________
E l. OnColapsing
property OnCollapsing: TTVCollapsingEvent;
Apare când un nod este pe cale să fie colapsat.Tipul TTVCollapsingEvent este definit astfel:
TTVCollapsingEvent = procedure(Sender: TObject;Node: TTreeNode; var AllowCollapse: Boolean) of object;
Node este nodul pe cale de a fi colapsat.Setaţi AllowCollpase la false pentru a nu permite colapsarea nodului Node.
261
E2. OnCollapsed
property OnCollapsed: TTVExpandedEvent;
Apare după ce un nod al arborelui a fost colapsat.Tipul TTVExpandedEvent este definit astfel:
TTVExpandedEvent = procedn re(Sender: TObject;Node: TTreeNode) of object;
Node este nodul colapsat.
E3. OnExpanding
property OnExpanding: TTVExpandingEvent;
Apare când un nod este pe cale de a fi expandat.Tipul TTVExpandingEvent este definit astfel:
TTVExpandingEvent = procedure(5enrfer: TObject;Node: TTreeNode; var AllowExpansion: Boolean) of object;
Node este nodul care urmează să fie expandat.Setaţi AllowExpansion la false pentru a nu permite expandarea nodului Node.
E 4. OnExpanded
property OnExpanded: TTVExpandedEvent;
Apare când un nod al arborelui este expandat (dacă are fii).Tipul TTVExpanded este definit astfel:
TTVExpandedEvent = procedureCSenc/er TObject;Node: TTreeNode) of object;
Node este nodul expandat.
Exem plu:
Următoarea aplicaţie va afişa un mesaj sugestiv în momentul în care apar evenimentele OnCollapsed, OnCollapsing, OnExpanded şi OnExpanding:
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.TreeViewlCollapsed(Sender: TObject;Node: TTreeNode);
beginShowMessage('Nodul cu eticheta '+Node.Text +
' a fost colapsat');end;
262
procedure TForml.TreeViewlCollapsing(Sender: TObject;Node: TTreeNode; var AllowCollapse: Boolean);
beginShowMessage('Nodul cu eticheta '+Node.Text + ' va fi colapsat');
end;
procedure TForml.TreeViewlExpandedlSender: TObject;Node: TTreeNode);
beginShowMessage('Nodul cu eticheta '+Node.Text +
' a fost expandat1);end ;procedure TForml.TreeViewlExpanding(Sender: TObject;
Node: TTreeNode; var AllowExpansion: Boolean);begin
ShowMessage('Nodul cu eticheta '+Node.Text + ' va fi expandat1); end;
Exemplu:
Următoarea aplicaţie afişează ordinea în care vor fi expandate şi colapsate nodurile arborelui reprezentat în componenta TreeV iew l. Vom folosi două butoane (Buttonl şi Button2) care vor realiza colapsare respectiv expandare întregului arbore (evenimentele OnCollapsed, OnCollapsing , OnExpanded şi OnExpanding sunt implementate ca în aplicaţia precedentă).
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Buttonl: TButton Caption = 'Colapseaza'
endobject Button2: TButton
Caption = 'Expandeaza' end
Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
TreeViewl.FullCollapse; end;procedure TForml.Button2Click(Sender: TObject); begin
TreeViewl.FullExpand; end;
263
' HfMtfc I
E5. OnDeletion
property OnDeletion: TTVExpandedEvent;
Apare când un nod este şters.
E6. OnEditing
property OnEditing: TTVEditingEvent;
Apare când textul ataşat unui nod (proprietatea TTreeNode.Text) este pe cale să fie editat. Tipul TTVEditingEvent este definit astfel:
TTVEditingEvent = procedur {Sender. TObject;N ode: TTreeNode; var AllowEdit: Boolean) of object;
Node este nodul care este editat.Setaţi AllowEdit la false pentru a nu permite editarea textului ataşat nodului Node.
E7. OnEdited
property OnEdited: TTVEditedEvent;
Apare după ce textul ataşat unui nod a fost editat. Tipul TTVEditedEvent este definit astfel:
TTVEditedEvent = procedure(Se/iâfer: TObject;N ode: TTreeNode; var S: string) of object;
Node este nodul al cărui text a fost editat, iar S este noua valoare a textului ataşat nodului.
E8. OnChanging
property OnChanging: TTVChangingEvent;
Apare când selecţia (focusul) este pe cale să se schimbe de la un nod la altul. Tipul TTVChangingEvent este definit astfel:
TTVChangingEvent = procedure(5'e«<ier: TObject;Node: TTreeNode; var AllowChange: Boolean) of object;
Setaţi valoarea lui AllowChange la false pentru a nu permite ca nodul actual să fie deselectat.
E9. OnChanged
property OnChange: TTVChangedEvent;
264
Apare după ce un alt nod a fost selectat. Acest eveniment nu apare dacă selectarea noului nod se face cu ajutorul butonului din dreapta al mouse- ului. Pentru a intercepta acest fel de schimbare implementaţi evenimentul OnMouseUp.Tipul TTVChangedEvent este definit astfel:
TTVChangedEvent = procedure(Sender: TObject;Node: TTreeNode) of object;
Node este noul nod selectat.
Exemplu:
Următoarea aplicaţie interceptează selectarea unui nou nod reprezentat într-o componentă TTreeView.
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.TreeViewlChange(Sender: TObject;Node: TTreeNode);
beginShowMessage('A fost selectat nodul cu eticheta ’ + Node.Text);
end;procedure TForml.TreeViewlMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState;X, Y: Integer);
varnod : TTreeNode;
beginnod := TreeViewl.GetNodeAt(X, Y) ; if (Button = mbRight) and (nod <> nil)then ShowMessage('A fost selectat nodul cu eticheta ' +
nod.Text);end;
20. 8. TTreeNodes
Este o clasă care implementează funcţionalitatea unei liste cu nodurile unei structuri arborescente.
Ierarhie_________________________ ____________________________
TObject -> TPersistent -> TTreeNodes
Definit în_____________________________________________________
com ctrls.pas
265
Proprietăţi
PI. Count
property Count: Integer;
Numără nodurile unei structuri arborescente.
P2. Item
property Item [Index: Integer]: TTreeNode;
Returnează nodul cu numărul de ordine Index.
P3. Owner
property Owner: TCustomTreeView;
Indică componenta de tip TTreeView, proprietară a listei curente de noduri.
Metode_____________________________________________________ _
M l. Add
function Add(Node: TTreeNode; const S: string): TTreeNode;
Adaugă un nod arbore la sfârşitul listei de noduri din care face parte Node (pe acelaşi nivel în arbore). Dacă Node este fiu al root-ului, atunci nodul adăugat va fi ultimul element al listei nodurilor fiu a root-ului, deci pe acelaşi nivel cu Node. S este valoarea proprietăţii Text al nodului nou adăugat.
M2. AddFirst
function AddFirst(AWe: TTreeNode; const S: string): TTreeNode;
Adaugă Node ca prim element al listei nodurilor din care face parte, (deci pe acelaşi nivel în arbore ca şi Node).
M3. AddChild
function AddChild(Node: TTreeNode; const S: string): TTreeNode;
Nodul Node este adăugat ca şi ultim fiu al lui Node.
266
function AddChildFirst(AWe: TTreeNode; const S: string):TTreeNode;
Nodul Node este adăugat ca şi prim fiu al lui Node.
M5. Insert
function Insert(AWe: TTreeNode; const S: string): TTreeNode;
Inserează nodul care apelează această metodă după nodul Node, pe acelaşi nivel.
M6. Delete
procedure Delete(Node: TTreeNode);
Şterge nodul specificat, împreună cu fii săi.
M7. Clear
procedure Clear;
Şterge toate nodurile dintr-un arbore.
M8. BeginUpdate
procedure BeginUpdate;
Blochează redesenarea cutiei care afişează un arbore în cazul unei modificări (inserare, ştergere) apărute în structura acestuia. Acest lucru ajută la mărirea vitezei de lucru în cazul prelucrării arborilor. Repermi- terea redesenării arborelui se face cu EndUpdate.
M9. EndUpdate
procedure EndUpdate;
Repermite desenarea arborelui după o execuţie a unor operaţii de modificare a acestuia. Se apelează neapărat după BeginUpdate.
Exem plu:
Următoarea aplicaţie construieşte (într-o componentă TTreeView) un arbore binar complet cu un număr fixat de nivele (care este citit dintr-o cutie de editare).
M4. AddFirstChild
267
Valorile proprietăţilor obiectelor aflate pe forma Form l sunt:
object Buttonl: TButtonCaption = 'ConstruiesteArbore'
endobject Editl: TEdit
Text = '2' end
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
varnivele : integer;
{$R *.DFM}procedure TForml.ConstruiesteArbore(nod : TTreeNode;
niv : integer);//aceasta procedura trebuie declarata in secţiunea public
varNodNou : TTreeNode;
beginif niv < nivele then begin
NodNou := TreeViewl. Items .AddChild (nod, IntToStr (niv) ) ,- ConstruiesteArbore(NodNou, niv + 1);NodNou := TreeViewl.Items.AddChild(nod,IntToStr(niv)); ConstruiesteArbore(NodNou, niv + 1);
end;end;procedure TForml-ButtonlClick(Sender: TObject);
varrădăcină : TTreeNode;
beginnivele := StrToInt(Editl-Text);TreeViewl.Items.BeginUpdate;TreeViewl. Items-Clear; // şterg arborele existentrădăcină := TreeViewl. Items .Add (nil,' 0 ') ; //rădăcină arboreluiConstruiesteArbore(rădăcină, 1);TreeViewl.Items.EndUpdate;TreeViewl .FullExpand; //afişe
end;
20.9. TTreeNode
Reprezintă un nod din cadrul listei cu noduri a unei componente TTreeNodes.
Ierarhie
TObject -> TPersistent -> TtreeNode
268
Definit în
com ctrls.pas
Proprietăţi___________________________________________________
PI. Absolutelndex
property Absolutelndex : integer;
Indică indicele absolut al unui nod în lista de noduri. Primul nod din listă are indexul 0.
P2. Count
property C ount: integer;
Indică numărul de copii ai unui (sub)nod arbore.
P3. Expanded
property Expanded: boolean;
Specifică dacă nodul este expandat.
P4. Focused
property Focused : boolean;
Indică dacă nodul curent este selectat, adică dacă este înconjurat de un dreptunghi având laturile din linie punctată. La un moment dat numai un nod poate avea acestă proprietate, dar mai multe noduri pot fi selectate.
P5. HasChildren
property HasChildren: boolean;
Indică dacă nodul curent (cel care a apelat această proprietate) are copii.
P6. Index
property Index : integer;
Această proprietate identifică în mod unic un nod în cadrul listei nodurilor copii ai nodului părinte.
P7. IsVisible
property IsV isible: boolean;
269
*** * HtWM wwMtf+t HHUmmnn w t t m mN#»«
Indică dacă un nod este vizibil într-o cutie de afişare. Un nod se consideră a fi vizibil dacă are indicele 0 sau dacă toţi părinţii lui sunt expandaţi.
P8. Item
property Item [Index integer] : TTreeNode;
Furnizează acces la nodul cu indicele Index din cadrul listei de noduri fiu al nodului curent.
P9. Level
property L ev e l: integer;
Indică nivelul în arbore al nodului care a apelat această proprietate. Nodul cel mai de sus (root) are nivelul 0, toţi fii lui au nivelul 1, ş.a.m.d.
P10. Parent
property P a ren t: TTreeNode;
Identifică nodul părinte al nodului care a apelat această proprietate.
P il . Selected
property S e lec ted : boolean;
Determină dacă nodul curent este selectat.
P12. Text
property T e x t: string;
Text este textul asociat unui nod.
P13. Data
property D a ta : pointer;
Pointează spre o structură de date asociată nodului curent.
P14. TreeView
property TreeView : TCustomTreeView;
Indică componenta TTreeView care afişează acest nod.
270
Metode
M l. Collapse
procedure Collapse(Recurse: Boolean);
Colapsează un nod. Dacă Recurse este true, toţi fiii acestui nod sunt colapsaţi, iar la următoarea expandare a nodului respectiv fiii vor fi colapsaţi. Dacă Recurse este false, fiii nu sunt colapsaţi, iar la următoarea expandare a nodului respectiv, fiii acestuia vor avea aceasşi stare ca şi înainte de apelul Collapse.
M2. Expand
procedure Expand (Recurse: Boolean);
Expandează un nod. Dacă Recurse este true, atunci toţi fiii acestui nod sunt expandaţi.
M3. Delete
procedure Delete;
Şterge nodul care o apelează, împreună cu fiii acestuia. De asemenea este eliberată întreaga memorie asociată nodurilor şterse.
M4. DeleteChildren
procedure DeleteChildren;
Şterge toţi fiii nodului care o apelează şi eliberează memoria asociată.
M5. GetFirstChild
function GetFirstChild: TTreeNode;
Returnează primul fiu al nodului care o apelează. Dacă acesta nu are fii, se retumeză nil.
M6. GetLastChild
function GetLastChild: TTreeNode;
Returnează ultimul fiu al nodului care o apelează.
M7. GetNext
function GetNext: TTreeNode;
Returnează următorul nod al listei de noduri, indiferent dacă acesta este sau nu vizibil.
M8. GetPrev
function GetPrev: TTreeNode;
Returnează precedentul nod al listei de noduri, indiferent dacă acesta este sau nu vizibil.
M9. GetNextSibling
function GetNextSibling: TTreeNode;
Returnează următorul nod (vizibil sau nu) aflat pe acelaşi nivel cu cel care apelează această metodă.
M10. GetPrevSibling
function GetPrevSibling: TTreeNode;
Returnează precedentul nod (vizibil sau nu) aflat pe acelaşi nivel cu cel care apelează această metodă.
M II . GetNextVisible
function GetNextVisible: TTreeNode;
Returnează următorul nod vizibil.
M12. GetPrevVisible
function GetPrevVisible: TTreeNode;
Returnează precedentul nod vizibil.
M14. IndexOf
function IndexOf(Va/«e: TTreeNode): Integer;
Dacă Value este fiu al nodului care a apelat această metodă, atunci IndexOf returnează indicele acestuia. Primul copil are indicele 0. Dacă nu, se returnează -1 .
272
M15. MakeVisible
procedure MakeVisible;
Face un nod vizibil. Dacă acesta nu este vizibil, atunci toţi părinţii săi vor fi expandaţi pentru ca acest nod să fie vizibil.
M16. MoveTo
procedure MoveTo (Destination: TTreeNode;Mode: TNodeAttachMode);
Mută un nod. Modul în care se face această mutare depinde de valoarea lui Mode. Valori posibile pentru Mode sunt:
V a lo a re S em n ifica ţie
N aA dd A daugă nodul care o apelează la sfârşitul listei de noduri, conform m etodei Add.
naAddFirst A daugă nodul care o apelează la începutul listei, conform m etodei AddFir.st.
naA ddC hild A daugă nodul care o apelează la sfârşitul listei nodurilor fii ai nodulu i Destination, conform m etodei AddChild.
naA ddC hildF irst A dauga nodu l conform m etodei AddFirstC hild.
naln sert Inserează nodul conform m etodei Insert.
M17. AlphaSort
function AlphaSort: Boolean;
Sortează crescător nodurile copii ale nodului curent. Sortarea se face pe baza proprietăţii Text.
M18. DisplayRect
function DisplayRect(7ex«9/i/y: Boolean): TRect;
Returnează dreptunghiul care mărgineşte un nod din arbore. Dacă TextOnly este true, atunci este returnat doar dreptunghiul care înconjoară textul unui nod, în caz contrar este returnată întreaga linie (din cadrul lui TTreeView) pe care se află nodul curent.
M19. EditText
function EditText: Boolean;
Permite utilizatorului să editeze textul ataşat unui nod. După apelarea acestei metode în locul textului apare o căsuţă de editare care conţine
textul ataşat nodului respectiv.
M20. EndEdit
procedure EndEdit(Cance/: Boolean);
încheie editarea textului ataşat unui nod.
274
21. GRAFICĂ
21.1. TColor
TColor = -(COLORJ3NDCOLORS + 1)..$02FFFFFF
Definit în_____________________________________________________
graphics.pas
Specifică culoarea unui obiect. Sunt definite constante de culoare care se potrivesc fie cu paleta sistem de culori (clAqua, clBlack, clBlue, clDkGray, clFuchsia, clGray, clGreen, clLime, clLtGray, clMaroon, clNavy, clOlive, clPurple, clRed, clSilver, clTeal, clWhite, şi clYellow), fie cu sistemul de culori definit de C ontrol Panel (clActiveBorder, clActiveCaption, clAppWorkSpace, clBackground, clBtnFace, clBtnHighlight, clBtnShadow, clBtnText, clCaptionText, clGrayText, clHighlight, clHighlightText, clInactiveBorder, clInactiveCaption, cllnactiveCaptionText, clMenu, clMenuText, clScrollBar, clWindow, clWindowFrame, şi clWindowText).
Totodată, o culoare se poate specifica sub forma unui număr pe 4 octeţi. Ultimii trei octeţi specifică intensităţile pentru sistemul RGB (Red, Green, Blue), astfel, valoarea 00FF0000 reprezintă albastru cu intensitate maximă, 0000FF00 reprezintă verde cu intensitate maximă, 000000FF reprezintă roşu cu intensitate maximă, OOFFFFFF reprezintă culoarea albă, iar 00000000 reprezintă culoarea neagră.
21.2. Funcţii pentru prelucrarea culorilor
F I. ColorToIdent
function ColorToIdent(Color: Longint; var Ident: string): Boolean;
După apel, Ident va conţine numele culorii Color (spre exemplu, clBlack, clWindow). Dacă culorii respective nu-i este ataşată o constantă, atunci funcţia returnează false.
275
F2. IdentToColor
function IdentToColor(const I dent: string; var Color: Longint):Boolean;
După apel, Color va conţine culoarea reţinută în Ident sub forma unui şir de caractere reprezentând numele constantei de culoare (exemplu: clW hite, clWindowText).
F3. ColorToRGB
function ColorToRGB (Color: TColor): Longint;
Returnează culoarea Color în format RGB. Asta înseamnă neglijarea informaţiei stocată în cel mai important octet al tipului TColor.
F4. ColorToString
function ColorToString(Color: TColor): string;
Returnează numele culorii Color sub forma unui şir de caractere. Dacă există o constantă (exemplu: clWhite, clWindowText) care să identifice culoarea Color, atunci este returnată aceasta. în caz contrar, este retur- nată, sub formă de şir, valoarea hexazecimală a lui Color.
F5. StringToColor
function StringToColor(const S: string): TColor;
Returnează culoarea stocată sub formă de şir de caractere. S poate conţine fie numele constantei de culoare, fie o valoare hexazecimală reprezentată sub formă de şir.
21.3. TGraphic
Este o clasă abstractă, de bază, pentru obiecte precum icoane, bitmap şi metafile.
I e r a r h i e ________________________________________________
TObject -> TPersistent -> TGraphic
Definit în_____________________________________________________
graphics.pas
276
Proprietăţi_________________________ __________________________
P I . Height
property Height: Integer;
Specifică înălţimea, în pixeli, a imaginii.Fiecare obiect grafic trebuie să îşi definească propriile lui funcţii de tip G et şi Set pentru accesarea şi setarea valorii acestei proprietăţi.
P2. Width
property Width: Integer;
Specifică lăţimea, în pixeli, a imaginii.Fiecare obiect grafic trebuie să îşi definească propriile lui funcţii de tip G et şi Set pentru accesarea şi setarea valorii acestei proprietăţi.
P3. Empty
property Empty: Boolean;
Indică dacă obiectul are o imagine încărcată în el. Proprietatea este Read Only.Fiecare obiect grafic, descendent din TGraphic trebuie să îşi definească propria lui metodă de tip Get pentru a accesa valoarea acestei proprietăţi.
Metode______________________________________________________
M l. LoadFromFile
procedure LoadFromFile(const FileName: string);
Citeşte fişierul cu numele FileName şi îi încarcă conţinutul într-un obiect grafic.
M2. SaveToFile
procedure SaveToFile(const FileName: string);
Salvează imaginea grafică într-un fişier.
277
Evenimente
E l. OnChange
property OnChange: TNotifyEvent;
Apare de fiecare dată când imaginea grafică se schimbă.
E2. OnProgress
property OnProgress: TProgressEvent;
Apare când imaginea grafică se schimbă încet (încărcare, transformare etc.).Tipul TProgressEvent este definit astfel:
TProgressEvent = procedure (Sender: TObject;Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string) of object;
unde:• Stage este de tip:
TProgressStage = (psStarting, psRunning, psEnding);
şi indică unde ne aflăm: la începutul schimbării, în timpul schimbării, sau la sfârşitul schimbării;
• PercentDone indică aproximativ cam cât la sută din transformare s- a realizat;
• RedrawNow indică dacă imaginea poate fi desenată pe ecran;
• R specifică porţiunea din imagine care s-a schimbat şi trebuie redesenată;
• M sg conţine un mesaj specificând tipul de transformare care este executată.
Descendenţii acestei clase pot genera evenimentul OnProgress prin apelarea metodei Progress (care este de tip protected).Deoarece TGraphic nu are reprezentare în Component Palette , programatorul trebuie să atribuie el însuşi un handler de evenimente la momentul execuţiei aplicaţiei.
278
21.4. TBitmap
Un bitmap este un obiect grafic folosit pentru a crea, manipula şi stoca imagini pe disc. Din punctul de vedere al utilizatorului un bitmap (în traducere harta pixelilor) este o matrice de pixeli care formează o imagine vizuală.
TBitmap este o clasă care stochează o imagine în format bitmap.
Ierarhie______________________________________________________
TObject -> TPersistent -> TGraphic -> TBitmap
Definit în_____________________________________________________
graphics.pas
Proprietăţi___________________________________________________
P I. Canvas
property Canvas: TCanvas;
Canvas furnizează acces la suprafaţa de desenare a bitmap-ului.
P2. Monochrome
property Monochrome: Boolean
Indică dacă bitmap-ul va afişa monocrom imaginea pe care o conţine.
P3. Handle
property Handle: HBitmap;
Este un handle - la obiectul de tip bitmap - folosit în apeluri ale funcţiilor API.
P4. HandleType
property HandleType: TBitmapHandleType;
Indică dacă bitmap-ul este de tip DDB (D evice Dependent Bitmap) sau DIB (D evice Independent Bitmap). Bitmap-urile de tip DDB se desenează mai rapid pe ecran, iar cele de tip DIB sunt stocate în memorie într-un format standard recunoscut de către toate dispozitivele, inclusiv imprimante.
279
P5. ScanLine
property ScanLine]/?ovv: Integer]: Pointer;
O imagine în formatul bitmap este stocată ca o matrice de pixeli. Este astfel posibilă accesarea rapidă - prin intermediul proprietăţii ScanLine- a fiecărei linii a acestei matrici. Proprietatea este folosită doar pentru bitmap-uri de tip DIB.
Exemplu:
Următoarea aplicaţie adaugă 20 de unităţi la culoarea fiecărui pixel al unui bitmap.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
i, j : Integer; b : TBitMap;P : PByteArray;
b e g i ni f OpenPictureDialogl.Execute t h e n b e g i n
b := TBitMap.Create;/ / inc.arc o im agine dintr-un f iş ie rb.LoadFromFile(OpenPictureDialogl.FileName); f o r i : = 0 t o b.height -1 d o //pentru fieca re linie b e g i n
P := b.ScanLine[i];f o r j := 0 t o b.width -1 d o
P [ j ] : = p [ j ] + 2 0 ; / / adaug 20 la valoarea fiecăru i pixele n d ;Canvas . Draw (0 , 0, b) ; / / desenez im aginea in coltul din stanga sus a form ei b . Free; // e liberez m em oria
e n d ;e n d ;
Metode
M l. LoadFromResource
procedure LoadFromResourceID(/n.s*mce: THandle; ResID: Integer);
încarcă un bitmap dintr-o resursă într-un obiect de tip TBitmap. Identificatorul de resursă, pentru bitmap, în cadrul modulului executabil Instance este ResID.
280
M2. LoadFromResourceName
procedure LoadFromResourceName(/n.s'taHce: THandle;const ResName: string);
încarcă un bitmap dintr-o resursă într-un obiect de tip TBitmap. Resursa, de tip bitmap, în cadrul modulului executabil Instance, este ResName.
21.5. Tlcon
Un icon este o imagine bitmap combinată cu o mască pentru a crea zone transparente.
Tlcon încapsulează o icoană (HICON) Windows.
Ierarhie______________________________________________________
TObject -> TPersistent -> TGraphic -> Tlcon
Definit în_____________________________________________________
graphics
Proprietăţi___________________________________________________
PI. Handle
property Handle: HIcon;
Este un handle - la obiectul de tip icon - folosit în apeluri ale funcţiilor- API.
21.6. TMetaFile
O imagine poate fi stocată în două modalităţi: bitmap şi metafile. Bitmap-ul este, în majoritatea cazurilor, o reprezentare ineficientă a unei imagini. Pur şi simplu stochează culoarea fiecărui pixel în parte. Metafde, din contră, este o metodă vectorială de stocare a unei imagini. Asta înseamnă că imaginile nu mai sunt stocate punct cu punct, ci cu ajutorul unor primitive (cerc, elipsă, dreptunghi etc.) care, combinate, dau imaginea dorită. Din această cauză, o imagine metafile este independentă de dispozitivul folosit pentru creare şi afişare.
Intern, un metafile este un vector de structuri care conţin primitivele folosite pentru desenarea imaginii.
TMetaFile încapsulează un metafile îmbunătăţit.
281
Ierarhie
TObject -> TPersistent -> TGraphic -> TmetaFile
Definit în_____________________________________________________
graphics.pas
Proprietăţi___________________________________________________
PI. MMHeight
property MMHeight: Integer;
Indică înălţimea obiectului metafile în unităţi de 0,01 milimetrii. Această proprietate oferă o mai mare acurateţe şi o independenţă faţă de dispozitivul cu care a fost creată imaginea metafile.
P2. MM Width
property MMWidth: Integer;
Indică lăţimea obiectului metafile în unităţi de 0,01 milimetrii. Acestă proprietate oferă o mai mare acurateţe şi o independenţă faţă de dispozitivul cu care a fost creată imaginea metafile.
P3. Handle
property Handle: HMetafile;
Este un handle - la obiectul de tip metafile - folosit în apeluri ale funcţiilor API.
P4. CreatedBy
property CreatedBy: string;
Indică numele aplicaţiei sau al programatorului care a creat acest metafile. Proprietatea este Read-Only.
21.7. TJpeglmage
Delphi pune la dispoziţia programatorilor clasa TJpeglmage pentru stocarea şi manipularea imaginilor JPG şi JPEG. Această clasă nu are reprezentare în ComponentPallete.
282
Folosind proprietăţile şi metodele ei şi componenta Thnage puteţi construi o componentă de afişat imagini JPG.
I e r a r h i e ______________________________________________
TObject -> TPersistent -> TGraphic -> TJpeglmage.
Definit în_____________________________________________________
jpeg.pas
Proprietăţi___________________________________________________
PI. CompressionQuality
property CompressionQuality: TJPEGQualityRange;
Indică raportul dintre calitatea imaginii şi mărimea fişierului în care este stocată imaginea. Tipul TJPEGQualityRange este un domeniu cuprins între 1 şi 100. O calitate mare indică un fişier mare, iar o calitate mică un fişier mic.
P2. GrayScale
property Grayscale: Boolean;
Indică dacă imaginea jpeg va fi afişată alb negru sa color. O afişare alb negru este folosită în cazul în care se doreşte viteză mare de afişare.
P3. Height
property Height: Integer;
Indică lăţimea, în pixeli, a imaginii jpeg.
P4. Width
property Width: Integer;
Indică înălţimea, în pixeli, a imaginii jpeg.
P5. Performance
property Performance: TJPEGPerformance;
Indică raportul dintre calitatea culorii şi viteza de decompresie.Valorile posibile pentru această proprietate sunt date de tipul TJPEGPerformance definit astfel:
type TJPEGPerformance = (jpBestQuality, jpBestSpeed);
P6. PixelFormat
property PixelFormat: TJPEGPixelForm;
Specifică numărul de biţi folosiţi pentru a reprezenta un pixel. Valori posibile pentru PixelFormat sunt date de TJPEGPixelFormat = (jf24Bit, jffiBit).
P7. Scale
property Scale: TJPEGScale;
Indică dimensiunile imaginii când aceasta este afişată. Valori posibile pentru Scale sunt:
V a lo a re S em n ifica ţie
jsF u llS ize Im aginea este afişată ia d im eniunile originale.
js H a lfIm aginea este afişată la jum ăta te din dim ensiunile iniţiale. T im pul de afişare este de asem enea ju m ăta te din cel necesar afişării la d im ens iun ile originale.
jsQ u a rterIm aginea este afişată la un sfert din d im ensiunile iniţiale. T im pul de afişare este de asem enea un sfert din cel necesar afişării la d im ensiunile originale.
jsE ighthIm aginea este afişată la 1/8 din dim ensiunile iniţiale. T im pul de afişare este de asem enea 1/8 din cel necesar afişării la dim ensiunile originale.
Exemplu:
Următoarea aplicaţie încarcă o imagine jpg şi o afişează într-o componentă TImage.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Imagel: TImage Stretch = True
endobject Buttonl: TButton
Caption = 'Buttonl' endobject OpenPictureDialogl: TOpenPictureDialog
Filterlndex = 2 end
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
284
uses jpeg;
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
x : TJpeglmage; b e g i n
i f OpenPictureDialogl.Execute t h e n b e g i n
x ;= TJpeglmage.Create;x.LoadFromFile(OpenPictureDialogl.FileName);Imagel.Picture.Assign(x)
e n d ;e n d ;
21.8. TGraphicsObject
Este o clasă abstractă, de bază pentru obiectele care încapsulează o unealtă grafică W indows precum TPen, TBrush, TFont.
Evenimente
E l. OnChange
property OnChange: TNotifyEvent;
Apare când un obiect grafic se schimbă.Deoarece obiectul TGraphicsObject nu are reprezentare în Component Palette, programatorul trebuie să-i atribuie singur un handler de evenimente la momentul execuţiei programului. Vom exemplifica acest lucru pentru obiectul TPen.
21.9. TBrush
Reprezintă culoarea şi modelul folosite pentru a umple suprafeţe închise. TBrush încapsulează obiectul pensulă (HBRUSH) din Windows.
Ierarhie______________________________________________________
TObject -> TPersistent -> TGraphicsObject -> TBrush
Definit în_____________________________________________________
graphics.pas
28.S
Proprietăţi
P I. Bitmap
property Bitmap: TBitmap;
Specifică o imagine care este folosită drept model. Această imagine trebuie să fie un pătrat cu latura de 8 (opt) pixeli. Dacă este mai mare se va folosi un pătrat de 8x8 din colţul din stânga sus al imaginii atribuite acestei proprietăţi.
P2. Color
property Color: TColor;
Specifică culoarea pensulei.
P3. Style
property Style:TBrushStyle;
Specifică stilul de haşurare. Valori posibile pentru Style sunt: bsSolid, bsClear, bsH orizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross.Dacă proprietatea Bitmap are atribuită o valoare, atunci valoarea proprietăţii Style nu are nici un efect.
P4. Handle
property Handle: HBrush;
Identificatorul W indows pentru acest obiect.
21.10. TPen
Reprezintă culoarea şi stilul folosit pentru a trasa curbe. TPen încapsulează obiectul stilou (HPEN) din Windows.
Ierarhie______________________________________________________
TObject -> TPersistent -> TGraphicsObject -> TPen
Definit în_____________________________________________________
graphics.pas
286
Proprietăţi
PI. Color
property Color: TColor;
Specifică culoarea liniei.
P2. Style
property Style: TPenStyle;
Specifică stilul liniei. Valori posibile pentru Style sunt:
V a lo a re S em n ifica ţie
P sSotid Linie continuă.
PsD ash Linie alcătu ită d intr-o serie de liniuţe mai mici.
P sD ot Linie punctată.
psD ash D ot Linie în care alternează liniuţele şi punctele
psD ash D otD o t Linie a lcătu ită d intr-o serie de com binaţii lin iuţă, punct, punct.
P sC lear N ici o linie nu este desenată.
P3. Mode
property Mode: TPenMode;
Specifică modul în care culorile pensulei şi culorile canvasului interac- ţionează. Valori pentru Mode sunt:
V a lo a re S em n ifica ţie
Pm Black în to tdeauna negru.
PmW hite în to tdeauna alb.
Pm N ot Inversul culorii fundalului.
Pm C opy C uloarea specificată în proprietatea Color.
Pm N olCopy Inversul culorii specificată în p roprietatea Color.
Pm XorSe aplică operatorul X O R între culoarea fundalului şi cca a creionului.
P4. Width
property Width: Integer;
Specifică lăţimea maximă a pensulei.
287
P5. Handle
property Handle: HPen;
Reprezintă handle-ul Windows la acest obiect.
21.11. TFont
Specifică fontul folosit pentru un text.
Ierarhie______________________________________________________
TObject -> TPersistent -> TGraphicsObject -> Tfont
Definit în_______________________________________________ __
graphics.pas
Proprietăţi_____________________________ ______________________
P I. Color
property Color: TColor;
Specifică culoarea textului.
P2. Size
property Size: Integer;
Specifică înălţimea fontului în număr de puncte.
P3. Height
property Height: Integer;
Specifică înălţimea fontului în număr de pixeli. Relaţia dintre Size şi Height este următoarea:
Height = Size * ScreenPixelsPerlnch / 72.
P4. Style
property Style: TFontStyles;
Specifică modul în care sunt desenate caracterele fontului. Style este o variabilă de tip mulţime deci are ca valoare o submulţime din următoarele elemente:
288
Valoare Semnificaţie
FsB old T ex t îngroşat.
F slta lic T ex t înclinat.
Fs Underline T ex t subliniat.
FsStrikeout T ex t tă ia t în două cu o linie orizontală.
P5. Pitch
property Pitch: TFontPitch;
Indică dacă toate caracterele fontului au aceeaşi lăţime. Valorile permise pentru Pitch sunt:
Valoare Semnificaţie
fp F ix ed T oa te caracterele au aceeaşi lăţim e. A cest lucru este folosit la coduri sursă.
fpV ariab le C aracterele au lăţim e variabilă. A cest lucru este util la editare de texte.
fp D efault Lăţim ea caracterelor depinde de font.
P6. Name
property Name: TFontName;
Este numele fontului.
P7. Handle
property Handle: HFont;
Este identificatorul obiectului de tip font.
Observaţie:
Setarea proprietăţilor unui obiect de tip TFont poate fi făcută într-o formă vizuală cu ajutorul componentei TFontDialog.
Exemplu:
Următoarea aplicaţie tipăreşte un text pe fereastra aplicaţiei. Valorile proprietăţilor fontului sunt selectate cu ajutorul componentei TFontDialog.
procedure T F o r m l . B i t B t n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
if F o n t D i a l o g l . E x e c u te then begin
I m a g e l . C a n v a s . F o n t := F o n t D i a l o g l . F o n t ;
289
I m a g e l . C a n v a s . T e x t O u t (10 , 10 , 'A c e s t a e s t e u n t e x t ' ) ; end;
21.12. TCanvas
Furnizează spaţiul de desenare pentru obiecte care îşi pot desena o imagine pe suprafaţă.
Ierarhie______________________________________________________
TObject -> TPersistent -> TCanvas
Definit în_____________________________________________________
graphics.pas
Proprietăţi___________________________________________________
PI. Brush
property Brush: TBrush;
Specifică culoarea şi modelul de haşurare pentru suprafeţe închise sau fundal uri.
P2. Font
property Font: TFont;
Specifică fontul folosit când se va scrie un text pe o imagine.
P3. Pen
property Pen: TPen;
Specifică tipul de pen folosit.
P4. PenPos
property PenPos: TPoint;
Specifică poziţia curentă a creionului de desenare.
end ;
290
P5. ClipRect
property ClipRect: TRect;
Specifică marginile suprafeţei de desenare. Operaţiile de desenare executate în afara acestui dreptunghi sunt invalide.
P6. CopyM ode
property CopyMode: TCopyMode;
Specifică modul în care imaginea se va comporta când va fi pusă pe suprafaţa de desenare. Valori posbile pentru CopyM ode sunt:
V a lo a re S em n ifica ţie
cmBlachiess U m ple dreptunghiul destinaţie cu negru.
cmDstlnvert Inversează im aginea de pe ecran şi ignoră im aginea sursă.
anM ergePaintC om bină im aginea de pe Canvas şi cea din b itm ap-ul sursă fo losind operatoru l OR.
cmSrcAndC om bină im aginea de pe Canvas şi cea din b itm ap-ul sursă fo losind operatoru l AND.
iinSrcCopy C op iază im aginea sursă pe Canvas.
cmSrcF.mseInversează im aginea de pe Canvas şi rezultatul îl com bină cu cea din bitm ap-ul sursă fo losind operatorul B oolean OR.
cinSnliivcrt C om bină im aginea de pe Canvas cu cea din b itm ap-ul sursă folosind operatoru l B oolean XOR.
n n S rc l’ainl C om bină im aginea de pe Canvas şi cu cea din b itm ap-ul sursă folosind operatorul B oolean OR.
cmWhitcnt'ss U m ple dreptunghiul destinaţie eu alb.
O bservaţie:
Valoarea implicită este cmSrcCopy.
P7. Pixels
property Pixels[X, Y: Integer]: TColor;
Specifică culoarea pixelului de coordonate (X,Y) din interiorul spaţiului de desenare.
P8. Handle
property Handle: HDC;
Reprezintă un handle la un device context.
291
P9. TextFlags
property TextFlags: Longint;
Indică felul în care textul este desenat pe Canvas. Valori posibile pentru TextFlags sunt (ele pot fi combinate cuajutorul operatorului or):
V a lo a re S em n ifica ţie
E T 0_C L IP P E DA re efect doar când textul este tipărit cu m etoda TextRect, şi va trunch ia textul la d im ensiunea dreptunghiu lu i în care se doreşte desenarea.
E T O jO P A Q U Eîn spate le tex tu lu i tip ă rit se va desena un fundal care va astupa p orţiunea din im agine peste care s-a suprapus dreptunghiul tex tului.
Metode
Ml. Arc
procedure Arc(X7, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);
Desenează un arc, de-a lungul unei elipse. Elipsa este mărginită de dreptunghiul care are coordonatele punctelor din colţurile stânga sus şi dreapta jos egale cu (XT, Y l) repspectiv (X2, Y2). Arcul este delimitat de intersecţiile dreptelor care trec prin centru elipsei şi prin punctele (X3, K3)-prima dreaptă, respectiv (X4, Y4)~ a doua dreaptă. Arcul este desenat de-a lungul perimetrului elipsei în sensul acelor de ceasornic, pornind de la primul punct (cel obţinut din intersecţia elipsei cu drepta care trece prin (X3, Y3) şi prin centrul elipsei) şi terminând cu cel de al doilea punct (cel obţinut din intersecţia elipsei cu drepta care trece prin (X4, Y4) şi prin centrul elipsei).
Exemplu:
Următoarea aplicaţie desenează un arc de cerc din care lipseşte cadranul I.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
C a n v a s . A r c (0 , 0, 100 , 1 0 0 , 50, 0, 100 , 5 0 ) ; end;
M2. Chord
procedure Chord(A7, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);
Desenează o figură închisă, delimitată de o elipsă (mărginită de
292
dreptunghiul (XI,Y1)-{X2,Y2)) şi de dreapta determinată de punctele (X 3, Y3), (X4, Y4). Arcul de elipsă care face parte din figură este luat de-a lungul perimetrului elipsei, în sensul acelor de ceasornic, plecând de la (X3, Y3) şi până la (X4, Y4). Dacă (X3, Y3), (X4, Y4) nu se află pe perimetrul elipsei, atunci se vor considera cele mai apropiate puncte de pe elipsă şi care se află şi pe dreapta curentă.
Exemplu:
Următoarea aplicaţie desenează o suprafaţă închisă sub forma unei jumătăţi de cerc. Suprafaţa va fi haşurată cu linii verticale de culoare verde.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
C a n v a s . B r u s h . S t y l e := b s V e r t i c a l ;C a n v a s . B r u s h . C o l o r : = c l G r e e n ;C a n v a s . C h o r d (0 , 0, 100 , 100 , 0, 50 , 100 , 5 0 ) ;
end;
M3. Ellipse
procedure Ellipse(X7, Yl, X2, Y2\ Integer);
procedure Ellipse(const Rect: TRect);
Desenează o elipsă care este încadrată de dreptunghiul de coordonate (XI, Y l) şi (X2, Y2).
Exemplul 1:
Următoarea aplicaţie desenează un cerc care are centrul în mijlocul ferestrei curente.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
R a za : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ,-
beginR a z a := 1 0 0 ; / / raza cerculuiC e n t r u X := C l i e n t W i d t h div 2 ; / / coordonatele centrului C e n t ru Y := C l i e n t H e i g h t div 2;C a n v a s . E l l i p s e (C e n tru X - R a z a , C e n tru Y - R a z a ,
C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;end;
293
Exemplul 2:
Următoarea aplicaţie desenează două cercuri concentrice:procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
R a z a : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ;
beginR a za := 1 0 0 ; / / raza cercului exteriorC e n t ru X := C l i e n t W i d t h div 2 ; / / coordonatele centrului C e n t r u Y := C l i e n t H e i g h t div 2;C a n v a s . E l l i p s e (C e n tru X - R a z a , C e n tru Y - R a za ,
C e n t ru X + R a za , C e n t ru Y + R a z a ) ;R a za := 5 0 ; / / raza cercului interiorC a n v a s . E l l i p s e (C e n tru X - R a za , C e n t ru Y - R a za ,
C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;end;
Această aplicaţie are însă un neajuns. Dacă desenăm prima dată cercul interior şi apoi cercul exterior atunci acesta va fi astupat. Pentru a remedia acest lucru vom seta proprietatea Style a obiectului TBrush la valoarea bsClear. Noul cod sursă este:
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
R a z a : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ;
beginR a za := 5 0 ; / / raza cercului exteriorC e n t ru X := C l i e n t W i d t h div 2; / / coordonatele centrului C e n t r u Y := C l i e n t H e i g h t div 2;C a n v a s . E l l i p s e (C e n tru X - R a z a , C e n tru Y - R a z a ,
C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;R a z a := 1 0 0 ; / / raza cercului interior C a n v a s . B r u s h . S t y l e := b s C l e a r ;C a n v a s . E l l i p s e (C e n t ru X - R a za , C e n tru Y - R a za ,
C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;end ;
Exemplul 3:
Următoarea aplicaţie desenează elipse pe formă. La apăsarea mouse-ului se reţine colţul din stânga sus al dreptunghiului care are laturile tangente la elipsă. Colţul din dreapta jos al acestui dreptunghi va fi punctul în care se eliberează mouse-ul.
varf i n a l : b o o l e a n = true;X S t a r t , Y S t a r t , Xtemp, Ytemp : i n t e g e r ;
294
procedure T F o r m l . F o r m C r e a t e (S e n d e r : T O b j e c t ) ; begin
C a n v a s . B r u s h . S t y l e := b s C l e a r ; end;
procedure T F o r m l . FormMouseDown(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s . Pen .M ode := pmNot;X S t a r t := X; // coordonatele coltului din stanga sus Y S t a r t := Y;Xtemp := X; // posibilele coordonate ale coltului din dreapta jos Ytemp -. = Y; f i n a l := false;
end;procedure T F o r m l . F o rm M o u seM o v e(S en d e r : T O b j e c t ;
S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;begin if not f i n a l then begin
C a n v a s . E l l i p s e ( X S t a r t , Y S t a r t , Xtemp, Y te m p ) ; / / şterg vechiul// segment
C a n v a s . E l l i p s e ( X S t a r t , Y S t a r t , X, Y) ; II desenez noul segment Xtemp := X;Ytemp := Y;
end;end;
procedure T F o r m l . FormMouseUp(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: i n t e g e r ) ;
beginC a n v a s . Pen .M ode := pm B lack ;C a n v a s . E l l i p s e ( X S t a r t , Y S t a r t , X, Y) ; // trasez segmentul definitiv f i n a l := true;
end;
M4. Pie
procedure Pie(X7, Yl, X2, Y2, X3, Y3, X4, Y4: Longint);
Desenează un sector de elipsă. Elipsa este încadrată în dreptunghiul de coordonate (X I,Y l), (X2,Y2). Secţiunea desenată este determinată de două drepte care trec prin centrul elipsei şi prin punctele de coordonatc (X3, Y3), (X4, Y4).
?'1S
Exemplu:
Următoarea aplicaţie desenează un sector de cerc reprezentând primul cadran.
procedure T F o r m l . B u t t o n 3 C l i c k ( S e n d e r : T O b j e c t ) ; begin
C a n v a s . P i e (0 , 0, 99 , 99 , 99 , 4 9 , 49 , 0 ) ; end;
M5. FillRect
procedure FillRect(const Rect: TRect);
Haşurează dreptunghiul Rect cu modelul şi culoarea curente (specificate de obiectul TBrush).
Exemplu:
Următoarea aplicaţie desenează dreptunghiuri de dimensiuni şi culori aleatoare. Generarea dreptunghiurilor se face până la apăsarea unei taste.
varf i n a l : b o o l e a n = false;
procedure T F o r m l . B u t t o n 3 C l i c k ( S e n d e r : T O b j e c t ) ; beginwhile not f i n a l do begin
C a n v a s . B r u s h . C o l o r : = r a n d o m ( $ 1 0 0 0 0 0 0 ) ;C a n v a s . F i l l R e c t ( R e c t ( r a n d o m ( 4 0 0 ) , r a n d o m ( 4 0 0 ) ,
r a n d o m ( 4 0 0 ) , r a n d o m ( 4 0 0 ) ) ) ;A p p l i c a t i o n . P r o c e s s M e s s a g e s ;
end; end;
procedure T F o r m l . F o r m l K e y P r e s s ( S e n d e r : T O b j e c t ; var Key; C h a r ) ; begin
f i n a l := true; end;
M6. FloodFill
procedure FloodFillfX, Y: Integer; Color: TColor; FillStyle: TFillStyle);
Haşurează o suprafaţă, care nu este neapărat dreptunghiulară. Suprafaţa haşurată conţine punctul (X,Y) şi este mărginită de alte suprafeţe care au toate culoarea Color sau toate nu au culoare Color. Valori posibile pentru FillStyle sunt:
296
V a lo a re S em n ifica ţie
fsSurfaceH aşurează suprafa ţa care are culoare C olor. Procesul este oprit când toate punctele care urm ează să fie colorate nu au cu loarea Color.
fsB o rd erH aşurează suprafaţa care nu are culoarea indicată de param etru l Color. Procesul este oprit în m om entul în care toate punctele care urm ează să fie co lorate au culoarea Color.
Exemplul 1:
Următoarea aplicaţie generează o grilă cu 100 de căsuţe şi colorează aleator 50 de căsuţe.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
i : b y t e ;X, Y : i n t e g e r ;
beginC a n v a s . P e n . C o l o r := c l G r e e n ;/ / generam grilaC a n v a s . R e c t a n g l e (0 , 0, 200 , 2 0 0 ) ;for i := 1 to 9 dobegin
C a n v as . MoveTo (1 , i * 2 0 ) ; // trasam liniile orizontale C a n v a s . L i n e T o (200 , i * 2 0 ) ;C a n v as .MoveTo ( i * 20 , 1 ) ; // trasam liniile verticale C a n v a s . L i n e T o ( i * 20 , 2 0 0 ) ;
end;// sclcctam aleator 50 de puncte// si haşuram căsuţele care le conţine cu o culoare aleatoare for i := 1 to 50 do begin repeat
X := r a n d o m ( 2 0 0 ) ; until X mod 10 <> 0; //nu doresc puncte pe grilaj repeat
Y := r a n d o m ( 2 0 0 ) ; until Y mod 10 <> 0;C a n v a s . B r u s h . C o l o r := ra n d o m ($ 1 0 0 0 0 0 0 ) ; //culoarea dehasurare C a n v a s . F l o o d F i l l (X, Y, c l G r e e n , f s B o r d e r ) ;
end; end;
Exemplul 2:
Următoarea aplicaţie generează (la apăsarea unui buton) o grilă cu 100 căsuţe. La executarea unui click cu mouse-ul în interiorul unui careu, acesta se va colora cu una din cele 10 culori disponibile.
const a : array [1..10] oft c o l o r = ( c l r e d , c l l i m e , c l y e l l o w , c l b l u e , c l n a v y , c l o l i v o ,
c l g r e e n , c l p u r p l e , c l f u c h s i a , c i t e a i ) ;
2 ()7
p r o c e d u r e T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; v a r
x , y , i ; i n t e g e r ;b e g i n
x : = 0 ;y : = 0 ;f o r i := 1 t o 10 do
b e g i nI m a g e l . C a n v a s .M o v e T o ( x ,y ) ;I ih a g e l . C a n v a s . L in e T o (x , 450) ; x := x + 50 ;
e n d ; x := 0; y := 0;f o r i : = l t o 10 do
b e g i nI m a g e l . C a n v a s .M o v e T o ( x ,y ) ;I m a g e l . C a n v a s . L i n e T o ( 4 5 0 , y ) ; y := y + 50 ;
e n d ;
e n d ;
p r o c e d u r e T F o r m l . Im age lM ouseD ow n(S e n d e r : TObj e c t ;B u t t o n ; T M o u s e B u t t o n ; S h i f t : T S h i f t S t a t e ;X, Y: I n t e g e r ) ;
b e g i nI m a g e l . C a n v a s . B r u s h . C o l o r := a [ l + r a n d o m ( l O ) ] ;I m a g e l . C a n v a s . F l o o d F i l l ( x , y , c l b l a c k , f s b o r d e r ) ;
e n d ;
M7. FrameRect
procedure FrameRect(const Reef. TRect);
Desenează un dreptunghi. Marginea are lăţime 1 şi este desenată cu setările proprietăţii Brush. Interiorul dreptunghiului nu este afectat.
M8. MoveTo
procedure MoveTo(X, Y: Integer);
Mută cursorul grafic în poziţia (X,Y).
M9. LineTo
procedure LineTo(X, Y: Integer);
Desenează o linie din poziţia PenPos până în poziţia (X,y). PenPos devine (X,Y).
298
Exemplu 1:
Următoarea aplicaţie trasează, pe formă, un segment între punctele de coordonate (10,20) şi (100, 250).procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ,- begin
C a n v a s . M oveTo(10 , 2 0 ) ;C a n v a s . L i n e T o (100 , 2 5 0 ) ;
end;
Exemplul 2:
Următoarea aplicaţie trasează segmente cu ajutorul mouse-ului. Pentru aceasta trebuie să implementăm evenimentele OnMouseDown şi OnMouseUp.
procedure T F o r m l . FormMouseDown(S e n d e r ; T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s .MoveTo(X, Y) ;
end;procedure T F o r m l . F o rm M o u seU p (S e n d e r : T O b j e c t ;
B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s . L in e T o (X , Y) ;
end;
Exemplul 3:
Dorim ca segmentul trasat să aibă o anumită grosime. Pentru aceasta folosim o cutie de editare (E ditl) în care vom specifica grosimea liniei trasate.
Handlerele de evenimente pentru setarea grosimii liniei sunt:procedure T F o r m l . F o r m C r e a t e (S e n d e r : T O b j e c t ) ; begin
C a n v a s . P e n . W i d th := S t r T o I n t ( E d i t l . T e x t ) ; end;procedure T F o r m l . E d i t l C h a n g e ( S e n d e r .- T O b j e c t ) ; begin try
C a n v a s . P e n . W i d t h := S t r T o I n t ( E d i t l . T e x t ) ; excepton E C o n v e r t E r r o r do C a n v a s . P e n . W id th := 1;
299
end;end;
Exemplul 4:
Următoarea aplicaţie desenează segmente de dreaptă cu ajutorul mouse- ului. Segmentele trasate pot avea diferite culori. Selectarea culorii de desenare se face cu ajutorul unei componente de tip TColorDialog.
Handlerele pentru evenimentele OnMouseDown şi OnMouseUp sunt cele din aplicaţia anterioară.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
if C o l o r D i a l o g l . E x e c u t ethen C a n v a s . P e n . C o l o r : = C o l o r D i a l o g l . C o l o r ;
end;
Exemplul 5:
Dorim să trasăm segmentele la fel ca în aplicaţia PaintBrush, şi anume dorim să fixăm unul din capetele segmentului iar celălalt capăt să îl plimbăm până în momentul în care ne vom decide asupra locului în care îl fixăm.
varf i n a l : b o o l e a n = true;X S t a r t , Y S t a r t , Xtemp, Ytemp : i n t e g e r ;
procedure T F o r m l . FormMouseDown(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s . M oveTo(X, Y) ;C a n v a s . Pen .M ode := pmNot;X S t a r t : = X; // coordonatele unuia dintre capetele segmentului Y S t a r t := Y; f i n a l := false;Xtemp : = X; // posibilele coordonate ale celuilalt capat al segementului Ytemp := Y;
end;
procedure T F o r m l . FormMouseUp( S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s .M o v e T o ( X S ta r t , Y S t a r t ) ;C a n v a s . P e n . Mode := p m B lack ;C a n v a s . L in e T o (X, Y) ,- // trasez segmentul definitiv f i n a l := true;
300
end ;
procedure T F o r m l . FornMouseMove (S e n d e r : T O b j e c t ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
begin if not f i n a l then begin
C a n v a s .M o v e T o ( X S t a r t , Y S t a r t ) ;C a n v a s . L in e T o (Xtemp, Ytemp) ; // şterg vechiul segment C a n v a s .M o v e T o ( X S t a r t , Y S t a r t ) ;C a n v a s . L in e T o (X, Y) ; // desenez noul segment Xtemp := X;Ytemp : = Y;
end;end;
Exem plul 6:
Următoarea aplicaţie trasează o linie curbă pe o formă. Linia va urma traiectoria cursorului de mouse.
varf i n a l : b o o l e a n = true;
procedure T F o r m l . FormMouseDown(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginf i n a l := false;C a n v a s . MoveTo (X, Y)
end;procedure T F o r m l . F o rm M o u seM o v e(S en d e r : T O b j e c t ;
S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;beginif not f i n a lthen C a n v a s . L in e T o (X , Y ) ;
end;procedure T F o r m l . FormMouseUp(S e n d e r : T O b j e c t ;
B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginf i n a l := true;
end;
Exemplul 7:
Următoarea aplicaţie trasează linii de diferite lungimi şi le ordonează după lungime folosind metoda bublesort. Culoarea fiecărei linii va fi
301
generată aleator.Vom folosi un RadioGroup cu două butoane care ne vor permite să alegem modul de sortare al liniilor (crescător sau descrescător).
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object I m a g e l : TImage W id th = 321 H e i g h t = 313
endobject B i t B t n l : T B i t B t n
C a p t i o n = ' t r a s e a z a ' endobject R a d io G r o u p l : T R ad io G ro u p
C a p t i o n = ' o r d o n a r e 'I t e m l n d e x = 0
I t e m s . S t r i n g s = (' c r e s c ă t o r '' d e s c r e s c ă t o r ' )
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:var a : array[ 1 . . 4 0 0 ] of i n t e g e r ;
procedure T F o r m l . d e s e n e a z ă ; var
x , y : i n t e g e r ; begin
I m a g e l . C a n v a s . B r u s h . C o l o r : = c l w h i t e ;I m a g e l . C a n v a s . R e c t a n g l e ( 0 , 0 , I m a g e l . W i d t h , I m a g e l . H e i g h t ) ; x : = l ;y : = l ;repeat
I m a g e l - C a n v a s . P e n . C o l o r : = ra n d o m (6 5 5 3 5 * 2 5 6 ) ;I m a g e l . C a n v a s .M o v e T o ( x ,y ) ;I m a g e l . C a n v a s . L i n e T o ( a [ (y + 1) div 2] , y ) ; y := y + 2;I m a g e l . C a n v a s .M o v e T o ( x ,y )
until y >= I m a g e l . H e i g h t ;I m a g e l . R e f r e s h ;
end;procedure T F o r m l . o r d o n a r e _ c r e s c a t o r ; var g a s i t : b o o l e a n ;
i , t : i n t e g e r ;beginfor i := 1 to ( I m a g e l . H e i g h t ) do
a [ i ] := r a n d o m ( I m a g e l .W id th ) d e s e n e a z ă ; repeat
g a s i t :=false;for i := 1 to I m a g e l . H e i g h t div 2 do if a [ i ] > a [ i + l ] then
302
beging ă s i t := true; t : = a [ i J ; a [ i ] := a [ i + 1 ) ;a t i + 1 ] : = t ;
end; d e s e n e a z a until not g a s i t ;
end;procedure T F o r m l . o r d o n a r e _ d e s c r e s c a t o r ; var g a s i t : b o o l e a n ;
i , t : i n t e g e r ;beginfor i := 1 to ( I m a g e l . H e i g h t ) do
a [ i ] : = r a n d o m d m a g e l .W id th ) ; d e s e n e a z a ; repeat
g a s i t := false;for i := 1 to I m a g e l . H e i g h t div 2 do if a[i] < a[i +1] then begin
g a s i t := true; t : = a [ i ] ; a [ i ] := a [ i + 1 ] ; a [ i +1 ] : = t ;
end; d e s e n e a z a until not g a s i t ;
end;procedure T F o r m l . B i t B t n l C l i c k ( S e n d e r : T O b j e c t ) ; begincase R a d i o G r o u p l . I t e m l n d e x of
0: o r d o n a r e _ c r e s c a t o r ;1 : o r d o n a r e _ d e s c r e s c a t o r ;
end; end;
M10. Polygon
procedure Polygon(Po/>i?s: array of TPoint);
Desenează o linie poligonală închisă care are vârfurile descrise în vectorul Points. Ultimul punct este automat unit cu primul. Interiorul poligonului va fi haşurat cu modelul şi culoarea curente descrise în proprietatea Brush.
Exemplul \ :
Următoare aplicaţie desenează un poligon oarecare. Vârfurile poligonului sunt alese aleator.
303
procedure T Fo rm l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
a : array[0..10] of T P o i n t ; i : b y t e ;
beginfor i := 0 to 10 do
a [ i ] := P o i n t ( r a n d o m ( 4 0 0 ) , r a n d o m ( 4 0 0 ) ) ;C a n v a s . P o l y g o n ( a ) ;
end;
Exemplul 2:
Următoarea aplicaţie desenează un poligon regulat cu un număr specificat de vârfuri.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
n r _ s i r : string;a : array of T P o i n t ;r a z a : i n t e g e r ; / / raza cercului circumscrisu n g h i , p a s : r e a l ;n : i n t e g e r ; / / numărul de laturii : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ;
//coordonatele centrului cercului circumscris begin
if I n p u t Q u e r y ( ' C i t i r e p o l i g o n ' ,' D a t i n u m ă r u l d e l a t u r i ' , n r _ s i r )
then begin//ş te rg ecranulC a n v a s . R e c t a n g l e (0 , 0 , C l i e n t W i d t h , C l i e n t H e i g h t ) ; n := S t r T o I n t ( n r _ s i r ) ;S e t L e n g t h ( a , n ) ; r a z a := 100;C e n t ru X := C l i e n t W i d t h div 2;C e n t r u Y := C l i e n t H e i g h t div 2; u n g h i : = 0; //unghiurile in radiani p a s := 2 * p i / n ; for i := 0 to n - 1 do begin
a [ i ] . x := C e n t ru X + t r u n c ( r a z a * c o s ( u n g h i ) ) ; a [ i ] . y := C e n t ru Y - t r u n c ( r a z a * s i n ( u n g h i ) ) ; u n g h i := u n g h i + p a s ;
end;C a n v a s . P o l y g o n (a ) ;
end;end;
M ll. PolyLine
procedure Polyline(Points: array of TPoint);
304
Desenează o linie poligonală deschisă.
M12. Rectangle
procedure Rectangle(A7, Y1,X2, Y2: Integer);
p rocedure Rectangle(const R e c t TRect);
Desenează un dreptunghi. Marginea va fi desenată conform cu setările proprietăţii Pen, iar interiorul conform setărilor proprietăţii Brush.
Exemplu:
Următoarea aplicaţie desenează dreptunghiuri pe o formă. La apăsarea mouse-ului se reţine colţul din stânga sus al dreptunghiului. Colţul din dreapta jos al dreptunghiului va fi punctul în care se eliberează butonul mouse-ului.
varf i n a l : b o o l e a n = true;X S t a r t , Y S t a r t , Xtemp, Ytemp : i n t e g e r ;
procedure T F o r m l . Form M o u seD o w n (Sen d e r : T O b j e c t ;B u t t o n ; T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s . P e n . Mode := pmNot;X S t a r t := X; // coordonatele coltului din stanga sus Y S t a r t := Y;Xtemp : = X; // posibilele coordonate ale coltului din dreapta jos Ytemp := Y; f i n a l := f a l s e ;
e n d ;
procedure T F o r m l . FormMouseMove(S e n d e r : TObj e c t ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
begin if not f i n a l then begin
C a n v as . R e c t a n g l e ( X S t a r t , Y S t a r t , Xtemp, Y te m p ) ; //şterg vechiul//segment
C a n v a s . R e c t a n g l e ( X S t a r t , Y S t a r t , X, Y) ; //desenez noul segment Xtemp := X;Ytemp := Y;
end;end;procedure T F o r m l . FormMouseUp(S e n d e r : T O b j e c t ;
B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;
beginC a n v a s . Pen .M ode := p m B lack ;
305
C a n v a s . R e c t a n g l e ( X S t a r t , Y S t a r t , X, Y) ; //trasez segmentul definitiv f i n a l := t r u e ;
e n d ;
p r o c e d u r e T F o r m l . F o r m C r e a t e 1 S e n d e r : T O b j e c t ) , - b e g i n
C a n v a s . B r u s h . S t y l e := b s C l e a r ; end,-
M13. TextOut
procedure TextOut(T, Y: Integer; const Text: string);
Scrie un text şi apoi poziţionează cursorul grafic Ia sfârşitul Iui.
Exem plu 1:
Următoarea aplicaţie afişează vertical un text care este dat într-o cutie de editare. Vom folosi o cutie de editare E ditl şi un buton la apăsarea căruia textul va fi scris vertical.
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
x , y : i n t e g e r ; i : i n t e g e r ;
beginX : = 2 0 ; // coordonata orizontala a punctului din care se incepe tiparirea y : = 2 0 ; //coordonata verticala a punctului din care incepe tiparirea i : = 1 ;//coloram alb dreptunghiul in care se desenează C a n v a s . B r u s h . C o l o r := c l w h i t e ;C a n v a s . R e c t a n g l e (0 , 0, C l i e n t W i d t h , C l i e n t H e i g h t ) ,- repeat
//testam daca mai incap caractere pe aceeaşi coloana sau trebuie sa trecem la alta if y > C l i e n t H e i g h t - C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) then y := 20;C a n v a s . T e x t O u t ( x , y , E d i t l - T e x t [ i ] ) ; y := y + C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) ; i : = i + 1 ;
until i > l e n g t h ( E d i t l . T e x t ) ; end;
Exem plu 2:
Acest exemplu este o generalizare a exemplului precedent: dându-se un text într-o cutie de editare, acesta va fi tipărit oblic, literele nefiind neapărat unele sub altele, ci aleator pe coloana respectivă. Culoarea fiecărei litere va fi generată aleator.
306
procedure T F o r m l . B u t t o n l C l i c k (S e n d e r : T O b j e c t ) ; var
x , y : i n t e g e r ; i : i n t e g e r ;
beginx : = 20 ; II coordonata orizontala a punctului din care se incepe tiparirea y := 2 0 ; //coordonata verticala a punctului din care incepe tiparirea i ;= 1 ;//coloram alb dreptunghiul in care se deseneaza C a n v a s . B r u s h . C o l o r := c l w h i t e ;C a n v a s . R e c t a n g l e (0 , 0, C l i e n t W i d t h , C l i e n t H e i g h t ) ,- repeat
//testam daca mai incap caractere pe aceeaşi coloana sau trebuie sa trecem la alia if y > C l i e n t H e i g h t - C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) then y := 20;C a n v a s . F on t . Col o r : = Random (ŞFFFFFF) ; II fiecare caracter va avea o alta
/ / culoare aleasa aleatorC a n v a s . T e x t O u t ( x , y , E d i t l . T e x t [ i ] ) ; y := y + C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) ;U x va f i aleator si un caracter nu va f i tipărit neaparat sub precedentul x : = x + r a n d o m ( 2 0 ) ; i : = i + 1;
u n t i l i > l e n g t h ( E d i t l . T e x t ) ; e n d ;
M14. TextWidth
function TextWidth(const Text: string): Integer;
Returnează lungimea, în pixeli, a unui şir de caractere. Această metodă este utilă pentru a testa dacă un şir de caractere încape într-o imagine.
M15. TextHeight
function TextHeight(const Text-, string): Integer;
Returnează înălţimea, în pixeli, a unui şir de caractere. Această metodă este utilă pentru a testa dacă un şir de caractere încape într-o imagine.
Exem plu:
Următoarea aplicaţie desenează un text în mijlocul ferestrei curente. Aplicaţia conţine două butoane, o cutie de editare şi o componentă TFontDialog. La apăsarea butonului Buttonl se schimbă fontul cu care va fi desenat textul în fereastră. La apăsarea butonului Buttonl se desenează textul (din cutia de editare E d itl) centrat în fereastră.
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject);
307
C e n tru X , C e n t r u Y , i n a l t i m e , l a t i m e : i n t e g e r ; begin
C e n tru X := C l i e n t W i d t h div 2; / / centrul ferestrei C e n t ru Y := C l i e n t H e i g h t div 2;i n a l t i m e := C a n v as . T e x t H e i g h t ( E d i t l . T e x t ) ; / / inaltimea textului l a t i m e -. = C a n v a s . T e x t W i d t h ( E d i t l . T e x t ) ; / / latimea textului C a n v a s . T e x tO u t ( C e n t r u X - l a t i m e div 2,
C e n t ru Y - i n a l t i m e div 2 , E d i t l . T e x t ) ;end;procedure T F o r m l . B u t t o n 2 C l i c k ( S e n d e r : T O b j e c t ) ; beginif F o n t D i a l o g l . E x e c u t e then begin
C a n v a s . F o n t . A s s i g n ( F o n t D i a l o g l . F o n t ) ; // schimb fontul cu care// se deseneaza
* 1. F o n t . A s s i g n ( F o n t D i a l o g l . F o n t ) // si fontul textului din Editlend -
end;
M16. Draw
procedure Draw(A", Y: Integer; Graphic: TGraphic);
Copiază un desen, specificat de parametrul Graphic, pe canvas, în poziţia de coordonate (X,Y). Imaginea copiată poate să fie bitmap, icon sau metafile, şi va fi desenată într-un dreptunghi cu colţul din stânga sus de coordonate (X,Y), conform setărilor lui CopyMode.
Exem plu:
Următoarea aplicaţie încarcă o imagine în obiectul h (de tip TBitmap) şio afişează centrat pe fereastra curentă.
procedure T F o r m l . B u t t o n 2 C l i c k ( S e n d e r : T O b j e c t ) ; var
b : TBi t m a p ; begin
b := T B i t m a p . C r e a t e ; b . L o a d F ro m F i1e ( ' i m a g i n e . bm p ' ) ;C a n v a s .D r a w ( C l i e n t W i d t h div 2 - b . W id th div 2,
C l i e n t H e i g h t div 2 - b . H e i g h t div 2 , b ) ;b . F r e e ;
end;
M17. StretchDraw
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic );
Copiază un desen, specificat de parametrul Graphic, pe canvas, în dreptunghiul Rect. Imaginea copiată poate să fie bitmap, icon sau
308
metafile, şi va fi redimensionată astfel încât să umple în întregime dreptunghiul Rect.
M18. DrawFocusRect
procedure DrawFocusRect(const Rect: TRect);
Desenează un dreptunghi care dă senzaţia că are focus. Acest lucru se realizează folosind operatorul XOR.
M19. CopyRect
procedure Copy Rec t(D<?.vr: TRect; Canvas: TCanvas; Source: TRect);
Copiază o parte a canvas-ului (parametrul Canvas) specificată prin dreptunghiul Source pe suprafaţa de desenare curentă în dreptunghiul Deşt.
Exem plu:
Următoarea aplicaţie salvează o parte din imaginea desenată pe formă într-un fişier pe disc.
procedure T F o r m l .Fo rm K ey D o w n (S e n d e r : T O b j e c t rvar Key: Word; S h i f t : T S h i f t S t a t e ) ;
beginif k e y = o r d ( ’ S ’ ) / / daca s-a apa.sat tasta S (Save) then begin
b := T B i t M a p .C r e a t e ; b . H e i g h t := 100 ; b . W id th := 200 ;// copiez un dreptunghi 200x100b . C a n v a s . C o p y R e c t ( R e c t (0 , 0, 200 , 1 0 0 ) ,
F o r m l .C a n v a s , R e c t ( 1 0 , 10 , 2 1 0 , 1 1 0 ) ) ; if S a v e P i c t u r e D i a l o g l . E x e c u te // salvez imaginea bmpthen b . S a v e T o F i l e ( S a v e P i c t u r e D i a l o g l . F i l e N a m e ) ; b . F r e e ;
end;end;
Evenimente
E l. OnChange
property OnChange: TNotifyEvent;
Apare după ce o imagine s-a schimbat. Acest eveniment este generat după ce a fost apelată una din metodele care schimbă conţinutul Canvas- ului.
309
E2. OnChanging
Apare înainte de a se schimba o imagine. Acest eveniment este generat înainte de a fi apelată una din metodele care schimbă conţinutul Canvas- ului.
Deoarece componenta TCanvas nu are propria ei reprezentare în C om ponent Pallete, programatorul trebuie să-i asigneze un handler de evenimente.
Următorul exemplu arată cum se poate atribui la momentul execuţiei (la apăsarea unui buton) câte un handler de evenimente la fiecare dintre evenimentele OnChange şi OnChanging.
Prototipurile acestor evenimente trebuie declarate în secţiunea public:
procedure D u p a (S e n d e r : T O b j e c t ) ; procedure î n a i n t e (S e n d e r : T O b j e c t ) ;
Implementările sunt următoarele:
varHDupa, H I n a i n t e : T N o t i f y E v e n t ;
procedure T F o r m l . D u p a (S e n d e r : T O b j e c t ) ; beginif A s s i g n e d ! HDupa) //daca mai exista un alt handler instalat t h e n HDupa (S e n d e r ) ; // il apelez S h o w M e ssa g e ( ' D u p a ') ,-
e n d ;
procedure T F o r m l . î n a i n t e ( S e n d e r : T O b j e c t ) ; begin
i f A s s i g n e d ( H I n a i n t e ) / / daca mai exista un alt handler instalat then H I n a i n t e ( S e n d e r ) ; //ilapelez S h o w M e ssa g e ( ' î n a i n t e ' ) ;
end;
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
if A s s i g n e d (C a n v a s . O nC hange) // testez daca exista un alt handler instalat then HDupa : = C a n v a s . O n C hange; // in caz afirmativ il reţin C a n v as . OnChange : = D u p a ; // si il atribui pe cel nou
if A s s i g n e d ( C a n v a s .O nC hang ing) then H I n a i n t e := C a n v a s .O n C h an g in g ;C a n v a s . O nC h an g in g := î n a i n t e ;
C a n v a s . L in e T o ( 1 0 0 , 1 0 0 ) ; // desenez ceva pe suprafaţa formei B u t t o n l . E n a b l e d := false;
end;
property OnChanging: TNotifyEvent;
310
21.13. TGraphicControl
Este o clasă de bază pentru toate controalele care nu au propria lor fereastră. Scopul acestor obiecte este de a afişa text şi imagine pe suprafaţa lor. Ele nu pot primi focus.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->TGraphicControl
Definit în_____________________________________________________
controls.pas
Proprietăţi___________________________________________________
P I. Canvas
property Canvas: TCanvas;
Furnizează, controlului grafic, o suprafaţa pentru desenare. Proprietatea este ReadOnly.
Metode______________________________________________________
M l. Paint
procedure Paint;
La primirea mesajului W M PA IN T, controlul iniţializează canvas-ul şi apelează metoda Paint. In această clasă metoda Paint nu face nimic, dar descendenţii trebuie să o redefinească pentru a indica modul în care se desenează suprafaţa unui control.
21.14. TPaintBox
Furnizează o componentă TCanvas în interiorul unui dreptunghi, prevenind desenarea în afara marginilor acestuia.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TPaintBox
311
Definit în
graphics.pas
Pagina
System
Proprietăţi______
P I. Canvas
property Canvas: TCanvas;
Reprezintă suprafaţa de desenare.
Exemplu:
Următoarea aplicaţie desenează un grafic de funcţie de un sigur parametru. Forma aplicaţiei conţine 4 cutii de editare în care utilizatorul este solicitat să introducă domeniul şi codomeniul funcţiei, o componentă TPaintBox în care se va realiza desenarea şi un buton (Buttonl) la a cărui apăsare se va declanşa desenarea.
function f ( x : r e a l ) : r e a l ; begin
R e s u l t := s i n ( x ) ; end;
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var
a : array of T P o i n t ; i : i n t e g e r ;
//dom eniu l s i codom eniul funcţieim in x , maxx, m in y , maxy : r e a l ;
beginm in x := S t r T o F l o a t ( E d i t l . T e x t ) ;maxx := S t r T o F l o a t ( E d i t 2 . T e x t ) ;m in y := S t r T o F l o a t ( E d i t 3 . T e x t ) ;maxy := S t r T o F l o a t ( E d i t 4 . T e x t ) ;
S e t L e n g t h ( a , 3 0 0 ) ; for i := 0 to 299 do begin
/ / i n vectorul a sunt s tocate perechile (xj'(x)) in coordonate ecran a [ i ] . x : = i ;a [ i ] . y := t r u n c ( ( f (m inx + i * a b s (m ax x - m inx) / 300)
- m i n y ) / (m a x y -m in y )* 3 0 0 ) ;end;P a i n t B o x l . C a n v as . P o l y l i n e (a) ; / / se deseneaza funcţia
312
en d ;
21.15. TImage
Permite afişarea unei imagini pe ecran. Această imagine este valoarea proprietăţii Picture. Poate fi icon, bitmap, metafile, sau orice alt obiect grafic definit de utilizator.
Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> -> TGraphicControl -> TImage.
Definit în
extctrls.pas
Pagina
Additional
Proprietăţi
PI. AutoSize
property AutoSize: Boolean;
Dacă AutoSize este truc, atunci controlul în interiorul căruia se afişează imaginea se va redimensiona în funcţie de dimensiunile acesteia.
P2. Stretch
property Stretch: Boolean;
Indică dacă imaginea trebuie să se redimensioneze astfel încât să ocupe întreaga suprafaţă a controlului.
P3. Center
property Center: Boolean;
Indică dacă imaginea trebuie centrată în interiorul controlului. Această proprietate nu are nici un efect dacă proprietăţile AutoSize sau Stretch sunt setate la true.
313
Specifică imaginea afişată.
Exemplul 1:
Pe o formă avem o componentă Tlmage cu ajutorul căreia dorim să afişăm o imagine aflată într-un fişier pe disc. Pentru aceasta ne folosim de o componentă TOpenPictureDialog care ne facilitează selectarea fişierului cu imaginea. La apăsarea butonului Buttonl vom realiza selectarea fişierului cu imaginea şi afişarea acesteia pe formă în componenta Im a g e l:
procedure T F o r m l . B u t t o n l C l i c k (S e n d e r : T O b j e c t ) ; begin
i f O p e n D i a l o g I . E x e c u t ethen I m a g e l . P i c t u r e . L o a d F r o m F i l e ( O p e n D i a l o g I . F i l e s . S t r i n g s [0] ) ;
/ /n e -a m fo lo s it d e m etoda LoadF rom File a lui TPicture / / pen tru a încărca o im agine dintr-un f iş ie r afla t p e disc. end;
Exemplul 2:
Următoarea aplicaţie afişează textul „DELPHI 7” a cărui dimensiune creşte pe măsură ce acesta se apropie de partea de jos a unei ferestre. Viteza de transformare a dimensiunii caracterelor poate fi setata de utilizator.Vom folosi o componentă Im agel care va constitui fereastra în care va fi afişat textul, o componentă TrackBarl cu ajutorul căreia vom seta viteza de transformare a dimensiunii caracterelor textului, o componentă Tim erl pentru a afişa la intervale regulate textul modificat şi un buton B itB tn l.
Proprietăţile obiectelor de forma Form l sunt:
object I m a g e l : T lm ag e L e f t = 0 Top = 0 W id th = 400 H e i g h t = 400
endobject B i t B t n l : T B i t B t n
C a p t i o n = ' E x e c u t a 'O n C l i c k = B i t B t n l C l i c k
endobject T r a c k B a r l : T T r a c k B a r
Min = 1 P o s i t i o n = 1
P4. Picture
property Picture: TPicture;
314
e n do b j e c t T i m e r l : T T im er
E n a b l e d = F a l s e I n t e r v a l = 500
e n d
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
p r o c e d u r e T F o r m l . B i t B t n l C l i c k ( S e n d e r : T O b j e c t ) ; b e g i n
x := 150 ; y := 50 ;I m a g e l . C a n v a s . F o n t . S i z e := 10;T i m e r l . E n a b l e d : = t r u e ;
e n d ;
p r o c e d u r e T F o r m l . T i m e r l T i m e r ( S e n d e r : T O b j e c t ) ; b e g i n
T i m e r l . I n t e r v a l := T r a c k b a r l . P o s i t i o n * 50;I m a g e l . C a n v a s . R e f r e s h ;i f y + I m a g e l . C a n v a s . T e x t H e i g h t ( 1t ' ) + 20 < I m a g e l . H e i g h t t h e n i f y + 2 * I m a g e l . C a n v a s . T e x t H e i g h t ( ' t ' ) > I m a g e l . H e i g h t
t h e n b e g i nI m a g e l . C a n v a s . B r u s h . C o l o r := c l w h i t e ;I m a g e l . C a n v a s . R e c t a n g l e ( 0 , 0 , 4 0 0 , 4 0 0 ) ;I m a g e l . C a n v a s . F o n t . C o l o r := c l r e d ;I m a g e l . C a n v a s .T e x t O u t ( x ,y , 'D E L P H I 7 ' ) ; y := y + 60;
en d e l s e b e g i n
y := y + I m a g e l . C a n v a s . F o n t . S i z e + 3;X : = X - 5;I m a g e l . C a n v a s . B r u s h . C o l o r := c l w h i t e ;I m a g e l . C a n v a s . R e c t a n g l e ( 0 , 0 , 4 0 0 , 4 0 0 ) ;I m a g e l . C a n v a s . F o n t . S i z e :=
I m a g e l . C a n v a s . F o n t . S i z e + 3 ; I m a g e l . C a n v a s . T e x t O u t ( x , y , 'DELPHI 7 ' ) ;
e n d e l s e e x i t ;
e n d ;
La apăsarea butonului BitBtnl vom seta coordonatele punctului în care va apare iniţial textul si vom seta proprietatea Enabled a componentei Timerl ca fiind true. La fiecare următor interval de timp vom redesena textul cu un font mai mare. Ne vom opri în momentul în care textul depăşeşte înălţimea ferestrei considerate (Im agel .Height). De asemenea, se poate seta şi culoarea cu care va fi afişat textul.
315
Reprezintă o curbă care poate fi trasată pe o formă.
Ierarhie
21.16. TShape
TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TShape.
Definit în___________________________________________________
extctrls.pas
Pagina_____________________________________________________
Additional
Proprietăţi__________________________________________________
PI. Brush
property Shape: TShapeType;
Specifică culoarea şi modelul de haşurare folosit pentru curbă.
P2. Pen
property Pen: TPen;
Specifică tipul de creion folosit pentru marginea curbei.
P3. Shape
property Shape: TShapeType;
Specifică curba care apare pe formă. Valori posibile pentru Shape sunt:
V a lo a re S em nifica tic
StCircle C urba este un cerc.
stEllipse C urba este o elipsă.
stRectangle C urba este un dreptunghi.
stRoundRect C urba este un dreptunghi cu colţurile rotunjite.
stRoundSquare C urba este un pătrat cu colţurile rotunjite.
slSquare C urba este un pătrat.
Următoarea aplicaţie schimbă succesiv, la apăsarea butonului B u tton l, proprietatea Shape a unui obiect de tip TShape. :
Valorile proprietăţilor obiectului TShape sunt:
object S h a p e l : T Shape W id th = 121 H e i g h t = 65 S h ap e = s t S q u a r e
endHandlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; beginif S h a p e l . S h a p e = s t C i r c l ethen S h a p e l . S h a p e : = s t R e c t a n g l eelse S h a p e l . S h a p e := s u c c ( S h a p e l . S h a p e ) ;
end;
21.17. TBevel
Reprezintă componenta care desenează un chenar cu contur.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TBevel.
Definit în_____________________________________________________
extrctrl.pas
Pagina______________________________________________________
Additional
Proprietăţi___________________________________________________
P I. Style
property Style: TBevelStyle;
Indică stilul chenarului. Valori posibile pentru Style sunt:
V a lo a re S em n ifica ţie
bsLow ered C henaru l este adâncit.
bsR aised C henarul este ridicat.
317
]
P2. Shape
property Shape: TBevelShape;
Indică forma curbei. Valori posibile pentru Shape sunt:
V a lo a re S em n ifica ţie
bsBox în treaga com ponentă apare rid icată s-au scobită, în funcţie de valoarea proprietăţii Style.
bsFram e în treaga m argine a com ponentei apare rid icată s-au scobită.
bsTopLine D oar m arginea de sus a com ponentei este afişată.
bsBottomLine D oar m arginea de jo s a com ponentei este afişată.
bsLeflLine D oar m arg inea stângă a com ponentei este afişată.
bsRiglitUne D oar m arg inea d reap tă a com ponentei este afişată.
21.18. TSplitter
Este o componentă care poate împărţi zona client în două panouri redimensionabile la momentul execuţiei programului.
Pentru a obţine cele două panouri redimensionabile, procedaţi astfel:
• aşezaţi pe formă primul panou, şi aliniaţi-l la stânga (proprietatea Align va fi setată la valoarea alLeft);
• aşezaţi pe formă (la dreapta primului panou) o componentă TSliptter; ea se va alinia automat la stânga (va fi lipită de marginea din dreapta a primului panou);
• aşezaţi pe formă cel de al doilea panou şi aliniaţi-l astfel încât să ocupe întreaga zonă client rămasă disponibilă (proprietatea Align va fi setată la valoarea alClient); acum componenta TSplitter se va afla între cele două panouri;
• rulaţi aplicaţia; cele două panouri pot fi redimensionate automat la momentul execuţiei programului.
Observaţie:
Nu doar panourile pot fi folosite, ci orice alt control ce poate fi aliniat(are proprietatea Align)\
Ierarhie
TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TSplitter.
318
Definit în
extctrlx.pax
Pagina
Additional
Proprietăţi
PI. Beveled
property lleveled: Boolean;
Indică dacă splilter-ul are o sau nu un chenar.
P2. MinSize
property MinSi/.e: NaluraINumber;
Indică care trebuie să fie dimensiunea minimă a panorilor pentru ca acestea să poală li redimensionate. Pentru dimensiuni mai mici de MinSize, panourile mi se modifică.
P3. ResizeSiyle
property ResizeSiyle: TResizeStyle;
Indică felul în care se face redimensionarea panorilor. Valori posibile pentru ResizeSiyle sunt:
V a lo a re S em n ifica ţie
rsNone Nu ;ne loc nici o redim ensionare.
rsLineO linie cslc desenată pentru a indica noua poziţie a splitter-ului. Keiliim-iiMonare e lectivă se face doar după ce este e liberat butonul de tiumsc.
rs UpdateK cilim cnsionarea panourilor şi m utarea splitter-u lu i se face concom itent cu m işcarea m ouse-ului.
Evenimente
E l. OnCanResize
property OnCanResize: TCanResizeEvent;
Apare când utilizatorul încearcă să mişte splitter-ul.
319
E2. OnMoved
property OnMoved: TNotifyEvent;
Apare după ce utilizatorul a terminat de mutat splitter-ul.
E3. OnPaint
property OnPaint: TNotifyEvent;
Apare când splitter-ul trebuie să se redeseneze.
Este o colecţie de imagini de aceeaşi dimensiune, fiecare dintre acestea putând fi accesată prin intermediul unui indice. Dacă încercaţi să adăugaţi la lista cu imagini o imagine cu dimensiuni mai mari decât cele setate cu ajutorul proprietăţilor Height şi Width, această imagine va fi ruptă în imagini mai mici care vor fi adăugate la listă. Deci în loc de o imagine veţi avea mai multe. Dacă din contră încercaţi să adăugaţi la listă o imagine cu dimensiunile mai mici decât cele specificate cu ajutorul proprietăţilor Height şi Width atunci lista va rămâne nemodificată, la ea neadăugându-se nimic. De aceea este foarte important să setaţi corect aceste dimensiuni, iar apoi să adăugaţi doar imagini de acest fel. Acest lucru îl puteţi face încărcând în prealabil imaginea nu direct în listă ci într-un obiect de tip TBitmap - de unde îi puteţi citi dimensiunile - iar apoi după ce setaţi dimensiunile listei, să o adăugaţi la ea. Schimbarea dimensiunilor imaginilor listei la momentul execuţiei programului va duce la pierderea informaţilor din ea.
încărcarea unei imagini într-o listă se poate face şi la momentul proiectării aplicaţiei, prin adăugarea pe formă a unei componente TImageList şi apoi execuţia a dublu click pe ea. Pe ecran va apare un ImageListEditor care vă permite să prelucraţi o listă cu imagini la timpul proiectării aplicaţiei.
Cu acest editor pot fi încărcate şi imagini de diferite dimensiuni, dar nu se va putea vedea decât o parte din ele (conform cu Options).
TObject->TPersistent->TCo/nponent->TCustomImageList->TImageList
21.19. TImageList
Ierarhie
Definit în
controls.pas
320
Pagina
Win32
Proprietăţi________________________________________________ _
PI. Count
property Count: Integer;
Indică numărul de imagini dintr-o listă.
P2. Height
property Height: Integer;
Indică înălţimea în pixeli a unei imagini. Datorită faptului că în listă pot fi stocate doar imagini de aceeaşi dimensiune, la schimbarea acestei valori, lista va 11 vidată.
IM. Width
property Width: Integer;
Indică lăţimea în pixeli a unei imagini. Datorită faptului că în listă pot fi stocate doar imagini de aceeaşi dimensiune, la schimbarea acestei valori, lista va fi vidată.
1*4. BlendColor
property BlendColor: TColor;
Specifică culoarea care este folosită în momentul în care proprietatea DrawingStyle are una din valorile dsFocus sau dsSelected.
P5. DrawingStyle
property DrawingStyle: TDrawingStyle;
Indică felul în care va fi desenată o imagine de către metodele obiectului TlmageList. Valori posibile pentru DrawingStyle sunt:
V a lo a re S em n ifica ţie
dsFocusD esenează im aginea am estecată 25% cu culoare specificată de către BlendColor.
dsSelected D esenează im aginea am estecată 50% cu culoare specificată de către B lendColor.
dsN orm al D esenează im aginea folosind doar cu loare de funda) (proprietatea
V a lo a re S em n ifica ţie
BkColor).
dsT ransparent D esenează im aginea neţinând cont de p roprietatea BkColor.
Următorul exemplu demonstrează felul în care este desenată o imagine dintr-o listă în funcţie de valoarea lui DrawingStyle. Vom folosi o componentă TlmageList în care încărcăm la momentul proiectării aplicaţiei o singură imagine. Mai folosim o componentă Tlmage în care afişăm imaginea din listă, şi o componentă TComboBox în care încărcăm cele patru stiluri de desenare: dsFocus, dsSelected , dsNormal, dsTransparent (sub forma unor şiruri de caractere cu acelaşi nume). La schimbarea itemului selectat din TComboBox se va schimba şi felul în care este desenată imaginea:
procedure TForml.ComboBoxlChange(Sender: TObj ect);var r:TRect;
beginif ComboBoxl.Text = 'dsFocus'then ImageListl.DrawingStyle := dsFocus else if ComboBoxl.Text = ’dsSelected'
then ImageListl.DrawingStyle := dsSelected else if ComboBoxl.Text = ’dsNormal'
then ImageListl.DrawingStyle := dsNormal else ImageListl.DrawingStyle : = dsTransparent;
r -.= Imagel.ClientRect;Imagel.Canvas.Brush.Color := clWhite;Imagel.Canvas.FillRect(r) ;
ImageListl .Draw(Imagel. Canvas ,0,0,0); //desenam prima imagine din lista
end;
Metode
M l. Add
function Add (Image, Mask: TBitmap): Integer;
Adaugă imaginea Image împreună cu masca Mask la lista cu imagini. Mask poate să fie nil.
M2. Addlcon
function AddIcon(//wage: Tlcon): Integer;
Adaugă un icon la lista cu imagini.
322
procedure Addlmages(Va/ne: TCustomlmageList);
Adaugă imagini dintr-o altă listă cu imagini.
M4. Clear
procedure Clear;
Şterge toate imagiile din listă.
M5. Delete
procedure Delete(Index: Integer);
Şterge imaginea cu numărul de ordine Index din listă.
M6. Draw
procedure Draw (Canvas: TCanvas; X, Y, Index: Integer;Enabled: Boolean=True);
Desenează imaginea cu numărul de ordine Index pe suprafaţa Canvas la poziţia (X,Y). Această imagine este desenată în conformitate cu proprietatea DrawingStyle.
M7. FileLoad
function ¥\\6Lo'ăd(ResType: TResType; Name: string;MaskColor: TColor): Boolean;
încarcă, în lista cu imagini, din fişierul Name, tipul de resursă specificat. Valori posibile pentru ResType sunt: rtBitmap, rtlcon, rtCursor.
M 8. GetBitmap
procedure GetBitmap(//it/e\: Integer; Image: TBitmap);
Returnează imaginea cu numărul de ordine Index din lista cu imagini.
M 9. Getlcon
procedure GetIcon(/«<ie;t: Integer; Image: TIcon);
Returnează imaginea cu numărul de ordine Index, sub forma unui icon.
M10. Insert
procedure Insert(/«cfe;c: Integer; Image, Mask: TBitmap);
M3. Addlm ages
323
Inserează un bitmap şi masca ataşată lui pe poziţia Index a unei liste cu imagini.
M II . Insertlcon
procedure InsertIcon(/«afe*: Integer; Image: Tlcon);
Înserează un icon pe poziţia Index+l a unei liste cu imagini.
M12. Move
procedure Move(CurIndex, Newlndex: Integer);
Mută imaginea de pe poziţia Curlndex în poziţia Newlndex.
M13. Replace
procedure Rep\ace(Index: Integer; Image, Mask: TBitmap);
înlocuieşte imaginea cu numărul de ordine Index din listă cu o altă imagine (Image) împreună cu masca asociată ei.
M14. Replacelcon
procedure ReplaceIcon(/rtctex: Integer; Image: Tlcon);
înlocuieşte imaginea de pe poziţia Index cu un Icon.
Evenimente_____
E l. OnChange
property OnChange: TNotifyEvent;
Apare când lista se schimbă (o imagine este adăugată, ştearsă,...).
22. TIMERE - COMPONENTA TTimer
Timer-ele înştiinţează utilizatorul despre scurgerea unui interval de timp. înştiinţarea se produce prin generarea unui mesaj. Programatorul Delphi poate intercepta acest mesaj sub forma unui eveniment. în interiorul acestui eveniment trebuie scris cod care se va executa la un interval (de obicei regulat) de timp. Sistemul de operare W indows oferă funcţii API pentru prelucrarea timer-elor. Mediul Delphi încapsulează aceste funcţii în componenta TTimer.
22.1. TTimer ^
Componenta TTimer încapsulează funcţiile API ale timer-elor W indows. Un tim er este o rutină care măsoară repetat scurgerea unui interval de timp. După scurgerea acestui interval de timp - a cărui valoare este indicată de către proprietatea Interval - sistemul este notificat prin apelarea evenimentului OnTimer. Datorită faptului că timer-ul depinde de viteza cu care sunt prelucrate mesajele din coada de mesaje, intervalul scurs va fi aproximativ.
Ierarhie______________________________________________________
TObject->TPersistent->TComponent->TTimer
Definit în_____________________________________________________
extctrls
Pagina_______________________________________________________
System
Proprietăţi___________________________________________________
P I. Enable
property Enabled: Boolean;
Specifică dacă ti.uer-ul răspunde la evenimentul OnTimer. Dacă Enable este true, atunci controlul răspunde normal la acest eveniment, în caz contrar evenimentul nu va fi apelat.
325
P2. Interval
property Interval: Cardinal;
Specifică numărul de milisecunde dintre două apeluri consecutive ale handlerului de evenimente OnTimer.
Evenimente
E l. OnTimerproperty OnTimer: TNotifyEvent;Apare de fiecare dată când trec “Interval” milisecunde de la ultimul eveniment OnTimer.
Exem plul 1:
Următorul exemplu foloseşte două componente de tip TTimer şi o cutie de editare de tip TEdit. La fiecare cinci secunde în cutia de editare este afişat textul “Au mai trecut 5 secunde” . Acest text este afişat timp de două secunde apoi cutia de editare este curăţată.
Proprietăţile obiectelor de pe forma Form l sunt:
object Editl: TEdit Enabled = False
endobject Timer1: TTimer
Interval = 5000 endobject Timer2: TTimer
Enabled = False Interval = 2000
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.TimerITimer(Sender: TObject); begin
Editl.Clear;Editl.Text := 'Au mai trecut 5 secunde.';Timer2.Enabled := true;
end;procedure TForml.Timer2Timer(Sender: TObject); begin
Editl.Clear;Timer2.Enabled := false;
end;
326
Exemplul 2:
Următoarea aplicaţie afişează în bara de titlu a formei câte secunde s-au scurs de la pornirea aplicaţiei.
vari : integer; titlu : string;
procedure TForml.FormCreate(Sender: TObject); begin
i := 1;titlu := Caption; //titlul formei
end;procedure TForml.TimerlTimer(Sender: TObject); begin
Caption := titlu + ' 1 + 'Au trecut ' + IntToStr(i)+1 secunde de la pornirea aplicaţiei';
inc(i); end;
Exem plul 3:
Următoarea aplicaţie realizează apariţia la un interval dat de timp a unei forme pe care este afişat un text.Obiectele de pe forma folosită vor fi un Timerl şi o etichetă L abell în care va fi scris textul care dorim sa fie afişat. Dimensiunea, culoarea şi celelalte proprietăţi ale textului se pot seta din Object Inspector.Vom realiza această aplicaţie folosind proprietăţile TransparentColor şi AlphaBlend ale formei F onul.
Proprietăţile formei Form l şi ale obiectelor de pe această formă sunt:
object Forml: TForml Left = 353 Top = 278 Width = 426 Height = 146 AlphaBlend = True AlphaBlendValue = 0 Caption = 'Forml'Color = c 1 Ac-liveCaption TransparonLColor = True Font.Color clWindowText Font.Height = -11 Font . Nr-irne = 'MS Sans Serif'Font.St yle = [ ]Text Ile i qht: = 13 object Labell: TLabel
Caption = 'Sa invatam DELPHI 7!'Color = clActiveCaption
327
Font.Color = clYellowFont.Height = -27Font.Name = 'MS Sans Serif'Font.Style = [fsBold]
endobject Timerl: TTimer
Interval = 50 OnTimer = TimerlTimer
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
v a raparent : boolean;
procedure TForml.TimerlTimer(Sender: TObject); begin
aparent := not aparent; if aparent then begin
Forml.TransparentColor := false;Forml.AlphaBlend := false;Forml.AlphaBlendValue : = 255;
end else begin
Forml.TransparentColor := true;Forml.AlphaBlend := true;Forml.AlphaBlendValue := 0;
end;end;procedure TForml.FormShow(Sender: TObject); begin
aparent := true; end
Exem plul 4:
Următorul exemplu va afişa un text, literă cu literă, cu o anumită frecvenţă.Vom considera o componentă Im agel şi o componentă OnTimer 1. Vom afişa literele cu o frecvenţă' data de valoarea proprietăţii Interval a obiectului OnTimerI. Vom seta 25 dimensiunea textului şi culoarea albastru. Dacă lungimea textului depăşeşte lăţimea pe care am setat-o pentru Im agel, atunci vom continua scrierea pe rândul următor. La lansarea în execuţie a programului, textul va începe să se scrie din colţul stânga sus al imaginii Im agel.
328
Proprietăţile evenimentelor de pe forma Form l sunt:
object Imagel: Tlmage Left = 0 Top = 0 Width = 400 Height = 400 AutoSize = True
endobject Timerl: TTimer
Interval = 100 OnTimer = TimerlTimer
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.TimerlTimer(Sender: TObject); begin
text := 'Acesta este un exemplu simplu de lucru'+' cu componenta OnTimer.';
imagel.Canvas.Font.Size := 25; imagel.Canvas.Font.Style := [fsbold]; imagel.Canvas.Font.Color := clblue if i > length(text) then elseif x > imagel.Width then begin
y := y + 50; x := 50;
end else begin
imagel.Canvas.TextOut(x,y,text[i]);X : = X + 3 0 ;inc(i );
end ;procedure TForml.FormShow(Sender: TObject); begin
X := 10; y := 10;
end;
329
23. FERESTRE DE DIALOG
Cutiile de dialog sunt ferestre complexe în care utilizatorul este solicitat să-şi introducă opţiunile referitor la felul în care se va executa în continuare aplicaţia. Cutiile de dialog pot fi prefabricate sau simple.
Cele prefabricate sunt complexe şi ele sunt destinate unui scop precis. Spre exemplu TOpenDialog, TPrintDialog. Toate acestea derivă din clasa TCommonDialog. Afişarea unei ferestre de dialog este modală şi se face apelând metoda Execute. Această metodă întoarce valoarea tru e dacă utilizatorul şi-a setat opţiunile dorite şi a apăsat butonul Ok. Metoda întoarce valoarea false dacă utilizatorul a apăsat butonul Cancel.
Apăsarea unuia dintre butoanele O k sau Cancel nu conduce la efectuarea vreunei operaţii de către componenta de dialog. Programatorului îi revine sarcina de a scrie codul ce se va executa după apăsarea unuia dintre butoanele O k sau Cancel.
Cutiile de dialog simple sunt create şi afişate cu ajutorul unor funcţii (spre exemplu ShowMessage). Ele sunt folosite pentru a afişa un text către utilizator (procedura ShowMessage) sau pentru a citi un text introdus de către utilizator.
23.1. TCommonDialog
Este strămoşul comun al tuturor componentelor ce reprezintă o cutie de dialog. Din el derivă TOpenDialog, TSaveDialog, TPrintDialog, TColorDialog, TOpenPictureDialog, TSavePictureDialog, TFontDialog, TPrinterSetupDialog, TFindDialog, TReplaceDialog.
Ierarhie___________________________________________________ __
TObject -> TPersistent -> TComponent -> TcommonDialog
Definit în_____________________________________________________
dialogs.hpp
330
Proprietăţi
PI. Ctl3D
property Ctl3D: Boolean;
Indică dacă fereastra de dialog are aspect 3D. Dacă Ctl3D este false, fereastra va avea un aspect plat.
P2. Handle
property Handle: HWnd;
Este identificatorul la fereastra dialogului. Acest identificator devine valid doar după apelarea metodei Execute. înainte de crearea ferestrei dialogului şi după distrugerea ei, Handle are valoarea 0.
Metode
M l. Execute
function Execute: Boolean; virtual; abstract;
Afişează fereastra cutiei de dialog. Toate cutiile de dialog enumerate mai sus sunt vizibile doar la momentul execuţiei aplicaţiei, după ce s-a apelat metoda Execute. Fiecare componentă va suprascrie această metodă pentru afişarea propriei cutii de dialog. O fereastră de dialog constă dintr-o parte specifică (spre exemplu, componenta TOpenDialog este destinată selectării unui fişier, componenta TColorDialog este destinată selectării unei culori, etc.) şi două butoane (unul etichetat cu Ok iar celălalt cu Cancel). Metoda returnează true dacă utilizatorul a făcut o selecţie validă şi a apăsat butonul Ok. în caz contrar (când este apăsat butonul Cancel) metoda returnează false.
Evenimente
El. OnShow
property OnShow: TNotifyEvent;
Apare când cutia de dialog este afişată.
331
E2. OnHide
property OnClose: TNotifyEvent;
Apare când cutia de dialog este închisă.
23.2. TOpenDialog
Afişează o cutie de dialog pentru a selecta şi deschide fişiere. Pe ecran este afişată:
Look in:
jBnj i Doc j Examples j Help j Images
J Include
File name:
Files of type:
j LibJ Objrepos J Ocx j Projects J Pvcs j Quickrpt
L_J Source ~=*1 D e lsLU su iTj Deploy j f f j License
>1 Readme, cnt Readme
□ pen
j£ 3 Cancel
P* Open asjead-only
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TOpenDialog.
Definit în
dialogs.pas
Pagina
Dialogs
Proprietăţi
PI. FileName
property FileName; TFileName;
332
Indică numele şi calea ultimului fişier selectat.
Exemplu:
Următoarea aplicaţie încarcă într-o componentă TMemo textul aflat într- un fişier. Numele şi calea fişierului sunt selectate cu ajutorul unei componente TOpenDialog.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Buttonl: TButtonCaption = 'Deschide Fişier'
endobject OpenDialogI: TOpenDialog
Filter = 'Fişiere Pascalj*.pas' end
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
if OpenDialogI.Executethen Memol.Lines.LoadFromFile(OpenDialogI.FileName);
end;
P2. Files
property Files: TStrings;
Returnează o listă cu numele şi căile fişierelor selectate. Selectarea mai multor fişiere este posibilă numai în cazul în care flagul ofAllowMultiSelect din cadrul proprietăţii Options este true.
Exemplu:
Următoarea aplicaţie afişează într-o componentă TListBox numele tuturor fişierelor selectate. Fişierele sunt selectate cu ajutorul unei componente TOpenDialog.
Valorile proprietăţilor obiectelor de pe forma F orm l sun t:.object Buttonl: TButton
Caption = 'Afiseaza nume' endobject OpenDialogI: TOpenDialog
Filter = 'Fişiere Pascal|* .pas'Options = [ofHideReadOnly, ofAllowMultiSelect,
ofEnableSizing]end
Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:
333
procedure TForml.ButtonlClick(Sender: TObject); beginif OpenDialogI.Executethen ListBoxl.Items.Assign(OpenDialogI.Files) ;
end;
P3. Filter
property Filter: string;
Specifică un filtru pentru selecţia de fişiere. Filtrul este creat la fel ca şi la TComboListBox.
P4. Filterlndex
property Filterlndex: Integer;
Specifică care filtru să fie ales când se deschide o cutie de dialog. Filtrele în cadrul proprietăţii Filter au ataşate numere de ordine. Primul filtru are numărul de ordine 1, al doilea 2, etc. Dacă se încearcă accesarea unui filtru care are numărul de ordine mai mare decât numărul total de filtre, atunci este ales primul filtru (cel cu numărul de ordine 1).
P5. DefaultExt
property DefaultExt: string;
Specifică extensia implicită pentru un fişier. Acest lucru este util în momentul în care utilizatorul tastează un nume de fişier fară extensie. La acest fişier este adăugată extensia DefaultExt. Spre exemplu dacă extensia fişierelor a fost setată la .pas (OpenDialogI.DefaultExt : = 1 pas ') , atunci, dacă utilizatorul tastează numele fişierului fară extensie (de exemplu unitl), implicit este unitl.pas.
P6. HistoryList
property HistoryList: TStrings;
Este o listă cu fişierele care au fost deja deschise.
P7. InitialDir
property InitialDir: string;
Indică directorul curent care va apărea implicit când se deschide o cutie de dialog. Dacă nu se specifică nici un director atunci InitialDir va fi directorul curent de lucru.
334
P8. Options
property Options: TOpenOptions;
Descrie felul în care se comportă fereastra de dialog.
Evenimente__________________________________________________
El. OnCanClose
property OnCanClose: TCloseQueryEvent;
Apare când utilizatorul închide cutia de dialog printr-o operaţie diferită de Cancel. Aceste eveniment este util atunci când selecţia unui nume de fişier este incorectă. Acest eveniment trebuie să îi spună utilizatorului de ce cutia de dialog nu poate fi închisă. Tipul TCloseQueryEvent este definit astfel:
TCloseQueryEvent = procedure(5e«<ier: TObject;var CanClose: Boolean) of object;
Pentru a preveni închiderea dialogului setaţi variabila CanClose la false.
E2. OnFolderChange
property OnFolderChange: TNotifyEvent;
Apare când utilizatorul schimbă directorul al cărui conţinut este curent afişat în cutia de dialog.
E3. OnTypeChange
property OnSelectionChange: TNotifyEvent;
Apare când utilizatorul selectează un alt filtru pentru fişierele afişate în cutia de dialog.
E4. OnSelectionChange
property OnSelectionChange: TNotifyEvent;
Apare când utilizatorul modifică conţinutul cutie de dialog. Acest lucru poate însemna: selectarea unui nou fişier sau director, selectarea unui nou filtru, crearea unui director etc.
335
23.3. TSaveDialog
Afişează o cutie de dialog asemănătoare cu cea de tipul Save As. Utilizatorul poate specifica aici modul şi locul de salvare a unui fişier.
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TOpenDialog -> TSaveDialog.
Definit în
dialogs.pas
Pagina
D ialogs
Observaţii:
Componenta TSaveDialog nu introduce nici o proprietate, metodă sau eveniment nou faţă de cele întâlnite la TOpenDialog.
Exemplu:!•:
Următoarea aplicaţie salvează într-un fişier textul aflat într-o componentă TMemo. Numele şi calea fişierului în care se va face salvarea este selectat cu ajutorul unei componente TSaveDialog.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Buttonl: TButton Caption = 'Salveaza'
endobject SaveDialogl: TSaveDialog
DefaultExt = 'txt'Filter = 'Fişiere text|*.txt'
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
I procedure TForml.ButtonlClick(Sender: TObject);I begin( if SaveDialogl.Execute
then Memol.Lines.SaveToFile(SaveDialogl.FileName); end;
336
Observaţie:
Mediul Delphi pune la dispoziţia programatorului încă două componente de dialog pentru încărcat şi salvat fişiere cu imagini. Ele se numesc TOpenPictureDialog şi TSavePictureDialog şi au aceleaşi proprietăţi ca şi componentele TOpenDialog şi TSaveDialog. Singura diferenţă este faptul că TOpenPictureDialog şi TSavePictureDialog pun la dispoziţia programatorului filtre pentru fişierele cu imagini.Filtrele implementate sunt:
Al1(*.jpg;*.j peg;*.bmp;*.i co;*.emf; ’ JPEG Image File {*.jpg,*.jpeg) Bitmaps (*.bmp)Icons (*.ico)Enhanced Metafiles (*.emf)Metafiles (*.wmf)[*.wmf
. wmf)
23.4. TFontDialog
Afişează o cutie de dialog pentru selectarea unui font:
Font:
E ffects
f ~ S trikeou t
I- U nderline
Color:
| B lack
Font style: Size:
|M S Sans Serif |Regu lar J1
MS Sans S e iif A . I J T i n i — : [MS Serif
ţ Playbill Small Fonts
T Symbol System Tahom a
_ l
Ita lic 1 B o ld 1 Bold Ita lic 1
_ J 223 H
Sam ple
A a B tA ă O o
[ Script:
_eritia l European
OK
Cancel
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TFontDialog.
337
Definit în
dialogs.pas
Pagina______________________________________________________
Dialogs
Proprietăţi___________________________________________________
PI. Font
property Font: TFont;
Specifică fontul selectat. Când utilizatorul alege un font şi apasă butonul Ok, fontul selectat este valoarea lui Font.
Evenimente
E l. OnApply
property OnApply: TFDApplyEvent;
Apare când utilizatorul apasă butonul Apply al ferestrei de dialog. Tipul jTFDApplyEvent este definit astfel:
TFDApplyEvent = procedure(.SVw/e/': TObject; Wnd: HWND)of object;
Wnd este menţinut pentru compatibilitate înapoi şi are aceeaşi valoare ca jşi proprietatea Handle.
Exemplu:
Următoarea aplicaţie setează fontul cu care este scris textul din cutia de editare E ditl. Fontul este selectat cu ajutorul unei componente TFontDialog.
I Valorile proprietăţilor obiectelor de pe forma Forml sunt:
I object Editl: TEdit( Text = 'Acesta este un text!'
endobject Buttonl: TButton
Caption = 'Seteaza Font' end
338
J
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
if FontDialogl.Executethen Editl.Font.Assign(FontDialogl.Font);
end;
procedure TForml.FontDialoglApply(Sender: TObject; Wnd: HWND); begin
Editl.Font.Assign(FontDialogl.Font) ; end;
23.5. TColorDialog
Afişează o cutie de dialog pentru selectarea unei culori:
Basic colors:
H r r n r i i i ■ rrrrrarnî mr r {smmmm mr mummuu mmmmMuuM wrrrnrmr
Custom colors: r r r r r r r r
r r r r r r r r
OK Cancel
Hue:fT2T Red: p T
Şal: f i 74 Green: ['215
ColoilSolid Lum. J Î43* glue: [ S F
Add to Custom Colors
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TFontDialog
Definit în
dialogs.pas
339
Pagina
Dialogs
Proprietăţi________________________________________________ _
PI. Color
property Color: TColor;
Returnează culoarea selectată.
Exemplu:
Următoarea aplicaţie selectează cu ajutorul unei componente TColorDialog culoare de fond a formei principale.
Handlerele de evenimente ale obiectelor de pe forma Forml sunt:
procedure T F o r m l . B u t t o n l C l i c k (S e n d e r : T O b j e c t ) ; begin
if C o l o r D i a l o g l . E x e c u tethen F o r m l . C o l o r := C o l o r D i a l o g l . C o l o r ;
end;
P2. CustomColors
property CustomColors: TStrings;
Indică care dintre culorile prelucrate sunt disponibile în cutia de dialog. Fiecare culoare prelucrată este specificată printr-un şir de forma ColorX=ValoareHexa (spre exemplu ColorA=808298). Se pot specifica cel mult 16 culori prelucrate (de la ColorA la ColorP).
Exemplu:
Următoarea aplicaţie setează 16 culori prelucrabile aleatoare.procedure T F o r m l . B u t t o n 2 C l i c k (S e n d e r : T O b j e c t ) ; var
i : b y t e ;Random Color : i n t e g e r ;
beginwith C o l o r D i a l o g l do begin
C u s to m C o lo r s . C l e a r ; //ş te rg culorile deja existentefor i := 0 to 15 dobegin
R andom Color := r a n d o m ) $ 1 0 0 0 0 0 0 ) ;C u s t o m C o lo r s .A d d ( ' C o l o r ' + c h r ( o r d ( ' A ' ) + i ) + ’= ' +
I n tT o H e x (R a n d o m C o lo r , 6 ) ) ;
340
end;end;
end;
23.6. TFindDialog
Afişează o cutie de dialog care permite introducerea unui text care va fi căutat într-un fişier:
Find what:
I- M atch whole word only D irection Cancel
' ' r y p ^ - own.
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TFindDialog.
Definit în
dialogs.pas
Pagina
Dialogs
Proprietăti
PI. FindText
property FindText: string;
La apăsarea butonului FindNext, FindText va primi ca valoare şirul introdus în cutia Find what de către utilizator.
P2. Options
property Options: TFindOptions;
Setează modul de comportare a cutiei TFindDialog.
341
TFindOptions este un tip mulţime, deci Options va fi o submulţime din următoarele valori:
V a lo a re S em n ifica ţie
frD ow nSelectează butonul de radio D ow n. C ând această valoare nu este inclusă în Options, în seam nă că butonul radio U p este selectat.
frF indN ext A cest flag este setat când u tilizatorul apasă pe butonul F in d N e x t
frM atrh C ase Selectează cutia de control M a tc h C ase.
frR eplaceSe aplică num ai la TReplaceD ialog. A cest flag ind ică faptul că aplicaţia trebuie să în locu iască doar prim a apariţie a lui FindText.
frR eplaceA llSe aplică num ai la TReplaceD ialog. A cest flag ind ică faptul că ap licaţia trebu ie să în locuiască toate apariţiile lui FindText.
frW h oleW ord ■ Selectează cu tia de control M a tc h W h o le W o rd .
frShow H elp A fişează un buton de Help.
P3. Position
property Position: TPoint;
Indică coordonatele colţului din stânga sus al ferestrei de dialog.
Metode______________________________________________________
M l. CloseDialog
procedure CloseDialog;
închide cutia de dialog, lăsând însă toate proprietăţile acesteia neschimbate.
Evenimente__________________________________________________
E l. OnFind
property OnFind: TNotifyEvent;
Apare când butonul FindNext este apăsat. în acest handler de evenimente utilizatorul poate şi trebuie să scrie codul necesar căutării unui subşir într-un şir. La prima vedere s-ar părea că operaţia de căutare a textului este făcută automat de către această componentă. Acest lucru este total greşit, această componentă oferind un mod mai prietenesc în care utilizatorul poate introduce şirul pe care îl caută. Programatorului îi
342
revine sarcina de a implementa evenimentele care se generează când butonul FindNext este apăsat.
Exem plu:
Următoarea aplicaţie caută un text într-o componentă TRichEdit. Munca de căutare este simplificată deoarece componenta TRichEdit furnizează metoda FindText pentru căutarea unui şir de caractere.
Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForm l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
F i n d D i a l o g l . P o s i t i o n := P o i n t ( R i c h E d i t l . L e f t +R i c h E d i t l .W id th , R i c h E d i t l . T o p ) ;
F i n d D i a l o g l . E x e c u t e ; end;procedure TForm l . F i n d D i a l o g l F i n d ( S e n d e r : T O b j e c t ) ; var
p o z : i n t e g e r ;S t a r t P o z , L ung im e : I n t e g e r ;
beginwith R i c h E d i t l do begin
if S e l L e n g t h <> 0then S t a r t P o z := S e l S t a r t + S e l L e n g t h
/ / i n cazu l in care am m ai g asit ce l puţin inca o apariţie a şirului / / incep cautarea dupa selecţia curentaelse S t a r t P o z := 0; // incep cautarea de la inceputul textului
Lungim e := L e n g t h ( T e x t ) - S t a r t P o z ;/ / lungim ea textului in care caut
p o z := F i n d T e x t ( F i n d D i a l o g l . F i n d T e x t , S t a r t P o z ,Lung im e , [ s t M a t c h C a s e ] ) ;
if p o z <> -1 then begin
S e t F o c u s ;/ /s e le c te z textul gasit S e l S t a r t := p o z ;S e l L e n g t h := L e n g t h ( F i n d D i a l o g l . F i n d T e x t ) ;
endelse Sh o w M e ssa g e ( ' T e x t u l c a u t a t nu m ai a p a r e c a s u b s i r ' ) ;
end; end;
Exemplu:
Următoarea aplicaţie realizează căutarea unui text într-o componentă TMemo. Deoarece nu mai avem la dispoziţie o metodă aşa de puternică
343
de căutare (precum metoda FindText a lui TRichEdit) vom folosi funcţia Pos împreună cu restrângerea şirului în care se realizează căutarea.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object B u t t o n l : T B u t to n C a p t i o n = ' C a u t a '
endobject F i n d D i a l o g l : T F i n d D i a l o g
O p t i o n s = [frDow n, f r D i s a b l e M a t c h C a s e , f rD isa b le U p D o w n , f rD i s a b l e W h o le W o rd , f rW holeW ord]
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
varS : string;p o z , i n a i n t e : i n t e g e r ;
procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin
F i n d D i a l o g l . P o s i t i o n := P o i n t (Memol. L e f t +Memol.W id th , M e m o l .T o p ) ;
F i n d D i a l o g l . E x e c u t e ; p o z := 1;/ / incep cautarea clin poziţia curenta a cursoruluii n a i n t e := M em ol. S e l S t a r t - 1;// S va indica textul in care executam cautareaS := c o p y (Memol. L i n e s . T e x t , Memol. S e l S t a r t ,
l e n g t h (Memol. L i n e s . T e x t ) - Memol. S e l S t a r t ) ;end;procedure T F o r m l . F i n d D i a l o g l F i n d (S e n d e r : T O b j e c t ) ; var
p o z : i n t e g e r ;S t a r t P o z , L ung im e : I n t e g e r ;
begin/ / cau t şirul dorit in textu l Sp o z := p o s ( F i n d D i a l o g l . F i n d T e x t , S ) ; if p o z = 0then S h o w M e ssa g e ( ' T e x t u l c a u t a t nu m ai a p a r e c a s u b s i r ' ) else begin
// m archez tex tu l gasitM em ol. S e l S t a r t := p o z + i n a i n t e - 1;M em ol. S e l L e n g t h := l e n g t h ( F i n d D i a l o g l . F i n d T e x t ) ;M emol. S e t F o c u s ; i n a i n t e := i n a i n t e + p o z ;/ / restrâng cautareaS := c o p y ( S , p o z + 1 , l e n g t h ( s ) ) ;
end;end;
344
23.7. TReplaceDialog
Afişează o cutie de dialog de tip Find-Replace pentru căutare şi înlocuire de text.
U M
Find what: ]
Replace with: | ~ '-;i j '"
f ~ M atch whole word only ------------------------
CancelI M atch case ------------------------
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDicdog -> -> TFindDialog -> TReplaceDialog.
Definit în
dialogs.pas
Pagina_______________________________________________
Dialogs
Proprietăţi____________________________________________
PI. ReplaceText
property ReplaceText: string;
Conţine textul care trebuie să înlocuiască FindText.
Observaţie:
Celelalte metode şi proprietăţi sunt preluate de la TFindDialog.
Replace
345
Evenimente
E l. OnReplace
property OnReplace: TNotifyEvent;
Apare când unul din butoanele Replace sau ReplaceAll este apăsat. In interiorul acestui handler de evenimente programatorul trebuie să scrie o secvenţă de cod care se va executa când se doreşte înlocuirea unui şir într-un text.
Exemplu:
Următoarea aplicaţie efectuează căutarea şi înlocuirea unui şir într-un text dat. începerea procesului de căutare se realizează la apăsarea butonului Buttonl.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object Forml: TForml ActiveControl = Memol object Buttonl: TButton Caption = 'înlocuieşte'TabOrder = 0 OnClick = ButtonlClick
endobject ReplaceDialogl: TReplaceDialog
Options = [frDown, frDisableMatchCase, frDisableWholeWord]
OnReplace = ReplaceDialoglReplace end
endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
varS : string;poz, inainte : integer;
procedure TForml.ButtonlClick(Sender: TObject); begin
ReplaceDialogl.Position := Point(Memol.Left +Memol.Width, Memol.Top);
ReplaceDialogl.Execute; poz := 1;/ / incep cautarea din p o ziţia curenta a cursorului inainte := Memol.SelStart - 1;/ / S va indica textul in care executam cautarea s i eventual inlocuirea S := copy(Memol.Lines.Text, Memol.SelStart,
length(Memol.Lines.Text) - Memol.SelStart);end;
346
p r o c e d u r e TForml.ReplaceDialoglReplace(Sender: TObject); v a r
poz : integer;StartPoz, Lungime: Integer;
b e g i n
i f frReplace i n ReplaceDialogl.Options / / daca se fa c e inlocuirea p a s cu p a s t h e n b e g i n
/ / caut şirul dorit in textul Spoz := pos(ReplaceDialogl.FindText, S); i f poz = 0t h e n ShowMessage('Textul cautat nu mai apare ca subsir') e l s e b e g i n
/ / m archez textul gasitMemol.SelStart := poz + inainte - 1;Memol.SelLength :=
length(ReplaceDialogl.FindText);/ / inlocuiesc textul si in cutia de d ia log si in şiru l S Memol.SelText := ReplaceDialogl.ReplaceText; delete(S, poz, length(ReplaceDialogl.FindText)); insert(ReplaceDialogl.ReplaceText, S, poz);Memol.SetFocus; inainte := inainte + poz;/ / restrâng cautarea s i inlocuireaS := copy(S, poz+1,length(S));
e n d ;e n d
e l s e / / in locuirea s e fa c e cu R eplace A l l ... e n d ;
23.8. TPrinterSetupDialog 3 .
Generează o cutie de dialog pentru configurarea imprimantei:
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog ->-> TPrinterSetupDialog.
Definit în
dialogs.pas
Pagina
D ialogs
M l
Plini Setup
Printer
Name: [Epson LX-800 Properties
Status: Default printer; Ready
Type: Epson LX-80Q
Where: LPT1:
Comment:
Paper Orientation
Size: A4 21 Ox ^97 mm
Source: Tractor
(* iPortraij
Landscape j
Cancel |
Observaţie:
Această componentă este singura (dintre cele din pagina Dialogs) pentru care, după ce este apăsat butonul Ok, programatorul nu mai trebuie să scrie cod. Ea configurează automat imprimanta în funcţie de opţiunile setate de către utilizator.
Exemplu:
Următoarea aplicaţie configurează imprimanta.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g i n
i f PrinterSetupDialogl.Executet h e n ShowMessage('Imprimanta a fost setata.')e l s e ShowMessage('A fost apasat butonul Cancel.');
23.9. TPrintDialog
Afişează o cutie de dialog pentru setarea modului în care vor fi tipărite paginile trimise pentru listat la imprimantă.
e n d ;
348
- Printer —
Name:
Status: Default printer; Ready
Type: Epson LX-800
W here: LPT1:
Comment:
Print range
& All
r ; | p
r
Properties
Copies....................................................
N umber of copies: [Î
12 r j (7 Collate
OK Cancel
Ierarhie
TObject -> TPersistent -> TComponent -> TCommonDialog ->-> TPrintDialog.
Definit în_____________________________________________________
dialogs.pas
Pagina______________________________________________________
D ialogs
Proprietăţi___________________________________________________
P I. Copies
property Copies: Integer;
Indică numărul de copii care trebuie făcute. Dacă Copies este 0 sau 1, atunci căsuţa cu Number of Copies din cutia de dialog va indica 1.
P2. FromPage
property FromPage: Integer;
Indică numărul paginii de la care să înceapă listarea.
349
P3. ToPage
property ToPage: Integer;
Indică numărul paginii până la care să se facă listarea.
P4. M axPage
property MaxPage: Integer;
Indică numărul maxim al unei pagini pe care utilizatorul o poate introduce pentru tipărire. Acest lucru este posibil doar dacă flagul poPageNums este setat.
P5. MinPage
property MinPage: Integer;
Indică numărul minim al unei pagini pe care utilizatorul o poate introduce pentru tipărire.
P6. PrintToFile
property PrintToFile: Boolean;
Indică dacă este bifată cutia de control Print To File.
P7. PrintRange
property PrintRange: TPrintRange;
Valoarea lui PrintRange corespunde cutiei cu butoane de radio PrintRange cu cele trei butoane: All, Selection şi Pages. Valori posibile pentru PrintRange sunt:
V aloare Sem n ificaţie
prAU Pages Butonul AU este selectat, deci toate paginile fişierului vor fi tipărite.
prSelectionButonul Selection este selectat, deci se listează selecţia curentă a textului.
prPageN um sButonul P ages este selectat, deci utilizatorul poate introduce intervalul de pagini care vor tl tipărite.
P8. Collate
property Collate: Boolean;
Indică dacă cutia de control Collate este selectată. Această cutie este utilă dacă se listează mai multe copii ale unui document. Dacă această
350
opţiune este setată, atunci se listează prima copie a documentului, apoi a doua copie, etc., în caz contrar se listează toate copiile primei pagini, apoi toate copiile celei de a doua pagini, etc.
Exemplu:
Următoarea aplicaţie implementează lucrul cu proprietăţile obiectului TPrintDialog.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
o b j e c t Buttonl: TButton Caption = 'Tipăreşte'
e n do b j e c t PrintDialogl: TPrintDialog
Collate = T r u eOptions = [poPageNums, poDisablePrintToFile]
e n d
Handlerele de evenimente ale obiectelor de pe forma Form l sunt: u s e s
printers;
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
i, p : integer;/ /p e n tr u tipărit o zona continua de p ag in i de_la, pana_la : integer;
b e g i nPrintDialogl.MinPage := 1;PrintDialogl.MaxPage := 10; //avem maxim 10pagini de tipărit
i f PrintDialogl. PrintRange = prAUPages / / tipăresc toate pag in ile
t h e n b e g i nde_la := PrintDialogl.MinPage; pana_la := PrintDialogl.MaxPage;
e n de l s e b e g i n / / tipăresc doar o p a rte din pagin i
de_la := PrintDialogl.FromPage; pana_la := PrintDialogl.ToPage;
e n d ;
i f PrintDialogl.Execute t h e n b e g i n
Printer. BeginDoc; // incep tiparirea i f PrintDialogl. Collate / / daca collate este truet h e n f o r i := 1 t o PrintDialogl. Copies d o // pentru fiecare copie
f o r p := de_la t o pana_la d o / / pentru fiecare pagina b e g i n
/ / t ip ă r e sc ceva p e fieca re paginaPrinter.Canvas.TextOut(10, 10, 'Pagina ' +
351
IntToStr(p)); Printer. NewPage; / / trec la o pag ina noua
Kc e n de l s e / / co llate este false
f o r p := de_la t o pana_la d of o r i := 1 t o PrintDialogl.Copies d o
b e g i n/ / t ip ă r e sc ceva p e fieca re paginaPrinter.Canvas.TextOut(10, 10, 'Pagina ' +
IntToStr(p));Printer.NewPage;
e n d ;Printer. EndDoc; / / s e term ina tiparirea
e n d ;e n d ;
23.10. Funcţii care afişează cutii de dialog
F I. CreateMesscigeDialog
function CreateMessageDialog(const Msg: string;DlgType: TMsgDIgType; Buttons: TMsgDlgButtons): TForm;
Creează o cutie de dialog care va afişa mesajul Msg. Tipul cutiei este specificat de parametrul DlgType. Butoanele amplasate pe cutie sunt specificate în parametrul TMsgDlgButtons.Tipul cutiei poate fi unul dintre:
V aloare Sem n ificaţie
m tW am ing Cutia de dialog conţine un semn de exclamare galben.
m tE rror Cutia de dialog conţine un semn de stop colorat în roşu.
m tlnform ation Cutia de dialog conţine caracterul "i" colorat în albastru.
m tConfirm ation Cutia de dialog conţine un semn de întrebare colorat în verde.
m tCustom Cutia de dialog conţine doar text simplu.
Butoanele amplasate pe cutia de dialog pot fi unul sau mai multe dintre următoarele:
V aloare T extu l în scris pe buton
m bYes Yes
mbNo No
m bO k Ok
m bC ancel Cancel
m bA bort Abort
m bR etry Retry
352
V aloare T extu l înscris pe buton
mb Ignore Ignore
m bAll AII
inbNoToAll N o To All
m bYesToAll Y es To AU
m bH elp Help
Observaţie:
Cutia de dialog nu va fi afişată ci doar creată. Pentru afişarea cutiei de dialog puteţi folosi metodele clasei TForm.
Exemplu:
Următoarea aplicaţie afişează o cutie de dialog în care utilizatorul îşi exprima intenţia cu privire la terminarea aplicaţiei curente.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
f : TForm; b e g i n
f := CreateMessageDialog('Doriţi sa terminati?’,mtConfirmation, [mbOK, mbCancel]);
i f f.ShowModal = mrOK t h e n Application.Terminate; f.Free;
e n d ;
F2. ShowM essage
procedure ShowMessage(const Msg: string);
Afişează o cutie de dialog simplă care conţine un mesaj către utilizator şi un buton Ok.
Exemplu:
Următoarea aplicaţie afişează la apăsarea butonului Buttonl data curentă.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g i n
ShowMessage ( 1 Astăzi este: ' +DateToStr (Date) ) e n d ;
353
function InputQuery(const ACaption, APrompt: string;var Value: string): Boolean;
Afişează o cutie de dialog în care utilizatorul este solicitat să introducă un şir de caractere. Această cutie de dialog este o fereastră care are titlu (specificat de către parametrul ACaption), un text informativ asupra şirului care trebuie furnizat de către utilizator (parametrul APrompt), o cutie de editare în care trebuie introdusă valoarea solicitată şi două butoane (Ok şi Cancel). Valoarea introdusă de către utilizator va fi retumată în şirul Value. Funcţia returnează true dacă utilizatorul a apăsat butonul Ok şi false în caz contrar.
Exemplu:
Următoarea aplicaţie solicită utilizatorului introducerea unui număr. Aplicaţia va face şi validarea numărului introdus.
u s e sfilectrl;
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
nr : integer; sir : s t r i n g ;
b e g i ni f InputQuery('Cutie de dialog', 'Introduceti un numar', sir) t h e n t r y
nr := StrToInt(sir); e x c e p t
o n EConvertError d o nr := 0; e n d
e n d ;
F4. SelectDirectory
function SelectDirectory(const Caption', string;const Root: WideString; out Directory: string): Boolean;
Afişează o cutie de dialog care îi permite utilizatorului să aleagă un director. Caption este eticheta cutiei de dialog. Root este directorul a cărui structură va fi afişată. Directory va conţine numele şi calea directorului selectat. Funcţia returnează true dacă utilizatorul a selectat un director şi a apăsat butonul Ok şi false în cazul în care utilizatorul a apăsat butonul Cancel.
F 3 . InputQuery
354
Exemplu:
Următoarea aplicaţie setează directorul curent la o valoarea selectată de către utilizator.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
dir : s t r i n g ; b e g i n
i f selectDirectory('Selecteaza D i r e c t o r c :\',dir) t h e n SetCurrentDir(dir);
e n d ;
355
24. DATE Şl TIMPURI
Tipurile şi clasele din acest capitol sunt destinate lucrului cu date calendaristice şi timpuri. O dată calendaristică este reprezentată de tripletul (zi, lună, an). Un timp, sau oră este reprezentat prin cvadruplul (oră, minut, secundă, sutime de secundă).
Tipul TDateTime stocheată o dată calendaristică şi un timp. Intern, obiectele de tip TDateTime menţin şi manipulează o dată de tip double.
Tipul TDate stocheată o dată calendaristică.Tipul TTime stocheată un timp.Componenta TDateTimePicker furnizează utilizatorului posibilitatea de
alegere în mod sugestiv (dintr-un calendar cu ajutorul mouse-ului) a unei date sau a unui timp.
Pe lângă aceste obiecte, unitul System.pas pune la dispoziţia programatorului o gamă completă de funcţii pentru manipularea datelor şi timpurilor.
24.1. TDate
Este un tip care codifică o dată calendaristică (zi, lună, an). în unitul system.pas este definit astfel:
type TDate = TDateTime;
24.2. TTime
Este un tip care codifică un moment din zi (oră, minut, secundă, milisecundă). în unitul system.pas este definit astfel:
type TTime = TDateTime;
24.3. TDateTime
Este un tip care codifică o dată calendaristică (lună, zi, an), un moment din timpul zilei (oră, minut, secundă, milisecundă) împreună cu funcţiile care prelucrează aceste valori.
Intern, o valoare TDateTime esle reprezentată de o variabilă double. Partea întreagă reţine data, iar partea fracţionară reţine timpul. Mai precis, în
356
partea întreagă este reţinut numărul de zile care au trecut de la data de 12/30/1899.
Spre exemplu, data de 21 May 2001 este reţinuta ca valoarea 37032. Putem obţine data calendaristică reprezentată de o valoare întreagă
executând următorul cod:
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
data : TDate; b e g i n
data := StrToInt (Editl .Text) ; //in cutia Editl se afla numărul intreg dorit ShowMessage(DateToStr(data));
e n d ;
în partea fracţionară este reţinut cât la sută au trecut din cele 24 de ore ale unei zile. Acest procent este calculat la nivel de milisecunde:
c o n s t MSecsPerDay = 24 * 60 * 60 * 1000;Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) /
MSecsPerDay;Următorul cod transformă un număr real cuprins între 0 şi 1 într-un timp
stocat într-o variabilă TDateTime pe care apoi îl afişează.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
data : TTime; b e g i ndata ;= StrToFloat(Editl.Text);ShowMessage(TimeToStr(data) ) ;
e n d ;
24.4. Operatori aritmetici şi relaţionali
Deoarece valorile de tip dată/timp sunt stocate sub formă de valori double, pentru manipularea acestor variabile pot fi folosiţi operatorii aritmetici uzuali (+, -).
Atenţie
Folosirea operatorilor aritmetici implică respectarea regulilor de stocare a variabilelor dată/timp.
Astfel, dacă se doreşte mărirea cu o zi a unei date, atunci se adaugă o unitate la valoarea respectivă:
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
t : TDate;
357
b e g i nt : = Date; //fu n c ţia Date returnează data curenta ShowMessage (DateToStr (t)) t t + 1;ShowMessage(DateToStr(t)) ;
e n d ;
Astfel, dacă se doreşte mărirea cu o secundă a unui timp, atunci se adaugă o valoarea 1000/MSecsPerDay:
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
t : TTime; b e g i n
t : = Time; // funcţia Time retumeaza ora curenta ShowMessage(TimeToStr(t)); t := t + 1000/MSecsPerDay;// am adaugat aceasta valoare deoarece // o secunda are 1000 de milesecunde ShowMessage(TimeToStr(t));
e n d ;
De asemenea pentru a compara două variabile dată/timp pot fi folosiţi operatorii relaţionali uzuali (=, <, >, o , >=, <=)•
Exemplu:
! Următoarea aplicaţie compară două date calendaristice şi afişează unmesaj sugestiv referitor la relaţia dintre ele. Datele sunt citite cu ajutorul unei componente TDateTimePicker care va fi prezentată mai jos în acest capitol.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
o b j e c t Buttonl: TButton Caption = 'Compara'
e n do b j e c t DateTimePickerl: TDateTimePicker DateFormat = dfshort DateMode = dmComboBox Kind = dtkDate
e n do b j e c t DateTimePicker2: TDateTimePicker DateFormat = dfshort DateMode = dmComboBox Kind = dtkDate
e n d
Handlerul de evenimente al obiectului Buttonl este:
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r
dl, d2 : integer;
358
b e g i ndl := trunc(DateTimePickerl.Date); // vom lua doar partea reprezentând data <3.2 := trunc (DateTimePicker2 .Date) ; i f dl < d2 t h e n ShowMessage('<1) e l s e i f dl = d2
t h e n ShowMessage('=') e l s e ShowMessage('>');
e n d ;
24.5. Funcţii şi proceduri
în cele ce urmează sunt prezentate o serie de funcţii şi proceduri utile lucrului cu variabile de tip TDateTime (respectiv TDate şi TTime).
FI. D ate
function Date: TDateTime;
Returnează data curentă.
F2. Time
function Time: TDateTime;
Returnează timpul curent.
F3. Now
function Now: TDateTime;
Returnează data şi timpul curent.
F4. IncMonth
function IncMonth(const Date: TDateTime;NumberOjMonths: Integer): TDateTime;
Adaugă NumberOjMonths la data Date şi returnează noua dată rezultată. NumberOfMonths poate fi şi negativă semnificând întoarcerea la o dată precedentă lui Date.
F5. IsLeapYear
function IsLeapYear(Year. Word): Boolean;
Returnează true dacă anul Year este an bisect.
359
procedure DecodeTime(77we: TDateTime;var Hour, Min, Sec, MSec: Word);
Decodifică timpul stocat în obiectul Time în valorile componente: oră (hour), minut (min), secundă (sec) şi milisecundă (msec).
F7. EncodeTime
function EncodeTime(//owr, Min, Sec, MSec: Word): TDateTime;
Codifică valorile Hour, Min, Sec, MSec într-un obiect TDateTime pe care îl returnează.
F8. DecodeDateprocedure DecodeDate(£toe: TDateTime;
var Year, Month, Day: Word);
Decodifică data stocată în obiectul Date în valorile componente: an (year), lună (month) şi zi (day).
F9. EncodeDate
function EncodeDate( Year, Month, Day: Word): TDateTime;
Codifică valorile Year, Month, Day într-un obiect de tip TDateTime pe care îl returnează.
FIO. StrToTime
function StrToTime(const S: string): TDateTime;
Converteşte o valoare şir de caractere care conţine valori pentru oră, minut, secundă, milisecundă, într-un obiect TDateTime.
F I I . TimeToStr
function TimeToStr(T/me: TDateTime): string;
Converteşte timpul Time într-un şir de caractere şi returnează rezultatul. Şirul returnat va conţine ora, minutul şi secunda.
F12. StrToDate
function StrToDate(const S: string): TDateTime;
Converteşte o valoare şir de caractere care conţine valori pentru an, lună, zi, într-un obiect TDateTime.
F6. DecodeTime
360
F13. DateToStr
function DateToStr(£toe: TDateTime): string;
Returnează data curent stocată în obiectul D ate , sub forma unui şir de caractere.
F14. StrToDateTime
function StrToDateTime(const S: string): TDateTime;
Converteşte o valoare şir de caractere care conţine valori pentru an, lună, zi, oră, minut, secundă, milisecundă, într-un obiect TDateTime.
F15. DateTimeToStr
function DateTimeToStr(Datfe77me: TDateTime): string;
Returnează data şi timpul stocate în obiectul DateTime sub forma unui şir de caractere.
F16. DayOfWeek
function DayOfWeek (Date: TDateTime): Integer;
întoarce ziua din săptămână pentru data specificată în variabila Date. Prima zi din săptămână este considerată Duminică. Valorile returnate de funcţie sunt numere întregi în intervalul 1..7.
Exemplu:
Următoarea aplicaţie afişează ziua curentă din săptămână sub forma unui şir de caractere conţinând numele zilei.
procedure TForml.ButtonlClick(Sender: TObject); var
d: TDateTime;zile: array[1..7] of string;
beginziletl] := 'Duminica'; zile[2] := 'Luni'; zile[3] := 'Marti'; zile[4] := 'Miercuri'; zile [5] := 'Joi ' zile[6] := 'Vineri'; zile[7] := 'Sambata';ShowMessage('Astăzi este ' + zile[DayOfWeek(Now)]);
end;
361
24.6. TDateTimePicker
Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TDateTimePicker.
Definit în_____________________________________________________
com ctrls.pas
Pagina ______________________________________________
Win32
Proprietăţi___________________________________________________
PI. CalColors
property CalColors: TMonthCalColors;
Indică culorile folosite pentru fiecare parte din calendar. Clasa TMonthCalColors are următoarele proprietăţi: MonthBackColor, TextColor, TitleBackColor, TitleTextColor, TrailingTextColor care
I indică culorile pentru fundalul principal (acolo unde sunt afişate datele),textul cu care aceste date sunt afişate (în cazul în care fac parte din luna curent selectată), fundalul de titlu (acolo unde sunt afişate numele lunii şi anul), textul de titlu (care indică numele Junii şi anul), textul cu care sunt afişate datele care nu fac parte din luna curent selectată.
Exemplu:
Următoarea aplicaţie setează culorile unui calendar. Pentru aceasta este folosită o componentă de tip TRadioGroup care are itemurile: MonthBackColor, TextColor, TitleBackColor, TitleTextColor şi TrailingTextColor.La apăsarea butonului Buttonl este afişată o fereastră de dialog (C olorD ialogl) pentru selectarea culorii. în funcţie de itemul selectat din RadioGroupl se vor schimba culorile diferitelor părţi ale componentei D ateTim ePickerl.
Valorile proprietăţilor obiectelor de pe forma Forml sunt:
object Buttonl: TButtonCaption = 'Schimba Culoarea1
endobject DateTimePickerl: TDateTimePicker
362
DateFormat = dfShort DateMode = dmComboBox Kind = dtkDate
endobject RadioGroupl: TRadioGroup
Caption = 'Culoare calendar'Items.Strings = (
'MonthBackColor''TextColor'’Ti tleBackColor''TitleTextColor''TrailingTextColor ')
endobject ColorDialogl: TColorDialog end
I landlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin
if C o lo r D ia lo g l . E x ecu te // daca a fost selectata o culoare then // si s-a apasat butonul okwith D a te T im e P ic k e r l .C a lC o lo r s do
case R a d io G ro u p l. I te m ln d e x of-1 : ShowMessage('Nici un item selectat');0 : MonthBackColor := ColorDialogl.Color;1 : TextColor := ColorDialogl.Color;2 : TitleBackColor := ColorDialogl.Color;3 : TitleTextColor := ColorDialogl.Color;4 : TrailingTextColor := ColorDialogl.Color;
end;end;
P2. Kind
property Kind : TDateTimeKind;
Indică dacă componenta TDateTimePicker este folosită ca selector de dată sau de timp. Valori posibile pentru TDateTimePicker sunt:
V a lo a re S em n ifica ţie
dtkTime C om ponen ta v a a fişa şi v a m anipu la ore.
dtkDate C om ponenta va afişa şi v a m anipu la date calendaristice.
P3. DateM ode
property DateMode : TDTDateMode;
Dacă valoarea lui DateM ode este dmComboBox, atunci componenta afişează (în*cazul în care Kind este setată la dktDate) un calendar din care utilizatorul poate selecta data dorită. Dacă valoarea lui DateM ode
363
este dm lfpDown, atunci componenta nu mai afişează calendarul prietenos, ci permite utilizatorului să selecteze data (sau timpul) cu ajutorul unei componente TUpDown.
P4. Date
property Date : TDate;
Indică data selectată de utilizator.
Exemplu:
Următoarea aplicaţie permite selectarea unei date calendaristice cu ajutorul componentei TDateTimePicker. La închiderea calendarului este afişat un mesaj cu data aleasă.
Fişierul .dfm conţine:
object DateTimePickerl: TDateTimePicker DateFormat = dfLong OnCloseUp = DateTimePickerlCloseUp
endHandlerul de evenimente este:procedure TForml.DateTimePickerlCloseUp(Sender: TObject); begin
if DateTimePickerl-Kind = dtkDatethen ShowMessage('Data selectata este:' +
DateToStr(DateTimePickerl.Date));end;
P5. Time
property T im e: TTime;
Indică timpul setat de către utilizator.
P6. DateTime
property DateTime : TDateTime;
Indică data şi timpul setate de către utilizator.
P7. M axDate
property M axD ate: TDate;
Indică data maximă până la care utilizatorul poate parcurge calendarul.
364
P8. M inDate
property M inD ate: TDate;
Indică data minimă de la care utilizatorul poate parcurge calendarul.
P9. DateFormat
property DateForm at: TDTDateFormat;
Indică modul în care este afişată o dată. Valori posibile pentru DateForm at sunt:
V a lo a re ' S em n ifica ţie
DfShort Pentru afişare se fo loseşte form atul scurt (ex. 7/11/2001).
DfLong Pentru afişare se fo loseşte form atul lung (ex. 7 no iem brie 2001).
Evenimente______________________________________________ ___
E l. OnChange
property OnChange : TNotifyEvent;
Apare când utilizatorul selectează o dată sau un timp nou.
E2. OnDropDown
property OnDropDown: TNotifyEvent;
Apare când este afişat calendarul din care utilizatorul îşi poate selecta o dată.
E3. OnCloseUp
property OnCloseUp : TNotifyEvent;
Apare când calendarul din care utilizatorul îşi selectează o dată este închis.
Exemplul 1:
Să reluăm aplicaţia construită mai sus în care foloseam două componente TDateTimePicker pentru compararea a două date calendaristice. Acolo foloseam un buton care declanşa compararea celor două date. Acum vom folosi în locul butonului evenimentul OnCloseUp al celei de a doua componente TDateTimePicker.
365
Noul handler de evenimente va fi:
procedure TForml.DateTimePicker2CloseUp(Sender: TObject);var dl, d2 : integer;
begindl := trunc (DateTimePickerl .Date) ; / / vom lua doar partea d2 := trunc (DateTimePicker2 . Date) ; // reprezentând data if dl < d2 then ShowMessage('<') else if dl = d2
then ShowMessage (.’ = ') else ShowMessage(’>');
end;
Exemplul 2:
Următoarea aplicaţie calculează numărul de zile care au trecut de la naşterea unui om până la o dată specificată de utilizator.Vom folosi două componente TDateTimePicker în care vom introduce cele două date: data naşterii (în D ateTim ePickerl) şi data curentă (în DateTim ePickerl).
procedure TForml.DateTimePicker2CloseUp(Sender: TObject); begin
ShowMessage(IntToStr(trunc(DateTimePicker2.Date-DateTimePickerl.Date)) + ' zile');
end;
Exemplul 3:
Următoarea aplicaţie calculează cu câte zile este mai mare o persoană decât cealaltă.Vom folosi două componente TDateTimePicker în care vom introduce cele două date: data naşterii primei persoane (în DateTim ePickerl) şi data naşterii celei de a doua persoane (în DateTimePicker2).
Proprietăţile obiectelor de pe formă sunt:
object Labell: TLabel Left = 56 Top = 104 Width = 143 Height = 13Caption = ’Data de naştere a persoanei 1'
endobject Label2: TLabel
Left = 328 Top = 104 Width = 143 Height = 13Caption = 'Data de naştere a persoanei 2'
end
366
object DateTimePickerl: TDateTimePicker Left = 56 Top = 120DateFormat = dfLong
endobject DateTimePicker2: TDateTimePicker
Le f t = 328 Top = 120DateFormat = dfLong
endobject Buttonl: TButton
Left = 240 Top = 224 Width = 7 5 Height = 25 Caption = 'Cate Zile?'OnClick = ButtonlClick
endHandlerele de evenimente sunt:
uses DateUtils;procedure TForml.ButtonlClick(Sender: TObject); begin
ShowMessage(IntToStr(DaysBetween(DateTimePickerl.Date, DateTimePicker2.Date)) +
end;zile');
367
25. GRIDURI
Grid-urile sunt componente care permit afişarea informaţiei într-o formă tabelară. Unitatea de bază a unui grid este celula. Un grid are o parte fixă şi o parte care poate fi defilată. Partea fixă constă dintr-un număr de celule aflate în stânga şi în partea de sus a grid-ului. Celulele fixe sunt specificate prin intermediul proprietăţilor FixedCols şi FixedRows. Accesarea celorlalte celule se poate face fie prin intermediul proprietăţii Cells (a componentei TStringGrid) fie cu ajutorul metodei CellRect (a componentei TDrawGrid) care returnează dreptunghiul ce înconjoară celula.
într-o celulă a unui grid se poate desena un grafic (componenta TDrawGrid) sau se poate afişa un text (componenta TStringGrid).
25.1. TCustomGrid
Este clasa de bază care defineşte comportamentul primar al grid-urilor.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGrid
Definit în_____________________________________________________
grids.pas
Proprietăţi___________________________________________________
PI. Col
property Col: Longint;
Indică numărul de ordine al coloanei care conţine celula selectată.
P2. Row
property Row: Longint;
Indică numărul de ordine al liniei care conţine celula selectată.
368
P3. ColCount
property ColCount: Longint;
Indică numărul de coloane ale unui grid.
P4. RowCount
property RowCount: Longint;
Indică numărul de linii ale unui grid.
Observaţie:
Folosind proprietăţile RowCount şi ColCount se poate modifica structura unui grid. Coloanele se vor adăuga sau şterge în partea dreaptă a gridului. Liniile vor fi adăugate sau şterse din partea de jos a grid-ului.
P5. DefaultColWidth
property DefaultColWidth: Integer;
Indică lăţimea implicită a coloanelor gridului. Lăţimea unei anumite coloane se poate modifica folosind proprietatea ColWidths.
P6. DefaultRowHeight
property DefaultRowHeight: Integer;
Indică înălţimea implicită a liniilor gridului. înălţimea unei anumite linii se poate modifica folosind proprietatea RowHeights.
P7. ColWidths
property ColWidths[/«de;c Longint]: Integer;
Indică lăţimea în pixeli a celulelor fiecărei coloane din grid.
P8. RowHeights
property RowHeights[/rcefex: Longint]: Integer;
Indică înălţimea în pixeli a celulelor fiecărei linii din grid.
P9. EditorM ode
property EditorMode: Boolean;
Indică dacă conţinutul celulei curente se poate edita.
369
P 10 .
P il.
P12.
P13.
P14.
P15.
FixedColor
property FixedColor: TColor;
Specifică culoarea celulelor fixe ale gridului.
FixedCols
property FixedCols: Integer;
Indică numărul celulelor fixe din marginea stângă a gridului. Aceste celule nu pot fi defilate.
FixedRows
property FixedRows: Integer;
Indică numărul celulelor fixe din partea de sus a gridului. Aceste celule nu pot fi defilate.
Options
property Options: TGridOptions;
Reprezintă un set de opţiuni care definesc comportamentul unui grid. Tipul TGridOptions este definit astfel:
TGridOptions = set of TGridOption;
iar tipul TGridOption este definit:
TGridOption = (goFixedVertLine, goFixedHorzLine,goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving, goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor, goThumbTracking);
LeftCol
property LeftCol: Longint;
Indică numărul de ordine al celei mai din stânga coloane vizibile.
TopRow
property TopRow: Longint;
Indică numărul de ordine al celei mai de sus linii vizibile.
370
P16. ScrollBars
property ScrollBars: TScroilStyle;
Indică tipul barei de defilare folosită pentru a defila celulele unui grid. Valori posibile pentru ScrollBars sunt:
V a lo a re S em n ific a fie
ssNone G rid-ul nu are nici o bară de defilare.
ssHorizontal G rid-ul are o bară orizontală de defilare.
ssVertical G rid-ul are o bară v erticală de defilare.
ssBoth G rid-ul are o bară o rizon tală şi o bară verticală pen tru defilare.
P17. Selection
property Selection: TGridRect;
Specifică marginile selecţiei curente de celule în grid.Tipul TGridRect este definit astfel:
TGridRect = record case Integer of
0: (Left, Top, Right, Bottom: Longint);1: (TopLeft, BottomRight: TGridCoord);
end;
In primul caz se indică numerele de ordine ale primei coloane, primei linii, ultimei coloane, ultimei linii ale selecţie curente.In al doilea caz se indică coordonatele colţurilor din stânga sus şi dreapta jos ale selecţiei curente de celule. Tipul TGridCoord este definit astfel:
TGridCoord = record X: Longint;Y : Longint;
end;
Exemplul 1:
Următoarea aplicaţie calculează suma numerelor înscrise în selecţia de celule a componentei TStringGrid curente. Utilizatorul poate edita conţinutul fiecărei celule.
procedure TForml.ButtonlClick(Sender: TObject);var i , j , s : integer;
begin s : = 0 ;
371
with StringGridl dofor i := Selection.Top to Selection.Bottom do
for j := Selection.Left to Selection.Right do s := s + StrToInt(Cells [j, i]);
ShowMessage(IntToStr(s)); end;
25.2. TDrawGrid
Este o componentă care permite afişarea de informaţie în formă tabelară. Accesarea unei celule a gridului se face prin intermediul metodei CellRect care returnează dreptunghiul ce înconjoară celula. Folosind proprietatea Canvas se poate desena în interiorul unei celule.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGrid ->TDrawGrid.
Definit în_____________________________________________________
grids
Pagina ___________________
Additional
Metode
M l. CellRect
function CellRect(ACol, ARow. Longint): TRect;
Returnează coordonatele ecran ale celulei de la intersecţia liniei ARow şi coloanei ACol. Dacă celula respectivă nu este vizibilă se returnează un dreptunghi vid.
M2. MouseToCell
procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
Returnează în perechea (ARow, ACol) coordonatele celulei aflate în poziţia (X, Y) faţă de colţul din stânga sus al grid-ului.
372
Evenimente
E l. OnDrawCell
property OnDrawCell: TDrawCellEvent;
Apare când o celulă trebuie redesenată. Operaţia de redesenare se realizează folosind canvas-ul grid-ului. Tipul TDrawCellEvent este definit astfel:
TDrawCellEvent = procedure (Sender: TObject;ACol, ARow: Longint; Rect: TRect;State: TGridDrawState) of object;
unde:
• ACol şi ARow reprezintă indicii celulei care trebuie redesenată.• Rect este dreptunghiul care mărgineşte celula.• State indică starea celulei. Valorile posibile pentru State sunt din
următoarea mulţime:
V a lo a re S em n ifica ţie
g oSelected C elu la este selectată.
goFocused C elu la are focus.
goFixed C elu la este fixă.
E2. OnSelectCell
property OnSelectCell: TSelectCellEvent;
Apare când o celulă este selectată. Tipul TSelectCellEvent este definit astfel:
TSelectCellEvent = procedure (Sender: TObject;ACol, ARow: Longint;var CanSelect: Boolean) of object;
CanSelect trebuie setat la valoare true dacă celula din poziţia {ARow, ACol) poate fi selectată şi false în caz contrar.
Exemplul 1:
Următoarea aplicaţie permite selectarea căsuţelor pentru care suma dintre coloana şi linia pe care se află este un număr impar.
procedure TForml.StringGridlSelectCell(Sender: TObject;ACol, ARow: Integer; var CanSelect: Boolean);
begini f (ACol + ARow) mod 2 = 0
373
then CanSelect := false eise CanSelect := true;
end;
E3. OnGetEditText
property OnGetEditText: TGetEditEvent;
Apare când este dorită valoarea conţinută în celula aflată la intersecţia liniei ARow cu coloana ACol. Tipul TGetEditEvent este definit astfel:
TGetEditEvent = procedure {Sender. TObject;ACol, ARow: Longint; var Value: String) of object;
Value reprezintă textul conţinut în celula (ARow, ACol).
E4. OnSetEditText
property OnSetEditText: TSetEditEvent;
Apare când utilizatorul editează textul dintr-o celulă. Tipul TSetEditEvent este definit astfel:
TSetEditEvent = procedure (Sender: TObject;ACol, ARow: Longint; const Value: String) of object;
Value reprezintă textul conţinut în celula (ARow, ACol).
Exemplul 2:
Următoarea aplicaţie calculează suma numerelor de pe fiecare linie şi fiecare coloană a unei componente TStringGrid şi le afişează în liniile respectiv coloanele fixe ale acestei componente. Utilizatorul poate introduce noi valori în celulele StringGrid-uhii. Sumele de pe linii şi coloane vor fi recalculate în momentul în care utilizatorul schimbă valoarea introdusă într-o celulă.
Valorile proprietăţilor obiectelor de pe forma Form l sunt:
object StringGridl: TStringGridOptions = [goFixedVertLine, goFixedHorzLine, goVertLine,
goHorzLine, goRangeSelect, goEditing]endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:
procedure TForml.FormCreate(Sender: TObject);var i, j : integer;
begin/ / in itia l toa te căsuţele su n t 0for i := 0 to StringGridl.RowCount - 1 do
for j := 0 to StringGridl.ColCount - 1 do
374
procedure TForml.StringGridlSetEditText(Sender; TObject;ACol, ARow: Integer; const Value: String);
var s, i : integer; begin
/ / calculez sum a p e linia A R owS : = 0 ;
for i := 1 to StringGridl.ColCount - 1 do try
s := s + StrToInt(StringGridl.Cells[i, ARow]); except
on EConvertError do ; end;
.StringGridl.Cells[0, ARow] := IntToStr(s );/ / calcu lez sum a pe co loana AColS : = 0 ;
for i := 1 to StringGridl.RowCount - 1 do try
s := s + StrToInt(StringGridl.Cells[ACol, i ]); except
on EConvertError do ; end;
StringGridl.Cells[ACol, 0] := IntToStr(s); end;
StringGridl.Cells[j, i] := IntToStr(0);end ;
25.3. TStringGrid abc
Este o componentă care permite afişarea de text într-o formă tabelară. Accesarea unei celule se face cu ajutorul proprietăţii Cells.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGrid ->TDrawGrid ->-> TStringGrid
Definit în_____
grids.pas
Pagina_______
Additional
375
Proprietăţi
PI. Cells
property Cells [ACol, ARow: Integer]: string;
Furnizează acces la textul din fiecare celulă a unui grid. ACol indică coloana pe care se găseşte celula, iar ARow indică linia pe care se află celula. Prima linie şi prima coloană au indexul 0.
Exem plul 1:
Următoarea aplicaţie afişează în fiecare celulă a unei componente TStringGrid suma indecşilor liniei şi coloanei pe care se află căsuţa respectivă. In căsuţele fixe este afişat textul 'Linia x', respectiv ’Coloana
/ •procedure TForml.ButtonlClick(Sender: TObject);
var i , j : integer; begin
with StringGridl do begin
// completam coloana fixafor i := 0 to RowCount - 1 do
Cells[0, i] := 'Linia ' + IntToStr(i);
II completam linia fixafor j := 1 to ColCount - 1 do
Cellstj, 0] := 'Coloana ' + IntToStr(j);
// completam restul celulelor for i := 1 to RowCount - 1 do
for j := 1 to ColCount - 1 do Cellstj, i] := IntToStrfi + j);
end;end;
P2. Cols
property Coh[Index: Integer]: TStrings;
Furnizează acces la lista de şiruri din fiecare coloană a unui grid.P3. Rows
property Rows [Index: Integer]: TStrings;
Furnizează acces la lista de şiruri din fiecare linie a unui grid.
376
Exem plul 2:
Următoarea aplicaţie afişează într-o cutie de editare multilinie (M em ol) şirurile din linia curent selectată a componentei Strin gG rid l. Şirurile sunt afişate câte unul pe fiecare linie.
procedure TForml.StringGridlSelectCell(Sender: TObject;ACol, ARow: Integer; var CanSelect: Boolean);
beginMemol.Lines.Assign(StringGridl.Rows[ARow]);
end;
Exem plul 3:
Se consideră două matrici. Se cere să se afişeze produsul lor.Vom considera fiecare matrice ca fiind reprezentată printr-o componentă StringGrid. Deci vom avea pe forma Form l trei componente StringGrid: una corespunzătoare primei matrice, o alta corespunzătoare celei de-a doua matrice şi o a treia pentru matricea produs. Vom mai considera şi patru cutii de editare în care vom introduce dimensiunile (numărul de linii şi numărul de coloane) celor două matrice considerate. Vom mai folosi şi două butoane. Primul buton numit A p lică " are rolul de a seta dimensiunile celor două componente StringGrid corespunzătoare matricelor iniţiale. La apăsarea acestui buton se va afişa un mesaj corespunzător dacă numărul de linii ale primei matrice este diferit de numărul de coloane ale celei de-a doua matrice (condiţie necesară pentru a se putea efectua produsul a două matrici). Dacă datele introduse sunt corecte, la apăsarea acestui buton se vor seta dimensiunile celor trei StringGrid - uri.La apăsarea celui de-al doilea buton se va afişa în cel de-al treilea StringGrid produsul rezultat din înmulţirea matricelor reprezentate în StringGridurile 1 şi 2.
Proprietăţile obiectelor de pe forma Form l sunt:
object StringGridl: TStringGrid ColCount = 2 FixedCols = 0 RowCount = 1 FixedRows = 0Options = [goFixedVertLine, goFixedHorzLine, goVertLine,
goHorzLine, goRangeSelect, goEditing, goAlways ShowEditor]
endobject StringGrid2: TStringGrid
ColCount = 2 FixedCols = 0 RowCount = 2 FixedRows = 0
377
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goAlwaysShowEdi tor]
object StringGrid3: TStringGrid FixedCols = 0 FixedRows = 0Options = [goFixedVertLine, goFixedHorzLine, goVertLine,
goHorzLine, goRangeSelect, goEditing]
end
endobj ect Editl: TEditendobj ect Edit2: TEditendobj ect Edit3: TEditendobject Edit4: TEditendobj ect BitBtn].; TBitBtn
Caption = 'Calculeaza produs1 OnClick = BitBtnlClick
endobject BitBtn2: TBitBtn
Caption = 'Aplica'OnClick = BitBtn2Click
endHandlerele de evenimente ale obiectelor de pe forma F orm l sunt:
procedure citire_matricel; var
i,j : integer; begin
Forml.StringGridl.Refresh;for i := 0 to Forml.StringGridl.ColCount - 1 do
for j := 0 to Forml.StringGridl.RowCount - 1 doa[i,j] := StrToInt(Forml.StringGridl.Cells[i,j ]);
end;procedure citire_matrice2; var
i,j : integer; begin
Forml.StringGrid2.Refresh;for i := 0 to Forml.StringGrid2.ColCount - 1 do
for j : = 0 to Forml. StringGrid2 . RowCount 1 dob[i,j] := StrToInt (Forml. StringGrid2 . Cells [i, j ]) ,-
end;procedure TForml.BitBtnlClick(Sender: TObject); var
i,j,k ; integer; begin
citire_matricel ,- citire_matrice2 ,-
378
Forml.StringGrid3.Refresh; for i := 0 to StringGridl.ColCount - 1 do
for j := 0 to StringGrid2.RowCount - 1 do begin
c [ i , j ] ; = 0 ;for k := 0 to StringGridl.ColCount - 1 do
c[i,j] := c[i,j] + a[i,k] * b [ k , j ] ;end;
for i := 0 to StringGridl.ColCount - 1 do for j := 0 to StringGrid2.RowCount - 1 do
Forml.StringGrid3.Cells[i,j] : = IntToStr(c[i,j]);
end;
procedure TForml.BitBtn2Click(Sender: TObject); begin
Forml.StringGridl.ColCount := StrToInt(Forml.Editl.Text);Forml.StringGridl.RowCount := StrToInt (Forml. Edit2 . Text) ,- Forml.StringGrid2.ColCount := StrToInt(Forml.Edit3.Text);Forml.StringGrid2.RowCount := StrToInt(Forml.Edit4.Text);if Forml.Editl.Text o Forml.Edit4.Textthen
ShowMessage('Nu se poate efectua inmultirea! Numărul de '+ ' linii ale primei matrici trebuie sa fie egal cu '+' numărul de coloane al matricii a doua.')
else beginForml.StringGrid3.RowCount :=
Forml.StringGrid2.RowCount;Forml.StringGrid3.ColCount :=
Forml. StringGridl. ColCountend;
end;
379
26. TScreen
Reprezintă starea ecranului în care rulează aplicaţia curentă. Toate proprietăţile, metodele şi evenimentele acestei componente se referă doar la aplicaţia curentă chiar dacă în sistem mai rulează alte aplicaţii care, la rândul lor, au forme, controale, etc. active.
Proprietăţi___________________________________________ ________
P I. Forms
property Forms [Index: Integer]: TForm;
Este un vector care conţine toate formele aplicaţiei. Prima formă are indexul 0. Este posibil ca unele forme să fie create la timpul execuţiei aplicaţiei. Aceste forme vor intra în calcul doar din momentul în care vor fi instanţiate şi până în momentul în care vor fi distruse.
P2. FormCount
property FormCount: Integer;
Indică numărul formelor aplicaţiei. Această proprietate este folosită împreună cu Forms pentru a manipula toate formele unei aplicaţii. Următoarea aplicaţie constă din două forme. Pe prima formă se află un buton şi o cutie de editare multiline. La apăsarea butonului se vor afişa informaţii despre cele două forme (şi anume titlul, înălţimea şi lăţimea):
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;
beginMemol.Clear;Memol.ScrollBars:=ssVertical ; for i := 0 to Screen.FormCount-1 do begin
Memol.Lines.Add(Screen.Forms[i].Caption);Memol. Lines . Add (IntToStr (Screen. Forms [ .i ] . Height) ) ;Memol.Lines.Add(IntToSt r (Screen.Forms[i] .Width));
end; end;Observăm (din informaţiile afişate de căsuţa de editare multilinie) că nu contează dacă forma a doua este sau nu afişată. Să facem o aplicaţie în care să conteze acest lucru, mai precis să creăm o formă la timpul
380
execuţiei aplicaţiei. Pentru aceasta mai folosim un buton la a cărui apăsare să creăm o nouă formă.Mai întâi, apăsăm primul buton pentru a ne afişa informaţiile despre formele existente. Observăm că doar prima formă este recunoscută. Apăsăm şi cel de al doilea buton. O nouă formă este creată. Acum apăsăm din nou primul buton şi observăm că în cutia de editare multilinie vor apărea informaţii despre două forme:
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;
beginMemol.Clear;Memol.ScrollBars:=ssVertical ; for i := 0 to Screen.FormCount-1 do begin
Memol.Lines.Add(Screen.Forms[i].Caption);Memol.Lines.Add(IntToStr(Screen.Forms[i].Height));Memol.Lines.Add(IntToStr(Screen.Forms[i].Width));
end; end;
procedure TForml.Button2Click(Sender: TObject);var Form2:TForm;
beginForm2:=TForm.Create(Application);Form2.Left:=100;Form2.Top:=100;Form2.Width:=100 ;Form2.Height: =100 ;Form2.Caption:=1blabla' ;Form2.Name:='Form2';Form2 .Visible:=true;
end;
Evident, cu ajutorul lui Forms şi FormCount pot fi modificate proprietăţile unei forme. Următorul exemplu modifică titlul şi lăţimea primei forme din Forms'.
procedure TForml-ButtonlClick(Sender: TObject); begin
Screen.Forms[0].Caption:= 'Noul titlu';Screen.Forms[0].Width:=Screen.Forms[0].Width div 2;
end;
P3. ActiveForm
property ActiveForm: TForm;
Reprezintă forma activă (cea care are focus) a aplicaţiei. Este tot o proprietate Read-Only, deci nu se i se poate atribui nici o valoare. Schim
381
barea formei active se poate face prin intermediul metodei SetFocus. La schimbarea formei active apare evenimentul OnActiveFormChange.
P4. CustomForms
property CustomForms[/ndex: Integer]: TCustomForm;
Este asemănătoate cu Forms dar, de data aceasta, sunt luate în calcul nu numai formele ci şi paginile de proprietăţi.
P5. CustomFormCount
property CustomFormCount: Integer;
Este asemănătoare cu FormCount dar, de data aceasta, pe lângă forme sunt numărate şi paginile de proprietăţi.
P6. ActiveCustomForm
property ActiveCustomForm: TCustomForm;
Conţine forma sau pagina de proprietăţi care are focus.
P7. DataM odules
property DataModules[/mfe*: Integer]: TDataModule;
Este lista cu modulele de date care sunt instantiate la un moment dat de către aplicaţie.
P8. DataM oduleCount
property DataModuleCount: Integer;
Indică numărul modulelor de date instanţiate la un moment dat de către aplicaţie.
P9. ActiveControl
property ActiveControl: TWinControl;
Indică care control este activ, adică are focus. Este tot o proprietate Read-Only, iar schimbarea controlului activ se poate face prin intermediul metodei FocusedControl. Evident, controlul activ se află pe ActiveForm. La schimbarea controlului Active Control apare evenimentul OnActiveControlChange.Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate diferite componente (care pot primi focus) printre care se află şi o cutie de
\K?
editare în care se va scrie numele componentei care are focus curent. Componenta TScreen fiind nevizuală, implementarea evenimentului OnActiveControlChange trebuie făcută manual, în cazul nostru prin intermediul procedurii SchimbaControl care are prototipul definit în secţiunea p rivate a clasei TForml astfel:
procedure TForml. SchimbaControl (Sender-.TObject) ; begin
Editl.Text:=Screen.ActiveControl.Name; end;
procedure TForml.FormCreate(Sender: TObject); begin
Screen.OnActiveControlChange:=SchimbaControl; end;
P10. Cursors
property Cursors [Index: Integer]: HCursor;
Este un vector cu toate cursoarelor disponibile aplicaţiei. Un nou cursor poate fi adăugat acestei liste în felul următor:
a. Creaţi un cursor folosind editorul de cursoare (spre exemplu: Im age E d ito r ).
b. în vectorul Cursors stabiliţi-i poziţia astfel încât să nu intre în conflict cu alte cursoare deja existente.
c. Obţineţi un handle la el folosind funcţia API LoadCursor care are doi parametrii: primul este un handle la instanţa aplicaţiei, iar al doilea este numele care identifică cursorul.
constcrMyCursor = 5 ;
procedure TForml.FormCreate(Sender: TObject) ,- begin
Screen.Cursors[crMyCursor] :=LoadCursor (Hlnstance, 'NewCursor' ) ,-
Cursor := crMyCursor; end;
P i l . Cursor
property Cursor: TCursor;
Reprezintă cursorul aplicaţiei. Dacă această proprietate este setată la crDefault atunci diferite componente vor putea avea tipul de cursor propriu.De exemplu, la apăsarea butonului Buttonl, cursorul aplicaţiei va fi setat la crHelp. Chiar dacă cursoarele diferitelor componente au alte valori, va fi afişat doar cursorul de help:
383
procedure TForml.ButtonlClick(Sender: TObject); begin
Screen.Cursor:=crHelp; end;
P12. Fonts
property Fonts: TStrings;
Este lista cu toate numele de fonturi disponibile în sistem.
Exem plul 1:
Următoarea aplicaţie ne returnează lista cu toate fonturile disponibile în sistem. Pentru aceasta avem nevoie de o cutie de editare multilinie în interiorul căreia vom scrie numele fonturilor (câte unul pe linie) şi un buton la a cărui apăsare declanşăm operaţia de detectarea fonturilor. Deci handlerul de evenimente pentru acel buton este:
procedure TForml.ButtonlClick(Sender: TObject); begin
Memol.Lines;=Screen.Fonls; end;
Exem plul 2:
Următoarea aplicaţie afişează u text folosind diferite fonturi. Pentru aceasta avem nevoie de un ComboBox în care să punem toate numele de fonturi şi din care apoi să alegem ce font dorim, de o componentă TLabel la care să-i schimbăm proprietatea Font şi de un buton la a cărui apăsare să iniţializăm datele cu ce ne este necesar:
procedure TForml.ButtonlClick(Sender: TObject); begin
ComboBoxl.Style:=csDropDownList;ComboBoxl.Items :=Screen.Fonts;Labell.Caption;='Acesta este un test';
end;procedure TForml.ComboBoxlChange(Sender: TObject); begin
Labell.Font.Name:=ComboBoxl.Items.Strings[ComboBoxl.Itemlndex];
end;
P13. Heigth
property Height: Integer;
Indică înălţimea ecranului aplicaţiei în număr de pixeli.
384
P14. Width
property Width: Integer;
Indică lăţimea ecranului în număr de pixeli.
O bservaţie:
Aceste două proprietăţi pot fi folosite pentru redimensionarea ferestrelor astfel încât să încapă în ecran.
Metode______________________________________________________
M l. Create
constructor Create(A Owner. TComponent); override;
Crează o instanţă a lui TScreen. Nu apelaţi această metodă. Mai degrabă folosiţi variabila Screen, care este creată şi iniţializată de către mediu, tot prin intermediul metodei Create.
M2. Destroy
destructo r Destroy; override;
Este destructorul clasei. Nu apelaţi această metodă pentru variabila Screen deoarece Delphi face eliberarea resurselor utilizate.
Evenimente ______________________________________________
E l. OnActiveControlChange
property OnActiveControlChange: TNotifyEvent;
Este apelat imediat după ce focusul se mută la un alt control.
E2. OnActiveFormChange
property OnActiveFormChange: TNotifyEvent;
Apare imediat după ce focusul a fost schimbat la o altă formă. Acest eveniment este util doar într-o aplicaţie cu mai multe forme.
385
27. CLIPBOARDUL
Este un loc de stocare temporară a informaţiei rezultată în urma unei operaţii de tip Cut sau Copy. Orice tip de dată poate fi plasată în Clipboard. Această plasare este totuşi condiţionată de formatele de date pe care le cunoaşte Clipboardul. Obţinerea informaţiilor din acest container se face în urma unei operaţii de tip Paste. Un lucru important de reţinut în privinţa Clipboard-ului este faptul că conţinutul său nu se pierde decât la o nouă operaţie Cut sau Copy (când o altă informaţie este depusă în el) sau la resetarea Windows-ului.
Componenta TClipboard din Delphi încapsulează funcţiile Clipboard- ului Windows. Ea este definită în unitul clipbrd.pas care trebuie inclus de fiecare dată când se foloseşte această componentă non-vizuală. Acest unit mai oferă şi o funcţie C lipboard:
function Clipboard: TClipboard;
care returnează o instanţă a lui TClipboard. Delphi instanţiază un singur obiect Clipboard de fiecare dată când este necesară o operaţie de tip Cut, Copy sau Paste. Dacă aplicaţia nu a folosit niciodată Clipboardul atunci funcţia Clipboard crează o instanţă a lui TClipboard. Dacă aplicaţia a mai folosit şi înainte Clipboardul atunci funcţia Clipboard returnează anterioara instanţiere a lui TClipboard.
Observaţie:
Este indicat să folosiţi funcţia Clipboard decât să instanţiaţi un nou obiect a lui TClipboard.
Proprietăţi___________________________________________________
P I. AsText
property AsText: string;
întoarce sau setează conţinutul Clipboardului sub formă de şir de caractere care nu depăşeşte 255 de caractere. Această proprietate poate fi folosită atât pentru obţinerea conţinutului Clipboardului:
sir:=Clipboard. AsText;
cât şi pentru setarea conţinutului Clipboardului:
386
Clipboard. AsText:=sir;
Pentru a manipula şiruri mai mari de 255 de caractere folosiţi metodele SetTextBuf şi GetTextBuf
P2. Formats
property Formats!/nrfe.*: Integer]: Word;
Returnează numărul de formate distincte în care se găsesc datele disponibile în Clipboard la un moment dat. Este Read-Only.
P3. FormatCount
property FormatCount: Integer;
Indică numărul de formate ale vectorului Formats.
Metode__________________________________________________
M l. Assign
procedure Assign(& wce: TPersistent);
întoarce sau setează conţinutul Clipboardului. Această metodă este asemănătoare cu proprietatea AsText, dar în cazul de faţă se poate asigna orice tip de obiect care derivă din TPersistent. De exemplu, pentru a se copia o imagine în C lipboard executăm următoarea instrucţiune:
Clipboard. Assign(Bitmap);
iar pentru a obţine o imagine din Clipboard executăm următoarea instrucţiune:
Bitmap. Assign(Clipboard);
M2. Clear
procedure Clear;
Se şterge conţinutul Clipboardului. Metoda Clear este apelată ori de câte ori se face o operaţie de tip Cut sau Copy.
M3. Open
procedure Open;
Deschide Clipboardul pentru a permite copierea de date în el fără a
387
permite altor aplicaţii să le altereze. Această operaţie este utilă atunci când în Clipboard trebuie trimise pe rând mai multe item-uri de informaţie care nu sunt toate disponibile la un moment dat, iar în tot acest timp alte aplicaţii nu au voie să acceseze Clipboardul. După apelarea metodei Close alte aplicaţii au voie să acceseze Clipboardul.Nu este obligatorie folosirea procedurii Open , decât în cazul în care nu se doreşte ca alte aplicaţii să altereze conţinutul Clipboardului. Oricum, după apelarea lui Close, toate aplicaţiile îi pot manipula conţinutul.
M4. Close
procedure Close;
închide Clipboardul dacă este cumva deschis. După închidere, acesta poate fi accesat şi de către alte aplicaţii. Este posibil ca metoda Open să fie apelată de mai multe ori. în acest caz pentru ca Clipboardul să fie accesibil trebuie apelată metoda Close tot de atâtea ori de cât a fost apelată Open.
Exem plul 1:
Să facem o aplicaţie care are trei butoane. Primul (Buttonl) apelează metoda Open şi deci alte aplicaţii nu au voie să acceseze Clipboardul. Al doilea îl închide, adică apelează metoda Close, iar apoi afişează conţinutul lui. Al treilea buton (Button3) adaugă date în Clipboard. Datele care sunt adăugate sau afişate se iau din cutia de editare E ditl.
Handlerele de evenimente pentru cele trei butoane sunt următoarele:
procedure TForml.ButtonlClick(Sender: TObject); begin
Clipboard.Open; end;
procedure TForml.Button2Click(Sender: TObject); begin
Clipboard.Close;Editl.Text:=Clipboard.AsText;
end;
procedure TForml,Button3Click(Sender; TObject);var s :string;
begins :=Editl.Text;ClipBoard.SetTextBuf(Pointer(s));E ditl.dead
end;
388
Pentru o mai bună înţelegere a modului în care funcţionează acest exemplu v-aş ruga să lansaţi în execuţie şi aplicaţia ClipboardViewer din Start\Programs\Accessories. Pentru început facem click pe butonul Buttonl. In acest moment în ClipboardViewer apare mesajul Cannot open Clipboard deci conţinutul lui nu va putea fi accesat din alte aplicaţii. Pentru a vedea cum funcţionează Open-urile imbricate mai apăsăm încă o dată pe Buttonl. Apoi scriem ce dorim în E ditl şi apăsăm Button3. Textul este mutat în Clipboard, dar noi avem afişat mesajul Cannot open Clipboard. Apoi apăsăm de două ori pe Button2 (deoarece am deschis Clipboardul de două ori) şi mesajul Cannot open Clipboard va dispare din ClipboardViewer, în locul lui apărând textul scris de noi.
M5. GetBufSize
function GetTextBuf(Buffer. PChar; BufSize: Integer): Integer;
Returnează primele BufSize caractere din Clipboard în zona de memorie spre care indică variabila Buffer. Funcţia întoarce numărul de caractere copiate. Acest număr poate fi diferit de BufSize în cazul în care nu sunt suficiente caractere în Clipboard.
M6. SetTextBuf
procedure SetTextBuf(Ba//er: PChar);
Copiază zona de memorie spre care pointează Buffer în Clipboard.
Exemplul 2:
Să realizăm un exemplu care să pună în lumină folosirea acestor două metode. Pentru aceasta ne vom folosi de două butoane: primul, Buttonl, care mută conţinutul cutiei de editare E ditl în Clipboard şi al doilea buton, Button2, la a cărui apăsare conţinutul Clipboardului este copiat în E d itl .
Cele două handlere de evenimente sunt:
procedure TForml.ButtonlClick(Sender: TObject); var s:string;
beginS:=Editl.Text;Clipboard.SetTextBuf(Pointer(s));
end;
procedure TForml.Button2Click(Sender: TObject); var p :PChar;
beginp : =StrAlloc (10) ;Clipboard.GetTextBuf(p,10);
389
Editl.Text:=p; end;
Şi componentele pot fi mutate prin intermediul Clipboardului, şi anume:
M7. SetComponent
procedure SetComponent( Component: TComponent);
Copiază o componentă în Clipboard.
M8. GetComponent
function GetComponent(Owner, Parent: TComponent): TComponent;
Returnează o componentă aflată în Clipboard şi îi setează acesteia proprietăţile Owner şi Parent în conformitate cu valorile transmise ca parametru.
Atenţie!
Trebuie făcută distincţie între proprietatea Owner şi proprietatea Parent. Proprietatea Owner este setată, pentru o componentă oarecare, la valoarea parametrului transmis metodei Create a acesteia. De exemplu toate componentele de pe o formă sunt proprietatea formei, pe când proprietatea Parent a unei componente poate fi şi, de exemplu, un Panel.
Exem plul 3:
Următorul exemplu este o aplicaţie care conţine două forme, două butoane şi o cutie de editare (toate trei aflându-se pe forma F orm l). La apăsarea lui Buttonl cutia de editare E ditl este copiată în Clipboard, iar la apăsarea lui Button2 componenta TEdit din Clipboard este copiată pe forma Form2.
Handlerele de evenimente pentru cele două butoane sunt (nu uitaţi să includeţi uniturile ClipBrd şi Unit2):
procedure TForml.ButtonlClick(Sender: TObject); begin
Clipboard.SetComponent(Editl); end;procedure TForml.Button2Click(Sender: TObject);
var c:TComponent; begin
RegisterClass(TEdit);c :=Clipboard.GetComponent(Form2,Form2);Form2.Show;
390
en d ;
în exemplul de mai sus am folosit şi procedura RegisterClass. Este necesar acest lucru: de fapt este necesară înregistrarea oricărei clase care trebuie adusă din clipboard. în caz contrar este generată o excepţie din clasa EClassNotFound. înregistrarea unei componente nu face ca clasa componentei să fie înregistrată.
M9. HasFormat
function HasFormat(Forma?: Word): Boolean;
Returnează true dacă printre formatele în care se află datele din Clipboard se găseşte şi Format. Unele dintre valorile posibile pentru Format sunt: CF_TEXT, CF_BITMAP, CF_MET AFILEPICT, CF_PICTURE, CF_OBJECT.
391
28. TApplication
Este o clasă care încapsulează o aplicaţie WINDOWS. Metodele, proprietăţile acestei clase reflectă fundamentele stabile în Windows privitor la modul de a crea, distruge, menţine, etc. o aplicaţie. De aceea TApplication simplifică interfaţa dintre mediul Windows şi utilizator când acesta scrie aplicaţii pentru acest sistem. Fiecare aplicaţie Delphi instanţiază automat o variabilă numită Application de tip TApplication. Această componentă nu este vizuală (deci nu apare în ComponentPalette), dar, totuşi, unele dintre valorile proprietăţilor pot fi setate la momentul proiectării aplicaţiei din Project\ Options.
Ierarhie______________________________________________________
TO bject-> TPersistent- > TComponent- > TApplication
Proprietăţi___________________________________________________
PI. Active
property Active: Boolean;
Returnează true dacă aplicaţia este activă şi are focus. Active este setată la true în constructorul aplicaţiei. Proprietatea este Read-Only.
P2. ExeName
property ExeName: string;
Este numele aplicaţiei. Această proprietate este Read-Only. Valoarea ei se poate schimba dacă proiectul se salvează sub un alt nume iar apoi se recompilează.
P3. Handle
property Handle: HWND;
Furnizează accesul la handle-ul de fereastră al formei principale.
P4. HelpFile
property HelpFile: string;
392
Indică numele fişierului Help ataşat aplicaţiei. Valoarea acestei proprietăţi poate fi şi şirul vid, în acest caz apelul help-ului va fi ignorat. Este posibil ca o formă să aibă propriul ei help (proprietatea HelpFile a lui TForm). în cazul acesta este apelat helpul formei active şi nu helpul aplicaţiei.
P5. Hint
property Hint: string;
Specifică şirul de caractere care apare ca help hint când mouse-ul trece pe deasupra unei componente. Acest şir este afişat când apare evenimentul OnHint.
P6. HintColor
property HintColor: TColor;
Specifică culoarea cutiei în care apare afişat help hint-ul. Implicit este clInfoBk.
P7. HintHidePause
property HintHidePause: Integer;
Specifică intervalul de timp după care help hint-n\ nu va mai fi afişat dacă mouse-ul nu se mută de pe componenta respectivă. Implicit este două secunde şi jumătate.
P8. HintPause
property HintPause: Integer;
Este intervalul de timp care trebuie să treacă înainte ca help hint-u\ să fie afişat când mouse-ul se mută pe o componentă. Implicit este o jumătate de secundă.
P9. HintShortPause
property HintShortPause: Integer;
Indică intervalul de timp pe care sistemul de operare îl aşteaptă înainte ca să afişeze un nou help hint dacă unul a fost deja afişat. Acest lucru este util în momentul în care se trece repede cu mouse-ul de la o componentă la alta. Implicit este 50 de milisecunde.
393
P19. Icon
Este iconul aplicaţiei care va fi afişat în task-bar. Acest icon poate fi diferit de cel al formei principale a aplicaţiei.
property Icon: Tlcon;
P i l . MainForm
property MainForm: TForm;
Indică care formă este principală pentru aplicaţie. Valoarea acestei proprietăţi este setată la prima formă creată cu CreateForm. Această valoare nu poate fi modificată la momentul execuţiei ci doar la momentul proiectării aplicaţiei din Project\Options. Când forma principală este închisă aplicaţia se termină.
P12. ShowHint
property ShowHint: Boolean;
Indică dacă help hint-w[\e vor fi sau nu afişate în aplicaţie. Valoarea implicită este true.
P13. ShowMainForm
property ShowMainForm: Boolean;
Indică dacă aplicaţia (când se va lansa în execuţie) va afişa sau nu forma principală. Acest lucru este util la crearea serverelor OLE. Implicit este true.
P14. Terminated
property Terminated: Boolean;
Indică dacă aplicaţia a primit sau nu mesajul WM_QUIT care închide aplicaţia. Acest lucru este util în aplicaţiile care trebuie să execute multe calcule. în aceste cazuri este indicat să se apeleze Application.ProcessM essages şi Terminated, periodic, pentru a se vedea dacă trebuie sau nu abandonate calculele şi terminată aplicaţia.
P15. Title
property Title: string;
Indică şirul de caractere care apare în dreptul iconului aplicaţiei când aceasta este reprezentată în task-bar. Acest şir poate fi diferit de
394
proprietatea Caption a formei principale a aplicaţiei. Valoarea acestei proprietăţi este luată din modulul EXE. La momentul proiectării aplicaţiei valoarea ei poate fi setată din Projects\Options.
Metode
M l. Create
constructor C re a te ^ Owner: TComponent); override;
Este constructorul clasei. Această metodă nu trebuie apelată de către programatorul în Delphi, deoarece acesta crează automat o instanţă a acestei clase pentru fiecare aplicaţie. Această instanţă poate fi accesată prin intermediul variabilei Application.
M2. Destroy
destructo r Destroy; override;
Distruge aplicaţia. Nici această metodă nu trebuie apelată niciodată. Pentru a termina o aplicaţie apelaţi Terminate.
M3. BringToFront
procedure BringToFront;
Face ca ultima formă activă a aplicaţiei să fie pusă deasupra tuturor celorlalte forme.
M4. CreateForm
procedure Cvtait\'orm (TonnClass: TFormCIass; var Reference);
Crează o nouă formă, a cărei referinţă este pasată lui Reference. Această metodă este folosită pentru a crea o nouă formă la momentul execuţiei aplicaţiei. Proprietarul noi forme create va fi chiar aplicaţia. Primul apel al acestei metode va crea forma principală a aplicaţiei.
M5. HandleException
procedure HandleException(Sender. TObject);
Furnizează un mod implicit de a prelucra excepţii. în momentul în care apare o excepţie care trece de toate blocurile try , aplicaţia apelează metoda HandleException. Dacă excepţia nu este de tip EAbort atunci
395
este apelat evenimentul OnException (dacă există unul), iar dacă nu se afişează un mesaj privitor la excepţia în cauză.
M6. HelpContext
function f IclpContext(Context: THelpContext): Boolean;
Apelează help-ul aplicaţiei. Context este identificatorul help de context. De exemplu, dacă Context are valoarea 100 va fi afişat acel ecran al help-ului care are identificatorul de context egal cu 100. Această metodă apelează evenimentul OnHelp.
M7. HelpJump
function HelpJump(const JumplD: string): Boolean;
Din nou apelează help-ul aplicaţiei, de data aceasta topicul căutat în help este dat sub formă de string.
M8. Initialize
procedure Initialize;
Această metodă este prima apelată de către orice proiect Delphi.
M9. MessageBox
function MessageBox(7'ext, Caption: PChar; Flags: Longint): Integer;
Afişează o cutie de dialog cu unul sau mai multe butoane. Caption este titlul cutiei de dialog, Text este textul afişat în ea şi este de obicei o întrebare. Acest text nu poate fi mai lung de 255 de caractere şi este fragmentat de către sistem pentru a putea încape în cutia de dialog.Flags indică felul şi butoanele cutiei. Dintre valorile lui Flags (se pot şi combina aceste valori) amintim:
M B_APPLM ODALEste o fereastră modală, deci aplicaţia nu va rula în continuare până când această fereastră nu este închisă.
M B_DEFB LITTON 1 Primul buton de pc cutia de dialog este cel implicit.
M B_DEFBUTTO N2 Al doilea buton dc pe cutia dc dialog este cel implicit.
M B J3E FBU T T O N 3A l treilea buton de pe cutia de dialog este cel implicit.
M B_DEFBUTTO N4 Al patrulea buton de pe cutia de dialog este cel implicit.
M B J tE L P Este un buton de help. Apăsând acest buton sau
396
tasta FI este generat evenim entul OnHelp.
M BJC O N E X C L A M A T IO N Un sem n de exclamare apare în cutia de dialog.
M B_ICONIN FORMATION Un icon constând în litera i încercuită apare în cutia de dialog.
M B JC O N S T O P Un semn de stop apare în cutia de dialog.
M B_O K Cutia conţine butonul Ok.
M B„O KCANCEL Cutia conţine butoanele Ok şi Cancel.
M B_RETRYCANCEL Cutia conţine butoanele Retry şi Cancel.
M B_Y E SN O Cutia conţine butoanele Yes şi No.
M B_Y ESN O C A N C EL Cutia conţine butoanele Y es, N o şi Cancel.
M B_ABORTRETRYIGNORECutia conţine butoanele ABORT, RETRY şi IGNORE.
M B„RTLREADINGTextul este afişat de la dreapta la stânga în conformitate cu modul de scriere arab.
M B_RIGHT Textul este aliniat la stânga.
Funcţia returnează O, dacă nu este destulă memorie pentru a o crea, sau una dintre următoarele valori:
V aloareV aloare
N um ericăîn sem n ătate
IDABORT 3 Utilizatorul a apăsat butonul Abort.
IDCANCEL 2 Utilizatorul a apăsat butonul Cancel.
IDIGNORE 5 Utilizatorul a apăsat butonul Ingnore.
IDNO 7 Utilizatorul a apăsat butonul No.
IDOK 1 Utilizatorul a apăsat butonul Ok.
IDRETRY 4 Utilizatorul a apăsat butonul Retry.
IDYES 6 Utilizatorul a apăsat butonul Yes.
M10. Minimize
procedure Minimize;
Apelaţi această metodă pentru a minimiza o aplicaţie. Nu confundaţi această metodă cu minimizarea unei forme, lucru care se obţine prin setarea proprietăţii WindowStcite a lui TForm.
397
procedure ProcessMessages;
întrerupe execuţia aplicaţiei pentru a-i permite Windows-ului să proceseze mesajele din coada de mesaje. Sunt procesate doar acele mesaje care privesc aplicaţia curentă. Această metodă este utilă atunci când sunt făcute calcule multe, în acelaşi eveniment. în acest caz metoda ProcessM essages trebuie apelată periodic pentru ca, de exemplu, interfaţa aplicaţiei să fie redesenată.
Exemplul 1:
Următoarea aplicaţie arată cum poate fi folosită ProcessM essages. Am spus că această metodă este utilă în cazul în care în interiorul unui eveniment se fac multe calcule (spre un apel recursiv cu multe puncte de întoarcere). Noi vom simplifica puţin lucrurile şi, în locul calculelor complexe, vom implementa un ciclu infinit, deci evenimentul nu se termină. De exemplu, la apăsarea butonului aplicaţia nu mai poate fi controlată în nici un fel (ci doar prin resetarea calculatorului);
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;
beginWhile true do
i : = 2 ;end;Dacă aplicaţia de mai sus este rulată în interiorul mediului Delphi ea poate fi întreruptă folosind Run\Program Reset.Dacă în interiorul ciclului introducem un ProcessM essages, aplicaţia va putea fi controlată fără nici o problemă (adică se pot apăsa şi alte butoane, se pot mări, micşora, etc. formele aplicaţiei):
procedure TForml.ButtonlClick(Sender: TObject);var i:integer;
beginWhile true do begin
i:=2;Application.ProcessMessages; if Application.Terminated then Exit;
end; end;
M il . ProcessM essages
398
M12. Restore
procedure Restore;
Readuce aplicaţia la mărimea ei normală. Nu confundaţi această metodă cu aducerea unei forme la mărimea normală, lucru care se obţine prin setarea proprietăţii WindowState a lui TForm.
M13. Run
procedure Run;
Execută aplicaţia. Delphi crează automat un bloc principal al programului care apelează această metodă.
A tenţie !
Nu confundaţi această metodă cu lansarea în execuţie a unei alte aplicaţii, lucru care se poate face, de exemplu, cu CreateProcess.
M14. ShowException
procedure ShowException(E: Exception);
Afişează mesajul unei excepţii. Această metodă este apelată dacă nici un handler de evenimente nu este asociat evenimentului OnException.
M15. Terminate
procedure Terminate;
Termină o aplicaţie.
Evenimente
E l. OnActivate
property OnActivate: TNotifyEvent;
Apare când o aplicaţie devine activă, adică când primeşte focus sau când este lansată în execuţie.
E2. OnDeactivate
property OnDeactivate: TNotifyEvent;
Apare când o aplicaţie devine inactivă, adică când este terminată sau când focusul trece la o alta.
399
E3. OnException
Apare când o excepţie a scăpat de toate blocurile except sau finally. în interiorul acestui handler de evenimente trebuie furnizat un nod general de prelucrare a excepţiilor. Dacă nu există un astfel de handler de evenimente este apelată metoda ShowException.
E4. OnHelp
THelpEvent = function (Command: Word; Data : Longint;v ar CallHelp: Boolean): Boolean of object;
property OnHelp: THelpEvent;
Apare când a fost iniţiată o cerere de tip help.
E5. OnHint
property OnHint: TNotifyEvent;
Apare când cursorul de mouse se mişcă pe deasupra unui control care poate afişa un help-hint.
Exem plul 2:
Următorul exemplu afişează într-un StatusBar hintul componentelor de pe o formă. Deoarece TApplication nu este o componentă vizuală, ea nu poate fi afişată în O bject Inspector, deci nu i se poate ataşa direct un handler de evenimente pentru evenimentul OnHint (de fapt nu se poate ataşa direct nici un handler pentru nici un eveniment), ci trebuie creată o procedură cu acelaşi tip de parametri ca şi evenimentul, iar apoi trebuie asignată evenimentului în cauză. în cazul nostru procedura se numeşte AfişeazăHint, iar definiţia ei o includem în secţiunea private a clasei:
procedure AfiseazaHint(Sender:TObject);
Implementările necesare sunt:
procedure TForml.FormCreate(Sender: TObject); begin
StatusBarl.SimplePanel:=true;Application.OnHint:=AfiseazaHint;
end;
procedure TForml.AfiseazaHint(Sender:TObject) ; begin
StatusBarl.SimpleText:^Application.Hint; end;
property OnException: TExceptionEvent;
400
E6. OnMessage
TMessageEvent = procedure (var Msg: TMsg; v ar Handled: Boolean)of object;
property OnMessage: TMessageEvent;
Apare când sistemul trimite un mesaj aplicaţiei. Cu ajutorul acestui eveniment pot fi interceptate toate mesajele pe care Windows-ul le trimite aplicaţiei. Totuşi, deoarece într-o secundă sunt trimise mii de mesaje, utilizarea acestui eveniment duce la încetinirea aplicaţiei.
E7. OnMinimize
property OnMinimize: TNotifyEvent;
Apare când aplicaţia este minimizată.
E8. OnRestore
property OnRestore: TNotifyEvent;
Apare când o aplicaţie anterior minimizată este adusă la forma ei normală.
E9. OnShowHint
property OnShowHint: TShowHintEvent;
Apare când un help-hint este pe cale de a fi afişat. Acest eveniment este util pentru specificarea modului în care este afişat hint-ul respectiv. Tipul TShowHintEvent este definit astfel:
THintlnfo = record HintControl: TControl;HintPos: TPoint;HintMaxWidth: Integer;HintColor: TColor;CursorRect: TRect;CursorPos: TPoint;ReshowTimeout: Integer;HideTimeout: Integer;HintStr: string;
end;
TShowHintEvent = procedure (var HintStr: string;var CanShow: Boolean; v ar Hintlnfo: THintlnfo) of object;
401
unde:
• HintStr este şirul de caractere care conţine textul hint-ului;
• CanShow este true dacă hint-ul se poate afişa;
• Hintlnfo este o variabilă de tip THintlnfo în care sunt reţinute:
- controlul pentru care se afişează hint-ul (HintControl)\- poziţia în care este afişat hint-u\ (HintPos)\- lăţimea //(«/-ului (HintMaxWidth);- culoarea /imf-ului (HintColor);
dreptunghiul în interiorul căruia trebuie să se afle mouse-ul pentru ca hint-ul să apară (implicit este dreptunghiul controlului) (CursorRect)\
- poziţia cursorului de mouse în interiorul controlului (•CursorPos)\
- numărul de milisecunde care trebuie să treacă până când hint-ul este afişat din nou, chiar dacă mouse-ul nu a părăsit controlul în cauză (implicit este zero ceea ce indică că hint-ul este afişat doar dacă mouse-ul pleacă şi revine apoi pe control) (ReshowTimeouty,
- valoarea proprietăţii HintHidePause (HideTimeout);- şirul care va fi afişat ca hint (HintStr).
402
29. TIPĂRIREA LA IMPRIMANTĂ
Mediul Delphi permite aplicaţiilor scrise în el să acceseze în două moduri imprimanta, şi anume în mod text şi în modul standard Windows.
29.1. Modul Text
în acest caz imprimanta este considerată ca un dispozitiv standard de tip fişier text, aşa că tipărirea de şiruri de caractere este identică cu scrierea de text într-un fişier pe disc. Următorii paşi trebuie urmaţi pentru a tipări un text la imprimantă:
1. atribuirea unei variabile fişier text la imprimantă;2. deschiderea fişierului pentru scriere;3. scrierea de text în el;4. închiderea fişierului.
Atribuirea de la punctul 1) se face cu ajutorul procedurii AssignPrn definită în unitul Printers astfel:
procedure AssignPrn(var F: Text);
în acest caz tipărirea unei linii Ia imprimantă în mod text se face în felul următor:
uses printers;procedure TForml.ButtonlClick(Sender: TObject);var F: TextFile;
beginAssignPrn(F);Rewrite(F);Writeln(, 'Acesta este un text');CloseFile(F);
end;Tipărirea în mod text a tuturor liniilor unei cutii de editare multi-linie se
face în felul următor (pe formă trebuie să se găsească o astfel de cutie, adică o componentă de tip TMemo):
uses printers;procedure TForml.ButtonlClick(Sender: TObject); var F:TextFile;
i:integer;begin
AssignPrn(F);
403
Rewrite(F);for i:=0 to Memol.Lines.Count-1 do
writeln(F,Memol.Lines.Strings[i)); closeFile (F)
end;
29.2. Mod standard Windows
Tipărirea unui text se poate face în două feluri, şi anume:
1. folosind o componentă TRichEdit în care se introduce textul ce urmează a fi tipărit iar apoi apelarea metodei Print\
2. folosind clasa TPrinter.
Vom analiza pe rând cele două variante subliniind avantajele şi dezavatajele fiecăreia.
I. Folosind metoda Print a componentei TRichEdit nu mai trebuie să scriem atâta cod ca în cazul folosirii componentei TPrinter. Dar, în schimb, nu avem suficient control asupra imprimantei şi a textului trimis spre ea. Mai precis, chiar dacă afişăm o cutie de dialog (TPrintDialog) cu ajutorul căreia selectăm paginile şi numărul de copii care urmează a fi tipărite, aceste lucruri nu vor fi luate în considerare de către metoda Print care tipăreşte o singură dată întreg documentul din cutia de editare respectivă. Ceea ce se poate schimba folosind metoda Print împreună cu o componentă TPrintDialog este tipul imprimantei folosite şi, bineînţeles, proprietăţile acesteia (care se setează apăsând butonul Properties) din respectiva cutie de dialog. în plus, formatarea textului trebuie făcută în interiorul cutie RicliEdit deoarece o linie prea lungă va fi ruptă automat (restul fiind trecut pe linia următoare) dacă se tipăreşte pe o hârtie prea mică. Setarea dimensiunii unei pagini în RichEdit se face cu ajutorul proprietăţii PageRect care este de tipul TRect.
Concluzionând, tipărirea conţinutului unei cutiei RichEditl se face în felul următor:
procedure TEditForm. PrintlClick(Sender: TObject);beginif PrintDialogl.Execute thenRichEditl.Print('Titlul documentului');
end;
în acest exemplu am folosit totuşi o componentă TPrintDialog cu ajutorul căreia se poate schimba imprimanta, dimensiunea foii pe care se tipăreşte, calitatea tipăriturii, etc. Parametrul metodei Print este un şir de caractere care va apărea în Print Manager ca titlu al documentului care se tipăreşte. De obicei, este numele şi calea fişierului ce urmează a fi trimis la imprimantă.
404
II. TPrinter
O altă modalitate de a tipări la imprimantă este oferită de către componenta TPrinter. Vom vedea că acestă componentă ne conferă un control mai puternic asupra textului tipărit. Delphi instanţiază pentru fiecare aplicaţie care foloseşte această componentă (nonvizuală) o variabilă de acest tip, numită Printer. Aşa că, dacă doriţi să folosiţi imprimanta prin intermediul acestei componente, nu apelaţi niciodată metoda Create, ci folosiţi variabila deja instanţiată Printer. Dar mai întâi să vedem care sunt proprietăţile şi metodele acestei componente.
PI. Canvas
property Canvas: TCanvas;
Reprezintă suprafaţa de tipărire a paginii curente. Suprafaţa foii de hârtie se consideră echivalentă cu o suprafaţa pe care se poate desena, scrie cu ajutorul proprietăţilor componentei TCanvas. De exemplu, schimbarea fontului, modului de scriere, a pen-ului, brush-ului, etc. se face tot prin intermediul acestei proprietăţi. De exemplu, pentru ca tipărirea să se facă cu acelaşi font cu care este scris şi textul (în acest exemplul este vorba de tipărirea tot în mod text), vom proceda în felul următor:
procedure TForml.PrintlClick(Sender: TObject); var Line: Integer;
PrintText: TextFile;beginif PrintDialogl.Execute then beginAssignPrn(PrintText);Rewrite(PrintText);Printer.Canvas.Font := Memol.Font; for Line := 0 to Memol.Lines.Count - 1 do Writeln(PrintText, Memol.Lines[Line]);
CloseFile(PrintText); end;
end;
P2. Copies
property Copies: Integer;
Indică numărul de copii curent tipărite ale documentului.
P3. PageHeight
property PageHeight: Integer;
Indică înăţimea în număr de pixeli a paginii care se tipăreşte curent.
405
P4. Page Width
property PageWidth: Integer;
Indică lăţimea în număr de pixeli a paginii care se tipăreşte curent.
P5. PageNumber
property PageNumber: Integer;
Indică numărul paginii care este curent tipărită. Această proprietate este automat incrementată de către metoda NewPage.
P6. Capabilities
property Capabilities: TPrinterCapabilities;
Indică capabilităţile imprimantei curente. Tipul TPrinterCapabilities este definit astfel:
TPrinterCapability = (pcCopies, pcOrientation, pcCollation); TPrinterCapabilities = set of TPrinterCapability;
deci capabilităţile imprimantei se referă la setările curente ale driver-ului de imprimantă şi anume: număr de copii, orientarea şi dacă indicatorul de tipărire în întregime a unei copii înainte ca vreo pagină din celelalte copii să fie tipărită este setat.
P7. Printers
property Printers: TStrings;
Este lista cu toate imprimantele instalate în sistem.
P8. Printerlndex
property Printerlndex: Integer;
Este numărul de ordine din lista Printers a imprimantei curent selectate. Dacă doriţi ca imprimanta implicită să fie cea curentă, atunci setaţi această proprietate la -1 .
P 9. Orientation
property Orientation: TPrinterOrientation;
Indică felul în care se va tipări documentul trimis la imprimantă. Valori posibile pentru Orientation sunt:
406
V aloare Sem nificaţie
p o P o rtra it Documentul se va tipări verical pe pagină.
poL an dscape Documentul se va tipări orizontal pe pagină.
P10. Aborted
property Aborted: Boolean;
Indică dacă utilizatorul a apelat sau nu metoda Abort pentru a termina tipărirea la imprimantă.
P il . Fonts
property Fonts: TStrings;
Reprezintă lista fonturilor suportate de către imprimantă.
P12. Title
property Title: string;
Este titlul care apare în PrintManager când documentul este tipărit. Această proprietate are valoare identică cu parametru metodei Print a lui TRichEdit.
Metode______________________________________________________
M l. Create
constructor Create;
Este constructorul clasei. Nu apelaţi acest constructor deoarece Delphi instanţiază automat un obiect de acest tip şi îl atribuie variabilei Printer.
M2. Destroy
destructor Destroy;
Este destructorul clasei. Nici această metodă nu trebuie apelată deoarece obiectul Printer este automat distrus.
M3. NewPage
procedure NewPage;
Apelarea acestei metode determină ca tipărirea să se facă pe o nouă pagină. Proprietatea PageNumber este incrementată, iar proprietatea Pen
407
a Canvas-\i\u\ este setată la (0,0).
M4. BeginDoc
procedure BeginDoc;
Se începe tipărirea unui nou document la imprimantă. Documentul nu este tipărit efectiv decât după apelarea metodei EndDoc.
M5. EndDoc
procedure EndDoc;
Termină de trimis la imprimantă documentul curent. între această metodă şi BeginDoc trebuiesc introduse instrucţiuni de genul:
Printer.Can vas.OutT ext....
Aceste două metode - BeginDoc şi EndDoc - se comportă ca şi procedurile AssignPrn şi CloseFile. Dacă se apelează metoda BeginDoc şi totuşi nu s-a putut face tipărirea corectă (de exemplu, dacă textul care urma a fi tipărit trebuia citit dintr-un fişier care era distrus) trebuie apelată metoda Abort.
M6. Abort
procedure Abort;
întrerupe trimiterea unui document spre imprimantă. în acest caz toate datele trimise cu ajutorul canvas-ului vor fi pierdute.
Observaţie:
în cazul în care se doreşte întreruperea tipăririi unui document se foloseşte PrintM anager-ul.
Exemplul 1:
Tipărirea unei linii de text se face astfel:uses printers;procedure TPrintForm.BitBtnlClick(Sender: TObject); begin
Screen.Cursor := crHourGlass; try
Printer.BeginDoc; tryWith Printer .Canvas do begin
Font.Name: = 'Arial ’ ;Font.Size:= 10;
408
Font.Style:=[fsBold];TextOut(0,0,'Acesta este un text');
end;Printer.EndDoc;
excepton Exception do Begin
Printer.Abort;Printer.EndDoc;Raise;
end; end;
finallyScreen.Cursor:=crDefault;
end; end;
Tipărirea unei imagini se face astfel:
procedure TForml.PrintlClick(Sender: TObject); beginwith Printer do begin
BeginDoc;Canvas. Draw(0, 0, Imagel. Picture .Graphic) ; {Im aginea v a f i desenată in) EndDoc; {colţul din stânga sus a paginii}
end; end;
29.3. Cutiile de dialog
De un mare ajutor pentru utilizator sunt cutiile de dialog TPrintDialog şi TPrinterSetupDialog. Prima dintre ele afişează un dialog cu privire la documentul care urmează a fi afişat, mai precis număr de copii, care pagini, în ce ordine, tipărire în fişier, etc. Din păcate, interacţiunea cu aplicaţia a acestui dialog este minimă, utilizatorul trebuind să ţină cont de toate aceste lucruri şi să le manipuleze ca atare. Spre exemplu, este inutil ca utilizatorul să seteze că doreşte două copii ale documentului, iar apoi apasă pe butonul OK al dialogului, căci nu se întâmplă nimic dacă în corpul ataşat acestui eveniment (apăsarea lui OK) programatorul nu a scris codul corespunzător tipării documentului (de câte ori trebuie), folosindu-se, spre exemplu, de componenta TPrinter.
în schimb, interacţiunea lui TPrinterSetupDialog cu aplicaţia este maximă, fără a mai fi nevoie ca programatorul să scrie nici un rând de cod pentru setarea imprimantei conform specificaţiilor utilizatorului. Folosirea acestei componente nu este necesară deoarece TPrintDialog are un buton denumit Properties la a cărui apăsare se deschide un dialog pentru setarea imprimantei.
409
Să începem cu prezentarea primeia dintre cele două componente. Datorită faptului că este o cutie de dialog, va avea metoda Execute care are acelaşi efect cu cel de la toate componentele de dialog.
Proprietăţi___________________________________________________
P I. Copies
property Copies: Integer;
Indică numărul de copii setate în PrinterDialog.
P2. Collate
property Collate: Boolean;
Indică dacă cutia de control Collate este vizată sau nu. Dacă este vizată, tipărirea în cazul în care Copies este mai mare decât 1 trebuie să se facă astfel: mai întâi prima copie a întreg documentului, apoi a doua etc. Dacă nu este vizată, atunci tipărirea trebuie făcută astfel: mai întâi prima pagină a documentului de câte ori trebuie, apoi a doua pagină de câte ori trebuie etc.
Un exemplu de folosire a lui Collate împreună cu Copies (celelalte proprietăţi nu sunt luate în calcul) este următorul:
uses Printers;procedure TForml.ButtonlClick(Sender: TObject);var i,k:integer;
beginif PrintDialogl.Execute then begin
Printer.BeginDoc;if PrintDialogl. Collate { Se scoate intai prima copie in
intregime a docum entului) then for k:=l to PrintDialogl. Copies do {iar apoi celelalte copii)
beginfor i:=0 to Memol.Lines.Count do beginif i mod 59=0then Printer.NewPage;Printer.Canvas.TextOut(0,12*(i mod 60),
Memol.Lines!i]); end; { La ultima pagina trebuie testat ce linie este,
pentru ca in caz contrar ){o sa generaţi o excepţie pentru index in afara lim itelor)
Printer.NewPage; end
410
else (se tipăreşte mai intai prima pagina de cate ori este necesar}for k:=l to (Memol.Lines.Count+1 div 60)+l do beginfor i:=l to PrintDialogl.Copies do beginfor j:=0 to 59 doPrinter.Canvas.TextOut(0,12*j,
Memol.Lines[(k-1)* 60+j]);Printer.NewPage;
end;Printer.NewPage;
end;Printer.EndDoc;
end;end;
P3. PrintToFile
property PrintToFile: Boolean;
Indică dacă căsuţa PrintToFile (de tip CheckBox) este sau nu vizată. Pentru ca această căsuţă să apară setaţi flagul poPrintToFile din proprietatea Options. Pentru a dezafecta această cutie de editare setaţi flagul poDisablePrintToFile.
P4. PrintRange
property PrintRange: TPrintRange;
Indică tipul de tipărire. Valori posibile pentru PrintRange sunt:
V aloare Sem nificaţie
prAUPagesToate paginile sunt tipărite. Corespunde selectării butonului de radio AII.
prSelection
Doar textul selectat este tipărit. Corespunde selectării butonului de radio Selection. In cazul unei cutii de editare mulţi linie este mai dificil de determinat care este textul selectat. Dacă folosiţi o cutie RichEdit, atunci determinarea selecţiei se face mai uşor deoarece aveţi la dispoziţie evenimentul OnSelectionChange. Determinarea selecţiei se face apoi cu ajutorul proprietăţilor SelStart şi SelLength.
prPageNumsDoar paginile ale căror număr de ordine este introdus vor fi tipărite. Corespunde selectării butonului de radio Pages.
P5. MinPage
property MinPage: Integer;
Indică cea mai mică valoare pe care utilizatorul o poate introduce pentru a specifica un număr de pagină ce urmează a fi tipărită.
411
P 6 . M axPage
Indică cea mai mare valoare pe care utilizatorul o poate introduce pentru a specifica un număr de pagină ce urmează a fi tipărită. Dacă utilizatorul introduce un număr de pagină mai mare atunci se semnalează un mesaj de eroare. Această proprietate poate fi folosită la un editor de texte pentru a specifica numărul de pagini al acestuia.
P7. FromPage
property FromPage: Integer;
Indică numărul paginii de la care să înceapă tipărirea documentului.
P8. ToPage
property ToPage: Integer;
Indică numărul paginii din document până la care se face tipărirea.
P9. Options
property Options: TPrintDialogOptions;
property MaxPage: Integer;
Determină felul cum apare şi cum se comportă cutia de dialog.Valori posibile pentru Options sunt orice submulţime din următoarea mulţime de flaguri:
V aloare Sem n ificaţie
poDisablePrintToFile Dezafectează cutia PrintToFile. Aceasta va fi afişată în continuare dar utilizatorul nu o va putea folosi.
poHelp A fişează un buton de help.
poPageNums
Se permite specificarea unui interval de pagini pentru a fi tipărite. Butonul radio Pages va fi vizibil şi va putea fi selectat. Mai trebuie îndeplinită o condiţie în plus şi anume ca MaxPage să lie strict mai mare decât MinPage.
poPrintToFileA fişează cutia de control PrintToFile. Dacă este setat şi flagul poDisablePrintToFile, atunci această cutie va fi afişată dar nu va fi activă.
poSelectionButonul Selection este posibil a fi selectat. Aceasta înseam nă că utilizatorul doreşte să tipărească doar textul marcat.
poW arningA fişează un mesaj de eroare dacă încercaţi să trimiteţi un text către o imprimantă neinstalată.
412
30. MULTIMEDIA
Aplicaţiile multimedia sunt acele aplicaţii care încorporează sunet şi imagine. Nu vorbim despre multimedia din jocuri din două motive:
1. acestea utilizează facilităţile multimedia la un nivel mult superior;2. afişarea imaginilor şi redarea sunetului în jocuri se realizează în
majoritatea cazurilor, cu ajutorul DirectX-ului.
O simplă aplicaţie multimedia constă dintr-o fereastră în care este afişată o imagine. Aplicaţii mai complexe conţin sunet şi imagini animate. Aplicaţii şi mai complexe permit utilizatorului să interacţioneze cu aceste facilităţi.
Cel mai simplu mod de a încorpora sunet într-o aplicaţie se realizează folosind funcţia API PlaySound. Prototipul “C” al acestei funcţii este:
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
unde parametrul pszSound specifică numele fişierului ce conţine sunetul iar parametrul fdwSound este o mulţime de flag-uri ce indică modul în care va fi rulat sunetul. Spre exemplu, rularea unui fişier cu numele sunet.wav se face prin execuţia instrucţiunii:
PlaySound('sunet.wav', NULL, SND_FILENAME);în prealabil trebuie să includeţi unit-ul MMSystem.h. Un mare deza
vantaj al funcţiei PlaySound este acela că ea nu poate rula fişiere cu sunete de lungime mai mare decât memoria disponibilă.
Mediul Delphi pune la dispoziţia programatorului două componente specializate în manipularea elementelor multimedia: TM ediaPlayer şi TAnimate.
f i30.1. TMediaPlayer ^
Controlează dispozitivele care furnizează un driver MCI (Multimedia Control Interface). Dintre dispozitivele multimedia (care pot fi hard sau soft) amintim: CD-ROM-ul, VCR, secvenţializorul MIDI, Scanner, DiscVideo etc.
Componenta TM ediaPlayer are o interfaţă grafică şi este alcătuită din mai multe butoane. Fiecare dintre acestea poate fi apăsat cu ajutorul mouse- ului, dar ele nu reprezintă componente independente. Această interfaţă este:
413
11 - ► 1 H !► m
Butoanele care alcătuiesc interfaţa grafică a acestei componente sunt:
B u ton V aloare Sem nificaţie
Play btPlay Rulează (play) un clip.
Pause btPauseOpreşte temporar înregistrarea sau rularea. Dacă butonul de pauză este deja apăsat, o nouă apăsare va duce la continuarea operaţiei întrerupte.
Stop btStop Opreşte definitiv rularea sau înregistrarea.
Next btNext Trece la următoarea pistă.
Prev btPrev Trece la pista anterioară.
Step btStep Mută înainte cu un număr de cadre.
Bark btBack Mută înapoi cu un număr de cadre.
Record btRecord Porneşte înregistrarea.
Eject btEject Scoate mediul. Acest buton este utilizat atunci când clip-ul curent este rulat de pe un CD sau VCR.
Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl.
Definit în_____________________________________________________
m player.pas
Pagina_______________________________________________________
System
Proprietăţi___________________________________________________
PI. AutoOpen
property AutoOpen: Boolean;
Specifică dacă dispozitivul multimedia va fi rulat automat în momentul în care care aplicaţia este lansată în execuţie. Dacă AutoOpen este true, atunci media player-ul încearcă să deschidă dispozitivul multimedia specificat în proprietatea DeviceType (sau FileName dacă DeviceType este dtAutoSelect). Dacă AutoOpen este false, atunci dispozitivul trebuie deschis cu ajutorul metodei Open.
414
P2. DeviceType
Specifică tipul de dispozitiv pe care îl poate deschide un media player. Valori posibile pentru DeviceType sunt: dtAutoSelect, dtAVIVideo, dtCDAudio, dtDAT, dtD igitalVideo, dtMMMovie, dtOther, dtOverlay, dtScanner, dtSequencer, dtVCR, dtVideodisc, sau dtWaveAudio. Implicit este dtAutoSelect.
property DeviceType: TMPDeviceTypes;
P3. D isplay
property Display: TWinControl;
Specifică o fereastră folosită de un dispozitiv multimedia care are nevoie de o fereastră pentru ieşire. Exemple de dispozitive multimedia care au nevoie de o fereastră de ieşire sunt: Animation, AVI Video, D igital Video, Overlay, şi VCR. Implicit este nil. în acest caz dispozitivul creează automat o fereastră.
P4. StarPos
property StartPos: Longint;
Specifică poziţia de start în cadrul mediului curent.
P5. EndPos
property EndPos: Longint;
Specifică poziţia în interiorul mediului curent la care să se oprească rularea sau înregistrarea. EndPos este setată conform valorii proprietăţii TimeFormat.
P6. FileName
property FileName: string;
Specifică numele fişierului în/din care este salvat/încărcat mediul curent.
P7. Frames
property Frames: Longint;
Specifică numărul de cadre cu care mediul poate fi derulat înainte sau înapoi cu ajutorul metodei Step.
415
P8. Length
property Length: Longint;
Specifică lungimea clip-ului curent. Această valoare este specificată folosind formatul de timp.
P9. Position
property Position: Longint;
Specifică poziţia curentă în cadrul clip-ului. Această valoare este specificată folosind formatul de timp.
P10. TimeFormat
property TimeFormat: TMPTimeFormats;
Indică formatul necesar pentru a specifica o poziţie într-un clip. Cele mai utilizate formate sunt:
V aloare Sem nificaţie
tfM illisecondsM ilisecunde. Numărul de m ilisecunde stocate ca un număr pe 4 octeţi. Este folosit mai mult la m ediile audio.
tfFramesCadre. Este reprezentat pe 4 octeţi. Este folosit la m ediile video, un cadru fiind o imagine.
P il. EnabledButtons
property EnabledButtons: TButtonSet;
Indică care din butoanele componentei sunt utilizabile. Valorile posibile pentru EnabledButtons sunt submulţimi ale mulţimii: {bpPlay , btRecord, btStop, btNext, btPrev, btStep , btBack, btPause, btEject}.
P12. Shareable
property Shareable: Boolean;
Indică dacă dispozitivul multimedia curent deschis este partajat şi altor aplicaţii.
Metode______________________________________________________
Principale metode sunt cele care sunt activate de butoanele conţinute în componenta TMediaPlayer.
416
Alte metode sunt:
M l. Open
procedure Open;
Pentru a rula un dispozitiv multimedia este nevoie ca acesta să fie deschis. Metoda Open deschide un dispozitiv multimedia.
M2. Save
procedure Save;
Salvează mediul curent în fişierul cu numele specificat de proprietatea FileName.
Să realizăm o aplicaţie care rulează un fişier .wav. Pentru aceasta folosim o componentă TM ediaPlayer şi setăm din Object Inspector AutoOpen la true, iar FileName cu numele fişierului .wav. Apoi lansăm aplicaţia în execuţie şi apăsăm butonul de Play.
Atenţie !
Componenta TM ediaPlayer nu funcţionează pe PcSpeaker.
Evenimente________________________________________________
E l. OnClick
property OnClick: EMPNotify;
Tipul EMPNotify este definit astfel:
EMPNotify = procedure (Sender: TObject;Button: TMPBtnType; var DoDefault: Boolean) of object;
E2. OnNotify
property OnNotify: TNotifyEvent;
30.2. TAnimate
Este un control ce furnizează o fereastră în care este afişat un clip AVI (Audio Video Interleaved). Un clip AVI este o succesiune de cadre. Un cadru
417
conţine un bitmap. Există şi clip-uri AVI cu sunet, dar acestea nu pot fi rulate în acest control.
Ierarhie________ ____________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TAnimate.
Definit în_____________________________________________________
comctrls.pas
Pagina_______________________________________________________
Win32
Proprietăţi___________________________________________________
PI. FileName
property FileName: TFileName;
Indică numele fişierului AVI care se doreşte afişat în control.
P2. Active
property Active: Boolean;
Indică dacă controlul rulează clip-ul AVI.
P3. CommonA VI
property CommonAVI: TCommonAVI;
Indică dacă controlul rulează unul din clip-urile AVI furnizate de Shell32.dll. Valori posibile pentru CommonAVI sunt:
Valoare Semnificaţie
aviNone Clip-ul este furnizat prin setarea proprietăţii FileName.
aviFindFolder Indică clip-ul afişat în timpul căutării unui director.
aviFindFile Indică clip-ul afişat în timpul căutării unui fişier.
aviFindComputer Indică clip-ul afişat în timpul unui calculator.
aviCopyFiles Indică clip-ul afişat în timpul copierii mai multor fişiere.
aviCopyFile Indică clip-ul afişat în timpul copierii unui fişier.
418
V aloare Sem nificaţie
aviR ecycleF ile Indică clip-ul afişat în timpul trimiterii unui fişier în R ecycle Bin.
aviE m ptyR ecycle Indică clip-ul afişat în timpul golirii lui R ecycle B in.
aviD eleteF ile Indică clip-ul afişat în timpul ştergerii unui fişier.
P4. FrameCount
property FrameCount: Integer;
Indică numărul de cadre din clip.
P5. StartFrame
property StartFrame: Smalllnt;
Indică numărul de ordine al cadrului care va fi afişat când controlul este activat.
P6. StopFrame
property StopFrame: Smalllnt;
Indică numărul de ordine al ultimului cadru AVI care este afişat în timp ce controlul este activ.
P7. FrameHeight
property FrameHeight: Integer;
Indică înălţimea, în pixeli, a fiecărui cadru afişat.
P8. FrameWidth
property FrameWidth: Integer;
Indică lăţimea, în pixeli, a fiecărui cadru afişat.
P9. Open
property Open: Boolean;
Indică dacă clip-ul este încărcat în memorie şi gata pentru derulare.
P10. Repetitions
property Repetitions: Integer;
Indică de câte ori va fi repetată secvenţa de cadre înainte ca proprietatea
419
Active să devină false.
p roperty Timers: Boolean;
Indică dacă cadrele sunt afişate ca răspuns la evenimentul OnTimer al unei componente TTimer. Acest lucru este util când se doreşte rularea în paralel a unui clip muzical. Evenimentul OnTimer va fi responsabil cu derularea clip-ului AVI.
Exemplu:
Următoarea aplicaţie ilustrează folosirea acestei proprietăţi în cazul unui clip AVI cu 13 cadre. Pe formă vom avea o componentă TTimer şi o componentă TAnimate cu următoarele proprietăţi:
object Animatei: TAnimate Width = 60 Height = 39 FileName ='C :\Program Files\Borland\Delphi7\Demos\CoolStuf\cool.avi' StopFrame = 13 Timers = True
endobject Timerl: TTimer
Interval = 100 OnTimer = TimerlTimer
endHandlerele de evenimente ale acestei aplicaţii sunt:var
t : integer;
procedure TForml.FormActivate(Sender: TObject); begin
t := 1; end;
procedure TForml.TimerlTimer(Sender: TObject); begin
Animatei.Seek(t); t := 1 + t mod 13;
end;
P i l . Timers
420
Metode
M l. Play
procedure PX'dyi From Frame, ToFrame: Word; Count: Integer);
Afişează secvenţa de cadre care începe la cadrul FromFrame termină la cadrul ToFrame, de Count ori.
M2. Seek
procedure Seek(Frame: Smalllnt);
Afişează cadrul cu numărul de ordine Frame.
M3. Stop
procedure Stop;
întrerupe derularea clip-ului AVI.
Evenimente______________________________________________
E l. OnOpen
property OnOpen; TNotifyEvent;
Apare când valoarea proprietăţii Open se schimbă din false în true.
E2. OnClose
property OnClose; TNotifyEvent;
Apare când valoarea proprietăţii Open se schimbă din tru e în false.
E3. OnStart
property OnStart: TNotifyEvent;
Apare când clip-ul începe să se deruleze.
E4. OnStop
property OnStop: TNotifyEvent;
Apare când controlul a terminat de afişat clip-ul AVI.
i se
421
31. DEZVOLTAREA DE COMPONENTE
Delphi nu este doar un mediu pentru dezvoltarea vizuală a aplicaţiilor cu ajutorul componentelor existente, ci include tot ceea ce este necesar pentru a crea noi componente.
Materialul care urmează prezintă doar modul în care aceste componente sunt create în O bjectPascal folosind mediul Delphi. Pentru o mai bună înţelegere a lor, utilizatorul poate studia codurile sursă a câtorva componente aflate în directoarele: ...\DEMOS\PROPEDlT şi ..ASOURCEY...
Principalele etape necesare pentru a crea o componentă sunt:
1. înţelegerea componentelor;2. scrierea de proprietăţi;3. scrierea de evenimente;4. scrierea de metode;5. grafica în componente;6. editoarele de componente;7. înregistrarea componentelor;8. adăugarea unei imagini la componentă.
în final sunt prezentate câteva exemple şi sunt discutate câteva tipuri mai speciale de componente, şi anume:
1. componente grafice;2. componente cutii de dialog (engl. dialog boxes).
31.1. înţelegerea componentelor
Prima întrebare la care trebuie răspuns, în acest capitol, este următoarea: Ce este o componentă? Cei care au ajuns până aici ştiu foarte bine răspunsul: O componentă nu este altceva decât o clasă. O clasă în cel mai adevărat sens al programării orientate pe obiecte (OOP). Totuşi există unele mici diferenţe datorate formei noi (necesară programării sub W indows) în care sunt puse elementele atât de cunoscutei clase. Şi anume, pentru început este important să se reţină că într-o clasă intră trei tipuri de informaţii:
422
a. Inform aţii de stare
Indică starea unei componente la un moment dat. în vechile clase această informaţie era dată de către conţinutul datelor membre. Aici s-a făcut un pas înainte, creându-se proprietăţile. O proprietate, la cel mai simplu nivel, este legată de o singură dată membră şi are aceeaşi valoare ca şi ea. Motivul pentru care au fost create aceste proprietăţi a fost acela de a asigura o interfaţă mai puternică între programator şi datele membre.
b. Inform aţii de acţiune
Indică modul în care componentele pot acţiona asupra lor sau asupra mediului înconjurător. Acest lucru este realizat prin intermediul metodelor.
c. Inform aţii de răspuns
îi dau posibilitatea programatorului să răspundă (prin intermediu codului sursă) la modificările care au loc în sistem sau într-o aplicaţie. Aceste informaţii sunt recepţionate prin intermediul evenimentelor.
Deşi oricare două componente sunt diferite în unele aspecte, ele au totuşi şi un aspect comun: toate derivă din clasa TComponent care defineşte un minim de atribute necesare pentru a putea opera sub mediul Delphi.
Deoarece componentele sunt clase, crearea lor se poate face folosind doar cod sursă. Dar, folosind mediul vizual de dezvoltare Delphi, munca programatorului este uşurată. Astfel, în momentul în care doriţi să creaţi o nouă componentă alegeţi itemul Component din (File\New) sau din meniul Component alegeţi submeniul New. Pe ecran va apare fereastra New Component ale cărei elemente sunt: Class N am e, Ancestor Type, Palette P age , Unit File N am e şi Search Path.
• în cutia de editare Class Name se introduce numele noii componente. Conform convenţiilor acest nume trebuie să înceapă cu litera T (de exemplu, TComponentaMea).
• în lista de tip drop down Ancestor Type, se alege componenta care este strămoşul direct al componentei noastre. Componenta noastră va moşteni toate proprietăţile, metodele şi evenimentele din componenta strămoş (de exemplu, strămoşul poate fi: TComponent).
• în lista de tip drop down Palette Page, se alege numele paginii din C om ponent Palette în care noua componentă va apărea când va fi introdusă în bibliotecă.
423
• U nit file nam e indică numele şi calea unitului ataşat componentei (de exemplu:
C:\Program Files\Borland\Delphi 7\Lib\ComponentaMea.pas
)•
• Search p a th indică calea în care este căutat unitul ataşat componentei.
Acţionând butonul Create Unit va fi creat următorul unit:
unit ComponentaMea;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs;
typeTComponentaMea = class(TComponent) private
{ Private declarations } protected
{ Protected declarations } public
{ Public declarations } published
{ Published declarations } end;
procedure Register;implementation procedure Register; begin
RegisterComponents('Samples', [TComponentaMea]); end;end.
Observăm totodată că mediul Delphi a făcut şi înregistrarea componentei (despre care vom vorbi puţin mai încolo).
Fişierele necesare unei componente sunt:
- un pachet (.DPL) sau o colecţie de pachete (.DPC);- un pachet compilat (.DCP);- un unit compilat (.DCU);- un fişier în care este stocat bitmap-ul afişat în Com ponent Pallete
(.DCR);- un fişier Help (.HLP).
424
31.2. Scrierea de proprietăţi
Proprietăţile îi creează utilizatorului iluzia că setează sau citeşte valorile unor variabile. De fapt proprietăţile se comportă ca şi nişte variabile, singura diferenţă fiind faptul că (proprietăţile) nu pot fi transmise ca parametru de tip referinţă (var). Principalul avantaj pentru utilizator este faptul că unele proprietăţi sunt disponibile în Object Inspector la momentul proiectării aplicaţiei (engl design time), deci munca de setare sau citire a valorilor lor este mult simplificată.
Pentru creatorul de componente, proprietăţile oferă mai multe avantaje:
• permit ascunderea detaliilor de implementare;• permit atribuirea unor valori implicite;• permit reducerea numărului de metode disponibile la momentul
execuţiei aplicaţiei. Aceste metode sunt, de fapt, incluse în proprietăţi.
• metodele pentru o proprietate pot fi override, aceasta însemnând că ceea ce pentru utilizator pare a fi o aceeaşi proprietate, în alte componente are implementări diferite.
31.2.1. Tipuri de proprietăţi
O proprietate poate fi de orice tip. Diferenţa dintre tipuri este modul în care ele apar în Object Inspector :
Tip dc proprietate Semnificaţie
Proprietăţisimple
Pot fi numerice, character, sau şir. Ele apar in Object Inspector ca şi numere, caractere sau şiruri. Utilizatorul poate edita direct valoarea lor. De exemplu proprietăţile: Top, Height, Caption a lui TForm.
Proprietăţi de tip enumerare
Sunt afişate în Object Inspector sub forma unei liste drop-down, toate valorile pe care le poate lua o proprietate de acest tip. De exem plu, proprietatea Align a lui TMemo.
Proprietăţi de tip mulţime
Sunt afişate în Object Inspector ca o mulţime. Expandarea acestei proprietăţi se face executând dublu click pe semnul + din faţa denumirii proprietăţii. După expandare utilizatorul este solicitat să trateze fiecare elem ente ca o mulţime de valori Booleane: true dacă elementul este inclus, false în caz contrar. De exem plu, proprietatea Options a lui TOpenDialog.
Proprietăţi de tip obiect
Sunt la rândul lor clase şi au propriile lor editoare, denumite editoare de proprietăţi. Un editor de proprietăţi poate fi activat prin click pe butonul (pe care sunt trei puncte) aflat în dreapta valorii proprietăţii. Dc exemplu, proprietatea Font. Această proprietate este şi de tip mulţime (de subpio prietăţi) deoarece în faţa denumirii ei (din Object Inspector) apare semnul i
425
31.2.2. Declararea proprietăţilor
Pentru a declara o proprietate trebuie specificate trei lucruri:
1. numele proprietăţii;2. tipul proprietăţii;3. metodele pentru a citi/seta valoarea proprietăţii.
Proprietăţile pot fi declarate în:
• secţiunea public, făcând astfel posibilă accesarea lor la momentul execuţiei aplicaţiei; setarea valorii unei astfel de proprietăţi se face la momentul execuţiei programului şi doar prin cod;
• secţiunea published, făcând astfel posibilă accesarea lor şi la momentul proiectării aplicaţiei; acest lucru face ca proprietatea să fie vizibilă în Object Inspector, deci valoarea ei poate fi setată şi la momentul proiectării (din Object Inspector).
Un exemplu tipic de declarare a unei proprietăţi este următorul: type
TComponentaMea=class(TComponent) private
FNumar:integer; published
property Număr:integer read FNumar write FNumar; end;
O dată membră poate fi accesată şi indirect, cu ajutorul unor metode de tipul Get sau Set (care vor fi discutate în secţiunea următoare):
typeTComponentaMea=class(TComponent) private
FNumar:integer;procedure SetValoare(Val:integer); function GetValoare:integer;
publishedproperty Număr:integer read SetValoare write SetValoare;
end;
31.2.3. Memorarea internă a datelor
Datele unei proprietăţi sunt memorate ca date membre ale clasei. Nu există restricţii, dar este de preferat să se respecte nişte convenţii:
Identificatorii pentru datele membre ale proprietăţilor încep cu litera F şi încorporează numele proprietăţii. De exemplu, proprietatea Width definită în TControl are data membră asocită cu numele FWidth.
426
Datele membre pentru o proprietate trebuie declarate ca private, deci componentele descendente nu o pot accesa direct, ci doar prin intermediul proprietăţii ataşate.
31.2.4. Metode de acces
Sintaxa declarării unei proprietăţi permite părţilor read şi w rite să specifice metodele folosite pentru a accesa o dată membră.
• Metoda Read
Este o funcţie care nu are nici un parametru (excepţie făcând proprietăţile de tip a rray şi proprietăţile care împart aceeaşi metodă read) şi returnează o valoare de acelaşi tip ca şi proprietatea. Această metodă se foloseşte când este nevoie de valoarea unei proprietăţi. în acel moment funcţia ataşată citeşte valoarea datei membre corespunzătoare şi o returnează.Prin convenţie numele ei începe cu Get şi se continuă cu numele proprietăţii.Singura excepţie pentru regula fară parametri o au proprietăţile array care pasează indecşi ca parametri, sau pentru proprietăţile care au specificatorul index.
• Metoda W rite
Este o procedură care are un singur parametru (excepţie făcând proprietăţile de tip a rray şi proprietăţile care au aceeaşi metodă write) şi care setează datele membre corespunzătoare unei proprietăţi. Parametrul are acelaşi tip cu proprietatea.Prin convenţie, numele procedurii începe cu Set şi se continuă cu numele proprietăţii.Această procedură se apelază când este atribuită o nouă valoare proprietăţii şi va seta datele membre la noile valori.De exemplu, să considerăm clasa declarată mai sus:
typeTComponentaMea=class(TComponent) private
FNumar:integer;procedure SetValoare(Val:integer); function GetValoare:integer);
publishedproperty Număr:integer read GetValoare write SetValoare;
end;
427
Implementările lui GetValoare şi SetValoare sunt:
procedure TComponentaMea.SetValoare(Val: integer); begin
if Val o FNumar then FNumar := Val;
end;
function TComponentaMea.GetValoare:integer; begin
GetValoare := FNumar; end;
Observaţie:
Funcţiile de tip Get şi Set trebuie declarate în secţiunea private a unei clase pentru a nu se avea acces la ele din afara clasei.
Mai multe proprietăţi pot utiliza aceleaşi metode read şi write, folosindu-se pentru aceasta de specificatorul index.
31.2.5. Valori implicite ale proprietăţilor
In momentul declarării unei proprietăţi se poate specifica o valoare implicită pentru acea proprietate. De exemplu, pentru a specifica că valoarea implicită pentru proprietatea /sTrue este true, vom scrie următoarea linie:
property IsTrue:boolean = {default=true};Asta nu înseamnă că valoarea iniţială a proprietăţii va fi setată la true
(mai general la ceea ce i se atribuie lui default), ci că, în cazul în care valoarea unei proprietăţi va fi diferită de valoarea lui default, ea va fi salvată în fişierul .dfin.
Dacă redeclaraţi o proprietate, atunci puteţi să specificaţi că ea nu va avea nici o valoare implicită, chiar dacă proprietatea strămoş are acest lucru, folosind specificatorul nodefault:
property Newlnteger:integer = {nodefault};
31.2.6. Proprietăţi de tip array
Aceste proprietăţi pot fi indexate într-un mod asemănător cu al vectorilor. Un exemplu este proprietatea Lines a componentei TMemo. Această proprietate reprezintă o listă indexată de stringuri (AnsiString) care împreună alcătuiesc textul cutie de tip TMemo. Fiecare string poate fi accesat prin intermediul unui indice.
428
Scrierea unei proprietăţi de tip array este asemănătoare cu scrierea unei proprietăţi normale, cu unele mici excepţii şi anume:
Declararea proprietăţii cuprinde unul sau mai mulţi indecşi de un tip specificat. Acest tip poate să fie orice, nu neapărat un tip ordinal.
Părţile de tip read şi write ale unei metode trebuie să fie metode şi nu date membre.
Metodele ataşate părţilor read şi write au, pe lângă parametrii obişnuiţi, şi parametrii corespunzători indecşilor. Aceşti parametri trebuie să fie în aceeaşi ordine şi de acelaşi tip ca şi cei specificaţi în declararea proprietăţii.
Exemplu:type
TComponentaMea=class(TComponent) private
function GetNumberSize(Index:integer):string; publicproperty NumberSize[Index:integer]:string =
{read=GetNumberSize};
end;
Funcţia GetNumberSize este:
function TComponentaMea.GetNumberSize (Index:integer):string;
begincase Index of
0: Result:= "Zero";100: Result = "Mediu";1000: Result = "Mare"; else Result = "Lungime foarte mare";
end; end;
31.2.7. Editoare de proprietăţi
într-un sens mai larg, această noţiune poate fi definită ca fiind o cutie de dialog prin intermediul căreia utilizatorul setează valoarea unei anumite proprietăţi (de exemplu, proprietatea Color a lui TForm). în momentul în care o componentă este selectată în O bject Inspector, acesta scanează toate proprietăţile şi va crea un editor de proprietăţi pentru fiecare proprietate în parte. De exemplu, dacă proprietatea este de tip integer, atunci un editor de proprietăţi pentru întregi va fi creat (implicit este de tipul TIntegerProperty).
429
Toate editoarele de proprietăţi derivă din TPropertyEditor. Editorul de proprietăţi este creat pe baza tipului proprietăţii care urmează să fie editată aşa cum este el dedus din tipul folosit de către RegisterPropertyEditor.
Pentru a uşura munca programatorului, Delphi-ul pune la dispoziţie câteva clase predefmite de editoare de proprietăţi. O parte din tipurile de editoare de proprietăţi predefmite ar fi:
T ip Sem nificaţie
T O rdinalP roperty Este clasa de bază pentru toate editoarele de tip ordinal (integer, char, enumerare...).
TIntegerP roperty Este editorul implicit pentru proprietăţile de tip long şi pentru toate subtipurile lui long (int, 1..10, etc).
TC harProperty Este editorul implicit pentru proprietăţile de tip char sau subintervale ale lui ch ar ( ‘A ’..’F ) .
T F loatP roperty Este editorul im plicit pentru numere reale.
TEnum Property Este editorul implicit pentru toate proprietăţile de tip enumerare.
TStringProperty Este editorul implicit pentru şiruri de caractere.
TSetElem entProperty Este editorul implicit pentru un elem ent dintr-o mulţime. Acest elem ent este văzut ca valoare booleană (aparţine sau nu mulţimii).
TSetPropertyEste editorul im plicit pentru proprietăţile de tip mulţime. A cest editor nu permite editarea directă a mulţimii, dar va afişa o listă de sub-proprietăţi cu fiecare elem ent al mulţimii.
T C lassP ropertyEste editorul implicit pentru proprietăţile care sunt la rândul lor clase. Va afişa numele clasei şi va permite editarea proprietăţilor obiectului ca sub-proprietăţi ale proprietăţii curente.
TM ethodProperty Este editorul im plicit pentru pointeri la metode (de exem plu, pentru evenimente).
TCom ponentPropertyProprietatea care are un editor de acest tip poate lua ca valoare orice componentă, de pe forma curentă, care are însă acelaşi tip cu proprietatea. D e exem plu proprietatea A ctiveC ontrol a lui TForm.
T C olorP roperty
Este editorul im plicit pentru proprietăţi de tip TColor. A fişează o listă drop-down cu culorile disponibile. La dublu click pe proprietate apare o cutie de dialog din care se va selecta visual culoarea dorită.
TFontNam ePropertyA fişează o listă drop-down cu toate fonturile disponibile din sistem.
TFontPropertyEste editorul im plicit pentru proprietăţi de tip TFont. Se poate edita sub-properităţile individual sau se accesează o cutie de dialog.
TC ursorP ropertyEste editorul im plicit pentru proprietăţi de tip TCursor. Se afişează o listă drop-down pentru a se alege un cursor dintre cele disponibile.
TM odalR esultPropertyEste editorul implicit pentru proprietăţi de tip TM odalResult. Se afişează o listă drop-down pentru alegerea unei valori modale. De exem plu, proprietatea M odalR esult a lui TBitBtn.
T ip Sem nificaţie
TShortCutProperty Este editorul im plicit pentru proprietăţi de tip TShortCut. Permite fie alegerea, fie tastarea unui short-cut.
TM PFilenam eProperty Afişează o cutie de dialog pentru deschiderea unui fişier media.
TD ateP roperty,TTim eProperty
Sunt editoarele pentru proprietăţile de tip dată şi timp a lui TDateTime.
TDateTim e Property Permite editarea datei şi timpului împreună.
Dacă doriţi să creaţi alte proprietăţi mai speciale trebuie ca clasa editorului vostru să derive din unele din clasele descrise mai sus (sau direct din TProperty Editor).
Observaţie:
Un editor de proprietăţi trebuie creat doar atunci când nici unul dintre tipurile implicite nu sunt suficiente. Acest lucru apare dacă proprietatea este un obiect.
Pentru a manipula comportamentul unei proprietăţi, utilizatorul trebuie să redefmească 4 metode ale lui TPropertyEditor şi anume:
M l. GetAttributes
function GetAttributes: TProperty Attributes; override;
îi spune lui O bject Inspector despre caracteristicile editorului de proprietăţi, pentru ca acesta (O bject Inspector) să afişeze unealta necesară. GetAttributes returnează o mulţime de tipul TPropertyAttributes care este alcătuit din următoarele valori:
V aloare Sem nificaţie
paV alueL istEditorul poate să retumeze o listă cu valori posibile pentru o proprietate. Aceasta va însemana că un buton drop-down va apărea în O bject In spec tor la dreapta proprietăţii.
paSortL ist Indică lui O bject In spec to r că lista trebuie sortată.
paSu bP roperties Proprietatea are subproprietăţi care vor fi afişate indentat.
paR eadO n ly Utilizatorul nu poate m odifica valoarea proprietăţii la timpul proiectării aplicaţiei.
p a D ia log Indică că metoda E dit va afişa o cutie de dialog pentru editarea proprietăţii.
paM ultiS electIndică lui O bjectln spec tor să afişeze proprietatea respectivă în cazul în care există selectate mai multe com ponente care o au.
■paRevertable Permite proprietăţii să revină la o valoare iniţială.
paA utoU pdate Componenta trebuie reînnoită după fiecare schimbare a unei
431
V aloare Sem n ificaţie
proprietăţi.
Exemple:
E ditoru l de proprietăţi
A tribu te
TEnum Property paM ultiSelect, paValueList, paS ortU st, paR evertable
TSetElem entProperty paM ultiSelect, paV alueList, paSortL ist
TSetProperty paM ultiSelect, paSubProperties, paR eadO nly, paR evertable
T C lassP roperty paM ultiSelect, paSubProperties, paR eadO nly
TFontNam eProperty paM ultiSelect, paValueList, paSortList, paR evertable
TC olorP roperty paM ultiSelect, paD ialog, paV alueList, paR evertable
paM ultiSelect, paValueList, paSortList, paR evertable
TF ontProperty paM ultiSelect, paSubProperties, paD ialog , paR eadO nly
TShortCutProperty paM ultiSelect, paValueList, paR evertable
M2. GetValue
function GetValue: string; override;
Este o funcţie care converteşte datele membre într-un şir de caractere text pentru a fi afişat în Object Inspector (de exemplu, o mulţime este afişată sub forma unui string [ell,el2,...,eln]). Implicit, această funcţie întoarce valoarea "unknown''. Dacă proprietatea nu este un string, atunci editorul trebuie să facă conversia la string.De exemplu, metoda GetValue pentru tipul integer este:
function TIntegerProperty.GetValue: string; begin
Result:=IntToStr(GetOrdValue); end;
M3. SetValue
procedure SetVaIue(const Value: string); override;
Această procedură converteşte stringul din coloana cu valori a unei proprietăţi în valori efective pe care le atribuie datelor membre corespunzătoare. Utilizatorul poate tasta un şir de caractere pe care metoda SetValue îl va converti la tipul proprietăţii şi îl va asigna datelor membre. în cazul în care şirul nu este corect trebuie generată şi tratată o excepţie.De exemplu, procedura SetValue pentru tipul integer este:
432
procedure TIntegerProperty.SetValue(const Value: string);var L : Longint;
beginL := StrToInt(Value);SetOrdValue(L);
end;Editorul de proprietăţi mai moşteneşte un set de metode folosit pentru a atribui sau citi diferite feluri de valori:
T ipul proprietăţii M etod a “ G et” M etod a “Set”
T ip ordinal GetOrdValue SetOrdValue
S trin g GetS trValue SetStrValue
E ven im en t GetM ethodValue SetM etbod Value
T ip V arian t GetVarValue SetVarValue
T ipuri reale GetFIoatVa lue SetFJoatValue
M 4. Edit
procedure Edit; override;
Este apelată de fiecare dată când utilizatorul apasă butonul ( ...) din dreapta unei proprietăţi sau când pe proprietate se execută dublu click. Acest lucru poate genera, de exemplu, afişarea unei cutii de dialog, pentru a permite editarea proprietăţii într-un mod mai sugestiv decât text simplu (vezi Font sau Color). în interiorul acestei metode urmaţi paşii:
a. construiţi editorul pe care îl folosiţi pentru proprietate;b. citiţi valoarea curentă şi atribuiţi-o proprietăţii folosind o metodă de
tip “Ger”;c. când utilizatorul selectează o nouă valoare folosiţi o metoda “Se?” ;d. distrugeţi editorul de proprietăţi.
Exemplu:procedure TColorProperty.Edit;var ColorDialog: TColorDialog;
beginColorDialog := TColorDialog.Create{Application);
tryColorDialog.Color : = GetOrdValue; if ColorDialog.Execute then SetOrdValue(ColorDialog.Color) ;
finally
ColorDialog.Free; end;
433
e n d ;
M5. Activate
procedure Activate; override;
Această metodă este apelată ori de câte ori proprietatea respectivă devine selectată în O bject Inspector. Acest lucru este util, de exemplu, în cazul în care anumite atribute ale proprietăţii trebuie sau pot fi determinate doar atunci când aceasta este selectată.
Restricţii:
Se poate apela doar atunci când GetAttributes întoarce paM ultiSelect şi paSubProperties.
M6. AllEqual
function AllEqual: Boolean; override;
Este apelată atunci când mai multe componente sunt selectate în Object Inspector. Dacă întoarce true, atunci este apelată GetValue. Dacă, dimpotrivă, întoarce valoarea false, atunci un şir vid este afişat în Object Inspector.
Restricţii:
Se poate apela doar atunci când GetAttributes întoarce paMultiSelect.
M7. GetEditLimit
function GetEditLimit: Integer; override;
Returnează numărul de caractere pe care utilizatorul le poate introduce pentru specificarea valorii unei proprietăţi. Implicit este 255.
M 8. GetName
function GetName: string; override;
Returnează numele proprietăţii. Toate liniile de subliniere sunt înlocuitre cu spaţii.
M9. GetProperties
procedure GetProperties(Proc: TGetPropEditProc); override;
Această metodă trebuie redefinită doar pentru a apela PropertyProc pentru fiecare dintre sub-proprietăţile proprietăţii curent editate şi
434
atribuirea de editoare pentru fiecare din acestea. De exemplu, tipul TSetProperty specifică câte un editor pentru fiecare element al unei mulţimi. Totodată, TClassProperty are nevoie de un editor pentru fiecare element al său deoarece acesta poate fi, de asemenea, o clasă:
procedure TClassProperty.GetProperties(Proc: TGetPropEditProc); var I: Integer;
Components: TComponentList;begin
Components := TComponentList.Create; tryfor I := 0 to PropCount - 1 do
Components.Add(TComponent(GetOrdValueAt(I ))); GetComponentProperties(Components, tkProperties,
Designer, Proc);finally
Components.Free; end;
end;
M 10. GetPropType
function GetPropType: PTypelnfo;
Returnează un pointer la tipul informaţiei proprietăţii (proprietăţilor) curent editate. Această metodă nu mai trebuie redefinită. Felul în care este implementată în TPropertyEditor este următorul:function TPropertyEditor.GetPropType: PTypelnfo; begin
Result := FPropList'' [ 0 ] . Proplnf . PropType'' end;
M II . GetValues
function GetValue: string; override;
Este apelată când GetAttributes întoarce paValueList. De exemplu, felul în care este ea implementată pentru tipul TEnuiiiProperty este următorul:
procedure TEnumProperty.GetValues(Proc: TGetStrProc); var I: Integer,-
EnumType: PTypelnfo;begin
EnumType := GetPropType; with GetTypeData(EnumType)" do
for I := MinValue to MaxValue doProc(GetEnumName(EnumType, X ));
end;
435
M12. Initialize
procedure Initialize; override;
Este apelată după ce editorul de proprietăţi a fost creat dar înainte de a fi apelat.
M13. GetComponent
function GetComponent(//!^ejc: Integer): TPersistent;
Este returnată a Index-a componentă editată de acest editor de proprietăţi.
Restricţii:
Poate fi apelată doar când paM ultiSelect este returnată de către GetAttributes.
Toate acestea fiind făcute nu ne mai rămâne decât să înregistrăm editorul de proprietăţi.
Prin înregistrarea unui editor se asociază un tip de proprietate cu un anume editor de proprietăţi. Se poate înregistra editorul pentru o anumită proprietate a unei anumite componente, sau pentru toate proprietăţile de un anumit tip.
înregistrarea unei componente se face cu ajutorul metodei RegisterPropertyEditor. Ea are prototipul definit astfel:
procedure RegisterPropertyEditor(PropertyType: PTypelnfo;ComponentClass: TClass; const PropertyName: string EditorClass: TPropertyEditorClass);
unde:
- PropertyType
Este un pointer la tipul informaţiei pentru tipul proprietăţii editate aşa cum este ea returnată de către funcţia Typelnfo. De exemplu, Typelnfo (TComponentaMea).
- ComponentClass
Este tipul componentei la care se aplică acest tip de editor. Dacă acest parametru este nil, atunci tipul de editor se aplică pentru toate proprietăţile având tipul PropertyType.
- PropertyName
Este numele proprietăţii la care se restricţionează acest editor. Dacă acest parametru este ( ” ), atunci acest editor se aplică la toate proprietăţile având PropertyType în ComponentClass.
436
- EditorClass
Este tipul editorului de proprietăţi folosit pentru a edita proprietatea specificată. Acesta va fi creat prin apelul EditorClass. Create.
Exemple:procedure Register; begin
RegisterPropertyEditor(Typelnfo(TComponent), nil,'' , TComponentProperty);
RegisterPropertyEditor(Typelnfo(TComponentName),TComponent, 'Name', TComponentNameProperty);
RegisterPropertyEditor(Typelnfo(TMenuItem),TMenu,'',TMenuItemProperty);
end;
Aceste trei funcţii descriu trei utilizări diferite ale lui RegisterPropertyEditor:
Prima înregistrează editorul de proprietăţi (TComponentProperty) pentru toate proprietăţile de tipul TComponent.
A doua înregistrează un editor pentru o proprietate specifică în cadrul unei anumite componente. în acest caz este vorba de proprietatea Name.
A treia funcţie înregistrează un editor pentru toate proprietăţile de tip TMenuItem în componente de tip TMenu.
31.3. Scrierea de metode
Nu introduce nimic nou faţă de metodele claselor.
Exemplu:
Să vedem însă când sunt apelaţi constructorul şi destructorul unei clase. Pentru aceasta vom implementa o componentă simplă care are un constructor şi un destructor. Aceştia sunt definiţi în secţiunea public a clasei TComponentaMea astfel:
constructor Create(AOwner : TComponent); override; destructor Destroy; override;Implementările acestor două metode speciale sunt:constructor TComponentaMea.Create(AOwner : TComponent); begin
inherited C re a te (AOwner) ; //se apeleaza constructorul clasei de baza Show M essage( ' S -a a p e l a t c o n s t r u c t o r u l . ' ) ;
437
e n d ;
destructor TComponentaMea.Destroy; begin
ShowMessage('S-a apelat destructorul.'); inherited Destroy; // se apeleaza destructorul clasei de baza
end;
Următorul pas este instalarea acestei componente. Acest lucru îl vom realiza accesând itemul Install din meniul Component. Un mesaj ne va confirma pagina pe care a fost aşezată componenta. Selectăm componenta din Com ponent Palette şi o aşezăm pe formă. în acest moment va fi apelat pentru prima dată constructorul şi va fi afişat mesajul scris de noi în corpul constructorului. Aceasta însemnă că obiectele amplasabile pe formă (componentele) sunt active, ele executând o anumită secvenţă de instrucţiuni. Acum să lansăm aplicaţia în execuţie. în acest moment constructorul se va apela pentru a doua oară. Aceasta înseamnă că a fost creat un nou obiect de clasă TComponentaMea. La distrugerea formei aplicaţiei se va apela destructorul. Acesta se va mai apela încă o dată la ştergerea componentei de pe formă.
31.4. Scrierea de evenimente
Un eveniment este o legătură dintre o apariţie în sistem (ca de exemplu apăsarea unei taste sau mişcarea cursorului de mouse) şi o secvenţă de instrucţiuni (numită handler de evenimente) care răspunde la apariţia respectivă.
Privit prin prisma utilizatorului de componente, evenimentul este doar un nume legat de un eveniment al sistemului, ca de exemplu OnClick, care apare în momentul în care utilizatorul apasă un buton al mouse-ului.
Privit prin prisma creatorului de componente, un eveniment este un pointer la o metodă. Din acest motiv şi tipurile de evenimente trebuie să fie de tip pointeri la metode. De exemplu tipul de eveniment TKeyPressEvent este definit astfel:
TKeyPressEvent = procedure(Senflfer TObject; var Key: Char)of object;
iar tipul TNotifyEvent este definit astfel:
type TNotifyEvent = procedure (Sender: TObject) of object;
Handlerele de evenimente trebuie să fie neapărat proceduri, deşi compilatorul permite şi funcţii. Chiar şi aşa se pot obţine informaţii de la utilizator prin folosirea de parametrii referinţă (aşa cum se vede mai sus).
Componentele folosesc proprietăţile pentru a crea evenimente. Spre deosebire de majoritatea proprietăţilor, evenimentele nu folosesc metode în părţile cu read şi w rite, ele accesând direct datele membre ale componentei.
438
Prin convenţie, data membră are acelaşi nume ca şi evenimentul, precedat însă de litera F, iar evenimentul are numele prefixat de cuvântul On:
typeTControl = class(TCom ponent)
privateFOnClick: TNotifyEvent; { declare a field to hold
the method pointer }
protectedproperty OnClick: TN otifyEvent read FOnClick write FOnClick;
end;
Din punctul de vedere al modului de interacţiune evenimentele pot fi împărţite în două categorii:
• interacţiune-utilizator, care sunt generate întotdeauna de către un mesaj Windows; de exemplu, când utilizatorul apasă un buton de mouse, Windows-ul trimite aplicaţiei mesajul
WM_LBUTTONDOWN.
• schimbări de stare, care sunt generate de schimbarea valorilor unor proprietăţi.
31.5. Grafica în componente
Unul dintre lucrurile cele mai importante dintr-o componentă este modul în care ea se afişează pe ecran. Windows-ul oferă un puternic Graphics Device Interface (GDI) pentru grafice independente de dispozitiv. Dar acest GDI este greu de folosit, necesitând eforturi serioase din partea programatorilor. Delphi- ul minimizează efortul necesar creării graficii pentru o componentă, dându-i posibilitatea programatorului să se concentreze spre aspectele importante ale unei aplicaţii şi să neglijeze detaliile.
Folosindu-se de proprietatea Canvas a unei componente, programatorul este scutit de lucrul la un nivel scăzut cu funcţii grafice. Canvas-ul manipulează toate resursele grafice ca Pen, Brush, Font, etc. care vor fi alocate şi eliberate fără ca programatorul să se mai ocupe de aceasta.
Exemplu:
Desenarea unei elipse într-o fereastră, mai întâi folosind funcţii API, iar mai apoi folosind avantajele lui Delphi:
procedure TMyWindow.Paint(PaintDC: HDC;var Paintlnfo: TPaintStruct);
var PenHandle, OldPenHandle: HPEN;BrushHandle, OldBrush.Han.dle-. HBRUSH;
439
beginPenHandle := CreatePen(PS_SOLID, 1, RGB(0, 0, 255));OldPenHandle := SelectObject(PaintDC, PenHandle) ,- BrushHandle := CreateSolidBrush(RGB(255, 255, 0)) ;OldBrushHandle := SelectObject(PaintDC, BrushHandle);
Ellipse(HDC, 10, 10, 50, 50);SelectObject(OldBrushHandle);DeleteObject(BrushHandle);SelectObject(OldPenHandle);DeleteObject(PenHandle);
end;
procedure TForml.FormPaint(Sender: TObject); beginwith Canvas do begin
Pen.Color := clBlue;Brush.Color := clYellow;Ellipse(10, 10, 50, 50);
end; end;
Deci canvasul poate fi folosit fie la un nivel superior (prin metode de genul M oveTo, LineTo, Ellipse, TextOut, FloodFill, etc. sau prin proprietăţile Pen, Brush, Pixels, Font, etc.) sau la un nivel de jos prin apelul funcţiilor API.
Nu toate componentele au proprietatea Canvas ci doar acelea care derivă din TGraphicControl. De aceea, componentele vizuale trebuie să derive din TGraphicControl.
Deci, pentru ca în momentul în care o componentă este plasată pe o formă să apară ceva desenat pe formă (ceva diferit de imaginea sa în Com ponent Palette), trebuie ca programatorul să redefinească metoda Paint a lui TGraphicControl.
31.6. Editoarele de componente
Editoarele de componente permit tratarea acestora (a componentelor) ca pe un întreg. Editorul de forme instanţiază un editor de componente în momentul în care componenta este aşezată pe formă. Tot atunci se determină câte unelte sunt necesare componentei. Aceste unelte sunt afişate în partea de sus a meniului (denumit şi speed menu) de tip popup care apare la click dreapta pe o componentă aşezată pe o formă. Fiecare din aceste unelte sunt numite, în limbajul VCL, verbe.
Un editor de componente este o clasă care derivă din TDefaultEditor. Pentru a adapta comportamentul componentei la necesităţile dumneavoastră, trebuie să redefiniţi câteva metode ale lui TDefaultEditor şi anume:
440
M l.
M2.
M3.
M4.
M5.
M6.
constructo r Create(AComponent: TComponent;ADesigner. TFormDesigner); override;
Este constructorul apelat pentru a crea un editor de componente. AComponent este componenta care urmează a fi editată.
GetVerbCount
function GetVerbCount: Integer; override;
Returnează numărul verbelor pe care editorul vostru le oferă.
GetVerb
function GetVerb (index: Integer): string; override;
Returnează un şir care reprezintă al Index-lea verb din speed menu. Primul verb are numărul de ordine 0, al doilea are numărul de ordine 1, ş.a.m.d.
ExecuteVerbprocedure ExecuteVerb(Index: Integer); override;Lansează în execuţie al Index-lea verb. Dacă utilizatorul execută dublu click pe o componentă, atunci este apelată ExecuteVerb(0).
Edit
procedure Edit; override;
Ciclează prin toată lista de proprietăţi a unei componente. Pentru fiecare proprietate, Edit apelează EditProperty. Utilizatorul nu trebuie să rede- finească Edit ci doar EditProperty.
EditProperty
procedure Ed i tProperty(PropertyE ditor TPropertyEditor;v ar Continue, FreeEditor: Boolean); override;
- PropertyEditor este numele editorului de proprietăţi care va fi afişat.
- Continue îi spune metodei Edit dacă să mai cicleze sau nu prin lista de proprietăţi.FreeEditor indică dacă editorul de proprietăţi va fi distrus sau nu.
Create
441
M7. Copy
procedure Copy; override;
Este apelată în momentul în care o componentă este copiată în Clipboard. Ceea ce se copiază în clipboard când se dă Copy pe o componentă este definiţia acesteia din fişierul .dfm. De exemplu, pentru o componentă TLabel, ceea ce se copiază în Clipboard este:object Labell: TLabel
Left = 96 Top = 88 Width = 32 Height = 13 Caption = 'Labell'
end
Ca şi în cazul editoarelor de proprietăţi trebuie făcută şi înregistrarea editoarelor de componente.
înregistrarea editoarelor de componente se face cu ajutorul procedurii RegisterComponentEditor definită astfel:
procedure RegisterComponent£ditor(ComponentClass-. TComponentClass;ComponentEditor. TComponentEditorCIass);
unde ComponentClass şi ComponentEditor sunt pointeri la tipul clasei respectiv la tipul editorului clasei.
31.7. Help pentru componente
Crearea unui fişier help pentru o componentă se face cu ajutorul utilitarului HCW. Pentru a furniza context sensitive pentru o componentă (adică în momentul în care focusul este pe o componentă şi se apasă FI să apară ecranul de help pentru aceea componentă), trebuie ca fişierul help al acelei componente să fie adăugat la helpul Delphi. Acest lucru se poate face folosind utilitarul OpenHelp (furnizat odată cu Delphi-ul). Mie personal acest utilitar nu mi-a funcţionat, de aceea am adoptat o altă metodă: am scris direct în fişierul BcbHelp.cfg care se găseşte în directorul Help. în acest fişier am mai adăugat două linii (să presupunem că componenta creată de mine se numeşte TMyComp, iar fişierul de help pentru ea se numeşte TMyComp.hlp):
: INDEX TMyComp=c : \Program Files\...\TMyComp. hlp : LINK c:\Program Files\...\TMyComp .hlp .
442
31.8. înregistrarea componentelor
Este un process prin care i se indică Delphi-ului care componente vor fi adăugate la pachetele sale cu componente şi unde vor fi adăugate acestea în Component Palette.
Pentru a înregistra o nouă componentă urmaţi etapele descrise mai jos:
1. Adăugaţi o procedură numită Register la fişierul .PAS. Acesta va arăta ceva de genul următor:
unit MyBtns; interface
typeţ Scrieţi interfaţa pentru componentă aici}
procedure Register; { aici declaraţi procedura R egister) implementation { Faceli implementarea componentei aici} procedure Register; begin
{înregistraţi componenta aici} end;
end.
2. în interiorul procedurii Register apelaţi RegisterComponents
procedure RegisterComponents(const Page: string;ComponentClasses: array of TComponentClass);
Este o procedură care are doi parametri: numele paginii din Component Palette în care va fi adăugată componenta, vectorul cu clasele componentelor.De exemplu, înregistrarea componentei cu numele TDesen pe pagina Samples:
procedura Register; begin
RegisterComponents('Samples’, [TDesen]); end;E posibil ca un unit să conţină mai multe componente, deci este mai uşor să se apeleze o singură dată procedura RegisterComponents pentru mai multe componente care vor fi înregistrate pe aceeaşi pagină:
procedure Register; begin
RegisterComponents!'Samples', [TDesen,TMyComp]); end;
443
31.9. Adăugarea unei imagini la o componentă
Pentru ca o componentă să poată fi adăugată la C om ponent Palette, trebuie să fie însoţită de o imagine care să o reprezinte. Această imagine este un pătrat cu latura de 24 pixeli şi care poate fi creată şi cu Im age E ditor şi anume:
Lansaţi Im ageEditor-ul din meniul Tools, submeniul Im ageEditor. Din meniul File al Im age Editor-ului alegeţi submeniul New, iar apoi subsub- meniul Com ponent Resource File (.dcr).
Va fi creată o nouă fereastră care arată în felul următor:Contents este un item pe care faceţi click dreapta. Va apare un meniu
popup din care alegeţi comanda New|Bitmap. O cutie de dialog vă va cere să introduceţi dimensiunile imaginii (care în cazul nostru vor fi de 24x24).
La click dreapta pe item-ul Bitmap] va apărea acelaşi meniu popup ca şi mai înainte, dar de data aceasta sunt disponibile şi celelalte item-uri, şi anume Edit (cu care editaţi imaginea), Delete (cu care ştergeţi item-ul Bitmap) şi R enam e (cu ajutorul căruia puteţi schimba numele itemului Bitm ap], Această schimbare de nume este necesară deoarece numele bitmap-ului trebuie să fie identic cu numele componentei şi trebuie scris cu majuscule. De exemplu, dacă componenta este TMyComp, atunci numele bitmap-ului trebuie să fie TMYCOMP.
Numele fişierului care conţine imaginea este identic cu cel .PAS, dar, bineînţeles, cu extensia .DCR. Dacă utilizatorul nu specifică nici o imagine, atunci Delphi-ul foloseşte o imagine oarecare.
31.10. Exemple
31.10.1. O componentă grafică
Această componentă se afişează pe ecran sub diferite forme (Cerc, Pătrat,Dreptunghi,Elipsa), în funcţie de valoarea proprietăţii M odel (care este de tip enumerare, deci un editor implict de tip TEnumProperty va fi afişat):
unit Desen;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs;
typeTModel=(fCerc,fElipsa,fPatrat,fDreptunghi);TDesen = class(TGraphicControl) private
FModel:TModel;procedure SetDesenModel(Valoare:TModel);
444
protectedprocedure Paint; override;
publicconstructor Create(AOwner: TComponent); override;
publishedproperty Model:TModel read FModel write
SetDesenModel default fCerc;end;
procedure Register; implementationconstructor TDesen.Create(AOwner: TComponent); begin
inherited Create(AOwner);Width:= 100;Height:= 100;FModel:=fPatrat;
end;procedure TDesen.SetDesenModel(Valoare:TModel); begin
if ValoareoFModel then begin
FModel:=Valoare;Invalidate;
end;end;procedure TDesen.Paint;
var p :TRec t;m:integer;
beginp :=ClientRect; case Fmodel of
fDreptunghi:Canvas.Rectangle(p.Left,p.Top,p.Right,p .Bottom); : Canvas.Ellipse(p.Left,p.Top,p.Right,p.Bottom); : begin
if Height>Width then m:=Width else m:=Height;Canvas.Rectangle(p.Left,p.Top,
p.Left+m,p.Top+m) ;end;
: beginif Height>Width then m:=Width else m:=Height;Canvas.Ellipse(p.Left,p .Top,
p.Left+m,p.Top+m);end;
end; end;
fElipsa fPatrat
fCerc
445
procedure Register; begin
RegisterComponents('Samples 1, [TDesen]); end;
end.
31.10.2. O componentă grafică cu un eveniment
Este aceeaşi componentă din exemplul anterior, dar de data aceasta i-am ataşat un eveniment OnChange care, pe lângă Sender, mai are încă un parametru şi anume Fost în care se specifică, în momentul în care apare o schimbare de desen, fostul tip de desen (Cerc, Elipsa, Dreptunghi sau Patrat). Pentru aceasta am definit un nou tip de eveniment TChangeEvent conform cu partea teoretică de la C rearea de evenimente.
unit Desen;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs;
typeTModel=(fCerc,fElipsa,fPatrat,fDreptunghi);TChangeEvent=procedure(Sender:TObject; var Fost;string)
of obj ect ,•TDesen = class(TGraphicControl) private
FModel:TModel;FOnChange:TChangeEvent; s:string;procedure SetDesenModel(Valoare:TModel) ;
protectedprocedure Paint; override;
publicconstructor Create(AOwner: TComponent); override;
published{ Published declarations )property Model:TModel read FModel write SetDesenModel
default fCerc;property OnChange:TChangeEvent read FOnChange write FOnChange;
end;procedure Register; implementationconstructor TDesen.Create(AOwner: TComponent); begin
inherited Create(AOwner);Width:= 100;Height:=100;
446
FModel:=fPatrat ; end;procedure TDesen.SetDesenModel(Valoare:TModel); begin
if ValoareoFModel then begin
if assigned(FOnChange) then FOnChange(Self,s);FModel:=Valoare;Invalidate;
end;end;procedure TDesen.Paint; var p :TRect;
m:integer;begin
p:=ClientRect; case FModel of
fDreptunghi: begins :='Dreptunghi';Canvas.Rectangle(p.Left,p.Top,
p .Right,p .Bottom)end;
fElipsa : begins :='Elipsa';Canvas.Ellipse(p.Left,p.Top,
p .Right,p .Bottom);end;
fPatrat : begins:='Patrat'; if Height>Width then m:=Width else m:=Height;Canvas.Rectangle(p.Left,p.Top,
p .Left+m,p.Top+m)end;
fCerc : begins :='Cere'; if Height>Width then m:=Width else m:=Height;Canvas.Ellipse(p.Left,p.Top,
p . Lef t+m, p . Top+m) ;end;
end;end;
procedure Register; begin
RegisterComponents('Samples', [TDesen]); end;
e n d .
31.10.3. O cutie de dialog specială
Această cutie afişează un AboutBox. Pentru aceasta copiaţi fişierul about.pas din directorul ...\BIN în directorul d-voastră de lucru. Acest unit conţine o formă TAboutBox pe care se află etichetele cu denumirile ProductName, Version, Copyright, Comments şi o componentă TImage în care va apărea un icon al aplicaţiei pentru care creaţi cutia About. Componenta noastră va folosi această formă, deci unitul nostru (TAboutDlg) va trebui să includă unitul About.pas.
Ştim de la clasicele cutii de dialog (TOpenDialog...) că o componentă de acest tip trebuie să aibă o metodă Execute care va aduce la suprafaţă o cutie de dialog. în cazul nostru, metoda Execute va afişa forma TAboutBox. Deci componentei noastre TAboutBoxDlg îi adăugăm patru proprietăţi corespunzătoare celor patru etichete de pe forma AboutBox şi o metodă Execute care va instanţia o componentă TAboutBox.
unit AboutDlg;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms,Dialogs,About;
typeTAboutBoxDlg = class(TComponent) private
FProductName, FVersion, FCopyright, FComments: string; protected publicfunction Execute: Boolean,-
publishedproperty ProductName: string read FProductName
write FProductName; property Version: string read FVersion write FVersion; property Copyright: string read FCopyright write FCopyright; property Comments: string read FComments write FComments;
end;var AboutBox:TAboutBox; procedure Register;implementationprocedure Register; begin
RegisterComponents('Samples', [TAboutBoxDlg]); end;
448
function TaboutBoxDlg.Execute: Boolean; begin
Abo\itBox := TaboutBox. Create (Application) ; try
if ProductName = ’'then ProductName := Application.Title;AboutBox.ProductName.Caption := ProductName; AboutBox.Version.Caption := Version;AboutBox.Copyright.Caption := Copyright;AboutBox.Comments.Caption : = Comments;AboutBox.Caption := 'About ' + ProductName;with AboutBox dobegin
Programlcon.Picture.Graphic := Application.Icon; Result (ShowModal = IDOK);
end; finally
AboutBox.Free;
end;end;end.
31.10.4. A doua cutie de dialog specială
O cutie de dialog trebuie să iniţializeze un dialog cu utilizatorul şi deci să returneze rezultatul dialogului. In acest scop am creat componenta TSirDialog care afişează o cutie de dialog în care utilizatorul este solicitat să introducă un şir de caractere. Cutia de dialog, care este formată din o componentă TEdit şi două componente TBitBtn (un buton de tip Default, iar celălalt de tip Cancel) s-ar fi putut realiza şi vizual (aşa cum era realizat AboutBox-\i\ din exemplul anterior), dar atunci ar fi fost mai problematică transmiterea de date spre componenta propriu-zisă (în cazul nostru TSirDialog). Aşa că am realizat această cutie de dialog doar folosind cod sursă. Componenta propriu-zisă TSirDialog are o proprietate şi anume proprietate Sir care va reţine şirul introdus de utilizator şi o metodă Execute care va crea un dialog cu utilizatorul şi va returna un şir de caractere introdus de acesta.
unit SirDialog;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
typeTSirDialog = class(TComponent)
449
privateFSir:string;
protected public
function Execute:boolean; published
property Sir .-string read FSir write FSir; end;
procedure Register; implementation
function TSirDialog.Execute:boolean; var f:TForm;
e:TEdit;bOk,bCancel:TBitBtn;
beginf:=TForm.Create(Application);f . Le f t : = 1; f . Top : = 1f.Width := 300 ; f.Height : = 200 ;f.Caption := 'SirDialog';f.Font.Color := clWindowText;f.Font.Height := -11;f.Font.Name := 'MS Sans Serif';f.Font.Style := [];e:=TEdi t.Create(f) ;e.Top:= 5 0; e.Le f t:= 8 0;e.Width := 121; e.Height := 21 ;e.TabOrder := 1 ;e.Text := ' ' ;e.Parent:=f;e.Visible:=true;bOk:=TBitBtn.Create(f);bCancel:=TBitBtn.Create(f);bOk.Kind:=bkOk ;bCancel.Kind:=bkCancel;b0k.Top:=100; bCancel.Top:=100;bOk.Left:=50; bCancel.Left:=150;bOk.Parent:=f ;bCancel.Parent: = f;Result:=f.ShowModal=mrOk; if Resultthen FSir:=e.Text;e.Free; bOk.Free; bCancel.Free;f.Free;
end;procedure Register; beginRegisterComponents('Samples', [TSirDialog]);
end;
450
e n d .
31.10.5. O componentă cu editor de proprietăţi
Este vorba de o componentă simplă care are două proprietăţi NumeSursa şi NumeDestinaţie. Acestea reprezintă două nume de fişiere între care se va face o operaţie de copiere prin intermediul metodei Copiază. Nimic deosebit până aici. însă ceea ce am vrut să scot în evidenţă a fost modul de introducere al numelor celor două fişiere. Pentru aceasta nu am creat două proprietăţi de tip string care să reprezinte cele două nume, ci am creat o clasă care are ca date membre cele două nume de fişiere.
Deci, cum am mai spus şi în partea teoretică, o componentă care are o proprietate cu editor de proprietăţi are nevoie de cel puţin 4 clase şi anume:
a. clasa propriu-zisă a componentei
în cazul nostru se numeşte TCopyComp.
b. clasa proprietăţii
Deoarece este nevoie de editoare de proprietăţi doar atunci când valoarea proprietăţii este o dată complexă. în cazul nostru clasa se numeşte TNumeFisiere.
c. clasa editorului de proprietăţi
Trebuie să derive din TPropertyEditor care trebuie să redefîneacă câteva metode. în cazul nostru clasa se numeşte TNumeFisiereProperty şi are redefinite metodele Edit şi GetAttributes.
d. clasa părţii de dialog
Constă din două componente TEdit în care se vor introduce numele fişierelor între care se va face copierea, două butoane TButton care vor fi folosite pentru a apela două cutii de dialog (componente de tip TOpenDialog) care vor permite selectarea, din fişierele existente, a celor două între care se face operaţia de copiere. Totodată dialogul mai conţine două componente TBitBtn una de tip Default şi alta de tip Cancel al căror scop este evident. Această cutie de dialog va arăta astfel:
451
m Dialogul z m m
y o k : : X Caflce|
Pentru a nu încărca un singur fişier, am pus clasele TCopyComp şi TNumeFişiere în alt unit:
unit CopyComp;interfaceuses
Classes, Graphics, Controls, Forms,fmxutils;
typeTNumeFisiere = class(TPersistent) private
FFisierSursa:string;FFisierDestinatie:string; procedure SetSursa(Valoare:string); procedure SetDestinatie(Valoare:string);{ Private declarations }
protected{ Protected declarations }
public( Public declarations }procedure Atribuie(Valoare:TNumeFisiere);
published{ Published declarations }property FisierSursa:string read FFisierSursa write SetSursa; property FisierDestinatie:string read FFisierDestinatie
write SetDestinatie;end;
TCopyComp=class(TComponent)FNumeFisiere:TNumeFisiere;constructor Create(AOwner:TComponent); override; procedure SetFisiere(Valoare:TNumeFisiere);
452
privateprotectedpublicprocedure Copiaza;
publishedproperty NumeFisiere:TNumeFisiere read FNumeFisiere
write SetFisiere;end;
implementation
procedure TNumeFisiere.SetSursa(Valoare:string); begin
if ValoareoFFisierSursa then FFisierSursa:=Valoare;
end;procedure TNumeFisiere.SetDestinatie(Valoare:string); begin
if ValoareoFFisierDestinatie then FFisierDestinatie:=Valoare;
end;procedure TNumeFisiere.Atribuie(Valoare:TNumeFisiere); begin
FişierSursa:=Valoare.FisierSursa;FisierDestinatie:=Valoare.FisierDestinatie;
end;constructor TCopyComp.Create(AOwner: TComponent); begin
inherited Create(AOwner);FNumeFisiere:=TNumeFisiere.Create ;FNumeFisiere.FisierSursa:='f1.txt';FNumeFisiere.FisierDestinatie:=1f2.txt1;
end;procedure TCopyComp.SetFisiere(Valoare:TNumeFisiere); begin
FNumeFisiere.Atribuie(Valoare); end;procedure TCopyComp.Copiaza; beginCopyFile(FNumeFisiere.FisierSursa,FNumeFisiere.FisierDestinatie); end;end.
iar unitul care conţine clasele TDialogul şi TNumeFisiereEditor este:
unit dialog;
453
i
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, CopyComp, StdCtrls, Buttons,Dsgnlntf;
typeTDialogul = class(TForm)Editl: TEdit;Edit2: TEdit;BitBtnl: TBitBtn;BitBtn2: TBitBtn;Buttonl: TButton;Button2: TButton;OpenDialogI: TOpenDialog;OpenDialog2: TOpenDialog; procedure ButtonlClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure BitBtn2click(Sender: TObject); procedure EditlChange(Sender: TObject); procedure Edit2Change(Sender: TObject);private
{ Private declarations }FNumeFisiere -.TNumeFisiere;FOriginalSursa, FOriginalDestinatie: string,- procedure SetNumeSursa(Valoare:string); procedure SetNumeDestinatie(Valoare:string); procedure SeteazaNumeFisiere(Valoare:TNumeFisiere);
public{ Public declarations }property EditorNume:TNumeFisiere read FNumeFisiere
write SeteazaNumeFisiere;end;TNumeFisiereProperty = class(TClassProperty)
publicprocedure Edi t; override;function GetAttributes-. TPropertyAttributes; override;
end;
procedure Register;implementation{ $R * . DFM}
procedure TDialogul.SetNumeSursa(Valoare:string); begin
OpenDialogI.FileName:=Valoare;FNumeFisiere.FisierSursa:=Valoare;Editl.Text:=OpenDialogl.FileName;
end;
454
procedure TDialogul.SetNumeDestinatie(Valoare:string); begin
0penDialog2.FileName:=Valoare;FNumeFisiere.FisierDestinatie:=Valoare;Edit2.Text:=0penDialog2.FileName;
end;procedure TDialogul.SeteazaNumeFisiere(Valoare:TNumeFisiere); begin
FNumeFisiere: =Valoare;FOriginalSursa:=Valoare.FisierSursa;FOriginalDestinatie:=Valoare.FisierDestinatie;SetNumeSursa(Valoare.FisierSursa) ;SetNumeDestinatie(Valoare.FisierDestinatie);
end;procedure TDialogul-ButtonlClick(Sender: TObject); begin
if OpenDialogI.Execute then Editl.Text:=OpenDialogl.FileName;
end;procedure TDialogul.Button2Click(Sender: TObject) ,- begin
if 0penDialog2.Execute then Edit2.Text:=0penDialog2.FileName;
end;procedure TNumeFisiereProperty.Edit; var
NumeFisiere: TNumeFisiere;NumeEditor: TDialogul;
beginNumeFisiere := TNumeFisiere(GetOrdValue);NumeEditor := TDialogul.Create(Application); tryNumeEditor.EditorNume := NumeFisiere;NumeEditor.ShowModal;
finallyNumeEdi tor.Free ;
end; end;function TNumeFisiereProperty.GetAttributes: TPropertyAttributes; begin
Result := [paDialog, paSubProperties, paMultiSelect]; end;procedure Register,- begin
RegisterComponents(’Samples', [TCopyComp]); RegisterPropertyEditor(Typeinfo(TNumeFisiere) ,nil, ’ ',
TNumeFisiereProperty);end;
455
procedure TDialogul.BitBtn2Click(Sender: TObject); begin
SetNumeSursa(FOriginalSursa);SetNumeDestinatie(FOriginalDestinatie);
end;procedure TDialogul.EditlChange(Sender: TObject); begin
SetNumeSursa(Editl.Text); end;
procedure TDialogul.Edit2Change(Sender: TObject); begin
SetNumeDestinatie(Edit2.Text); end;end.
31.10.6. Un editor de componente
Este vorba de aceeaşi componentă de mai sus (TCopyComp) la care îi mai adăugăm un item în meniul de context care apare la click drepta pe ea (la timpul proiectării aplicaţiei). Acest nou item se va numi Editează Nume şi la apăsarea lui va apărea cutia de dialog de la proprietatea NumeFisiere.
Noua clasă, a editorului de componente, se va numi TCopyCompEditor şi va redefini metodele EdilProperty, GetVerbCount, GetVerb şi ExecuteVerb. Codul sursă de la componenta anterioară rămâne acelaşi, aşa că nu îl mai rescriu, ci doar adaug la el (la unit-ul dialog) următoarele linii:
{A ceste linii se vor adăuga în secţiunea interface}TCopyCompEditor = class(TDefaultEditor) protected
procedure EditProperty(PropertyEditor-. TPropertyEditor; var Continue, FreeEditor: Boolean); override;
publicprocedure ExecuteVerb(Index: Integer); override; function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override;
end;
{A ceste linii se vor adăuga în secţiunea im p lem entation}
procedure TCopyCompEditor.EditProperty(PropertyEdi tor: TPropertyEdi tor; var Continue, FreeEditor: Boolean);
varPropName: string;
beginPropName := PropertyEditor.GetName; if (CompareText(PropName, 'NumeFisiere') = 0) then
456
beginProperCyEdi tor.Edi t ;Continue := False;
end; end;function TCopyCompEditor.GetVerbCount: Integer; begin
Result := 1; end;function TCopyCompEditor.GetVerb(Index: Integer): string; begin
if Index = 0 thenResult := 'Editează Nume1
else Result := 1 1 ; end;procedure TCopyCompEditor.ExecuteVerb(Index: Integer); begin
if Index = 0 then Edit; end;
iar în interiorul procedurii Register se va adăuga linia:
RegisterComponentEditor(TCopyComp, TCopyCompEditor);
BIBLIOGRAFIE
1. M. Oltean, M. Cocan, C ++B uilder în Aplicaţii, Editura Albastră, Grupul Microinformatica, 1998.
2. M . Oltean, Programarea avansată în Delphi, Editura Albastră, Grupul Microinformatica, 1999.
3. M. Oltean, C. Groşan, Programare în C++Builder, Editura Albastră, Grupul Microinformatica, 2000.
4. Delphi Pages, http://www.delphipages.com.
5. Torry's Delphi Pages, http://www.torry.net.
6. About Dephi Programming, http://delphi.about.com.
7. Project Jedi, http://www.delphi-jedi.org.
8. Delphi32, http://www.delphi32.com.
9. Delphi Super Page, http://delphi.icm.edu.pl.
10. The Delphi Magazine, http://www.thedelphimagazine.com.
11. The Delphi Pool, http://www.lmc-mediaagentur.de/dpool.htm.
12. Unofficial Delphi Developers FAQ,http:// w w w . gnomehome .demon. nl/uddf.
13. DelphiSeek, http://www.delphiseek.com.
14. The Delphi Corner, http://www.delphicorner.,f9.co.uk.
15. Dr. Bob's Delphi, C+Builder, and JBuilder Programming Clinic, http://www.drbob42.com.
16. Delphi-Dolphin, http://www.delphi-dolphin.com.
17. The Delphi Compendium: Delphi Programming Resources, http://www.cyber-matrix.com/delphi.html.
18. The Delphi Compendium'. Delphi Programming Resources, http://www.cyber-matrix.com/delphi.html.
LLLiL lLU V l t t i X i t x U Lwww.albastra.ro
www.gmi.ro
I.S.B.N. 973-650-119-1
Delphi este un mediu de programare vizual destinat proiectării rapide a aplicaţiilor Windows.
Cartea oferă o imagine de ansamblu, descriind şi exemplificând elementele de bază necesare programării aplicaţiilor In mediul Delphi.
i
L H m ijiiA . t u j & s i m400500 str. Observatorului 1
Cluj-Napoca, România tel. 0264.438328*, fax 0264.598263
e-mail:[email protected] C. P. 186 Of. Post. Cluj-Napoca 1