Sunteți pe pagina 1din 456

U i' t i i a 'iiI linific: i

liof. Univ. Dr. Leon inbulea


I a cu itatea tic M atcm atic i In fo rm atic I liu v ersitatca B ab c-B o ly ai ( lu j-N ap o ca

Uditura Albastr Director editur Smaranda Derveteanu Tehnoredactare computerizat Codrua Poenaru Coperta Liviu Derveteanu Tiprit EDITURA ALBASTRA comanda 166 / 2003

lulitura este acreditat de CNCSIS (Consiliul Naional al Cercelarii Slinjiliee din invtmntul Superior) cu numrul 1142 din 30 iunie 2003 .i este recomandaii Consiliului Naional de Atestare a Titlurilor i Diplomelor Universitare. Copyright 2004
T o a t e d r e p t u r i l e a s u p r a a c e s t e i l u c r ri a p a r i n s.c. C a s a d e L d i t u r a A l b a s t r a s.r.l. R e p r o d u c e r e a i n t e g r a l s a u p a r i a l a a t e x t u l u i s a u a i l u s t r a i i l o r din a c e a s t a c a i l e e s l e p o s i b i l n u m a i c u a c o r d u l p r e a l a b i l in s c r i s al C a s e i d e l i d i l u r a A l b a s l i u .

CUPRINS
PR EFA ................................................................................................ 1..INTRODUCERE................................................................................. 1.1. Limbaj sau mediu de dezvoltare?........................................................ 1.2. Programare W indows............................................................................ 1.3. Cum simplific mediul Delphi programarea sub W indow s?......... 1.4. Obiectele V C L ....................................................................................... 1.5. Com ponentele........................................................................................ 1.6. Cum se programeaz sub Delphi......................................................... 1.7. Prima ap licaie....................................................................................... 1.8. Aplicaii CLX ......................................................................................... 1.8.1. Crearea unei aplicaii C LX .......................................................... 1.8.2. Diferenele dintre un proiect Delphi 7 i un proiect K ylix..... 1.8.3. Folosirea funciilor A PI................................................................ 2. MEDIUL DE DEZVOLTARE D E L P H I............................................ 2.1. Meniul principal..................................................................................... 2.2. Editorul de cod....................................................................................... 2.3. Editorul de form e................................................................................... 2.4. Toolbar............................ ........................................................................ 2.5. Paleta de componente............................................................................ 2.6. Object Inspector..................................................................................... 2.7. Managerul de proiecte........................................................................... 3. FIIERELE PROIECTULUI.............................................................. 4. PROGRAMAREA EXCEPIILOR N DELPHI.............................. 4.1 .Construcia try - finally.......................................................................... 4.2. Construcia try-except........................................................................... 4.3. Generarea unei excepii......................................................................... 4.4. Clase de excepii.................................................................................... 5. OBIECTE G ENERALE......................... ............................................ 5.1. T O b ject................................................................................................... 5.2. T P ersistent.............................................................................................. 5.3. T C om ponent.......................................................................................... 5.4. TC ontrol.................................................................................................. 5.5. TW inControl.......................................................................................... 9 11 11 11 12 13 13 13 14 17 17 19 19 20 20 22 23 23 24 24 26 28 31 32 34 35 35 39 39 41 43 44 60
3

6. FERESTRELE APLICAIEI - COM PONtiV TA T F p x n U ^ --,;.. 6.1. T F o rm ..................................................................................................... 7. B U T O A N E .......................................................................................... 7.1. T B utton................................................................................................... 7.2. T B itB tn ................................................................................................... ''7.3. TSpeedB utton........................................................................................ 7.4. T U pD ow n............................................................................................... 8. ET IC H E T E .......................................................................................... 8.1. TLabel...................................................................................................... 8.2. TStaticText.............................................................................................. 9. CUTII DE EDITARE........................................................................... 9.1. TStrings................................................................................................... 9.2. TStringList.............................................................................................. 9.3. T E d it........................................................................................................ 9.4. TLabeledEdit......................................................................................... 9.5. T M askE dit.............................................................................................. 9.6. TM emo..................................................................................................... 9.7. TRichEdit................................................................................................ 9.8. TTextAttributes...................................................................................... 9.9. TParaAttributes...................................................................................... 10. BUTOANE RADIO........................................................................... 10.1. TRadioButton....................................................................................... 10.2. TR adioG roup....................................................................................... 11. COMPONENTE PENTRU OPIUNI............................................. 11.1. TCheckBox........................................................................................... 11.2. TCheckListBox.................................................................................... 12. PROGRESUL EXECUIEI - COMPONENTA TProgressBar. 12.1. T ProgressB ar....................................................................................... 13. BAR DE S T A T U T ......................................................................... 13.1. T StatusB ar............................................................................................ 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.......................................................................................

157 160 160 166 166 168 175 178 188 193 193 193 195 197 197 201 202 203 205 205 210 212 214 217 220 220 221 221 223 223 224 225 226 227 227 234 5

66
78 78 80 85 87 ; 15. R IG LE ................................................................................................ 15.1. TTrackBar............................................................................ 16. MENIURI........................................................................................... r 16.1. TM enu................................................................................................... 16.2. TM ainM enu......................................................................................... 16.3. TPopUpM enu....................................................................................... 16. 4. T M enuItem ......................................................................................... 16.5. Funcii care prelucreaz m eniuri....................................................... 17. SCURTTURI................................................................................... 17.1. TShortCut.............................................................................................. 17.2. T H otK ey............................................................................................... 17.3. Funcii i Proceduri............................................................................. 18. LISTE, COZI l S T IV E ........................................................................... 18.1. TList....................................................................................................... 18.2. TOrderedList...................................................................................... . 18.3.TQ ueue.................................................................................................. 18.4. T S tack................................................................................................... 19. FIIER E, D IRECTO A RE l D ISC U R I............................................... 19.1. TFileListBox........................................................................................ 19.2. TDirectoryListBox.............................................................................. 19.3. TDriveComboBox............................................................................... 19.4. TFilterCom boBox............................................................................... 19.5. TFileStream.......................................................................................... 19.6. Structuri i funcii utile pentru lucrul cu fiiere, directoare i discuri................................................................ 19.6.1. Structuri........................................................................................ 19.6.2. Atributele fiierelor.................................................................... 19.6.3. Cutare de fiiere........................................................................ 19.6.4. Manipulri de fiiere.................................................................. 19.6.5. Manipulri de extensii................................................................ 19.6.6. Manipulri de ci........................................................................ 19.6.7. Operaii asupra directoarelor.................................................... 19.6.8. Manipulri de d iscu ri................................................................. 20. ITEM U RI...................................................................................................... 20.1. TListB ox............................................................................................... 20.2. TComboBox.........................................................................................

91 94 97 97 101 102 HO 112 H8 12 125 129 129 130 134 134 136 139 139 146 146 148 149 153 153

20.3. T C olorB ox........................................................................................... 20.4. TListV iew ............................................................................................. 20.5. TListltem s............................................................................................. 20.6. TListltem .............................................................................................. 20. 7. TTreeV iew .......................................................................................... 20. 8. TTreeN odes........................................................................................ 20.9. TTreeNode............................................................................................ 2 l\ GRAFIC.......................................................................................... '21.1. TColor).................................................................................................. 21.2. Funcii pentru prelucrarea culorilor.................................................. 21.3. T G raphic............................................................................................... 21.4. TBitmap ...................................................... '........... ............................. 21.5. T Icon...................................................................................................... 21.6. TM etaFile.............................................................................................. 21.7. TJpeglm age.......................................................................................... 21.8. TG raphicsO bject................................................................................. 21.9. T B ru sh .................................................................................................. 21.10. T Pen.................................................................................................... 21.11. TFont............................................................ ....................................... 21.12. TC anvas............................................................ ................................. 21.13. TGraphicControl............................................................................... 21.14. TPaintB ox.......................................................................................... 21.15. TIm age................................................................................................ 21.16. T Shape................................................................................................ 21.17. TBevel................................................................................................. 21.18. T Splitter.............................................................................................. 21.19. TIm ageList......................................................................................... 22. TIMERE - COMPONENTA T T im er.............................................. 22.1. T T im er.................................................................................................. 23. FERESTRE DE DIALOG................................................................ 23.1. TCom m onD ialog................................................................................ 23.2. TOpenDialog................................................................................. ...... 23.3. T SaveD ialog........................................................................................ 23.4. TFontD ialog......................................................................................... 23.5. TColorD ialog....................................................................................... 23.6. TFindD ialog......................................................................................... 23.7. T R eplaceD ialog.................................................................................. 23.8. TPrinterSetupDialog........................................................................... 23.9. TPrintD ialog........................................................................................ 23.10. Funcii care afieaz cutii de dialog...............................................
6

239 242 249 251 254 265 268 275 275 275 276 279 281 281 282 285 285 286 288 290 311 311 313 316 317 318 320 325 325 330 330 332 336 337 339 341 345 347 348 352

24. DATE l TIM P U R I.......................................................................... 24.1. T D a te ..................................................................................................... 24.2. TTim e.................................................................................................... 24.3. TD ateTim e........................................................................................... 24.4. Operatori aritmetici i relaionali...................................................... 24.5. Funcii i proceduri............................................................................. 24.6. TDateTimePicker................................................................................ 25. G R IDURI........................................................................................... 25.1. TCustom G rid....................................................................................... 25.2. TDrawGrid........................................................................................... 25.3. TStringGrid........................................................................................... 26. TS creen............................................................................................. 27. CLIPBOARDUL.......................................................... .................... 28. T A p p licatio n .................................................................................... 29. TIPRIREA LA IMPRIMANT...................................................... 29.1. Modul T e x t.......................................................................................... 29.2. M od standard W indow s..................................................................... 29.3. Cutiile de dialog................................................................................... 30. MULTIMEDIA.................................................................................... 30.1. TM ediaPlayer....................................................................................... 30.2. T A nim ate.............................................................................................. 31. DEZVOLTAREA DE CO M PO NENTE................................. ........ 31.1. nelegerea com ponentelor................................................................. 31.2. Scrierea de proprieti......................................................................... 31.2.1. Tipuri de proprieti................................................................... 31.2.2. Declararea proprietilor........................................................... 31.2.3. Memorarea intern a datelor...................................................... 31.2.4. Metode de acces.......................................................................... 31.2.5. Valori implicite ale proprietilor............................................. 31.2.6. Proprieti de tip array................................................................ 31.2.7. Editoare de proprieti................................................................ TIntegerProperty............................................................................... TCharProperty.................................................................................. TColorProperty................................................................................. TFontNam eProperty........................................................................ TFontProperty....................................................................................

356 356 356 356 357 359 362 368 368 372 375 380 386 392 403 403 404 409 413 413 417 422 422 425 425 426 426 427 428 428 429 430 430 430 430 430 7

T C ursorProperty................................................. .............................. TShortCutProperty............................................................................ TMPFilenameProperty..................................................................... TDateProperty, TTim eProperty..................................................... TDateT im eProperty.......................................................................... 31.3. Scrierea de m etode.............................................................................. 31.4. Scrierea de evenim ente...................................................................... 31.5. Grafica n com ponente....................................................................... 31.6. Editoarele de com ponente.................................................................. 31.7. Help pentru com ponente.................................................................... 31.8. nregistrarea com ponentelor............................................................. 31.9. Adugarea unei imagini la o com ponent....................................... 31.10. E xem ple.............................................................................................. 3 1 .1 0 .1 .0 component grafic............................................................. 31.10.2. O component grafic cu un evenim ent............................... 3 1 .1 0 .3 .0 cutie de dialog special........................................................ 31.10.4. A doua cutie de dialog special.............................................. 31.10.5. O component cu editor de proprieti................................. 31.10.6. Un editor de com ponente........................................................ B IB LIO G R A FIE...................................................... ............................. .

430 431 431 431 431 437 438 439 440 442 443 444 444 444 446 448 449 451 456 458

PREFA *

Delphi este un mediu de programare vizual oferit de ctre 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 programrii n mediul Delphi. Un aspect esenial al programrii n Delphi l constituie tratarea excepiilor. O prezentare detaliat a excepiilor este realizat n capitolul 4. Folosirea mecanismului de tratare a excepiilor simplific interceptarea i tratarea erorilor ce pot aprea pe parcursul execuiei unei aplicaii. De aceea recomandm programatorilor s foloseasc din plin acest mecanism flexibil i elegant. n capitolele urmtoare (5-30) am realizat o prezentare detaliat a componentelor furnizate de ctre acest mediu. Pentru fiecare component am prezentat cteva exemple practice de funcionare. Am ncercat s atingem majoritatea aspectelor legate de programarea n Delphi ncepnd cu elementele simple, precum butoane, cutii de editare, etichete etc. pn la elemente mai complexe precum componentele multimedia. n ultimul capitol am prezentat modul de creare a componentelor Delphi. Aceast facilitate ofer att posibilitatea unei structurri mai puternice a programelor ct i o modalitate de extindere a mediului Delphi.

10 oct. 03

Autorii

1. INTRODUCERE
Delphi este un mediu de programare sub Windows oferit de ctre firma Borland. La momentul curent (Iulie 2003) este disponibil versiunea 7.0 a acestui mediu. Delphi folosete limbajul de programare Object Pascal. Exist o versiune a mediului Delphi i pentru sistemul de operare Linux. Aceasta se numete Kylix i, la data curent, se afl la versiunea 3.0. De remarcat este faptul c se pot crea aplicaii 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 aplicaii Linux care pot fi compilate far modificri i n mediul Delphi sub Windows. n acest capitol vom ncerca s realizm o prezentare general a me diului de programare Delphi. Vom ncerca s rspundem n general la ntrebri legate de programare sub W indows i la felul n care mediul Delphi simplific programarea sub Windows.

1.1. Limbaj sau mediu de dezvoltare?


Mediul D elphi 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 dect att) n care programatorul scrie instruciuni ntr-un limbaj de programare. Mediul de dezvoltare Delphi este un mediu general, aproape indepen dent de limbajul folosit pentru dezvoltarea de aplicaii. Spre exemplu, interfaa mediului Delphi este folosit i de ctre mediul C++Builder. Limbajul de programare folosit de ctre mediul Delphi este Object Pascal. Acesta difer fa de limbajul folosit n mediul Turbo Pascal n prin cipal prin mbuntirile 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 obinuit. Funciile cu ajutorul crora se construiete o aplicaie Windows se numesc fu n cii API. Ele sunt scrise n limbajul C, dar pot fi uor adaptate

11

pentru a ti folosite n Object Pascal. Spre exemplu, funcia 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

// p o in te r la n u m ele clasei d e fereastra // p o in ter la irul care co n in e num ele ferestrei // stilu l ferestrei // c o o rd o n atele coltu lu i din stan g a sus al ferestrei

//
// d im en siu n ile ferestrei

II
II identi ficato ru l p rin te lu i ferestrei // id e n tific a to ru l m eniului // id en tificato ru l aplicaiei care a c re at fereastra // p o in te r la o stru ctu ra cu datele ata a te ferestrei.

); Funcia ntoarce un identificator (de tip HWND) la fereastra nou creat. n unitul windows.pas, care conine header-ele Object Pascal pentru majoritatea funciilor API, funcia 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 aplicaii folosind doar funcii API este simpl aplicaie care const dintr-o fereastr pe care sunt amplasate de editare i butoane poate ajunge uor la cteva sute de linii. urmeaz vom vedea felul n care Delphi simplific conceptul de sub Windows.

dificil. O cteva cutii In cele ce programare

1.3. Cum simplific mediul Delphi programarea sub Windows?


Firma Borland a creat o bibliotec de clase i funcii care ncapsuleaz funcionalitatea funciilor API. Ea se numete V CL (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 O W L ('Object Windows Library). Aceast ierarhie a precedat VCL-ul i a fost destinat pentru aplicaiile Windows dezvoltate sub Borland C++. Diferena esenial ntre V C L i O W L este faptul c obiectele O W L nu au reprezentare vizual la momentul proiectrii aplicaiei. Folosind O W L -ul trebuie scris doar cod: obiectele trebuie instaniate manual (apelnd constructorul Create), valorile datelor membre trebuie setate prin cod, etc. Folosind obiectele V C L programarea aplicaiilor Windows se simplific n mod semnificativ. Majoritatea obiectelor VCL pot fi manipulate i la momentul proiectrii aplicaiei cu ajutorul unei unelte soft foarte puternice: Object Inspector (Inspectorul de Obiecte). La pornirea mediul Delphi, Object Inspector apare n partea din stnga a ecranului. Cu ajutorul lui se pot seta valorile datelor membre ale obiectelor V C L i, de asemenea, se poate naviga prin sistemul de evenimente al unei aplicaii.

1.4. Obiectele VCL


Pentru ca obiectele VCL s poat fi manipulate n interiorul mediului Delphi, s-au introdus cteva mbuntiri modelului obiectual standard. Cea mai important este introducerea proprietilor. O proprietate se comport ca o dat membr: valoarea ataat ei poate fi citit sau scris ntr-un mod asemntor 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 funcionalitatea unei aplicaii. Un element definitoriu pentru compo nente este acela c toate au un strmo comun, i anume clasa TComponent. Aceast clas implementeaz un minim de specificaii 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 Aplicaiei. Ce nsemn mediu de programare vizual? n primul rnd nseamn un mediu n care o parte din aplicaie se realizeaz fr a scrie cod surs ci, spre 13

exemplu, cu ajutorul mouse-ului. n plus, partea construit vizual este disponibil programatorului n aceeai form n care aceasta va fi afiat la momentul execuiei. Partea cea mai important din aplicaie care se poate construi cu ajutorul mouse-ului este interfaa. Sistemul de operare Windows a stabilit un set de reguli pe care trebuie s le respecte fiecare aplicaie pentru a putea fi executat n acest sistem de operare. Fiecare aplicaie Windows conine o fereastr, eventual un meniu, butoane, cutii de editare, .a.m.d. Exist un set finit de obiecte furnizate de ctre Windows i care pot alctui interfaa aplicaiei. Iniial aceste obiecte puteau fi create folosind funcii API pe care leam definit n seciunile precedente. Mediul Delphi a ncapsulat fiecare dintre aceste pri ale unei aplicaii n cte o clas (component). Aceste componente se gsesc n Paleta de Componente (Component Palette) i pot fi manipulate cu ajutorul mouse-ului. Folosind mediul Delphi interfaa aplicaiei se construiete foarte simplu prin plasarea componentelor din Component Palette pe fereastra (forma) aplicaiei. Plasarea unei componente se face executnd click pe reprezentarea acesteia n Paleta de Componente i apoi nc un click n poziia n care se dorete a fi amplasat pe fereastra aplicaiei. 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 cteva aplicaii simple n care vom pune n lumin conceptele de baz ale programrii sub mediul Delphi.

1.7. Prima aplicaie


Vom construi o aplicaie care afieaz un text ctre utilizator. Acest lucru se poate realiza n mai multe moduri, i anume: 1. 2. 3. 4. Folosind o component de tip TLabel, Folosind o component de tip TEdit Folosind o cutie de dialog, Desennd textul pe fereastr.

1.

Folosind o component de tip TLabel Aceasta este cea mai simpl modalitate de a afia un text pe o fereastr (form). Principalul avantaj este acela c programatorul nu trebuie s scrie cod surs la momentul execuiei programului, ci trebuie doar s seteze valorile ctorva proprieti. Pentru aceasta vom crea o nou aplicaie (File\New\Application). Apoi vom amplasa pe form o etichet n care vom scrie textul dorit. Compo-

14

nentele se gsesc n Paleta de Componente, aflat n partea dreapt, sub meniul principal. Din pagina Standard a Paletei de Componente selectm componenta TLabel. Dac executm dublu-click pe aceast component ea va fi amplasat n centrul formei. De acolo ea poate fi mutat de ctre utilizator, cu ajutorul mouse-ului, n orice alt poziie de pe form. n momentul amplasrii pe form, orice component de tip TLabel are ataat un text care i-a fost atribuit implicit de ctre mediul Delphi. Dac este prima component de tip Tlabel, atunci ea are ataat textul L a b el!. Dac este a doua component de tip TLabel de pe form, atunci are ataat textul Label2. Textul ataat unei componente de tip TLabel se gsete stocat n proprietatea Caption. Putem schimba acest text modificnd valoarea acestei proprieti cu ajutorul Inspectorului de Obiecte. S presupunem c am schimbat acest text la valoarea Hello W orld! . Atunci valorile unora dintre proprietile obiectelor care constituie aplicaia sunt:
object Forml: TForml Caption = 'Afiseaza text' object Labell: TLabel Left = 224 Top = 152 Width = 58 Height = 13 Caption = 'Hello World!' end end

Nu ne mai rmne dect s lansm aplicaia n execuie fie apsnd tasta F9, fie executnd click pe itemul Run\Run din meniul principal.

Folosind o component TEdit Principalul dezavantaj al folosirii componentei de tip TLabel este acela c textul afiat nu poate fi schimbat de ctre utilizator la momentul execuiei aplicaiei. n unele situaii 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 gsete tot n pagina Standard a Paletei de Componente. Selectm aceast component i o amplasm pe form. Numele implicit pe care l -va primi aceast component este Editl. Textul ataat acestei componente este stocat de ctre proprietatea Text. Modificm cu ajutorul Inspectorului de Obiecte textul ataat acestei componente. Dup modificare, valorile proprietilor obiectului Editl sunt: 15

object Editl: TEdit Left = 200 Top = 144 Width = 121 Height = 21 TabOrder = 0 Text = 'Hello World' end

Lansm aplicaia n execuie. De data aceasta textul afiat poate fi modi ficat de ctre utilizator. Dac dorim ca textul s apar la apsarea unui buton atunci mai amplasm pe form nc o component. Aceasta este de tipul TButton i se gsete tot n pagina Standard a Paletei de C om ponente.
procedure TForml.ButtonlClick(Sender: TObject); begin Editl.Text = 'Hello World'; end;

3.

Folosind o cutie de dialog Dac dorim s afim un mesaj pentru utilizator atunci putem folosi procedura ShowMessage care afieaz o fereastr n care se afl textul trimis ca i parametru. Fereastra afiat mai conine i un buton la a crui apsare fereastra este distrus. Pentru realizarea acestei aplicaii vom amplasa pe form un buton la a crui apsare dorim s se afieze textul ctre utilizator sub forma unei cutii de mesaj. Procedura care se apeleaz la apsarea butonului este:
procedure TForml.ButtonlClick(Sender: TObject); begin ShowMessage('Hello World'); end;

4.

Desennd textul pe form Aceast aplicaie deseneaz textul dorit pe form, la o poziie speci ficat. 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 suprafaa de desenare a unei forme. Una dintre metodele lui TCanvas este TextOut care are ca parametri poziia i textul care urmeaz a fi afiat.

16

Amplasm pe form un buton la a crui apsare dorim s desenm 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. Aplicaii CLX


Una dintre cele mai importante faciliti oferite de mediul Delphi 7 este posibilitatea de a crea aplicaii att pentru sistemul de operare Windows ct i pentru Linux. Aceste aplicaii pot fi create att n versiunea pentru Windows a mediului Delphi, ct i n versiunea pentru Linux. Mediul de programare oferit de ctre Borland pentru sistemul de operare Linux se numete Kylix. Odat create aplicaiile pot fi deschise i compilate fie sub Windows, fie sub Linux. Aceste aplicaii (care au posibilitatea de a fi importate dintr-un sistem de operare n altul) au fost denumite aplicaii CLX (Cross-Platform). Trebuie reinut c aceast portabilitate nu este a codului executabil (compilat cu mediul Delphi 7 sau Kylix) ci a codului surs (generat de ctre Delphi6 sau Kylix). De asemenea, pentru ca o aplicaie s poat fi portat de pe o platform pe alta trebuie s nu conin apeluri de funcii API specifice celor dou sisteme de operare.

1.8.1. Crearea unei aplicaii CLX


Din meniul File alegem comanda New | CLX Application. Paleta de Componente va afia doar acele componente care pot fi folosite ntr-o aplicaie CLX. Alte componente nu au voie s fie folosite. Exemplu: Codul surs al unui unit Delphi 7 (destinat doar pentru platforma W indows) este urmtorul:
unit Unitl; interface uses Windows, Messages, SysUtils, Variants, Classes,

17

Graphics, Controls, Forms, Dialogs, StdCtrls; type TForml = 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 aplicaie Windows.'; end; end.

Codul surs al unui unit Delphi 7 (destinat pentru platformele Windows i Linux) este urmtorul:
unit Unitl; interface uses SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,QStdCtrls, QMenus, QTypes; type TForml = 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 aplicaie CLX'; end; end.

1.8.2. Diferenele dintre un proiect Delphi 7 i un proiect Kylix


Fiierele cu extensia .dfm din Delphi 7 au extensia .xfm n Kylix. Fiierele cu extensia .dof din Delphi 7 au extensia .kof n Kylix. Oricum aceste fiiere trebuie resetate deoarece mediile de sub cele dou sisteme de operare i construiesc fiiere cu opiuni specifice.

1.8.3. Folosirea funciilor API t


Folosirea funciilor API specifice unei platforme se poate face doar utiliznd directiva $IFDEF care va indica seciunile de cod ce se vor apela sub sistemul de operare W indows i cele care se vor apela sub sistemul de operare Linux. Exemplu:
{ S I F D E F M S W IN D O W S } // aici se v a s crie co d ce se va e x ec u ta d o a r su b W indow s. - { $ E N D IF } { S I F D E F L IN U X } // a ic i se scrie co d care se va e x ec u ta d o a r su b L inux. {S E 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 d it Search View Project Run Component Database Tools Help ; ':j<None> ; ij*

File Conine comenzi pentru a deschide (Open, Open Project, Reopen), crea (New), salva (Save, Save All, Save Project As, Save As), nchide (Close, Close AH), tipri (Print) proiecte i fiiere. Edit Conine comenzi pentru operaiile 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 rd er,...). Search Conine comenzi pentru localizare de text n pagina activ a editorului de cod. View Conine comenzi pentru a afia sau ascunde elemente ale mediului i proiectului curent.

20

Project Conine comenzi pentru a manipula (Add to Project, Remove from Project), a compila (Compile Unit, M ake project, Build project) i a configura (Options) fiierele ataate unui proiect. Run Conine comenzi pentru executarea (Run, Parameters), depanarea (Step Over, Tracc Into, Trace To Next Source Line, Run To Cursor, Show Execution Point) i oprirea unei aplicaii (Program Pause, Program Reset). De asemenea, cu ajutorul comenzilor: Inspect, Add W atch, Evaluate/Modify se pot inspecta valorile unor variabile. Component Conine 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 adugarea i configurarea paletei cu com ponente. DataBase Conine comenzi pentru manipularea bazelor de date. Workgroups Este folosit pentru manipularea proiectelor mari i diferitelor versiuni ale unui proiect. Tool Conine comenzi pentru a rula programele utilitare disponibile, far a prsi mediul Delphi. De asemenea, se poate manipula i seta compor tamentul (Enviroment Options) mediului de dezvoltare. Help Conine comenzi pentru afiarea aplicaiilor de tip Help (Contents, Index), accesarea paginilor WEB n care se gsesc ultimele informaii 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 afiarea dialogului About.

21

2.2. Editorul de cod


S Unitl. i pas
Unii |

3 sE
. ,

unit Unit-1;
interface uses Windows, Messages,

-> *

SysUtils,

Classes, Graphics

type TF^rml = c l a s s (TForm) private i Private d e c l a r a t i o w public

f-

f Public dec2arat i o n s
end;

9: 5

Modified

Insert

Ca orice mediu de programare, Delphi are o fereastr unde programatorul poate scrie codul unei aplicaii. Acesta este un editor ASCII complet care poate deschide mai multe fiiere simultan, Fiecrui fiier deschis i este ataat, n partea de sus a ferestrei, un buton cu numele lui. Trecerea de la un fiier la altul se face prin click pe butonul Close Page Ctrl+F4 ataat fiierului. Open File al Cursor Ctrl+Enter La intrarea n Delphi, sau la crearea New Edit W indow Erowse Symbol at Cursor unui nou project, editorul de cod conine Topic Search F1 textul afiat n imaginea de mai sus. In momentul n care adugm la proiect, un unit sau o form, n editorul de cod se Complete class at cursor Shift+Ctrl+C creeaz o nou fereastr. Numele de fiiere A d d T o*D o Itgm... S hift+Ctrl+T care sunt modificate n editorul de cod dar care nu au fost salvate sunt afiate cu ca ractere ngroate (bold). Prin execuia unui click dreapta n Toggle Bookmarks editorul de cod, Delphi ne pune la dispo (3oto Bookmarks ziie un meniu cu comenzile cele mai des Debug folosite de editare, depanare, execuie a unei aplicaii. Read Only Alegnd Properties avem acces la M essage View setrile de baz ale editorului, i anume la Shift+Ctrl+E View Explorer culorile, fonturile, etc. folosite. Properties O component poate fi vzut ca i 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 aaz componente care vor forma interfaa vizual a aplicaiei. Pentru un mai bun control al poziiei unde sunt amplasate acestea, Editorul de forme are pe suprafaa lui o reea de puncte echidistante.

2.4. Toolbar
D eschide P roiect nch id e m uriiue proiect r < ?auRa fiiere la proje c i ^ V izu a liza re .,.. Vizualizare . unit-uri Run j

Pauza

li ,
D e s c h id / ^ fisier nch id e / fiier terge

- 0 ; Q* 11 1 j s
, / j / T rece de ta \ \ \ Step N

^Step
Over |nt0

fiiere din proiect

forma la unit 5 lnve,s 1

K*m a noua

Toolbar este o scurttur a comenzilor aflate n meniul principal. n varianta implicit, comenzile pe care le conine sunt cele specificate n figura de mai sus. Programatorul poate aduga 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, W in32, System DataAccess, DataControl, ADO, InterBase, M idas, InternetExpress, Internet, FastNet, DecisionCube, QReport, Dialogs, W in3.1, Samples, ActiveX, Servers. Cele mai folosite componente sunt cele din pagina Standard, care conine cutii de dialog, meniuri, butoane, etc. Pentru a obine "help" despre fiecare din ele, se execut click pe componenta dorit, iar apoi se apas F I . O component special este i forma. Adugarea ei la o aplicaie 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. Aezarea unei componente pe o form se poate face n mai multe moduri. Dac dorim ca amplasarea componentei s fie n mijlocul formei, atunci executm dublu click pe componenta respectiv. Dac dorim s plasm componenta n alt loc dect centrul formei, atunci executm click pe component, iar apoi nc un click n locul dorit pe form. Colul din stnga 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 rmne n codul surs al aplicaiei deoarece acesta ar putea fi apelat de ctre alte metode. tergerea unui astfel de handler trebuie fcut att n partea de definiie a clasei ct i n implementare. n caz contrar, compilatorul va semnala o eroare.

2.6. Object Inspector


Object Inspector face legtura ntre interfaa aplicaiei i codul scris de programator. Are dou funcii: a. b. seteaz proprietile componentelor aflate pe form; 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, apsarea unei taste, a unui buton de mouse, etc.). n partea de sus a lui se afl O bject Selector care conine toate compo nentele de pe form mpreun cu tipul lor. Object Inspector are dou pagini:
O bject inspector Forml Properties ] Eve n ts | A ction ActiveControl Align A lphaBlend E l Anchors AutoS croll AutoS fee BiDiMode Q E o rd e rlc o ri BorderS tyle BorderW idtti 1 Caption ClientH eight ClienfW idth Coioi CU3D Cursor E l Constraints aINone False

H I 3 |

J l]

|Form1 Properties Action ActiveControl Menu O bjectM enultei O nActivate QnCanResize | OnClick OnClose OnCloseQuery OnConstrainedl OnContextPopi QnCreate OnDbiClick O nDeactivate OnDestroy O nD ockD iop O nDockO ver O nDtagDtop O nDtagOver O nEndD ock All shown Events I

Jk.

AlphaBlendV alt 255 : [akLeft,akT op] T fu e ........................ _ ] False : bdLeftT oRight j[bi5ystem M enu, i bsSizeable

3 3 E H IH 3 H

mm
:206 j'309
c iB tn F a c e IfTSizeConstraini T rue crDefault

D efaultM onitor dm ActiveFoim A ll show n

pagina proprietilor

pagina evenim entelor

i.

Pagina proprietilor Aceast pagin seteaz valorile proprietilor unei componente, i anu me dimensiunile ei, poziia n cadrul formei, fonturile folosite, numele ei, etc. Alte proprieti pot fi setate la momentul execuiei programului prin scrierea de cod surs n cadrul handlerelor de evenimente.

ii.

Pagina evenimentelor Aceast pagin permite legarea unei componente la evenimentele pro gramului. Prin executarea unui dublu click pe un eveniment, de exemplu pe OnClick, D elphi creeaz un handler de evenimente, care este, de fapt, o metod a unei clase i care se va executa cnd 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 su rsa, carc se va ex ecu ta / / n m o m en lu l ap asarii buto n u lu i B utton 1

end;

n cazul n care alegem evenimentul OnDblClick handlerul de eveni mente va arta n felul urmtor (am ales n cazul acesta componenta de tip TEdit):
procedure TForml.EditlDblCiick(Sender: TObject); begin end;

Precum se vede i din cele dou exemple, formele i componentele sunt numerotate (F o rm l, Button1, E ditl). Dac am mai fi adugat pe form nc o component de tip Tbutton, aceasta ar fi fost denumit RadioButton2, etc. Delphi denumete automat toate componentele i handlerele de evenimente. Aceste denumiri pot fi schimbate cu ajutorul lui Object Inspector. Delphi va face schimbri, automat, peste tot unde este necesar (n codul inserat automat de ctre el, dar nu i n codul scris de programator). Atenie! Object Inspector nu indic valorile proprietilor obiectelor n tim pul execuiei i nici n timpul depanrii aplicaiei. El este folosit doar pentru setarea acestor valori la momentul proiectrii programelor.

2.7. Managerul de proiecte


IPioject M anager
jimagview.eKe ---------- 71 1 Path CAPrograme CAPrograme CAPrograme CAPrograme CAPrograme CAPrograme CAPrograme CAPrograme g New

X
Remov

Files J l ProiectGfoupI

imagview.exe
j ] IMAGEW IN ; IMAGEWIN.PAS JHl ImageForm ifD jg VIEW W IN.PAS "~1 ViewForm

26

Pe msur ce aplicaia crete, numrul de fiiere necesare va fi tot mai mare (de exemplu, pot fi adugate fiiere multimedia, baze de date, unituri Pascal, etc.) i deci se va face tot mai simit nevoia unei manipulri ct mai uoare a acestor fiiere. Delphi se ocup de manipularea tuturor acestor fiiere i totodat pune la dispoziia programatorului un instrument care i permite acestuia s navigheze uor printre fiierele ce alctuiesc un proiect. Acest instrument este denumit sugestiv Project Manager. Butoanele New i Remove sunt folosite pentru a aduga un nou proiect, respectiv pentru a terge un proiect la/din grupul de proiecte curent. Prin click dreapta pe itemul cu numele proiectului se afieaz un m en iu ' ce conine comenzi pentru manipularea fiierelor componente ale proiectului respectiv.

3. FIIERELE PROIECTULUI

n acest capitol sunt prezentate fiierele care alctuiesc o aplicaie Delphi. 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 prelucrri (editare, execuie). Manipularea proiectelor dintr-un grup se face folosind Project M anager descris n capitolul anterior. Un grup de proiecte se salveaz cu extensia .bpg. Utilitatea unui grup de proiecte nu este mare, el doar scutete progra matorul de a deschide i nchide proiecte separate. 2. Proiectul Un proiect este un grup de mai multe fiiere care mpreun alctuiesc aplicaia Delphi. Fiecare fiier reprezint, pentru aplicaia din care face parte, o resurs" care necesit setri speciale pentru a putea fi legat la aplicaia final (DLL sau EXE). Pentru a vedea ce fiiere intr n alc tuirea unui proiect accesai comanda View|Project Manager.

Fiierele care intr n alctuirea unui proiect sunt urmtoarele: 3. Fiierul principal al proiectului Fiierul principal al proiectului are extensia .dpr (i numele implicit Projectl.dpr) El este punctul central al unei aplicaii Delphi. El conine codul principal al unei aplicaii. Din acest punct i ncepe aplicaia execuia. O aplicaie simpl poate conine doar acest fiier. Exemplu: Codul surs coninut n fiierul principal al unei aplicaii Delphi simple:
program Projectl; uses Forms, Unitl in ' Unitl.pas'

{Forml};

28

{ $ R * . RES}

begin Application.Initialize; Application.CreateForm(TForml, Forml); Application.Run; end.

4.

Fiierul de resurse Este un fiier care folosete formatul standard Windows pentru fiierele de resurse. Are extensia .res. Resursele pot fi icon-uri, bitmap-uri, cursoare, etc. Numele acestui fiier este identic cu cel al proiectului, avnd ns extensia res. Mediul Delphi manipuleaz singur acest fiier. Este rareori nevoie ca programatorul s editeze acest fiier.

5.

Fiierele ataate formei Unei forme i sunt ataate dou fiiere cu extensiile .pas i .dfm. Fiierul dfm (Definition Module) conine imaginea unei forme, adic conine valorile proprietilor ei i ale componentelor de pe ea. Pentru o form care conine o component de tip TButton, fiierul dfm este urmtorul:
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 = 128 Top = 112 Width = 75 Height = 25 Caption = 'Buttonl' TabOrder = 0 end end

Aceasta poate fi vizualizat cu ajutorul opiunii View As Text (respectiv View As Form) din meniul de context ataat unei componente (care apare la click dreapta pe ea). 29

Fiierul .pas conine declaraia i implementarea clasei formei. Pentru o form vid (care nu conine nici o component) fiierul .pas este:
unit Unitl; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForml = class(TForm) private
{ P riv ate d e claratio n s )

public
{ P u b lic d e claratio n s )

end; var Forml: TForml; implementation {$R *.DFM} end.

6.

Fiierele unit Este vorba despre fiiere care nu au ataate o form. Ele au extensia .pas i pot conine clase, funcii i proceduri care pot fi folosite de un pro gram Delphi.

Observaii: 1. 2. 3. M ajoritatea acestor fiiere sunt create i manipulate automat de ctre mediul Delphi. Dac un fiier ce intr n alctuirea unui proiect nu se afl n acelai director cu acesta, atunci D elphi va pstra calea spre el. Programatorul poate folosi P ro ject M an ag er pentru a manipula fiierele care alctuiesc un proiect Delphi. Acesta se poate activa din meniul View, comanda Project M anager, sau apsnd combi naia de taste <Ctrl> + <Alt> + <F 11 >.

30

4. PROGRAMAREA EXCEPIILOR N DELPHI


Printre condiiile pe care trebuie s le ndeplineasc o aplicaie pentru a putea fi folosit fr probleme se numr i robusteea. Mai precis, o aplicaie este robust dac nu genereaz mesaje de eroare din a cror cauz s se blocheze i s se ntrerup. Aceste blocaje pot duce deseori la pierderi de date. Delphi pune la dispoziie un mecanism prin care i se permite unei apli caii s-i revin dup apariia unei erori i s se comporte ca atare, n funcie de situaia ivit. n acest scop s-a introdus noiunea de excepie, definit ca fiind o mul ime de condiii care pot genera o eroare care va ntrerupe cursul normal al execuiei unei aplicaii. Exemplu: O situaie clasic care poate genera o eroare (adic apariia unei excep ii) este mprirea la 0:
var a, b, c
:

integer;

a := 0 ; b := 2; c : = b div a;

{ n a ceast linie ex ec u ia a p licaiei se v a o p ri| { i v a fi afiat un m esaj de eroare)

Interceptarea excepiilor are ca scop tocmai evitarea opririi aplicaiilor i rezolvarea erorilor aprute prin intermediul blocurilor de protecie. Un astfel de bloc de protecie este alctuit din instruciuni care se execut n cazul n care a aprut o excepie. Pentru o bun rezolvare a excepiilor trebuie cunoscut na tura acesteia. Totui acest lucru nu este necesar, excepiile putndu-se prelucra i la modul general (n acest caz spunem c avem de-a face cu un cod de curire). Cnd o eroare apare, aplicaia genereaz o excepie, adic, mai precis, este creat un obiect al excepiei. Observaii: 1. Executnd aplicaia din interiorul mediului Delphi, aceasta se va ntrerupe n blocul n care apare excepia, semnalnd-o. Dac exist blocul pentru tratarea excepiei respective atunci aplicaia va fi doar 31

ntrerupt nu i terminat. Programatorul poate continua execuia (cu tasta <F9> sau folosind comanda Run\Run). 2. Executnd aplicaia n afara mediului (deci sub form de execu tabil), interceptarea i rezolvarea excepiei se va face invizibil pen tru utilizator. n acest caz, execuia se va desfura ca i cum nu ar fi existat nici o eroare.

Object Pascal ofer dou mecanisme pentru tratarea excepiilor: unul care nu ine cont de natura erorii, iar al doilea care ine cont de aceast natur.

4.1. Construcia try - finally


Este folosit de obicei n cazul alocrii unor resurse: alocarea unei zone de memorie care, apoi, datorit apariiei unei excepii, nu mai este eliberat, deschiderea unui fiier care, apoi tot din cauza apariiei unei erori, nu mai este nchis, etc. Sintaxa unei construcii try - finally este urmtoarea:
try
{in stru ciu n i n care e p osibil s ap ar o eroare}

finally
{lista cu in stru ciu n i care se e x ec u ta in d iferen t d a ca a a p ru t sau nu o excepie}

end

Felul n care funcioneaz o astfel de construcie este urmtorul: se execut instruciunile din seciunea try. Dac nu a aprut nici o excepie, atunci se continu cu execuia instruciunilor din partea finally. Dac a aprut o excepie, se sare la partea finally i se execut instruciunile de acolo, iar apoi excepia este din nou activat. Exemplul 1: Apariia unei erori de mprire la zero este rezolvat astfel:
a b := 0; := 0 ; c := a

try div b ;
{n m od no rm al aici e x ec u ia ap lic aiei) {ar fi n cctat, dar acu m nu m ai nceteaz...} {i c va prim i v a lo a re a zero}

finally
c : =0;

end;

32

Exemplul 2: S considerm acum cazul n care un fiier nu putea fi nchis datorit apariiei unei erori care oprea execuia aplicaiei:
Reset(f); b := 0; try c := a div b ;
{n m o d no rm al ap lic aia s-a r b lo c a aici } {i fiierul f nu ar fi nchis}

finally c := 0; CloseFile ( f ) ; {acum el e ste n s nchis} end;

Exemplul 3: Este posibil ca la un moment dat, n blocul finally s nu rezolvm toate excepiile aprute. De exemplu, s presupunem c avem de-a face cu dou excepii de mprire 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, afind-o). Exemplul 4: Dac n schimb avem excepii de mai multe tipuri i rezolvm doar unele dintre ele, atunci vom primi mesaje de eroare i aplicaia 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) ltvally

I A ici ni s e v a sem n a la ) o ex ce p ie de in trare/ieire)

X:=0; end;

4.2. Construcia try-except


Este folosit atunci cnd se cunoate clar natura erorii aprute. Sintaxa unei c o n s t a try-except este urmtoarea:
try xc.
^list cu instruciuni}

en<j c de excepie}

unde blocm ^

exCepii este format din instruciuni de tipul:

011 identificator: Tip do instruciune

Exemplu; *m t*&rirea la zero, iniial rezolvat clasic, iar apoi folosind excepii:
fu,^tion be&in
MediaAritmetica

(Suma, NumarDeNumere: Integer): Integer;

NumarDeNumere o 0 then Result := Suma div NumarDeNumere . else Result := 0;

Iar 3 cu m rezolvat folosind excepii:


' fUtv S t i o n MediaAritmetica(Suma,

NumarDeNumere: Integer)-. Integer;

ba*in

t r y Result := Suma div NumarDeNumere except


on EDivByZero do Result 5= Oj end ;

M Q(1u1

care * executa construcia tr,-e* cep . eSte urmtorul:

34

Lista de instruciuni din blocul try se execut n ordine. Dac nu apare nici o eroare blocul except este ignorat, continundu-se execuia cu prima instruciune aflat dup end. Dac a aprut o excepie, controlul este dat celui mai interior handler de excepie existent. Dac nu exist, atunci el va fi cutat nspre exterior, n alt bloc try-except neterminat nc. Dac nici aici nu este gsit, se continu n acest fel pn la epuizarea blocurilor try-except, sau pn la gsirea handlerului de excepie corespunztor. Dac nu este gsit nici unul se genereaz un mesaj de eroare.

4.3. Generarea unei excepii


Este util n cazul n care dorim s semnalm ceva care nu apare printre clasele de excepii cunoscute. Spre exemplu, dorim s semnalm faptul c un numr nu este ntr-un interval dat. Sintaxa generrii unei excepii este urmtoarea:

raise I n s t a n a E x c e p i e i ;
Instan a Excepiei este un obiect i nu o clas i este generat, de obi cei, direct la faa locului prin apelul constructorului clasei din care face parte obiectul. Exemplu: Dorim s generm o excepie dac un numr nu este n intervalul dat:
function StrToIntRange(const S: string; Min, Max: Longint): Longint; begin Result := StrToInt(S); if (Result < Min) or (Result > Max) then raise ERangeError.CreateFmt( '%d nu este n intervalul %d..%d', [Result, Min, Max]) ; end;

4.4. Clase de excepii


Excepiile sunt ncapsulate n clase care au ca strmo comun clasa Exception, definit astfel:
type Exception = 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 proprieti care specific un mesaj descriptiv pentru excepie (Message) i un context help pentru un eventual help on-line. Constructorii difer ntre ei prin felul n care este furnizat mesajul descriptiv al excepiei. Astfel, constructorii care au n cadrul lor secvena res trebuie s-i construiasc mesajul dintr-o resurs de tip string avnd identi ficatorul Ident. Constructorii care au n componena numelor secvena Fmt trebuie s-i construiasc mesajul pe baza unui format. Constructorii care au n componena numelui secvena Help trebuie s furnizeze un parametru suplimentar contextul pentru help-ul on-line al excepiei. n unitu] SysUtils sunt definite cteva clase de excepii utile, dintre care amintim cele mai importante:
C la s d e e x c e p ii C auza E ro ri care nu tre b u ie s afieze u n m esaj de eroare. A c este erori se m ai n u m e sc erori silen io a se. O e ro are sile n io a s p o a te fi g e n erat cu A b o rt. E rori d e acces in v alid al m em oriei. E rori care su n t cau zate de n e g sire a unei clase. E rori la iu cru l cu bazele d e date. E rori la lucrul cu c o m p o n en ta TD ateT im e. Erori la m p rirea cu zero a ntregilor. E rori la cre area unui fiier. E rori la d esch id erea unui fiier. E rori cau z a te d e d e p ire a nu m ru lu i de o ctei a lo cai p en tru un n treg n cazul n care se e fe ctu ea z calcule. E ro ri la c o n v ersia unei interfee. E rori Ia sp ec ifica re a unui a rg u m e n t invalid unei funcii.

E A b o rt

E A c ce ssV io la tio n E C la ssN o tF o u n d E D a ta b a se E r r o r E D a te T im e E rro r E D iv B yZ ero E F C re a te E rro r E F O p en E rro r E ln tO v e rflo w E ln tfC a stE rro r E ln v a lid A rg u m e n t

36

i l f P M l s jfl

C la s d e e x c e p ii E ln v a lid C a st E ln va lid G ra p h ic E h w a lid G ra p h ic.O p era tio n E ln va lid G rid O p e ra tio n E lii v a lid P o in ter E U s tE r r o r E M en u E rro r E O le C trlE rro r EO le E xcep tio n E O le S y sE rro r E O u tO fM em o ry E P a c ka g e E rro r E P rin ler E T h re a d E T re e V iew E rro r E V a ria n tE rro r E W in 3 2 E rro r Erori la co n v ersii.

C auza

E rori la n c rc area unui tip de g rafic n ecunoscut. Erori la m an ip u la re a im a g in ilo r grafice. E rori la m an ip u la re a grid -u rilo r. Erori la fo lo sirea p o in te rilo r invalid. Erori la m an ip u la re a listelor (clasele T L ist, T S trin g L ist etc.). Erori la m an ip u lare ite m -u rilo r de m eniu. E ro ri sp ec ifice co n tro a le lo r A ctiveX . E rori care ap ar n m e to d ele sau p ro p rietile un u i o b ic c t O LE. Erori sp ec ificc lui ID isp a tch . Erori d e m em o rie in su ficien t la alocare. Erori legate de m an ip u la re a p ach etelor. E rori leg ate d e m a n ip u la re a im p rim antei. E rori legate de m an ip u la re a firelo r de e xecuie. Erori leg ate d e m an ip u lare co m p o n e n tei TT reeV iew . E rori la m an ip u la re a v ariant-urilor. Erori ale sistem u lu i de operare.

Exemplul 1: Dorim s convertim un ir de caractere la un numr ntreg. n caz de excepie atribuim numrului valoarea 0.
procedure TForml.ButtonlClick(Sender: TObject); var nr : integer; begin try nr := StrToInt(Editl.Text); except on EConvertError do nr := 0; end; ShowMessage(IntToStr(nr)); end;

Exemplul 2: Rezolvarea excepiilor generate de accesarea unui nod inexistent dintr-o list se face astfel:

37

procedure TForml .ButtonlClick(Sender: TObject); var lista : TList; p : pointer; begin lista := TList.Create; try p := lista. Items [lista .Count] except on EListError do p := nil end; end;

Exemplul 3: Urmtoarea aplicaie intercepteaz i rezolv dou excepii de clase EConvertError i EDivByZero.
procedure TForml.ButtonlClick(Sender: TObject); var nr : integer; x : integer; begin x := 25; try nr := StrToInt (Editl .Text); / s a putea s apara eroare de conversie / -r a x := x div nr; / s a putea s apara i p r r l 0 / -r a m a ti e a except on EConvertError do nr := 1; on EDivByZero do x := 0; end; ShowMessage(IntToStr(x)); end;

5. OBIECTE GENERALE

n acest capitol sunt prezentate principalele clase "strmo" ale obiec telor VCL. Aceste clase nu sunt proiectate pentru a fi instaniate direct. Din ele trebuie derivate alte clase cu o funcionalitate precis. TObject este clasa strmo a tuturor obiectelor care alctuiesc ierarhia VCL. Aceast clas definete funcionalitile de baz precum crearea i alo carea memoriei necesare, iniializarea datelor membre, accesarea, distrugerea ctc. a obiectelor VCL. Obiectele VCL necesit metode speciale pentru atribuirea valorilor proprietilor unui alt obiect. Mai mult dect att, majoritatea obiectelor VCL i stocheaz valorile proprietilor pe disc n fiiere cu extensia .dfm (aceste fiiere au fost binare pn la versiunea 6, de atunci fiind fiiere text simple). Metodele necesare pentru a citi i scrie pe/de pe disc sunt definite n clasa TPersistent. Clasa TComponent introduce metode i proprieti 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, aezat 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 execuiei aplicaiei. Aceasta nseamn c aceste obiecte au o dimensiune i o poziie stabil pe form la momentul execuiei aplicaiei. 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 funcie de component. Spre exemplu, pe un buton care are focus este desenat un dreptunghi punctat.

5.1. TObject
TObject este strmoul comun al tuturor obiectelor VCL. Ierarhie TObject.

39

Definit n system.pas Metode_________________________________________ __ _________ __ Ml. Create constructor Create; Construiete un obiect i iniializeaz datele ataate 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: Urmtoarea aplicaie afieaz tipul variabilei referit de parametrul Sender al unui handler de evenimente. n cazul particular al aplicaiei prezentate mai jo s va fi afiat 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: Urmtoarea procedur afieaz numele clasei obiectului stocat n variabila Sender.
procedure TForml.ButtonlClick(Sender: TObject); begin ShowMessage( Sender. ClassType.ClassName); end;

Aplicaia va afia mesajul 'TButton'.

M5.

ClassParent class function ClassParent: TClass; Returneaz tipul printelui obiectului. Pentru un obiect de tip TObject se returneaz nil, deoarece acesta nu are nici un strmo.

Exemplu: Urmtoarea procedur afieaz numele clasei i al tuturor claselor strmo 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
Persistena este proprietatea obiectelor de a fi salvate i apoi rencrcate. TPersistent este strmoul comun al acelor obiecte care au capacitatea de a fi atribuite. Spre exemplu, instruciunea Destinaie := Sursa, nu nseamn neaprat c ntreg coninutul obiectului Sursa va fi copiat n Destinaie. Spre exemplu, n cazul pointerilor dup atribuirea de mai sus Destinaie i Sursa vor referi acelai 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 coninutul unui obiect n alt obiect. Apelul standard este: Destination. Assign(Source);

Exemplu: Urmtoarea aplicaie atribuie cutiei de editare Edit2 obiectul de tip TFont ataat cutiei de editare Editl. Valorile proprietilor obiectelor de pe forma Form l sunt:
object Buttonl: TButton Caption = ' AtribuieFont' end object Editl: TEdit Font.Height = -19 Font.Name = 'Courier New' Font.Style = [fsBold, fsltalic] end object Edit2: TEdit Font.Height = -27 Font.Name = 'Arial' Font.Style = [fsUnderline, fsStrikeOut] end

Handlerele de evetiimente ale obiectelor de pe forma Form l sunt:


procedure TForml.ButtonlClick(Sender: TObject); begin Edit2 .Font. Assign(Edi tl.Font) ; end;

M2.

AssignTo virtual void fastcall AssignTo(TPersistent* Dest); Copiaz coninutul unui obiect n alt obiect. Cele dou obiecte pot s nu aib acelai tip. Apelul standard este:

42

Source. AssignTo(Destinatie); Observaie: Nu toate obiectele implementeaz ambele metode Assign i AssignTo.

5.3. TComponent
Este strmoul comun al componentelor VCL. Toate componentele aflate n Component Palette deriv direct sau indirect din TComponent. Clasele care nu l au pe TComponent ca strmo (direct sau indirect) sunt clase noncomponente. Principala caracteristic a instanelor de tip TComponent este faptul c unele proprieti ale lor (cele declarate n seciunea published) pot fi prelucrate la momentul proiectrii aplicaiei prin intermediul lui Object Inspector. Ierarhie_________________________________________________________ TObject -> TPersistent -> TComponent. Definit n classes.pas Proprieti______________________________________________________ PI. ComponentCount property C om ponentC ount: integer; Indic numrul 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 dect ComponentCount, deoarece componentele sunt numerotate de la zero. P3. Component Index property Componentlndex : integer; 43

Indic poziia componentei n vectorul de componente. Prima compo nent are indexul zero, iar ultima are indexul cu o unitate mai mic dect numrul indicat de ComponentCount. P4. Name property Name : AnsiString; Name conine numele componentei. Exemplu: Urmtorul cod afieaz (la apsarea butonului Button1) numele compo nentelor aflate pe forma F orm l a aplicaiei:
procedure TForml .ButtonlClick(Sender: TObject); var i : integer; begin for i := 0 to ComponentCount - 1 do ShowMessage(Components[i].Name); end;

P5.

Owner property TComponent* Owner; Indic componenta proprietar a componentei curente.

Observaii: 1. 2. Forma este componenta proprietar a tuturor componentelor de pe ea. La distrugerea ei vor fi distruse toate componentele de pe ea. Forma, la rndul ei, se afl n proprietatea aplicaiei. De aceea, n momentul n care aplicaia este distrus (eliberat din memorie) i forma este distrus.

5.4. TControl
Este clasa de baz pentru componentele vizuale - care sunt vzute de utilizator la momentul execuiei. Definete metode, proprieti i evenimente comune pentru toate componentele vizuale, precum: Top, Left, Width, sau Height. Totodat TControl introduce proprieti care definesc modul n care apar sau sunt accesibile instanierile 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 seciunea protected a lui TControl, i, din aceast cauz, nu se pot accesa dect n clasele derivate din TControl. Ierarhie_________________________________________ TObject -> TPersistent -> TComponent -> TControl. Definit n ________________________________________________

controls. Proprieti______________________________________________________ 1*1. BoundsRect property BoundsRect: TRect; Returneaz dreptunghiul care ncadreaz controlul. Sistemul de axe de coordonate la care este raportat dreptunghiul are originea n colul din stnga sus al controlului printe. Observaie: Valorile cmpurilor Right, Left, Top, Bottom pot fi aflate i prin intermediul proprietilor cu acelai nume:
property property property property Top : integer; Bottom : integer; Left : integer; Right : integer;

P2.

ClientRect property ClientRect: TRect; Returneaz dimensiunile (n pixeli) dreptunghiului care reprezint zona client a controlului. Cmpurile Top i Left au valoarea 0, iar cmpurile Right i Bottom indic dimensiunea zonei client a controlului. Valorile pentru ultimele dou cmpuri pot fi aflate i cu ajutorul proprietilor:
property ClientHeight : Integer; property ClientWidth : Integer;

Pentru un obiect de tip Tcontrol, ClientHeight are aceeai valoare cu Height. Alte clase derivate pot implementa diferit ClientHeight. Pentru o form avem: ClientHeight = Height - nlimea barei de titlul - marginea redimensionabil - nlimea scrolibar-urilor. 45

P3.

Caption property Caption: string; Specific titlul controlului. Titlul este folosit pentru identificarea con trolului de ctre utilizator. Putem schimba titlul unui buton cu ajutorul urmtorului cod:
procedure TForml.ButtonlClick(Sender : TObject) begin Buttonl. Caption := 'AltTitlu'; end;

La apsarea butonului B uttonl 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 fcut doar la momentul proiectrii aplicaiei. P5. PopupMenu property PopupMenu: TPopupMenu; Indic meniul popup ataat controlului. Acest meniu apare n momentul n care utilizatorul execut click cu butonul din dreapta al mouse-ului pe component. Pentru mai multe informaii despre meniuri citii capitolul despre meniuri. P6. Color property Color: TColor; Indic culoarea fundalului unui control. Studiai tipul TColor pentru mai multe informaii. Observaie: Pentru a schimba culoarea unui control se ine cont de urmtoarea indicaie: Un control i poate modifica culoarea doar dac are proprie tatea Color. La schimbarea culorii unui control trebuie s se in cont i de valoarea proprietii ParentColor. Dac valoarea proprietii 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 (printele) i-o schimb. Implicit ParentColor este setat de Object Inspector la true. Kxcmplu: S presupunem c pe form avem un buton (B uttonl) i o component de tip TLabel (L a b ell). Urmtorul program, la apsarea butonului, va schimba culoare formei i a componentei de tip TLabel n rou:
procedure TForml.ButtonlClick(Sender : TObject); begin Forml.Color := clRed; end:

Dac setm ParentColor pentru Labell la false, atunci la apsarea butonului B uttonl 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 cnd acesta trece pe deasupra unui control. Valorile standard (furnizate de ctre TScreen) sunt urmtoarele constante ntregi: crNone, crArrow, crCross, crIBeam, crSize, crSizeNESW, crSizeNS, crSizeNW SE, crSizeWE, crUpArrow, crHourGlass, crDrag, crNoDrop, crHSplit, crVSplit, crMultiDrag, crSQLWait, crNo, crAppStart, crHelp i crHandPoint.

1*8.

Enable property Enabled: boolean; Specific dac controlul mai rspunde la mouse, tastatur, sau sisteme de timere. Pentru a bloca un buton (de exemplu B uttonl) s mai rs pund Ia astfel de evenimente, scriem instruciunea:
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 gsi n capitolul despre grafica n mediul Delphi.

P10.

Hint property Hint: string; Specific textul care apare cnd cursorul de mouse este trecut pe deasupra controlului. Pentru ca acest text s apar trebuie ca proprietatea ShowHint s fie setat la true.

P il.

ShowHint property bool ShowHint; Stabilete dac Help Hint-u\ va aprea n momentul n care cursorul mouse-ului poposete pentru puin timp pe control. Trebuie inut cont i de valoarea proprietii ParentShowHint i anume, dac ParentShowHint este setat la true, atunci fiecare component va afia propriul ei Help Hint (indiferent de valoarea lui ShowHint), n caz contrar fiecare component se va conforma propriului ei ShowHint.

Exemplu: S realizm o aplicaie care const dintr-un buton (Button]) i o cutie de editare (E d itl) care s aib fiecare cte un Help Hint. Valorile proprie tilor obiectelor de pe form vor fi:
object Buttonl: TButton Hint = ' Apasati-ma' ParentShowHint = False ShowHint = True end object Editl: TEdit Hint = 'Introduceti un text' ParentShowHint = False ShowHint = True end

P12.

Text property Text: string; Text conine textul ataat unui control. Cu ajutorul acestei proprieti poate fi citit textul ataat unui control, sau se poate ataa controlului un

48

text. Implicit Text are ca valoare numele controlului. Spre exemplu, ntro component de tip TEdit se afl nscris iniial un text reprezentnd numele componentei: de exemplu E ditl. P13. Visible property Visible: boolean; Specific dac un control este vizibil pe ecran la momentul execuiei aplicaiei. Observaie: O component care deriv doar din TComponent nu poate fi vizibil la momentul execuiei 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 printelui. Valori posibile pentru Align sunt:
V a lo a r e a lN o n e S e m n ific a ie D im e n siu n ile i p o z iia c o m p o n entei rm n neschim bate. C o m p o n e n ta se m u t n p artea de sus a com p o n en tei printe. a lT o p L im e a ei d ev in e eg al cu lim ea com p o n en tei printe, n lim e a nu se m o d ific * C o m p o n e n ta se m u t n p a rte a de jo s a com p o n en tei printe. a lB o tto m L im e a ei d e v in e e g al cu lim ea c om ponentei printe. n lim e a nu se m o dific.* C o m p o n e n ta se m u t n p a rte a stng a com p o n en tei printe, a l L e ft n lim e a ei d ev in e eg al cu n lim ea com p o n en tei printe. L im e a nu se m o d ific .* C o m p o n e n ta se m u t n p a rte a stn g a com p o n en tei printe, a lR ig h t n lim e a ei d ev in e e g al cu n lim e a form ei. L im ea n u se m o dific.* C o m p o n e n ta se red im en sio n eaz astfel n c t s um ple z ona clien t a co m p o n e n tei p rin te. a lC lie n t D a c o a lt co m p o n e n t a o cu p at de ja o parte din a ceast z o n (are seta t o v alo are d ife rit de a lN o n e pentru p ro p rietate a A lig n ), atunci c o m p o n e n ta c u ren t o c u p restul suprafeei rm ase neacoperite.

49

Dac mai exist i alte componente avnd setat aceeai 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 pro prietate. Spre exemplu, dac exist dou componente avnd proprietatea Align setat la valoarea alTop, atunci una dintre ele (cea creia i-a fost setat prima dat valoarea alTop) se va lipi de marginea superioar a componentei printe, iar cealalt de marginea inferioar componentei deja amplasat. Anchors property Anchors: TAnchors; Indic felul n care componenta este ancorat de printe. Ancorarea se realizeaz fa de una (sau mai multe) dintre marginile componentei printe. Aceast operaie ne asiigur c poziia componentei - fa de marginile de care a fost ancorat n cadrul printelui - nu se modific. Valori posibile pentru Anchors sunt o submulime a:
V a lo a r e a kT o p a k B o tto m a k L e ft a k R ig h t S e m n ific a ie C o m p o n e n ta e ste a n c o ra t de m a rg in e a su p erio ar a com p o n en tei printe. C o m p o n e n ta e ste a n c o ra t de m a rg in e a in ferio ar a co m p o n e n tei printe. C o m p o n e n ta este a n c o ra t de m a rg in e a din st n g a a com p o n en tei p rinte. C o m p o n e n ta este a n c o ra t de m a rg in e a din d reap ta a com p o n en tei p rin te.

P15.

Observaie: Dac o component este ancorat de dou margini opuse (spre exemplu akTop i akBottom) atunci, n cazul redimensionrii componentei printe, se vor modifica i dimensiunile ei astfel nct distana la marginile de care este legat s nu se schimbe. PI 6. AutoSize property AutoSize: Boolean; Indic dac controlul se redimensioneaz sau nu automat cnd con inutul lui se schimb. Exemplu de control avnd proprietatea AutoSize este TEdit. Setnd valoarea proprietii AutoSize la true, cutia de editare se va acomoda cu nlimea textului introdus n ea.

50

P17.

DragCursor property DragCursor: TCursor; Indic tipul de cursor care este afiat n momentul n care controlul curent este tras (este executat asupra lui o operaie de tip drag). Implicit are valoarea crDrag.

P18.

DragMode property DragMode: TDragMode; Determin comportamentul drag and drop al controlului. Valori posibile pentru DragMode sunt:
V aloare Sem nificaie

dmMtmuo/ dmAutomatic

Controlul nu poate fi tras dect dup ce aplicaia apeleaz metoda BeginDrag. Controlul este gata spre a fi tras. Utilizatorul poate executa n orice moment aceast operaie.

P19.

Parent property Parent: TW inControl; Indic controlul printe n interiorul cruia este afiat cel curent.

Exemplu: Urmtoarea aplicaie afieaz prinii unui buton, tiind c acesta este aezat pe o component TPanel.
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 c o n t r o l : T C o n t r o l ; begin
// prinii unui control ii afiam intr-un LislBox cate unul pe linie L is tB o x l. C le a r; c o n t r o l := S e n d e r as T C o n t r o l ; // convertete controlul la TControl while c o n t r o l <> nil do

begin
L i s t B o x l . I t e 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 printele controlului

end; end;

n urma execuiei programului, n ListBoxl vor fi afiate liniile: Button 1 Panel 1 Form l 51

Metode Ml. Hide procedure Hide; Face un control s devin invizibil. Proprietile i metodele controlului sunt disponibile i dac acesta nu mai este vizibil. n schimb, un control invizibil nu poate recepiona mesaje generate de apsarea tastelor sau a mouse-ului. M2. Show procedure Show; Face ca un control s fie vizibil. M3. Refresh procedure Refresh; Redeseneaz imediat controlul. O bservaie: Dac nu se apeleaz aceast metod redesenarea controlului se va face doar dup procesarea mesajelor trimise de aplicaie nainte de mesajul de redesenare. Exemplu: Dac dorim s implementm un contor care afieaz ntr-o csu de editare numerele de la 1 la 1000 (cte unul la un moment dat) atunci urmtorul cod va afia n E ditl doar numrul 1000: procedure TForml.ButtonlClick(Sender: TObject); var i: integer; begin for i := 1 to 1000 do
Editl.Text := IntToStr(i);

end; Codul corect este urmtorul: procedure TForml.ButtonlClick(Sender: TObject); var i: integer; begin for i := 1 to 1000 do begin
Editl.Text := IntToStr(i); Editl.Refresh;

52

end; end ;

M4.

ClientToScreen function ClientToScreen(const Point: TPoint): TPoint; Convertete coordonatele unui punct din zona client a controlului n coordonate ecran. Coordonatele ecran sunt stabilite fa de colul din stnga sus a ecranului. Acel punct (din colul din stnga sus al ecranului) are coordonatele (0, 0).

Evenimente E l. OnClick p ro p e rty OnClick: TNotifyEvent; Apare cnd utilizatorul execut click pe control. Mai poate aprea cnd: utilizatorul selecteaz un item dintr-o gril, list sau combo box prin apsarea unei sgei; utilizatorul apas tasta <Space> n timp ce butonul sau cutia de control are focus; utilizatorul apas <Enter> cnd forma activ are un buton Default', utilizatorul apas <Esc> cnd 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 proprietii 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 funcia de a notifica (a informa) o component de o schimbare aprut 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 poziia mouse-lui, nici dac apsarea butonului a fost nsoit de apsarea unei taste. Tipul TNotifyEvent este definit n unitul classes astfel:
TNotifyEvent = procedure (Sender: TObject) of object;

unde Sender este obiectul notificat (informat) despre schimbarea aprut n sistem. 53

,#***

m irtu fff,

E2.

OnDblClick property OnDblClick: TNotifyEvent; Apare cnd utilizatorul execut dublu click pe un control.

E3.

OnStartDrag property OnStartDrag: TStartDragEvent; Operaia drag-drop const n apsarea butonului stng al mouse-ului pe un control, iar apoi "tragerea" (cu mouse-ul apsat) controlul ntr-o alt poziie, unde butonul de mouse este eliberat. Evenimentul OnStartDrag apare cnd utilizatorul a nceput o operaie 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 conine informaii despre operaia drag-drop curent. Spre exemplu, DragObject poate conine informaii despre cursorul de mouse folosit n aceast operaie. E4. OnDragOver property OnDragOver: TDragOverEvent; Apare cnd utilizatorul trage un obiect pe deasupra unui control. Controlul pe deasupra cruia 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 cruia se trage obiectul Source, iar variabila boolean Accept indic dac Source poate fi lsat s cad (operaia drop) peste Sender. TDragState este un tip enumerare care conine valorile:
Valoare
d sD ra g E n te r d sD ra g M o v e d sD ra g L e a v e

Sem nificaie
C u rso ru l dc m o u se intr n su p ra fa a de d e su p ra Sem /er-ului. C u rso ru l d e m o u se este p lim b at pe d e asu p ra Sevirfer-ului. C u rso ru l de m o u se p rsete su p ra fa a Sender-u\xu.

54

E5.

OnDragDrop property OnDragDrop: TDragDropEvent; Apare cnd 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 cnd tragerea unui obiect nceteaz, fie prin lsarea 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 operaia drop. Exemplul 1: Urmtoarea aplicaie permite plimbarea cu ajutorul mouse-ului a unei etichete pe o form. Valorile proprietilor obiectelor de pe forma Form l sunt:
object Labell: TLabel Caption = 'Labell' DragMode = dmAutomatic end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.Label1StartDrag(Sender: TObject; var DragObject: TDragObject); begin DragObject := nil; end; procedure TForml.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := 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: Urmtoarea aplicaie const dintr-o form pe care se afl 5 etichete (componente de tip TLabel) i o component TListBox. Etichetele au ca text ataat numerele de la 1 la 5. Utilizatorul trebuie s trag fiecare etichet n Listboxl. Dac eticheta este acceptat atunci textul ataat ei va fi adugat ca item al lui Listboxl. Nu orice ordine de adugare a textelor n ListBoxl este permis. Adugare etichetelor trebuie s nceap cu numrul 1 i trebuie s se continue succesiv cu numerele 2, 3, 4 ,5 . Valorile proprietilor obiectelor de pe forma Form l sunt:
object Labell: TLabel Caption = '1' DragMode = dmAutomatic OnStartDrag = LabellStartDrag end object Label2: TLabel Caption = '2' DragMode = dmAutomatic OnStartDrag = LabellStartDrag end object Label3: TLabel Caption = '31 DragMode = dmAutomatic OnStartDrag = LabellStartDrag end object Label4: TLabel Caption = '4' DragMode = dmAutomatic OnStartDrag = LabellStartDrag end object Label5: TLabel Caption = '5 DragMode = dmAutomatic OnStartDrag = LabellStartDrag end

Handlerele de evenimente ale obiectelor de pe forma Form l sunt:

56

var curent : byte; / care e i h t t c u e adaugata l momentul a t a / tcea ihi a cul procedure TForml.FormCreate(Sender: TObject); begin curent := 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); begin Accept := (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 e i h t de acceptat / tcea end;

E7.

OnMouseDown property OnMouseDown: TMouseEvent; Apare cnd un buton al mouse-ului este apsat. Tipul TMouseEvent este definit astfel:
TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;

unde Sender este controlul pe a crui suprafa este apsat mouse-ul. (X, Y) sunt coordonatele pixel-ului unde cursorul de mouse a fost apsat. TMouseButton este un tip enumerare:
TMouseButton = (mbLeft, mbRight, mbMiddle);

i indic butonul de mouse care a fost apsat. TShiftState este o mulime:


TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

57

care indic ce taste de control sau ce butoane ale mouselui au fost apsate n timpul apariiei acestui eveniment. E8. OnMouseMove property OnMouseMove: TMouseMoveEvent; Apare cnd cursorul de mouse este micat. Tipul TMouseMoveEvent este definit astfel:
TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;

Parametrii sunt aceeai ca la OnMouseDown (schimbnd "apsat" cu "micat"). Exemplu: Urmtoarea aplicaie const dintr-o form pe care se afl o cutie de editare (E ditl). La trecerea cursoului de mouse pe deasupra cutiei E ditl, culoarea textului nscris n ea va deveni roie. La ieirea 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 cnd 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 (schimbnd apsat cu eliberat).

58

E10.

OnCanResize

property OnCanResize: TCanResizeEvent;


Apare cnd se ncearc redimensionarea unui control. Tipul TCanResizeEvent este definit astfel:
TCanResizeEvent = procedure (Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;

unde NewW idth i N ew H eight sunt noile dimensiuni ale obiectului. Resize indic dac modificarea dimensiunilor este acceptat sau nu.

Exemplu:
S se realizeze o aplicaie care nu permite redimensionarea formei prin cipale peste valoarea 300 pentru nlime i lime. Iniial forma are ambele dimensiuni (Height i Width) mai mici dect 300. Handlerul pentru evenimentul OnCanResize al formei F orm l este urm torul:
procedure TForml. ForinCanResize (Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); begin if (NewWidth > 300) or (NewHeight > 300) then Resize := false else Resize := true; end;

O alt posibilitate de a realiza aceast aplicaie (fr a folosi evenimen tul OnCanResize) este de a seta valorile proprietii 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 aplicaie care nu permite ca dimensiunile formei principale s nu fie multiplu de 10. Rezolvm cerina problemei implementnd handlerul pentru evenimen tul OnResize al formei Form l:
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 ataat o fereastr. O important caracteristic a lor este faptul c pot primi focus (deci pot interaciona cu utilizatorul prin intermediul tastaturii).

Ierarhie_______________________________ ________
TO bject -> TPersistent -> TComponent -> TControl -> TWinControl.

Definit n______________________________ ________ _


controls.pas

Proprieti___________________________________________________
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 colului din stnga sus al controlului. P3.
ClientRect

property ClientRect: TRect;


Indic dimensiunile ferestrei controlului, n numr de pixeli. 60

P4.

ControlCount

property ControlCount: Integer;


Indic numrul de componente care sunt copii ai componentei care a apelat aceast metod. P5.
Controls

property Controls)Index: Integer]: TControl;


Este un vector care conine controalele care sunt fii ai controlului care apeleaz aceast proprietate. P6.
CtlJD

property Ctl3D: Boolean;


Indic dac controlul este afiat sau nu 3D. Acest lucru depinde i de valoarea proprietii ParentC tU D . P7.
P arentC tU D

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 printe. Dac ParentCtl3D este true, atunci felul n care arat o component este identic cu felul n care arat componenta printe. Dac ParentCtl3D este false, atunci componenta i va folosi propria proprietate Ctl3D. P8.
TabO rder

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 numr unic ataat (TabOrder). Dac TabO rder este -1 , atunci controlul respectiv nu poate fi accesat cu ajutorul tastei <Tab>. Iniial, aceast ordine este ordinea n care sunt aezate controalele pe form.

Itxemplu:
S se realizeze o aplicaie care afieaz Tab-ordinea componentelor de pe o form. Folosim o component TListBox n care afim numele componentelor (cte unul pe o linie) i numrul lor de ordine (conform cu Tab-ordinea).

61

Handlerele de evenimente ale obiectelor de pe forma F orm 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 //te stu l acesta este ne ce sar


then begin
/ / d e o arec e p e o fo rm a se p o t afla // si c o m p o n en te care nu d eriv a din T W in C o n tro l // sp re ex em p lu T L a b el sau T T 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, AllowW inControls:Boolean=False): TControl; Returneaz controlul fiu aflat la poziia Pos.

62

MS.

G etTabO rderList

procedure GetTabOrderList(List: TList);


Returneaz ordinea Tab ntr-o list. Ordinea Tab indic felul n care sunt parcurse controalele prin apsarea tastei <Tab>.

M6.

Repaint

procedure Repaint;
Redeseneaz controlul.

M7.

ScrollBy

procedure ScrollBy(DeltaX, DeltaY: Integer);


Defileaz coninutul ferestrei controlului cu D eltaX pixeli orizontal (spre dreapta) i D eltaY pixeli vertical (n jos). D eltaX i D eltaY pot avea i valori negative, asta nsemnnd c coninutul ferestrei va defila spre stnga, respectiv n sus.

M8.

ScaleBy

procedure ScaleBy(M, D: Integer);


Redimensioneaz un control mpreun cu toate controalele coninute n acesta. M reprezint factorul cu care va fi multiplicat dimensiunea ori crui control, iar D reprezint numrul cu care va fi mprit dimen siunea fiecrui control. Dac dorim s micorm 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 urmtorul cod:
procedure TForml.ButtonlClick(Sender: TObject); begin

ScaleBy(3,4);
end;

63

Evenimente E l.
OnEnter

property OnEnter: TNotifyEvent;


Apare cnd o fereastr-control devine activ (cnd primete focus).

E2.

OnExit

property O n E x it: TNotifyEvent;


Apare cnd 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;

Apsarea unei taste poate fi acompaniat i de apsarea unui buton de mouse sau de apsarea tastelelor <Ctrl>, <Shift>, <Alt>, aceste lucruri fiind specificate n parametrul Shift. Valori posibile pentru Shift sunt o submulime din urmtoarele valori constante: ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssM iddle, ssD ouble. Semnificaia acestor constante este:
Valoare
ssShift ssAlt ssClrl ssLeft ssRight ssM iddle ssDouble

Semnificaie
T a sta <Shift> este apsat. T a sta <Alt> este apsat. T a sta <Ctrl> este apsat. B utonul stn g al m o u se-u lu i este in u t apsat. B utonul d rep t al m o u se-u lu i este in u t apsat. B utonul din m ijlo c al m o u se-u lu i este in u t apsat. A fo st e x ec u ta t un d u b lu -click .

E4.

O nKeyUp

property OnKeyUp: TKeyEvent;

64

Apare n momentul n care utilizatorul elibereaz o tast pe care a apsat-o ntr-un moment anterior. Semnificaia parametrilor este ca i la
OnKeyDown.

E5.

O nK eyPress

property OnKeyPress: TKeyPressEvent;


Apare cnd 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;

K ey reprezint tasta apsat.

Exemplu:
Urmtoarea aplicaie const dintr-o form (F orm l). Utilizatorul poate scrie un text n bara de titlu a formei prin apsarea tastelor n timp ce focusul este la forma F orm l i nu la una din componentele ei.
procedure TForml.FormKeyPress(Sender: TObject; var Key: C h a r ) ; begin

Caption := Caption + Key;


end;

65

6. FERESTRELE APLICAIEI COMPONENTATForm '

O aplicaie W indow s const din una sau mai multe forme (ferestre). Una dintre ele este fereastra principal care va fi afiat n momentul lansrii aplicaiei n execuie. Componenta care implementeaz caracteristicile i comportamentul unei forme se numete TForm. Aceast component nu are reprezentare n Component Palette i, de aceea, adugarea unei noi forme la aplicaie se realizeaz prin accesarea comenzii File\NewForm. O fereastr este mprit n dou zone principale:

bara de titlu; zona client.

Bara de titlu se afl n partea de sus a formei i conine de la stnga spre

dreapta: meniul sistem; titlul ferestrei; trei butoane (Minimizare, Maximizare i nchidere).

Zona client are cea mai mare suprafa. Pe ea programatorul aeaz con troale cu ajutorul crora definete funcionalitatea unei aplicaii.

6.1. TForm
Ie r a r h ie ____________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TScrollingW inControl -> TForm.

Definit

_______________________________________

form s.pas

66

Proprieti PI.
Active

property Active: Boolean;


Determin dac o form este activ sau nu (daca are sau nu focu s). La un moment dat, doar o form poate avea focus. O form activ este aceea asupra creia utilizatorul acioneaz la momentul curent. Se deosebete de toate celelalte forme prin culoare barei de titlu.

P2.

ActiveC ontrol

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 A ctiveC ontrol indic componenta care va primi fo cu s n momen tul n care forma primete.

P3.

B orderlcons

property BorderIcons:TBorderIcons;
Indic tipurile de iconuri ce pot s apar n bara de titlu a unei forme. TBorderlcons este o mulime, deci poate lua mai multe valori dintre urmtoarele:
V a lo a r e S e m n ific a ie F o rm a are un m eniu n u m it System , care e ste a fiat Ia a p sarea ico n u lu i (din colul din stn g a sus) cu ajutorul cru ia fo rm a poate fi n ch is, m ax im izat, m in im iza t etc. F o rm a are un b u to n de m in im izat(n colul din d re a p ta sus). F o rm a are u n b u to n de m ax im izat(n colul din d re a p ta sus). F o rm a are un b u to n d e help care are de se n a t p e el un sem n de n trebare.

BiSystemM enu BiM inim ize BiM aximize BiHelp

P4.

BorderStyle

property BorderStyle: TFormBorderStyle;


Specific tipul de margine pentru o form. Valorile posibile pentru
BorderStyle sunt:

67

V a lo a r e

S e m n ific a ie F o rm a nu standard. p oale fi red im en sio nat. M arg in ea este n form

BsDiatog BxSingle BsNune BsSizeable BsToolW indow BsSizel'oolW in

F orm a nu p o ate fi red im en sio n at. 0 sin g u r linie ca m argine. F orm a nu p o ate fi red im en sio n at. N ici o linie viz ib il ca m argine. F o rm a p oate 1 redim ensionat. 1 La fel ca i bxSingle d a r cu un titlu m ai m ic. L a fel ca i bsSizeahle d a r cu un titlu m ai m ic.

Apare aici termenul de form redimensionabil . Este vorba de schim barea dimensiunilor formei cu ajutorul mouse-ului n timp ce aplicaia este n execuie. Oricum, schimbarea dimensiunilor formei poate fi fcut i n timpul execuiei aplicaiei, dar fr ajutorul mouse-ului, ci cu ajutorul proprietilor ClientHeight i ClientWidth.

Exemplu:
S presupunem c la lansarea n execuie a aplicaiei forma nu putea fi redimensionat, dar dorim ca la apsarea unui buton ( B u tto n l ) aceasta s poat fi redimensionat. Atunci handlerul de evenimente ataat buto nului B uttonl i evenimentului OnClick trebuie s conin linia:
procedure TForml.ButtonlClick(Sender: TObject); begin Forml. BorderStyle:=bsSizeable; end;

P5.

ClientHeight

property ClientHeight: Integer;


Specific nlimea, n pixeli, a zonei client a formei. Pentru a determina ntreaga nlime a formei (+ zona de titlu) citii valoare proprietii Height a lui TControl.

P6.

ClientWidth

property ClientWidth: Integer;


Specific limea, n pixeli, a zonei client a formei.

Exemplu:
Urmtoarea aplicaie interschimb, la apsarea butonului B u tton l, valoa rea limii cu valoarea nlimii zonei client a unei forme (F orm l):

68

procedure TForml.ButtonlClick(Sender: TObject); var h :integer; begin h := Forml.ClientHeight; Forml .ClientHeight := Forml.ClientWidth; Forml.Clientwidth := h; end;

La apsarea cu numr de ordine par, forma va avea dimensiunile ei originale. P7.


Position

property Position: TPosition;


Specific dimensiunile i poziia pe care o va avea o form pe ecran. Valorile posibile pentru Position sunt:
V a lo a r e S e m n ific a ie F o rm a v a apare p e ecran n aceeai p o ziie i cu aceleai d im en siu n i ca i cele setate la tim pul p roiectrii ei. W in d o w s-u l alege p o z iia i d im e n siu n ea form ei. W in d o w s-u l v a aleg e d o a r p o z iia fo rm ei, rm n n d cele setate la tim pul p ro iectrii ei. W in d o w s-u l v a aleg e d o a r r m n n d cea de la p roiectare. dim en siu n ile d im e n siu n ile

poD esigned poD efault poD efauhP osO nly poDefaultSizeO nly poScreenC enter

form ei,

p o z iia

F o rm a va av ea p o z iie cen tral pe e cran i d im e n siu n ile pe care le av ea 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 parial sau total de ctre o alt form). Dac o aplicaie are mai multe forme, atunci cele care au proprietatea Visible setat la true, vor fi vizibile (sau parial vizibile dac sunt acoperite de alte forme), iar cele cu proprie tatea Visible setat la false nu sunt vizibile. P9.
Menu

property Menu: TMainMenu;


Specific meniul unei forme. Dac pe form sunt adugate 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 W indowState sunt:
V a lo a r e S e m n ific a ie F o rm a apare n stare n o rm a l (nici m in im iza t nici m axim izat). F o rm a apare n stare m inim izat. F o rm a ap are n stare m ax im izat.

wsNorm al wsM inim ized wsM aximized

P12.

FormStyle

property FormStyle: TFormStyle;


Indic stilul unei forme. Valori posibile pentru FormStyle sunt:
V a lo a r e S e m n ific a ie F o rm a nu este nici o fe re a str M D I p rin te , nici M D I copil. F o rm a e ste o fe re a str M D I copil. F o rm a e ste o fereastr M D I p rinte. F o rm rm n e a fiat pe d esk top d e asu p ra tu tro r celorlalte form e care nu au p ro p rietatea FormStyle seta t la a ce a st valoare.

FsNormal FsM D IC hild FsM DIForm F sStayOnTop

P13.

M odalR esult

property ModalResult: TModalResult;


Specific o valoare pentru care forma va fi nchis dac este afiat ca modal. Pentru a nchide forma, aceast valoare trebuie s fie mai mare dect 0 (mrNone ). Valori posibile pentru M odalR esult sunt:
V a lo a r e S e m n ific a ie V alo are im plicit. N u are nici o sem nificaie. U tilizato ru l a ieit apsnd un b u to n de tip Ok. U tilizato ru l a ieit apsnd un b u to n de tip Cancel. U tiliz a to ru l a ieit ap sn d un b u to n de tip Abort. U tiliz a to ru l a ieit ap sn d un b u to n de tip Retry.

mrNone mrO k mrCancel m rAbort m rRetry

70

V a lo a r e

S e m n ific a ie U tilizato ru l a ieit a p sn d un buton de tip Ignore. U tilizato ru l a ieit ap sn d un b u to n de tip Yex. U tilizato ru l a ieit ap sn d un b u to n d e tip No. U tilizato ru l a ieit ap sn d un b u to n de tip AII.

mrIgnore mrYe.s m rNo m rAll

P15.

Canvas

property Canvas: TCanvas;


Furnizeaz acces la suprafaa de desenare a formei.

Exemplu:
Urmtoarea aplicaie deseneaz pe forma F orm l, la apsarea butonului
B u tton l, 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 tiprit la impri mant. Valori posibile pentru PrintScale sunt:
V a lo a r e S e m n ific a ie N u are loc n ici o scalare. F o rm a este sca la t astfel n c t tip rit s a ib cam dim en siu n i ca i pe ecran. aceleai

PoNone PoProportional PoPrintToFit

F o rm a este sca la t astfel n ct s n c a p n p a g in a pe care este tiprit.

P17.

TransparentColor

property TransparentColor: Boolean;


Indic dac una din culorile folosite la desenarea suprafeei formei va fi afiat drept transparent. Aceasta nseamn c unele poriuni din form vor fi transparente, prin ele fiind vizibile alte ferestre. Aceast facilitate nu funcioneaz ns dect pentru versiunile mai noi ale sistemului de operare (cel puin Windows 2000).

71

P18.

TransparentColorValue

property TransparentColorValue: TColor;


Indic culoarea transparent a formei. Dac se folosete o palet pe 16 bii 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 proprietii 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;
Afieaz forma. Show seteaz proprietatea Visible la true.

M2.

Hide

procedure Hide;
Ascunde forma. Hide seteaz proprietatea Visible la false.

Exemplu:
Avem o aplicaie cu dou forme. Aceste forme vor fi create n ordinea adugrii lor la aplicaie, iar n momentul n care lansm aplicaia n execuie va deveni vizibil prima form creat (conform cu ordinea Z). Pe fiecare form avem la dispoziie cte un buton la a crui apsare forma pe care se afl devine invizibil, iar cealalt devine vizibil (ac tiv). Handlerele de evenimente pentru cele dou butoane vor arta astfel:

72

Pentru Unit 1.p a s 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;

M 3.

ShowM odal

function ShowModal: Integer;


Afieaz forma ca form modal. Asta nseamn c utilizatorul trebuie s nchid aceast form pentru ca aplicaia s poat continua.

Exemplu:
Avem o aplicaie care are dou forme. Pe prima form se afl un buton la a crui apsare forma Form2 va fi afiat 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 o rm l : Handlerele de evenimente din Unit 1.p a s sunt:
procedure TForml.ButtonlClick(Sender: TObject); begin Form2.ShowModal ; Editl.Text:=Form2.Editl. Text; end;

iar din u n itl.p a s sunt:


procedure TForm2.FormShow(Sender: TObject); begin Editl.Clear; Editl.SetFocus; end;

U nit2.pas trebuie inclus n Unit 1.pas.

M4.

CloseQ uery

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 CloseQ uery pentru o form returneaz false, atunci operaia de nchidere a formei nu este posibil. n caz contrar este apelat evenimentul OnClose.

Observaie:
nchiderea formei principale a unei aplicaii duce la terminarea apli caiei.

M6.

Release

procedure Release;
Distruge o form i elibereaz spaiul de memorie ocupat de ea. Spre deosebire de F ree , Release ateapt pn n momentul n care execuiile tuturor handlerelor de evenimente de pe form sunt terminate.

M7.

FocusControl

procedure FocusControl(Control: TWinControl);


Componenta Control devine noua valoare a proprietii 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;
Tiprete forma.

Exemplu:
Urmtorea aplicaie numr cte componente sunt pe form. Pentru fiecare component se va afia 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 afia numrul componentelor, L istB oxl- pentru a afia

numele i indexul unei componente n cadrul vectorului de componente (al formei). Afirile descrise mai sus se vor face la apsare unui buton
(B uttonl). Unit 1.p as va fi conine urmtoarele handlere de evenimente:
procedure TForml.ButtonlClick(Sender: TObject); var i:integer; begin Editl.Text:=IntToStr(ComponentCount); for i:=0 to ComponentCount do ListBoxl.Items.Add(Components[i].Name+' '+ IntToStr(Components[i].Componentlndex)) ; end;

Evenimente E l.
OnActivate

property OnActivate: TNotifyEvent;


Apare cnd forma este activat (primete focus).

E2.

O nD eactivate

property OnDeactivate: TNotifyEvent;


Apare cnd forma pierde focus-ul (nu mai este activ).

E3.

OnShow

property OnShow: TNotifyEvent;


Apare cnd proprietatea Visible este setat la valoarea true.

E4.

OnHide

property OnHide: TNotifyEvent;


Apare cnd proprietatea Visible este setat la valoarea false.

E5.

OnResize

property OnResize: TNotifyEvent;


Apare cnd forma este redimensionat.

75

E6.

OnClose

p ro p e rty OnClose: TCloseEvent; Apare cnd forma este nchis. Tipul TCloseEvent este definit astfel:
TCloseEvent = procedure {Sender: TObject; var Action: TCloseAction) of object;

Action indic ce aciune va fi ntreprins n momentul n care forma este nchis. Valori posibile pentru Action sunt:
V a lo a r e S e m n ific a ie F o rm a nu este n ch is. F o rm a nu este n c h is ci d o a r ascuns. F o rm a nu este n c h is ci d o a r m inim izat. F o rm a este n c h is i m e m o ria a lo c at este eliberat.

caNone vaHide caM inimize caFree

O bservaie: Dac forma care se nchide nu este forma principal a aplicaiei atunci, la nchidere, Action are valoarea cciHide. Exem plu: Dorim s realizm o aplicaie care s nu poat fi nchis dect dac cutia de editare E d itl conine irul de caractere 12345. Pentru aceasta handlerul de evenimente O nClose va conine:
procedure TForml.FormClose(Sender: TObject; var Action: TCloseAction); begin if Editl.Text <> '12345' then Action := caNone; end;

E8.

OnCreate

p ro p e rty OnCreate: TNotifyEvent; Apare cnd forma este creat. E9.


O nD estroy

p ro p e rty OnDestroy: TNotilylivent; Apare cnd forma este distrus.

76

E10.

O nPaint

p ro p e rty OnPaint: TNotifyEvent; Apare cnd forma este redesenat.

7. BUTOANE
Butoanele sunt cele mai frecvente componente utilizate ntr-o aplicaie

Windows.
Cel mai simplu tip de buton este TButton. El are o etichet definit de proprietatea Caption. Cele mai multe operaii i aciuni sunt executate la apsarea unui buton. Codul care se execut la apsarea unui buton trebuie scris n interiorul handlerului de evenimente OnClick. TBitBtn este un buton pe suprafaa cruia se poate desena o imagine. Aceasta va fi specificat prin intermediul proprietii Glyph. Butoanele de tip TSpeedButton pot fi grupate n aa fel nct, la un moment dat, mai multe dintre ele s se gseasc n starea apsat. TUpDown este o component alctuit din dou butoane folosite pentru a incrementa i decrementa o valoare numeric. Aceast valoarea poate fi afiat ntr-o cutie de editare ataat controlului prin intermediul proprietii
Associate.

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TButtonControl -> TButton.

Definit n_____________________________________________________
stdctrls.pas

Pagina_______________________________________________________
Standard.

Proprieti___________________________________________________ PI.
Cancel

property Cancel: Boolean;


Indic dac butonul este sau nu de tip Cancel. Dac este un buton Cancel, atunci la apsarea tastei d is c se execut handlerul de eveni 78

mente asociat lui OnClick. Mai multe butoane de pe o aceeai form pot fi n acelai timp butoane Cancel. n acest caz, la apsarea 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 D efault , atunci la fiecare apsare a tastei Enter, se execut handlerul de evenimente asociat lui OnClick. Excepie de la aceasta se face n momentul n care un alt buton are focus (pe el este desenat punctat un dreptunghi), n acest caz executndu-se handlerul asociat butonului selectat. Dar, n cazul n care nici un buton nu este selectat, sau un alt control este activ, la apsarea tastei Enter se execut handlerul de evenimente asociat butonului Default. Cazul cu mai multe butoane D efault este tratat ca i cazul cu mai multe butoane Cancel. P3.
M odalR esult

property ModalResult: TModalResult;


Indic dac i cum nchide butonul forma (modal) printe. Cnd butonul este apsat, proprietatea M odalR esult a formei printe este setat la aceeai valoare ca i proprietatea M odalResult a butonului.

Metode
M l.
Click

procedure Click;
Simuleaz execuia unui click pe care utilizatorul l-ar fi executat. Handlerele asociate cu evenimentul OnClick sunt de asemenea executate.

Exemplu:
Urmtoarea aplicaie folosete un buton TButton i o cutie TColorD ialog. La apsarea 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 F orm l sunt:


procedure TForml.ButtonlClick(Sender: TObject); begin if ColorDialogl.Execute then Forml.Color:=ColorDialogl.Color; end;

7.2. TBitBtn
Este un buton pe suprafaa cruia se poate desena o imagine.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TButtonControl -> TButton -> TBitBtn.

Definit n_____________________________________________________
buttons.pas

Pagina______________________________________________________
Additional.

Proprieti___________________________________________________ PI.
Glyph

property Glyph: TBitmap;


Specific imaginea de pe suprafaa unui buton. Glypli poate conine un bitmap care, la rndul lui, poate conine maxim patru imagini care vor fi puse pe buton n cele patru situaii n care acesta se poate gsi: prima imagine din list se va pune pe buton atunci cnd acesta este neselectat; a doua imagine va li pus pe bulon atunci cnd acesta nu este accesibil utilizatorului; a treia imagine va li pus atunci cnd butonul este apsat; a patra imagine este pus cnd butonul se all n starea apsat, indicnd c respectiva opiune esle nc selectat.

Cele maxim patru imagini pe care le poale conine bitmap-ul ataat lui Glyph sunt de aceeai dimensiune i sunt dispuse pe orizontal n cadrul bitmap-ului respectiv. 80

P2.

NumGlyphs

property NumGlyphs: TNumGlyphs;


Indic numrul de imagini care se gsesc n bitmap-ul proprietii
Glyph.

P3.

Kind

property Kind: TBitBtnKind;


Indic tipul butonului. Valorile pe care le poate lua Kind mpreun cu descrierea, eticheta, M odalResult i descriere imagine sunt urmtoarele:
Valoare Semnificaie Etichet ModalResult Descriere imagine Valoare Semnificaie Etichet ModalResult Descriere imagine Valoare Semnificaie Etichet ModalResult Descriere imagine Valoare Semnificaie Etichet ModalResult Descriere imagine Valoare
b k A b o rt B uton d e tip Cancel. A bort m rA b o rt U n X ro u apare l n g titlu.

bkA ll B uton OK. cu e tic h eta AII. T o a te sch im b rile ap ru te pe fo rm a care c o n in e a ce st buton su n t accep tate, ia r apoi fo rm a este n ch is. AII m rA ll U n sem n dublu de bifare apare lng titlu.

b k C an cel B uton d e tip Cancel. C an cel m rC an cel Un X rou apare lng etichet.

b k C lo se B uton de tip Default. C lose m rC lo se O u de cu lo a re a levnicii cu un sem n verde de ieire d easupra. b k lg n o re

81

Semnificaie Etichet ModalResult Descriere imagine

C re az un b u to n fo lo sit pen tru a ig n o ra sch im b rile i p en tru a co n tin u a cu o aciu n e specificat. Ignore m rlg n o re U n o m c o lo ra t n verde p lecn d.

Valoare

b k H elp B uton cu e tic h c ta H elp. C n d u tilizatorul a p as acest b u to n fiierul h elp ata a t acestei aplicaii devine activ. F iieru l de H elp e ste sp ec ifica t n p ro p rietate a HelpFile a lui TAplication. H elp m rH elp U n sem n de n treb are alb astru ap are l n g titlu. Folosii h an d leru l de ev en im en te al acestui buton p e n tru a apela un fiie r H elp.

Semnificaie

Etichet ModalResult Descriere imagine

Valoare Semnificaie Etichet ModalResult Descriere imagine

b k C u sto m 0 p u tei folosi p e n tru a v cre a p ropriul d u m n e a v o astr b u to n , pe care s sp ecificai o im agine.

Valoare Semnificaie Etichet ModalResult Dcscricre imagine

b kR etry F o rm a nu este n ch is, datele intro d u se de utiliz a to r fiind incorecte. R etry m rR etry O sg eat circ u la r verde.

Valoare Semnificaie Etichet ModalResult Descriere imagine

bkO K B ulon dc lip Default. OK m rO K Un sem n verde dc hilare.

82

Valoare Semnificaie Etichet ModalResult Descriere imagine

bkN o B u to n d e tip Cancel. N ici u n a d in sch im b rile care au in terv en it pe fo rm a care c o n ine a ce st buton nu sunt accep tate, iar fo rm a e ste nchis. No m rN o

Un cerc ro u tiat.

Valoare Semnificaie Etichet ModalResult Descriere imagine

bkY es B uton d e tip Default. Y es m rY es U n sim p lu sem n d e bifare.

Exemplul 1:
S crem o aplicaie cu dou forme. Pe prima form se afl un singur buton (B u tto n l ) la a crui apsare forma Form2 este afiat modal. Dorim s determinm cum a fost nchis forma Form2. Handlerul de evenimente pentru evenimentul OnClick al butonului B uttonl de pe forma F orm l este urmtorul:
procedure TForml.ButtonlClick(Sender: TObject); var a:integer; begin

a ;=Form2.ShowModal; case a of mrOk : ShowMessage('Form2 a fost inchisa prin Ok.1); mrCancel : ShowMessage(1Form2 a fost inchisa prin Cancel.');
end; end;

Pe forma Form2 am aezat dou butoane de tip TButton. La apsarea primului buton (B u tto n l ) forma Form2 va primi valoarea modal mrOk, iar la apsarea lui Button2 va primi valoarea modal m rCancel. Dup atribuirea uneia dintre cele dou valori forma Form2 se va nchide. Handlerele de evenimente pentru forma F orm l sunt:
procedure TForm2.ButtonlClick(Sender; TObject); begin

ModalResult:=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 rnd de cod surs pentru forma Form2. n locul butoanelor Buttonl i Button2 folosim dou butoane de clas TBitBtn la care setm proprietatea Kind astfel:
object BitBtnl: TBitBtn

Kind = bkOK
end object BitBtn2: TBitBtn

Kind = bkCancel
end

P4.

Layout

property Layout: TButtonLayout;


Indic amplasamentul imaginii fa de textul afiat pe buton. Valori posibile pentru Layout sunt:
Valoare
B IG lyphLef BIGlyphRight BlGlypliTop BtGlyphBollimi

Semnificaie
Im a g in e a a p are la stn g a tex tu lu i. Im ag in ea apare la d reap ta textului. Im aginea ap are d easu p ra textului. Im ag in ea ap are su b text.

P5.

Spacing

property Spacing: Integer;


Indic numrului de pixeli dintre textul i imaginea de pe buton. Dac este selectat 0 atunci imaginea ncepe chiar lng text. Dac va fi selectat -1 sau numere mai mici dect -1 atunci imaginea i textul vor fi centrate.

P6.

Margin

property Margin: Integer;


Indic numrului 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 dect I atunci imaginea va li centrat.

Este un buton care introduce proprieti ce permit lucrul n comun a mai multor componente de acest tip.

Ierarhie

_____________ ____________________________________

TO bject -> TPersistent -> TComponent -> TControl -> -> TG raphicControl -> TSpeedButton.

Definit n

_____ _____ ____________________________________

buttons.pas

Pagina
A dditional.

__________________________________________

Proprieti___________________________________________________ PI.
Glyph

property Glyph: TBitmap;


Specific imaginea de pe suprafaa unui buton. Glyph poate conine un bitmap care, la rndul lui, poate conine maxim patru imagini, care vor fi puse pe buton n cele patru situaii n care acesta se poate gsi: prima imagine din list se va pune pe buton atunci cnd acesta este neselectat; a doua imagine va fi pus pe buton atunci cnd acesta nu este accesibil utilizatorului; a treia imagine va fi pus atunci cnd butonul este apsat; a patra imagine este pus cnd butonul se afl n starea apsat, indicnd c respectiva opiune este nc selectat.

Cele maxim patru imagini pe care le poate conine bitmap-ul ataat lui Glyph sunt de aceeai dimensiune i sunt dispuse pe orizontal n cadrul bitmap-ului respectiv.

P2.

NumGlyphs

property NumGlyphs:
Indic numrul de imagini care se gsesc n bitmap-ul proprietii
Glyph.

85

P3.

Layout

property Layout: TButtonLayout;


Indic poziia imaginii fa de textul afiat pe buton. Valori posibile pentru Layout sunt:
Valoare
BIGlyphLeft BIGlyphRight BIGlyphTop BIGlyphBottom

Semnificaie
Im ag in ea ap are la stn g a textului. Im ag in ea ap are la d re a p ta textului. Im ag in ea ap are d e asu p ra tex tu lui. Im a g in e a ap are su b text.

P4.

M argin

property Margin: Integer;


Indic numrului 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 dect -1 atunci imaginea va fi centrat.

P5.

Spacing

property Spacing: Integer;


Indic numrului de pixeli dintre textul i imaginea de pe buton. Dac este selectat 0 atunci imaginea ncepe chiar lng text. Dac va fi selectat -1 sau numere mai mici dect -1 atunci imaginea i textul vor fi centrate.

P6.

G rouplndex

property Grouplndex: Integer;


Permite butoanelor s lucreze mpreun ca un grup. Dac G rouplndex este 0, atunci butonul se comport independent de celelalte butoane. Dac G rouplndex este mai mare dect zero, atunci butoanele vor fi grupate. Apsarea unuia dintre acestea va duce automat la deselectarea (ridicarea) celorlalte din acelai grup. Mai multe informaii gsii la proprietatea AllowAllU p.

P7.

AllowA llU p

property AllowAllUp: Boolean;


Indic dac toate butoanele din acelai grup pot fi neselectate n acelai timp. D ac AllowA llU p este false, atunci, n fiecare moment, cel puin 86

un buton din grup este apsat (jos). Setarea valorii lui A llow A llU p pentru un buton din grup va duce la setarea, cu aceeai valoare, a proprietii AllowA llU p, pentru toate butoanele din grup.

P8.

Down

property Down: Boolean;


Indic dac un buton este jos.

7.4. TUpDown
Este un control ce conine dou sgei 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

__________________________________________

TO bject -> TPersistent ->TC om ponent->T C ontrol-> TW inControl -> -> TCustomUpDown -> TUpDown.

Definit n_____________________________________________________
com ctrls.pas

Pagina_______________________________________________________
Win32

Proprieti___________________________________________________ PI.
AlignButton

property AlignButton: TUDAlignButton;


Determin poziia controlului UpDown fa de controlul cu care este asociat. Valori posibile pentru AlignButton sunt:
udLeft -

udRight -

controlul UpDown se aliniaz la partea din stnga a contro lului asociat lui; controlul UpDown se aliniaz la partea din dreapta a contro lului 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 afia valoarea numeric pe care controlul UpDown o poate modifica (incrementa sau decrementa). De exemplu, pentru a asocia un control UpDown ( U p D o w n l) cu o cutie de editare (E d itl) scriem linia (sau lucrm de la Object Inspector):
U p D ow n -> A ssociate= E ditl;

Astfel, la lansarea n execuie a aplicaiei, n partea dreapt (implicit) a cutiei de editare (E d itl) ne va apare un control de tip U pD own , iar n interiorul cutiei E ditl va apare cifra 0 (implicit) care poate fi mrit sau micorat la fiecare apsare a sgeilor 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 afiat n respectiva cutie de editare, deci din interiorul cutiei poate fi prelucrat prin intermediul proprietii Text a Jui TEdit.

P4.

Increment

property Increment: Integer;


Indic numrul de uniti adugate sau sczute la valoarea lui Position , n urma unei apsri a sgeilor controlului TUpDown. Valoarea implicit este 1.

P5.

M ax

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 r e S e m n ific a ie C o n tro lu l este a lin ia t o rizontal. C o n tro lu l este a m p la sa t v ertical.

UdHorizontal UdVertical

Exemplu:
Urmtorul exemplu folosete o cutie TfileListBox (care listeaz fiierele din directorul curent), o cutie de editare ( Edit2 ) care conine numele fiierului selectat, un control TUpDown i o cutie de editare E d itl (care este ataat controlului TUpDown). Fiierul curent selectat este cel cu numrul de ordine egal cu valoarea proprietii Position, deci la apsarea butoanelor controlului TUpDown se modific fiierul selectat. Totodat utilizatorul poate selecta el nsui un fiier (cu ajutorul mouse-ului) modificnd astfel valoarea lui Position. Valorile proprietilor obiectului U pD ow nl sunt:
object UpDownl: TUpDown Associate = Editl Min = 0 Position = 0 end

Handlerele de evenimente pentru F orm l sunt:


procedure TForml .UpDownlClick(Sender: TObject; Button: TUDBtnType); begin FileListBoxl.Itemlndex:=StrToInt(Editl.Text) ; Edit2.Text:= FileListBoxl.Items.Strings[FilelistBoxl.Itemlndex]; end; procedure TForml.FormCreate(Sender: TObject); begin UpDownl.Max:=FileListBoxl.Items.Count-1;

Edit2. Text:=FileListBoxl.Items.Strings[0]; FileListBoxl.Itemlndex:=0 ;


end; procedure TForml.FileListBoxlClick(Sender: TObject); begin UpDownl.Position:=FileListBoxl.Itemlndex; Edit2.Text:= FileListBoxl.Items.Strings [FileListBoxl .Itemlndex]

89

end; P8.
Wrap

property Wrap: Boolean;


Specific ce se ntmpl 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.

A rrow K eys

property ArrowKeys: Boolean;


Specific dac controlul reacioneaz la comenzile lansate de la sgeile tastaturii. Dac este selectat true, atunci - n cazul n care este asociat cu un alt control (de exemplu cu TEdit ) - controlul rspunde la comenzile sgeilor sus-jos ale tastaturii. Dac este selectat false, atunci asupra controlului se poate aciona doar cu mouse-ul.

90

8. ETICHETE
Sunt componente folosite pentru afiarea unui text pe form. irul afiat este stocat de proprietatea Caption. Etichetele sunt folosite i pentru a indica utilitatea altor componente. Spre exemplu, etichetele se pot amplasa lng (deasupra sau la stnga) compo nentelor TEdit pentru a indica utilizatorului ce trebuie introdus n cutia de editare TEdit. Exist dou tipuri de etichete: TLabel i TStciticText. TLabel deriv din TG rapliicControl deci programatorul are acces la suprafaa de desenare a acesteia. TStaticText deriv din TW inControl i deci are un handle de fereastr.

8.1. TLabel

Este un control fr fereastr folosit pentru a afia text pe o form. Acest text poate fi folosit pentru a eticheta alte componente. Atribuirea unei valori proprietii Caption este echivalentul desenrii unui text pe componenta printe.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TG raphicControl -> TCustomLabel -> TLabel.

Definit n_____________________________________________________
stdctrls.pas

Pagina_______________________________________________________
Standard

Proprieti___________________________________________________ PI.
Alignm ent

property Alignment: T Alignment;

91

Controleaz aliniamentul textului fa de marginile din stnga respectiv dreapta ale etichetei. Valori posibile pentru Alignm ent sunt:
V a lo a r e S e m n ific a ie T e x tu l apare a lin ia t d e -a lungul m arginii stngi a etichetei. T e x tu l ap are alin iat de-a lungul m arginii d re p te a etichetei. T ex tu l apare c en tra t fa de etichet.

taLeftJustify taRiglitJustify taCenter

P2.

AutoSize

property AutoSize: Boolean;


Indic dac dimensiunile etichetei se modific automat, n funcie de dimensiunea textului. Dac AutoSize este false, atunci eticheta are dimensiuni fixe, n caz contrar aceasta se poate acomoda n funcie de nlimea i limea textului.

P3.

FocusControl

property FocusControl: TWinControl;


Indic componenta asociat cu aceast etichet. Dac este specificat un accelerator pentru etichet, atunci, la apsarea lui, controlul FocusControl va primi focus. Un accelerator se specific prin amplasa rea unui ampersand (&) nainte de un caracter din textul ataat 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 afiat


subliniat, iar ampersandul respectiv nu va fi afiat. Pentru a afia un ampersand cnd ShowAccelChar este true, scriei doi ampersanzi unul lng altul (&&). Dac FocusControl are atribuit o valoare, atunci, la apsarea literei subliniate, controlul va fi trecut la FocusControl.

Exemplu:
Urmtoarea aplicaie const dintr-o form pe care sunt amplasate un buton (B u tton l), o cutie de editare (Editl ) i dou etichete ( L a b el!, Label2) folosite pentru a trece focus-ul de la E d itl la B uttonl (cu ajutorul acceleratorului lui L abei!) i invers (cu ajutorul acceleratorului lui Label2). Titlurile etichetelor vor fi L abel1 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 dorete s treac controlul la buton, atunci o simpl apsare 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 totui controlul s fie transferat la buton este necesar apsarea combinaiei de taste Alt+LiteraSubliniat. Dac controlul se afl la buton i se dorete trecerea la cutia de editare, atunci simpla apsare a literei subliniate va produce schimbarea focus-ului.

Valorile proprietilor componentelor L a b ell i Label2 sunt:


object Labell: TLabel

Caption = 'iLabell' FocusControl = Buttonl


end object Label2: TLabel

Caption = 'L&abel2' FocusControl = Editl


end

Observaie:
De obicei, un buton nu are nevoie de o etichet separat, proprietatea Caption fiind propria lui etichet. Dac dorim s executm codul ataat evenimentului unui buton, atunci setm unul dintre caracterele din irul proprietii Caption ca tast de accelerare. La apsarea acelei taste (sau a combinaiei Alt+Tast dac focusul se afl curent ntr-o cutie de editare) se va executa handlerul de evenimente al butonului respectiv. Spre exemplu, considernd valorile proprietilor obiectelor de pe form setate astfel:
object Label2: TLabel

Caption = '&Label2' FocusControl = Editl


end object Buttonl: TButton

Caption = '&Buttonl' OnClick = ButtonlClick


end

iar handlerul evenimentului OnClick al butonului B u tto n l :


procedure TForml.ButtonlClick(Sender: TObject); begin

ShowMessage('Am fost apasat');


end;

atunci la apsarea tastei <b>, respectiv <Alt>+<b>, se va executa hand lerul pentru evenimentul OnClick.

93

P5.

Transparent

property Transparent: Boolean;


Specific dac ceea ce se afl n spatele etichetei poate fi vzut de utili zator 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 aeza o etichet care are proprietatea Transparent setat la valoa rea false.

Exemplu:
Deoarece TLabel deriv din TGraphicControl, nseamn c avem acces la suprafaa ei de desenare (Canvas). Urmtoarea aplicaie deseneaz - la apsarea unui buton - o elips delimitat de marginile etichetei. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Label1: TLabel

Width = 134
end object Buttonl: TButton

Caption = 'Deseneaza!'
end

Handlerele de evenimente ale componentelor de pe forma F orm 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;


end; end;

8.2. TStaticText
Este un control care afieaz un text pe o form. Spre deosebire de
TLabel, componenta TStaticText are propria ei fereastr (adic deriv din TW inControl).

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> -> TW inControl -> TCustomStaticText -> TStaticText.

94

Definit n
stdctrls.pas

Pagina
A dditional

Proprieti___________________________________________________ PI.
Alignm ent

property Alignment: TAlignment;


Controleaz aliniamentul textului fa de marginile din stnga respectiv dreapta ale etichetei. Valori posibile pentru Alignment sunt:
V a lo a r e S e m n ific a ie T ex tu l ap are a lin iat de-a lungul m arginii stngi a etichetei. T ex tu l apare alin iat d e-a lungul m arginii d rep te a etichetei. T extul ap are cen trat fa de etichet.

taLeftJustify taRightJustify taCenter

P2.

AutoSize

property AutoSize: Boolean;


Indic dac dimensiunile etichetei se modific automat, n funcie de dimensiunea textului. Dac AutoSize este false, atunci eticheta are dimensiune fixe, n caz contrar aceasta se poate acomoda n funcie de nlimea i limea textului.

P3.

BorderStyle

property BorderStyle: TStaticBorderStyle;


Indic felul n care apar marginile controlului. Valori posibile pentru
BorderStyle sunt:
V a lo a r e S e m n ific a ie Nu apare nici o m argine. M argine form at d in tr-o sin g u r linie. M arg in e scufundat.

sbsNone sbsSingle sbsSunken

P4.

FocusControl

property FocusControl: TWinControl;


95

Este controlul asociat cu aceast etichet. Dac este specificat un accelerator pentru etichet, atunci, la apsarea lui, controlul FocusControl va primi focus. Un accelerator (sau tast de accelerare) se specific prin amplasarea unui ampersand nainte de un caracter din textul ataat 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 afiat subliniat, iar ampersandul respectiv nu va fi afiat. Pentru a afia un ampersand cnd ShowAccelChar este true, scriei doi ampersanzi unul lng 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 ctre utilizator. Uneori sunt folosite pentru afiarea unui text ce poate fi apoi editat. Cutiile de editare pot fi mprite dup mai multe criterii: a. Dup numrul 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 afiat n cutia de editare folosind proprie tatea 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 poriuni din textul introdus.

9.1. TStrings
Este o clas abstract reprezentnd o list de iruri de caractere. Metodele i proprietile abstracte introduse de TStrings sunt implemen tate n clasa TStringList.

Ierarhie________________________________________________ ______
TO bject -> TPersistent -> TStrings.

Definit n____________________________________________________
classes.p a s

97

Proprieti___________________________________________________
P I.
Count

p ro p e rty Count: Integer; Indic numrul de iruri din list. Este o proprietate abstract care trebuie implementat de ctre clasele derivate. P2.
Strings

p ro p erty Strings[/ndex: Integer]: string;


Strings refer irul cu numrul de ordine Index din list. Primul ir are

indexul 0. P3.
Text

p ro p erty Text: string;


Text este un ir obinut prin concatenarea tuturor irurilor din list. irurile componente sunt delimitate ntre ele prin CR ( C arriage Return) i LF ( Line Feed).

P4.

CommaText

p ro p e rty CommaText: string;


CommaText concateneaz toate irurile n unul singur n format SDF (System D ata Format). n formatul SDF, irurile sunt desprite prin

virgul. Exem plu: Pentru a evidenia diferena dintre proprietile Text i CommaText, vom considera urmtorul exemplu: la apsarea unui buton, vom afia ntr-o cutie de editare coninutul unei componente TMemo folosind, la alegere dintr-un TRadioGroup, aceste dou proprieti. Valorile proprietilor obiectelor de pe form sunt:
object Memol: TMemo Lines.Strings = ( 'Istorie' ' Geografie' ' Limba Romana' 'Informatica 1 'Educaie Fizica') end

98

object Editl: TEdit

Text = 'Editl'
end object BitBtnl: TBitBtn

OnClick = BitBtnlClick
end object RadioGroupl: TRadioGroup

Caption = 'Proprietatea folosita' Items.Strings = ( ' Text'


'CommaText' )

TabOrder = 3
end

Cnd 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,"Educaie Fizica". O bservaie: Spre deosebire de proprietatea Text, proprietatea CommaText separ prin virgula irurile existente, iar dac unul dintre iruri este format din mai mult de un cuvnt (chiar i un cuvnt urmat de caracterul spaiu) l ncadreaz ntre ghilimele. De asemenea, dac n ir sunt coninute 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 spaiu, acesta este ignorat.

Metode
M l.
A dd

function Add(const 5: string): Integer; virtual; Adaug un ir la sfritul listei i ntoarce numrul lui de ordine n aceast list. M 2.
AddStrings

p ro ced u re AddStrings(5wigj: TStrings); virtual; Adaug o mulime de iruri (un alt obiect de tip TStrings) la sfritul listei curente.

99

M 3.

A ppend

pro ced u re Append(const S: string); Adaug un ir la sfritul listei. Aceast metod este asemntoare cu
Add, singura diferen este c Append nu returneaz numrul de ordine

al irului adugat. M 4.
Clear

p ro ced u re Clear; virtual; ab stract; Golete o list cu stringuri. Descendenii lui TStrings trebuie s imple menteze aceast metod pentru a terge irurile din list. M 5.
D elete

p ro ced u re Delete(Index: Integer); virtual; ab stract; terge irul cu numrul de ordine Index din list. M 6.
Equals

function Equals(S'm/ig.v: TStrings): Boolean; Determin dac dou liste de iruri sunt egale. ntoarce tru e dac cele dou sunt identice. ntoarce false n urmtoarele cazuri: M 7. numrul de iruri din liste difer, dou iruri de pe aceeai poziie difer.

Exchange

p ro ced u re Exchang e(Indexl, Index2: Integer); virtual; Schimb ntre ele dou iruri din list. Acestea sunt identificate prin poziiile lor (Indexl i Index2) n cadrul listei de iruri. M 8.
IndexO f

function IndexOf(const S: string): Integer; virtual; Returneaz numrul de ordine al unui ir n cadrul listei. Primul ir din cadrul listei are numrul de ordine 0. Dac irul nu se gsete n list se returneaz valoarea -1.

100

M9.

Insert

p ro ced u re Insert {Index: Integer; const S: string); virtual; ab stract; Insereaz irul S pe poziia Index n cadrul listei. M 10. M ove p ro ced u re M o ve.(CurIndex, N ew lndex: Integer); virtual; Mut stringul de pe poziia Curlndex pe poziia Newlndex. M I I . LoadFrom File p ro ced u re LoadFromFile(const FileName: string); virtual; ncarc o list de iruri cu liniile unui fiier avnd numele FileName. Fiecare linie din fiier va fi un ir din list. M 12. SaveToFile p ro ced u re SaveToFile(const FileN am e : string); virtual; Salveaz irurile dintr-o list ntr-un fiier cu numele FileName. Fiecare string din list va fi pus pe o linie nou n fiier.

9.2. TStringList
Implementeaz metodele i proprietile abstracte ale lui TStrings. Totodat introduce metode i proprieti noi.

Ierarhie
TO bject -> TPersistent -> TStrings -> TStringList.

Definit n_____________________________________________________
classes.pas

Proprieti___________________________________________________
P I.
Sorted

p ro p e rty Sorted: Boolean; Indic dac lista de iruri este sortat automat. Dac Sorted este false, atunci irurile pot fi sortate cresctor folosind metoda Sort. Dac Sorted

101

este tru e atunci metoda Insert i pierde valabilitatea, n acest caz ns putnd fi folosit metoda A dd care adug irul pe poziia corect astfel nct list s rmn tot ordonat.

P2.

D uplicates

p ro p e rty Duplicates: TDuplicates; Specific dac iruri dubluri pot fi adugate la o list sortat. Valori posibile pentru aceast proprietate sunt:
V a lo a r e S e m n ific a ie N u este p e rm is a d u g a re a de d u p lic a te n list. A d u g area n list a unui ir d e ja e x isten t g e n erea z o ex ce p ie de cla s ElslError. S u n t accep tate d u b lu ri de iruri ale listei.

duplgnore dupError dupAccept

Metode______________________________________________________
M l.
Sort

pro ced u re Sort; virtual; Sorteaz irurile dintr-o list care are proprietatea Sorted setat la valoarea false.

9.3. TEdit
Este un control care permite afiarea de text ctre utilizator sau permite preluarea textului pe care utilizatorul l tasteaz.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TCustomEdit -> TEdit.

Definit n_______________________________________________ _
stdctrls.pas

Pagina______________________________________________________
Standard

102

Proprieti
P I.
Auto Select

p ro p e rty AutoSelect: Boolean; Dac A utoSelect este tru e, atunci n momentul n care cutia de editare devine activ, tot textul coninut n ea va fi marcat (selectat), n caz contrar textul nu va fi marcat. P2.
AutoSize

p ro p e rty AutoSize: Boolean; Determin dac nlimea cutiei de editare se acomodeaz cu textul din ea. Dac AutoSize este tru e, dimensiunea cutiei se modific dac apare un eveniment care ar determina-o s fac acest lucru (de exemplu schim barea mrimii fontului). Dac AutoSize este false, atunci nlimea cutiei este fix. De exemplu, dac AutoSize este false, schimbnd mrimea fontului cu care este scris textul din interiorul cutiei (de exemplu la 20), aceasta va arta n felul urmtor:

iar dac AutoSize este tru e, la mrirea fontului cutia s-ar acomoda i ea:

Editl
P3.
CharCase

p ro p e rty AutoSize: Boolean; Determin tipul textului dintr-o cutie de editare. Valori permise pentru
CharCase sunt:
Valoare
ecLowerCa.se ecUpperCase ecNormal

Semnificaie
T e x tu l este co n v ertit au to m at la caractere m ici. T e x tu l este co n v ertit la caractere mari. T ex tu l este m ixt (caractere m ari i m ici).

Dac proprietatea CharCase este setat la ecLowerCase, atunci tentativa de a scrie cu litere mari eueaz, caracterele fiind automat convertite la litere mici.

103

P4.

H ideSelection

p ro p e rty 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

p ro p e rty 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 execuie a aplicaiei care conine cutia de editare cu pricina este mai mare dect M axLength , textul nu va fi trunchiat. Dac ncercai s introducei un text de lungime mai mare dect MaxLength nu vei fi lsat. Folosii aceast facilitate pentru a copia text ntr-un ir de lungime fix. P6.
M odified

p ro p e rty Modified: Boolean; Indic dac textul dintr-o cutie de editare a fost modificat. P7.
Passw ordC har

p ro p e rty PasswordChar: Char; Indic caracterul care va fi folosit pentru a fi afiat n locul altor carac tere. Dac Passw ordC har conine caracterul vid, atunci va fi afiat textul normal, n caz contrar fiecare caracter va fi nlocuit cu caracterul din P asssw ordC har. Aceast facilitate este folosit pentru ca un anumit text (parola) s nu fie vzut i de alte persoane. Textul tastat poate fi mani pulat, bineneles, cu proprietatea Text. E xem plu: Urmtoarea aplicaie const dintr-o cutie de editare (E d itl) n care utilizatorul trebuie s introduc o parol. Pentru ca textul introdus s nu fie descifrabil setm proprietatea Passw ordChar a lui E d itl la valoarea La apsarea lui Buttonl se face validarea parolei.

104

Obiectele de pe forma F orm l au setate urmtoarele proprieti:


object Editl: TEdit

PasswordChar = '* '


end object Buttonl: TButton Default = True

OnClick = ButtonlClick
end

Handlerele de evenimente pentru F orm 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 execuie a aplicaiei controlul este trecut la cutia de editare E ditl n care trebuie introdus parola. P8.
ReadO nly

p ro p e rty ReadOnly: Boolean; Specific dac utilizatorul poate modifica textul dintr-o cutie de editare. Dac ReadO nly este true, atunci utilizatorul poate doar citi acel text, far a-1 putea modifica. P9.
SelLength

p ro p e rty SelLength: Integer; Indic numrul de caractere care vor fi marcate (selectate), ncepnd cu poziia SelStart. Dac SelLength + SelStart depete numrul de caractere existente, atunci vor fi marcate toate pn la sfritul textului. P10.
SelStart

p ro p e rty SelStart: Integer; Indic poziia primului caracter ce va fi marcat. Primul caracter din text are poziia 0. Dac nu se atribuie lui SelLength o valoare, atunci SelStart va conine poziia cursorului.

105

P il.

SelText

p ro p e rty SelText: string;


SelText indic textul marcat. Citii aceast valoare pentru a afla textul marcat sau setai aceast valoare pentru ca textul marcat s fie nlocuit cu noul text.

E xem plu: Urmtorul program folosete dou cutii de editare (E d itl i Edit2) i un buton (B uttonl). La apsarea 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 proprietilor obiectelor de pe F orm l sunt urmtoarele:
object Editl: TEdit

Text = 'Editl'
end object Edit2: TEdit

Text = 'Edit2'
end object Buttonl: TButton

Caption = 'Muta text selectat' OnClick = ButtonlClick


end

Handlerele de evenimente pentru obiectele de pe forma F orm l sunt:


procedure TForml. FormActivate(Sender: TObject); begin II se videaz prim a cutie de editare Edi tl.Clear;

Edit2 .Clear; Editl.SetFocus;


end;

/ se videaz a doua cutie de editare /


IIprim a cutie devine activa

procedure TForml.ButtonlClick(Sender: TObject); begin Editl.SelStart:=(Length(Editl.Text)) div 2;


// se poziioneaz cursorul Ia jum atatea II textului din prim a cutie de editare

Editl.Se1Length:=Length(Editl.Text) ;
// se selecteaz a doua jum atate a textului

Edit2 .Text:=edi tl .s . text ; el


II se copiaz textul selectat in a doua cutie de editare

Editl.SelText:='';
II din prim a cutie de editare se terge a II doua jum atate a textului

end;

106

Metode
M l.
C lear

p ro c e d u re Clear; virtual; terge tot textul din cutia de editare. M 2.


ClearSelection

p ro c e d u re ClearSelection; terge tot textul marcat din cutia de editare. M 3.


CopyT oC lipboard

p ro c e d u re CopyToClipboard; Copiaz textul marcat n ClipBoard. M 4.


CutToC lipboard

p ro ced u re CutToClipboard; Copiaz textul marcat n ClipBoard, iar apoi l terge din cutia de editare. M 5.
PasteF rom C lipboard

p ro ced u re PasteFromClipboard; nlocuiete textul marcat cu textul din ClipBoard. Dac nu exist text marcat, atunci textul din ClipBoard este inserat la poziia actual a cursorului. Dac n ClipB oard nu exist nimic, atunci P asteF rom C lipboard nu face nimic. E xem plu: Urmtorul exemplu execut aceeai operaie ca i precedentul, dar de data aceasta transferul textului de la o cutie de editare la alta se face prin intermediul Clipboard- ului:
p ro c e d u re b e g in

TForml.ButtonlClick(Sender: TObject);

Editl.SelStart:=Length(Editl.Text) d i v 2; IIselecia incepe de la

IIjuniatatea irului
Editl.SelLength:=Length ( Editl. Text); Editl .CutToClipboard; Edit2.Clear; Edit2 .PasteFromClipboard; / se selecteaz textul pana la sfarsit /
IIs e muta textul selectat in ClipBoard

/ se muta textul din ClipBoard in Edit2 /

107

end;
jTTll

procedure T c F? begin

'''ormActivate (Sender: TObject);

E d i t l .Cle&{', Edit2 .Clea/^us. E d i t l . SetFt? end;

M 8.

S e le c t^

p r o c e d H c tA l l ; S e le c te d Marcheaz) tot textul dintr-o cutie de editare. E x em p lu : S con^c-J1 o aplicaie care conine un buton ( B u tto n l ) i o cutie de ' editare^ fiecare avnd un Help Hint. Dac dorim s atribuim cte un H elf componentelor E d itl i B uttonl atunci trebuie s setm valorile ^oarelor proprieti:
obiect i TEdit Hint # introducei un text Text ^itl'
end 0u k

object ^ , nl: TButton Hint, pasai ' 0n Capt^ " 'Buttonl'


end

M 9.

Undo

proced(,r ^ndo; Reface ^ O c rile stocate n buferul Undo. M 10. C l e a r l f l<l proced1 ^-learUndo; * terge ^ 6fl)l Undo. Apelarea metodei Undo nu mai are nici un efect. E xem plu: U r m t / ^ aplicaie implementeaz lucrul cu metodele Undo i Clearl}1 forma aplicaiei exist o cutie de editare (E d itl) i dou butoan^ i Buttonl). La apsarea butonului Buttonl sunt ref cute * crile asupra textului din cutia de editare E d itl. La apsarea

108

butonului Button2 este ters buferul Undo. n componenta StatusB arl sunt afiate strile buferului Undo.
object Editl: TEdit Text = 'Editl' OnChange = EditlChange end object Buttonl: TButton

Caption = 'Undo' Enabled = False OnClick = ButtonlClick


end object StatusBarl: TStatusBar

Panels = o SimplePanel = True


end object Button2: TButton

Caption = 'Clear Undo Buffer' Enabled = False OnClick = Button2Click


end

Handlerele de evenimente pentru obiectele de pe forma F orm l sunt:


var

NrSchimbari : integer;
procedure TForml.EditlChange(Sender: TObject); begin inc (NrSchimbari ); //incrementez numrul schimbrilor din Editl / / si care sunt retinute in buferul Undo

StatusBarl.SimpleText := IntToStr(NrSchimbari) + ' Schimbri1;


/ / afiez acest numr

Buttonl.Enabled := Editl.CanUndo;
/ / butonul de Undo devine disponibil pentru apasare

Button2.Enabled := Editl.CanUndo; / cel puin o modificare a avut loc, deci se poate terge buferul Undo /
end; procedure TForml.ButtonlClick(Sender: TObject); begin Edi 11. Undo; / anuleaza toate modificrile din buferul Undo / Edi 11. C1earUndo; / si terg continutul buferului Undo /

NrSchimbari := 0; StatusBarl.SimpleText := IntToStr(NrSchimbari)+ ' Schimbri' ; 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)+ ' Schimbri'; 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

p ro p e rty OnChange: TNotifyEvent; Apare cnd textul din cutia de editare se schimb.
Lab ei

9.4. TLabeledEdit

Reprezint o cutie de editare care are asociat o etichet.

Ierarhie_________________________________________________ ____
T O bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomEdit -> TCustomLabeledEdit->TLabeledEdit.

Definit n________________________________________________ _
ExtCtrls.pas

Pagina______________________________________________________
Additional.

M area majoritate a proprietilor sunt comune cu ale componentelor


TEdit i TLabel. Cteva proprieti specifice doar componentei TLabeledEdit

sunt descrise n continuare.

Proprieti_______________________________________________ __ PI.
EditLabel

p ro p e rty EditLabel: TBoundLabel; Este folosit pentru a specifica proprietile etichetei care este asociat

110

unei cutii de editare etichetate. Proprieti referitoare Ia titlul care apare n etichet, la poziia titlului n etichet, la fontul utilizat, etc., pot fi setate din O b ject Inspector. P2.
LabelPosition

p ro p e rty LabelPosition: TLabelPosition; Specific poziia etichetei relativ la cutia de editare pentru o cutie de editare etichetat. Sunt posibile urmtoarele valori:
V a lo a r e S e m n ific a ie E tich e ta v a fi p o z iio n a t d e asu p ra cu tiei de editare. E tich e ta v a fi p o z iio n a t sub cu tia de editare. E tich e ta v a fi p o z iio n a t n stn g a cu tiei de editare. E tich e ta v a fi p o z iio n a t n d reap ta cutiei de editare.

IpAbove IpBelow IpLeft IpRight

P3.

LabelSpacing

p ro p e rty LabelSpacing: Integer; Indic distana n pixeli ntre etichet i cutia de editare. Exem plu: S se scrie un program pentru rezolvarea ecuaiei de gradul doi. aceasta vom folosi trei cutii de editare: L a b eled E d itl , LabeledEdit2, LabeledEdit3 n care vom introduce coeficientul lui x2, coeficientul lui x i coeficientul termenului liber. Pentru afiarea soluiilor ecuaiei folosim o component L istB oxl. Mai folosim un buton Button1 la apsarea cruia se va afia rezultatul. Dac ecuaia nu are soluii reale se va afia un mesaj corespunztor. Vom folosi o etichet Soluia deasupra componentei ListB oxl pentru a indica faptul c n acea cutie va fi afiat soluia. Proprietile obiectelor de pe forma F orm l sunt:
object Label1: TLabel

Pentru

Caption = 'SOLUIA'
end object LabeledEditl: TLabeledEdit

EditLabel. Caption = 'Coeficientul lui x patrat'


end object LabeledEdit2: TLabeledEdit

EditLabel.Caption = 'Coeficientul lui x'


end

UI

object LabeledEdit3: TLabeledEdit

EditLabel.Caption = 'Coeficientul termenului liber'


end object ListBoxl: TListBox end object Buttonl: TButton

Caption = 'Afiseaza1 OnClick = ButtonlClick


end

Handlerele de evenimente ale obiectelor de forma F orm 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 citii:


a - coeficientul lui x 2, 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 < 0 then ShowMessage('Ecuaia nu are rdcini 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 vali deaz textul introdus de ctre utilizator.

Ierarhie___________________________________ __________________
TO bject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCtistomMaskEdit -> TMaskEdit.

Definit n
mask.pas

112

Pagina
A dditional

Proprieti PI.

______________________________

Edit Mask

p ro p e rty 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 restriciona 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 (cmpuri) separate prin "(;)". Prima parte reprezint masca nsi. A doua parte este un caracter care specific dac literalii unei mti sunt salvai 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 Semnificaie
D a c a ce st c arac te r apare n m asc atu n ci caracterele o p io n a le sunt re p re sen ta te n p ro p rietate a EditText c a i spaii la ncep u tu l secvenei carac te re lo r o p io n ale. D ac acest c aracter nu apare n m a sc atunci c aracterele o p io n a le su n t rep rezen tate ca i spaii la sfritul secvenei carac te re lo r opionale. D ac a ce st c arac te r apare in tr-o m asc, atunci toate c aracterele care u rm e a z (p n n m o m en tu l n care apare caracterul < ) treb u ie s ie litere m ari. D a c a ce st c arac te r apare n tr-o m asc, atunci toate caracterele care u rm eaz (p n n m o m en tu l n care ap are caracterul <) tre b u ie s fie litere m ici. D a c aceste d o u caractere a p ar m p reu n , atunci textul v a f reprezentat a a cu m l in tro d u ce u tilizato ru l (cu litere m ari i m ici) C arac te ru l care u rm eaz acestui c arac te r este un literal. A c est caracter este fo lo sit p en tru a se p u tea utiliza o ricare din carac te re le sp eciale ale m tii. D a c a ce st c aracter apare n tr-o m asc, atunci utilizatorul treb u ie s in tro d u c (pe p o z iia resp ectiv ) o liter:A -Z , a-z. D a c a cest c arac te r apare n tr-o m asc, a tunci u tilizatorul poate s in tro d u c (pe p o z iia resp ectiv ) o liter:A -Z , a-z. N u este n ecesar in tro d u ce re a literei. D a c a ce st c arac te r apare n tr-o m asc, atunci utilizatorul tre b u ie s in tro d u c (pe p o z iia resp ectiv ) un carac te r a lp h a -n u m e ric adic o liter:

>

<

113

C a ra c te r A -Z , a-z, sau o c ifr 0-9.

S e m n ific a ie

D a c acest c aracter apare n tr-o m asc, atunci utilizatorul po ate s in tro d u c (pe p o z iia resp ectiv ) un c aracter a lp h a-n u m eric a d ic o liter: A -Z , a-z, sau o c ifr 0-9. N u este n e ce sar in tro d u ce re a caracterului. U tilizato ru l treb u ie s in tro d u c un c arac te r a rb itrar p e a ceast poziie. U tilizato ru l p oate s in tro d u c un c aracter a rb itrar pe aceast poziie. N u e ste n e ce sar in tro d u cerea caracterului. U tilizato ru l tre b u ie s in tro d u c o cifr pe p o z iia respectiv. U tilizato ru l p o a te s in tro d u c o c ifr pe p o z iia respectiv. N u este n e ap ra t n e ce sar in tro d u cerea cifrei. U tilizato ru l p o ate s in tro d u c pe p o z iia re sp ec tiv o cifr sau sem nele + sau -. N u este n e ap ra t n e ce sar in tro ducerea lor. E ste fo lo sit pen tru a sep ara zilele lunile i anii. E ste fo lo sit p en tru a sep ara orele, m in utele i secundele. E ste fo lo sit p e n tru a sep ara cele trei cm puri ale unei m ti.

C c 0 9

# /

A c est c arac te r in sereaz au to m at spaii n tr-u n text. C nd u tilizatorul in tro d u ce caractere, c u rso ru l trece au to m at p este c arac te ru l _.

Caracterele care nu apar mai sus sunt literale i ele sunt inserate auto mat, cursorul trecnd peste ele n momentul editrii. Caracterele care sunt folosite de o masc pot s apar i ele ca i literali, dar cu condiia s fie precedate de caracterul Exemple:
M asca !\00009 0 0 0 0 0 9 9 ; 1;_ 190/90/00; 1;_ !9 0 :0 0 :0 0 > L L ;1 ;_ > A A A a ;l;_ 10000-190-90; 1;_ !99 > L < L L \1 \9 0 0 ;1 ;_ E x e m p lu 04 5 4 3 5 3 4 5 5 4 2 2 7/0 1 /9 7 0 9 :3 4 :2 3 P M 1P2a 1997-11-06 13 lan 1997

P2.

EditText

p ro p e rty EditText: string; Indic textul care apare n fereastra cutiei de editare cu masc.

114

P3.

IsM asked

p ro p e rty 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

p ro cedu re ValidateEdit; virtual; Determin dac textul curent introdus este n conformitate cu regulile din EditMask.

Evenimente__________________________________________________
E l.
OnChange

p ro p erty OnChange: TNotifyEvent; Apare cnd coninutul 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.
Alignm ent

p ro p e rty Alignment: TAlignment; Specific aliniamentul textului n cadrul cutiei. Valori posibile pentru
Alignm ent sunt:
V a lo a r e S e m n ific a ie Textili este alin iat n p artea stn g a cutiei T extul este a lin ia t c en tra t fa d e m arg in ile din stn g a i d re a p ta ale cutiei. T e x tu l este alin iat n p a rte a d re a p t a cutiei.

taLeftJustify taCenter laRightJuslify

P2.

Lines

p ro p e rty Lines: TStrings;


Lines conine textul din cutie, sub forma unei liste de stringuri.

P3.

Scollbars

p ro p e rty ScroIIBars: TScroIIStyle; Indic dac controlul are scrollbar-uri. Valori posibile pentru Scrollbars sunt:
V a lo a r e S e m n ific a ie C o n tro lu l nu are nici un scro llb ar C o n tro lu l are un sin g u r scro llb ar la m a rg in e a inferioar a cutiei. A cesta v a p erm ite d e fila re a o riz o n ta l a textului (n cazul n care l lim c a sa este mai m are d ect a cutiei). C o n tro lu l are un sin g u r scro llb a r la p a rte a d re a p t a cutiei. A c esta va p e rm ite d e fila re a p e v ertical a textului din cutie (n cazul n care ex ist mai m ulte linii d ect p o t li afiate od at n cutie). C o n tro lu l arc d o u scro llb ar-u ri (orizontal i v ertical).

s.sNone ssH orizontal

ss Vertical ssBoth

Exem plu: Urmtorul exemplu folosete o cutie de editare muli linie (M em o!) i o component TListBox n care, pentru fiecare linie n parte, se va afia numrul de caractere din ea la apsarea 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])) ));

end;
procedure TForml.FormActivate(Sender: TObject); begin Memol.Clear; ListBoxl.Clear; Memol.ScrollBars:=ssBoth; end;

P4.

WantReturns

p ro p e rty WantReturns: Boolean; Indic dac utilizatorul mai poate introduce caracterul sfrit de linie prin apsarea tastei <Enter>. Dac WantReturns este false, atunci utilizatorul nu mai poate introduce sfrit de linie tastnd <Enter>,. ci tastnd Ctrl+Enter, iar apsarea tastei <Enter> este tratat ca un eveniment pentru form.

Exemplu:
Urmtoarea aplicaie const dintr-o form pe care se afl o cutie de editare simpl {E d itl), o cutie de editare multi-linie (M em o l) i un buton (B uttonl) de tip Default. Utilizatorul introduce text n cutia M e m o l, iar la apsarea tastei <Enter> prima linie a acestui text va fi copiat n
E d itl.

Valorile proprietilor obiectelor de pe forma F orm l sunt:


object Buttonl: TButton Default = True end object Memol: TMemo WantReturns = False

ScrollBars = ssBoth
end object Editl: TEdit Text = 'Editl' end

I Iandlerele de evenimente pentru forma F orm l sunt:


procedure TForml.ButtonlClick(Sender: TObject); var i :integer; begin Editl.Text:=Memol.Lines.Strings[0]; end;

117

procedure TForml.FormActivate(Sender: TObject); begin


Memol.Clear; Editl.Clear; Memol.ScrollBars:=ssBoth; Memol.SetFocus;

end;

P5.

WantTabs

p ro p e rty WantTabs: Boolean; Indic dac utilizatorul poate insera tab-uri n text. Dac WantTabs este false, atunci la apsarea tastei Tab, controlul este trecut la alt compo nent de pe form.

P6.

WordWrap

p ro p e rty WordWrap: Boolean; Specific dac textul care atinge marginea din dreapta a cutiei este rupt pentru a fi trecut la linia urmtoare. Procedeul de rupere a rndurilor const n introducerea unor soft carriage returns", care nu modific numrul de caractere de sfrit de linie reale (introduse de utilizator). Dac W ordW rap este tru e, atunci irurile de caractere mai lungi dect limea cutiei vor fi rupte la partea dreapt i trecute pe rndul urmtor. Dac cutia are scrollbar orizontal, aceast rupere nu se va mai produce.

Evenimente
E l.
OnChange

p ro p e rty OnChange: TNotifyEvent; Apare cnd textul din cutia de editare multilinie se schimb.

9.7. TRichEdit

Este un control care afieaz un text, n format rich text, pe o form.

Ierarhie

____________________________________________

TO bject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomMemo -> TCustomRichEdit -> -> TRichEdit. 118

Definit n
com ctrls.pas

Pagina
Win32

_____________________________________________

Proprieti___________________________________________
P I.
HideScrollBars

p ro p e rty HideScrollBars; Nu mai afieaz scrollbar-ul atunci cnd nu este nevoie de el (deci textul ncape ntr-o pagin). P2.
Lines

p ro p e rty Lines: TStrings; Conine liniile unei cutii cu text rtf. P3.
Paragraph

p ro p e rty Paragraph: TParaAttributes; Specific atributele pentru paragraful curent. Paragraful curent este acela care conine textul selectat. Dac nu exist text selectat, atunci para graful curent este acela care conine cursorul. P4.
SelAttributes

p ro p e rty SelAttributes: TTextAttributes; Specific atributele textului selectat. Tipul TTextAttributes este definit mai jos.

Metode______________________________________________________
M 1.
FindText

function FindText(const SearchStr: string; StartPos, Length'. Integer; Options: TSearchTypes): Integer; Caut textul SearchStr n subsecvena de lungime Length i care ncepe cu litera StartPos.
119

Se poate face o cutare mai special folosind O ptions , care este o varia bil de tip mulime, deci poate conine o submulime de valori din urm toarele posibile: stW holeW ord, stM atchCase. M 2.
Print

p ro ced u re Print(const Caption: string); virtual; Formateaz i tiprete coninutul unei cutii RichEdit.

Evenimente
E l.
O nSelectionChange

p ro p e rty OnSelectionChange: TNotifyEvent; Apare cnd o alt poriune de text este selectat. E2.
O nProtectChange

p ro p e rty OnProtectChange: TRichEditProtectChange; Apare cnd utilizatorul ncearc s modifice un text protejat. Tipul TRichEditProtectChange este definit astfel: type TRichEditProtectChange = procedure(Sen</er: TObject; StartPos, EndPos: Integer; v a r AllowChange: Boolean) of object;
StartPos i EndPos indic poriunea de text care va fi supus modifi crii. AllowC hange indic dac este permis sau nu efectuarea de modi ficri 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
T O bject -> TPersistent -> 77 'extAttributes.

Definit n
com ctrls.pas

Proprieti P I.
C olor

_________________________________________________

property Color: TColor;


Specific culoarea textului.

P2.

P rotected

property Protected: Boolean;


Indic dac textul reprezentat de TTextA ttributes este sau nu protejat mpotriva modificrilor. n caz afirmativ, dac utilizatorul ncearc s l modifice va fi apelat evenimentul OnProtectChange care poate dezafec ta protecia. Dac acest handler de eveniment nu exist, textul respectiv este de tip read-only.

P3.

Size

property Size: Integer;


Specific nlimea fontului n numr de puncte.

P4.

Height

property Height: Integer;


Specific nlimea fontului n numr de pixeli. Relaia dintre Size i
H eight este urmtoarea:
Height := Size * ScreenPixelsPerlnch / 72.

P5.

Style

property Style: TFontStyles;


Specific modul n care sunt desenate caracterele fontului. Style este o variabil de tip mulime, deci are ca valoare o submulime din urmtoa rele elemente:
Valoare
fslio ld J'sHaUc
T e x t ngroat. T e x t nclinat.

Semnificaie

121

V a lo a r e

S e m n ific a ie T e x l subliniat. T e x t t ia t cu o linie o riz o n ta l pe la ju m ta te .

fsU nderline fsStrikeout

P6.

Pitch

p ro p e rty Pitch: TFontPitch; Indic dac toate caracterele fontului au aceeai lime. Valorile permise pentru Pitch sunt:
V a lo a r e S e m n ific a ie T o a te caracterele au aceeai lim e. A cest lucru este folosit la coduri surs. C arac te re le au lim e v ariabil. A c est lucru e ste util la e ditare de texte. L im e a carac te re lo r d ep in d e de font.

fp Fixed f p Variable fp D efa u lt

P7.

ConsistentAttributes

p ro p e rty ConsistentAttributes: TConsistentAttributes; Indic care dintre proprietile obiectului TTextAttributes sunt valabile pentru textul curent selectat. Tipul TConsistentAttributes este definit astfel: type TConsistentAttribute = (caBold, caColor, caFace, caltalic, caSize, caStrikeout, caUnderline, caProtected); TConsistentAttributes = set of TConsistentAttribute;
ConsistentAtributes poate avea ca valori o submulime din mulimea celor enumerate mai jos:
V a lo a r e S e m n ific a ie Toate c aracterele su n t fie n g ro a te fie nengroate. T o ate c aracterele au aceeai culoare. T ip u l c aracterelo r este acelai p entru n treg textul. T o a te carac te re le su n t fie italice fie n e italice. T o ate caracterele au aceeai m rim e. 'Toate c aracterele su n t fie tiate fie netiate. C arac te re le su n i fie lo ale su b lin iate, fie to ate n esubliniate. T e x tu l e ste p ro tejat sau n eprotejet.

caBold caC olor caFace caltalic caSize caStrikeout caUnderline caProtected

122

E xem plul 1: Urmtorul exemplu preia un fiier pas, care conine un program T u rb o Pascal, i boldeaz toate cuvintele rezervate. Pe form se afl o cutie RichEdit, dou cutii de dialog (O penD ialogI i S a veD ia lo g l), trei butoane: B uttonl pentru deschis un fiier cu extensia pas de pe disc, Button2 pentru salvarea fiierului cu extensia r tf curent pe disc, i Button3 la a crui apsare se vor bolda toate cuvintele rezervate. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Buttonl: TButton
Caption = 'Open' OnClick = ButtonlClick

end object Button2: TButton


Caption = 'Save' OnClick = Button2Click

end object Button3: TButton


Caption = Boldeaza' OnClick = Button3Click

end object RichEditl: TRichEdit


Lines.Strings = ( ' RichEditl' ) ScrollBars = ssBoth

end object OpenDialogI: TOpenDialog


Filter = 'Programe Pascal|* .pas'

end object SaveDialogl: TSaveDialog


Filter = ' RichTextFormat|*.rtf'

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


const
rezervate : array[1..49] of string = ('program','uses','type','var' , 'if',then','else','for','d o ' , 'to','while','repeat','until' , 'begin','end','case','of','with', 'set','array','record','asm','and' , 'o r ' 1 , not' ' , or1, 'const' ' , constructor' , ' destructor','div','downto','file','function' , 'goto','implementation','in','inline', 1interface, 'label' 'mod', ' , nil' ' , object' , ' packed','procedure','shl','shr','string' , 'unit','with');

procedure TForml.ButtonlClick(Sender: TObject); begin if OpenDialogI.Execute 123

then RichEditl.Lines.LoadFromFile(OpenDialogl.FileName); end; procedure TForml.Button2Click(Sender: TObject); begin if SaveDialogl.Execute then RichEditl.Lines.SaveToFile(SaveDialogl.FileName); end; procedure TForml.Button3Click(Sender: TObject); var

poz, LungText : integer; i : byte;


begin
//lungim ea textului in care fa c cautarea

LungText:=length(RichEditl.Lines.Text); for i := 1 to 49 do
/ / pentru fiecare cuvnt rezervat
/ / il caut in tot textul

begin poz 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 b o ld
// apoi c o n tin u i cau tarea m ai d e p arte in text

poz := RichEditl.FindText( rezervate[i], poz+1,LungText-poz,[stWholeWord]) ;


end; end; end;

E xem plul 2: Urmtoarea aplicaie afieaz proprietile seleciei curente de text dintro cutie de editare TRichEdit. Sunt folosite trei butoane de tip TSpeedButton pentru a afia care sunt caracteristicile textului selectat. Sunt cutate proprietile Bold, Italic i Underline. Butoanele corespun ztoare proprietilor textului selectat vor fi n starea apsat. Valorile proprietilor obiectelor de pe forma Form l 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]

end object SpeedButton3: TSpeedButton AllowAllUp = True


Grouplndex = 3 Caption = ' U' Font.Style = [fsUnderline]

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.RichEditlSelectionChange(Sender: TObject); begin with RichEditl.SelAttributes do begin if fsBold in Style then if caBold in ConsistentAttributes then SpeedButtonl.Down := true else SpeedButtonl.Down := false else SpeedButtonl.Down := false; if fsltalic in Style then if caltalic in ConsistentAttributes then SpeedButton2.Down := true else SpeedButton2.Down := false else SpeedButton2.Down := false; if fsUnderline in Style then 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.

Proprieti______________________________________________
1*1.
Alignment

property Alignment: TAlignment;


Indic felul n care se aliniaz textul n cadrul paginii.

125

Valoare
taLeftJustify taCenter taRightJustify

Semnificaie
T e x tu l este a lin ia t la stn g a parag rafu lui. T e x tu l este centrat. T e x tu l este a lin ia t la d re a p ta parag rafului.

P3.

Leftlndent

property Leftlndent: Longint;


Indic distana n pixeli a paragrafului fa de marginea din stnga a paginii.

P4.

Rightlndent

property Rightlndent: Longint;


Indic distana n pixeli a paragrafului fa de marginea din dreapta a paginii.

Exemplu:
Urmtoarea aplicaie 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 valo rile pentru marginile din stnga, respectiv dreapta ale paragrafului cu rent. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Buttonl: TButton
Caption = 1Seteaza Paragraf'

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


uses unit2; procedure TForml.ButtonlClick(Sender: TObject); begin
// setez v alo rile c u tiilo r d e e d ita re E d itl si E d it2 la ti v alo rile c u re n te ale p ro p rietilo r L e ftln d en t si R ig h tln d en t

Form2.Editl.Text := IntToStr(RichEditl.Paragraph.Leftlndent); Form2.Edit2.Text := IntToStr(RichEditl.Paragraph. Rightlndent);


// afiez fo rm a F o rm 2 m odala

if Form2.ShowModal = mrOk then begin


// d a c a s-a a p asa t b u to n u l O k fo rm atez p arag rafu l c o re sp u n z to r

RichEditl.Paragraph.Leftlndent := StrToInt(Form2.Editl.Text); RichEditl.Paragraph.Rightlndent :=

126

StrToInt(Form2.Edit2.Text ) ;

end;
end;

Valorile proprietilor obiectelor de pe forma Form2 sunt:


object Labell: TLabel
Caption = 'Marginea stanga'

end object Label2: TLabel


Caption = 'Marginea dreapta'

end object Editl: TEdit


Text = '0'

end object Edit2: TEdit


Text = '0'

end object BitBtnl: TBitBtn


Kind = bkOK

end object BitBtn2: TBitBtn


Kind = bkCancel

end

1*5.

Firstlndent

p ro p e rty Firstlndent: Longint; Specific distana n pixeli a primei linii a paragrafului fa de marginea din stnga a paginii. Aceast distan este relativ la valoarea proprietii
Left Indent.

1*6.

Numbering

p ro p e rty Numbering: TNumberingStyle; Valori posibile pentru Numbering sunt:


V a lo a r e S e m n ific a ie N ici o n u m ero tare nu ex ist la stnga. in faa fiecrui p a ra g ra f este d e se n a t o b il de culoare neagr.

nsNone nsBullct

Kxcmplu: Urmtoarea aplicaie seteaz i afieaz numerotarea paragrafului curent din cutia de editare R ich E 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 F orm l sunt:


procedure TForml.RichEditlSelectionChange(Sender: TObject); begin
/ a i e s a e paragrafului / fz tra CheckBoxl.Checked := RichEditl.Paragraph.Numbering = nsBullet

end; procedure TForml.CheckBoxlClick(Sender: TObject); begin


II s t z s a e paragrafului ee tra

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 opiuni care se exclud reciproc. Butoanele radio pot fi grupate n mai multe moduri. Cele mai utilizate posibiliti 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 gruprii folosind componenta TRadioGroup itemurile sunt doar grafic desenate ca butoane radio, n realitate ele fiind iruri de caractere. Acce sarea unui item particular dintr-o component TRadioGroup se face folosind proprietatea Items.

10.1. TRadioButton

I e r a r h i e ____________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TButtonControl -> TRadioControl.

Definit n
stdctrls.pas

Pagina______________________________________________________
Standard

Proprieti___________________________________________________
P I.
Alignm ent

p ro p erty Alignment: TLeftRight; Determin poziia textului ataat butonului fa de acesta. Posibile valori pentru Alignm ent sunt:

129

V a lo a r e

S e m n ific a ie T ex tu l apare n p a rte a stn g a butonului. T ex tu l ap are n p artea d re a p t a butonului.

laLefJtustify taRightJustify

P2.

Checked

p ro p e rty Checked: Boolean; Determin dac un buton proprietatea Checked sunt:


V a lo a r e tru e

este

selectat.

Valori

posibile

pentru

S e m n ific a ie U n d isc neg ru apare n interiorul buto n u lu i, indicnd faptul c acesta a fo st selectat. N ici un disc negru nu apare n in teriorul b utonului, deci acesta n u este selectat.

fa ls e

Un singur buton de radio neselectat ( Checked este false) poate fi selectat (Checked s devin tru e) la executarea unui click pe el. Un buton de radio selectat (Checked este tru e) 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 funcioneaz mpreun. Pentru a aduga butoane la TRadioGroup folosii proprietatea Items. Prin intermediul acesteia se specific textul ataat fiecrui buton de radio. Contrar unei impresii de moment, proprietatea Items nu pointeaz spre elemente de tip TRadioButton. Elementele ei nu sunt dect nite simple iruri de caractere ce identific eticheta ataat fiecrui buton radio. Cu ajutorul proprietii 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 TRadioG roup ; ntr-un TGroupBox\ ntr-un TScrollBox ; ntr-un TPanel. Mai multe butoane aflate n acelai grup nu pot avea statutul de activ (un punct negru apare n mijlocul butonului respectiv) n acelai timp. Doar unul
130

,t

ft ?fHifH**********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 acelai timp n starea setat, dac fac parte din grupuri diferite.

Ierarhie_________ ________________ ___________________________


TO bject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGroupBox -> -> TCustomRadioGroup -> TRadioGroup.

Definit n_____________________________________________________
stdctrls.pas

Pagina
Standard

Proprietti
1*1.
Columns

property Columns: Integer


Specific numrul de coloane pe care sunt aezate 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 numrul de ordine al itemului (butonului radio) selectat. Primul buton are numrul de ordine 0. Dac nici un buton nu este selectat, atunci Itemlndex are valoarea -1.

P3.

Items

property Items: TStrings


n Items este reinut lista butoanelor de radio din TRadioGroup. Prelu crarea butoanelor nseamn de fapt prelucrarea unei componente
TStrings.

E xem plul 1: Urmtoarea aplicaie conine un TRadioGroup cu trei butoane radio care au fost inserate cu ajutorul proprietii Items la momentul proiectrii aplicaiei. Pe form mai exist o cutie de editare E d itl care va afia care buton de radio este selectat. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object RadioGroupl: TRadioGroup
Caption = 'RadioGroupl' Items.Strings = ( ' primul' 'al doilea1 ' al treilea) OnClick = RadioGrouplClick

end object 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); begin case 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;

Exem plul 2: Urmtoarea aplicaie adaug unei componente numrul de itemuri nscris n cutia de editare Edit2. n cutia de editare E d itl se afl numrul de coloane pe care vor fi dispuse itemurile din componenta TRadioGroup. Etichetele itcmurilor sunt numere n intervalul 0. .strToint ( E d itl.Text) . La apsarea unui item se va afia eticheta lui. Valorile proprietilor componentelor de pe form sunt:
object Editl: TEdit
Text = '4'

end object Edit2: TEdit 132

Text = '12'

end object RadioGroupl: TRadioGroup


Caption = 'Butoane radio'

end object Buttonl: TButton


Caption = 'Creeaza butoane1 OnClick = ButtonlClick

end

llandlerele de evenimente ale componentelor de pe forma F orm l 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 OPIUNI

Componente de opiuni ofer posibilitatea utilizatorului de a alege dintrun grup de opiuni. Spre deosebire de butoanele radio, opiunile pot s nu se exclud reciproc, la un moment fiind posibil selectarea mai multor opiuni. Componentele de opiune pot aprea singure pe o form ( TCheckBox ) sau grupate ( TCheckListBox ). Proprietile Checked i State reflect starea unui item. Checked poate avea dou valori: bifat (valoarea tru e) i nebifat (valoarea false). State poate avea trei valori: bifat (valoarea cbCheked), nebifat (valoarea cbU nchecked) i nedecis sau gri (valoarea cbG rayed).

11.1. TCheckBox

Este o component ce const dintr-o cutie de bifare etichetat care ofer utilizatorului posibilitatea de a alege sau nu o opiune a aplicaiei.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TButtonControl -> TCustomCheckBox -> TCheckBox.

Definit n_____________________________________________________
stdctrls.pas

Pagina______________________________________________________
Standard

Proprieti_______ ____________________________________________ PI.


Alignm ent

p ro p e rty Alignment: TLeftRight; Specific poziia textului ataat cutiei fa de cutie. Valori posibile pentru Alignm ent sunt:

134

V a lo a r e

S e m n ific a ie T extul apare n p artea stn g a butonului. T extul apare n p artea d re a p t a butonului.

talxftJusU fy taRightJustijy

P2.

A llow G rayed

p ro p e rty AllowGrayed: Boolean; Indic dac cutia de control permite i starea gri. Dac A llow G rayed este tru e, atunci cutia de control poate avea trei valori: check (bifat), uncheck (nebifat), grayed (bifat, dar pe fundal gri). Dac A llow G rayed este false, atunci cutia de control poate avea doar dou stri: check i
uncheck.

1*3.

Checked

p ro p e rty Checked: Boolean; Indic dac cutia de control a fost selectat. Dac Checked este tru e, atunci semnul de marcare apare n cutie, n caz contrar cutia se poate gsi n starea nebifat sau n starea gri (dac A llow G rayed este true). 1*4.
State

p ro p e rty State: TCheckBoxState; Indic starea cutiei de opiuni. Valori posibile pentru State sunt:
V a lo a r e S e m n ific a ie S p ecific d a c cu tia de control este b ifa t (u tilizatorul a s e le c ta t o op iu n e). n ea v a apare u n sem n de bifare. C u tia de control nu este bifat. C u tia de control nu se a fl nici n starea bifat, nici n s tarea nebifat, n cu tie apare un sem n de b ifare av n d culoare d ife rit (gri) de cu lo a re a sem n u lu i fo lo sit pen lru stare bifat.

cbC hecked cbU nchecked cbC rayed

Kxcmplu: Urmtoare aplicaie folosete componentele:

cutie de control ( CheckBoxl)-, cutie de editare (E d itl) care va afia starea lui C h eckB oxl ; un grup de butoane radio (R adioG rou pl) care conine butoanele "Permite stare gri" i "Nu perm ite stare gri" folosite pentru a speci fica dac este permis sau nu starea "gri" pentru CheckBoxl.

135

Valorile proprietilor obiectelor de pe forma F orm l sunt:


object CheckBoxl: TCheckBox
Caption Checked State = OnClick = 'CheckBoxl' = True cbChecked = CheckBoxlClick

end object RadioGroupl: TRadioGroup


Caption = 'Starea gri' Items.Strings = ( 'Permite stare gri' 'Nu permite stare gri') OnClick = RadioGrouplClick

end object Editl: TEdit


Text = 'Editl'

end

Handlerele de evenimente pentru forma F orm l sunt:


procedure TForml.CheckBoxlClick(Sender: TObject); begin case CheckBoxl.State of
cbChecked: 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
Afieaz o list cu itemuri care au cte un semn de bifare la stnga lor. Un item este un ir de caractere. Accesarea acestora se face prin intermediul proprietii Items.

136

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomListBox -> TListBox.

Definit n___________________________________________________
stdctrls.pas

Pagina_____________________________________________________
Standard

Proprieti__________________________________________________
P I.
Items

p ro p erty Items: TStrings;


Items conine lista cu itemurile dintr-un TCheckListBox.

P2.

State

p ro p erty 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, cbG rayed). Cnd Checked este tru e, State este cbChecked. Cnd Checked este False, State poate fi fie cbUnchecked, fie cbG rayed. Cnd State este cbG rayed, ItemEnabled este False. Mai mult, ItemEnabled poate fi, de asemenea, false cnd State este cbUnchecked sau cbChecked. P3.
Checked

p ro p erty Checked [Index: Integer]: Boolean; Pentru fiecare item din vectorul Items, Checked indic starea acestuia. Valori posibile pentru Checked sunt: cbChecked , cbUnchecked. Pentru valoarea cbG rayed a lui State, valoarea lui Checked va fi false.

137

E xem plu: Urmtoarea aplicaie afieaz component TCheckListBox. numrul itemurilor bifate dintr-o

12. PROGRESUL EXECUIEI COMPONENTA TProgressBar


n acest capitol este prezentat componenta TProgressBar care permite vizualizarea grafic a evoluiei unui proces n execuie.

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;

12.1. TProgressBar
aplicaii

- __ I

im i1

P4.

A llow G rayed

p ro p e rty AllowGrayed: Boolean; Indic dac este permis starea gri.

O component TProgressBar indic n mod vizual progresul unei n execuie. Pe msur ce aplicaia se execut, componenta TProgressBar se coloreaz, de la stnga la dreapta, cu culoarea standard exprimat de constanta clHighLight.

Evenimente
E l.

_______________ _________________

Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> -> TW inControl -> TProgressBar.

OnClickCheck

p ro p e rty OnClickCheck: TNotifyEvent; Apare cnt utilizatorul bifeaz sau debifeaz un item.

Definit n
com ctrls.pas

_______________________

Pagina______________________
Win32

Proprieti PI.
Position

________________________

p ro p erty Position: Integer; Reprezint poziia curent a componentei de progres.

P2.

Max

p ro p e rty Max: Integer; Reprezint valoarea maxim pe care o poate lua proprietatea Position.

138

139

im .M uahw M M i^H a.------- m i l l

ii ii n mi

11) i . iiii.

P3.

Min

p ro p e rty Min: Integer; Reprezint valoarea minim pe care o poate lua proprietatea Position.

Exemplul 1:
Vom face o aplicaie care genereaz combinrile mulimii Aceste combinri vor fi afiate ca i item-uri ale lui L istB oxl. Numrul n va fi citit dintr-o cutie de editare {E ditl). Numrul de poziii pe care le are componenta P rogressB arl este egal cu: 4 _ n -(n -l)-(;i-2 )-(/t-3 ) 24 Procesul de generare al combinrilor ncepe la apsarea butonul
B uttonl.

Valorile proprietilor obiectelor de pe forma F orm l sunt:


object Buttonl: TButton
Caption = 'Genereaza'

end object Editl: TEdit


Text = '6'

end

Handlerele de evenimente pentru obiectele de pe forma F orm l sunt:


procedure TForml.ButtonlClick(Sender: TObject); var
n, i, j, k, g : byte; s : string;

begin
ListBoxl.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 do for j := i + 1 to n - 2 for k := j + 1 to n for g := k + 1 to n begin

do
1 do

do

s := inttostr (i) + ' inttostt (j )-- '+ * i' inttostr (k) + 1 tint Iosl. r (y ) i' ' - ;
ListBoxl .1 .Add ( ; ; :) I iKt loxl .Ro Iro " 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

ProgressBarl.Position := ProgressBarl.Position + 1; ProgressBarl.Refresh;

end;
end;

Exem plul 2: Urmtoarea aplicaie ncarc sau salveaz un fiier n/din cutia de editare multilinie M em ol. Numele fiierului este obinut cu ajutorul unei componente TO penDialog sau TSaveDialog. Pentru a se pune n eviden utilitatea TProgressBar- ul, fiierul este citit octet cu octet. Compo nenta TProgressBar va avea attea poziii ci octei are fiierul. Pe form se afl i o component TMainMenu care are n bara principal un singur item - File - i dou subitemuri: O pen , respectiv Save. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object MainMerml: TMainMenu object Filei: TMenuItem
Caption = 'File' object O p e n l : TMenuItem Caption = 'Open'

nd objact S a v e l : TMenuItem
Caption = 'Save'

nd nd nd objot OpenDialogl: TOpenDialog


K liter = 'Fiiere Text|*.txt'

nd objact SaveDialogl: TSaveDialog Kiltor - 'Fiiere Text |* .txt' and

I Inndlercle dc evenimente ale obiectelor de pe forma F orm l sunt:


var I ih : T F i l e S t r e a m ; <li momi i u n c : i n t e g e r ;
mm
P :

: string;
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 ) ;
vr

l
hau l n

I 1 1i m > ; 1 |- l

If ' || UMI) I, I I < I 1 . V.y.i'i 'Ut f-i l "


t han b n g i n
M M > . (' I <i r ; l ill 1 * 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 , > *

1tnOponH<ml) ;
I AI

dimensiune := fis. Size; / /dimensiunea f e u u iirli ProgressBarl.Max := dimensiune; sir := ''; getmem(p,1); ProgressBarl.Position := 0; for i := 1 to dimensiune do begin fis .Read (p~,1) ; sir := sir + string(p"); //pun f e u i t - n sr ii r l n r u i 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; / s t znumrul p z i o p o r s b r u u / ee oiilr r g e s a - l i ProgressBarl.Position := 0 ; getmem(p,1); for i := 1 to dimensiune do begin p[0] := Memol.Lines. Text[i] ; fis .Write (p~,1) ; / s r u i f e un o t t / c i n iir c e ProgressBarl.Position := ProgressBarl.Position + 1; end; fis. Free; end; end;

E xem plul 3: Se cere s se scrie ntr-un fiier toate numerele de ia 1 la 1.000.000. Pro gresul procesului de scriere n fiier va fi afiat folosindu-se o compo nent ProgressBar. Pentru a realiza aceast aplicaie vom folosi o component ProgressB ar cu ajutorul creia vom afia progresul execuiei operaiei de scriere n fiier i un buton la apsarea cruia aplicaia va fi lansat n execuie. Dac proprietatea Smooth a componentei ProgressB ar este setat true, atunci progresul execuiei va fi marcat printr-o linie continu, altfel printr-o linie discontinu.

142

n momentul n care toate numerele au fost scrise n fiier se va afia mesajul S-a terminat de scris n fiier De asemenea, procesul poate fi oprit (scrierea n fiier poate fi ntrerupt) prin apsarea tastei Escape. Proprietile obiectelor de pe forma F orm l sunt:
object Buttonl: TButton
Caption = 'Start' OnClick = ButtonlClick

end object ProgressBarl: TProgressBar


M a x = 1000000 Smooth = True

end

Handlerele de evenimente ale obiectelor de forma Formlsunt:


var
apasat_escape : boolean;

procedure T Form l.ButtonlClick(Sender: TObject); var


i : integer;

begin apasat_escape := false; assignfilelf, 'fiier.txt'); rewrite(f) ;


P r o g r e s s b a r l .Position := 0;

for i := 1 to 100000 do begin


Application.ProcessMessages; if apasat_escape

then begin
closefi l e (f ); exit;

end;
w r i t e l n ( f ,i ); P r o g r e s s barl.Position := ProgressBarl.Position + 1; if i = 100000 then S h o wM e s s a g e ('S-a terminat de scris in fiier');

end;
closef ile (f ) , -

end; procedure T F o r m l .FormKeyDown(S e n d e r : TObject; var Key: Word;


Shift: TShiftState);

begin if ke y = VK_Escape then apasat_escape := true; end;

143

j p M H M t t ******

E xem plul 4: Programul urmtor afieaz ntr-un ListBox toate permutrile primelor n numere naturale. Valoarea lui n este selectat dintre cele 20 de valori posibile (1 pn la 20) prezente ntr-un ComboBox. Este folosit i un P rogressB ar care afieaz evoluia procesului de determinare a soluiei. Proprietatea Smooth a componentei P rogressB ar poate fi tru e sau false; atunci cnd este setat tru e, bara de progres este continu, iar cnd este setat false, bara de progres este segmentat. Proprietile obiectelor de pe forma F orm l sunt:
object ComboBoxl - TComboBox .
Items.Strings = ('2' '3' 4 '5' '6' '7 ' '8' '9' '10' '11'
'12' '13' '14' '15' '16' 17' '18' 1 9 '20')

end object ListBoxl: TListBox end object ProgressBarl: TProgressBar


M in = 0 Max = 100 Step = 1

end object BitBtnl: TBitBtn


Caption = 'afiseaza' OnClick = BitBtnlClick

end

Pentru a determina toate permutrile numerelor naturale mai mici sau egale dect un numr n dat vom folosi metoda backtracking. Handlerele de evenimente ale obiectelor de pe forma Form l sunt:
var
soluie, n : integer; a : a r r a y [1..100] of integer,-

function continuare(poz,v : integer) var


i : integer;

: boolean;

begin
continuare true; for i := 1 to poz - 1 if a[i] = v then continuare :=

do false;

end; procedure tipar; var


i : integer; s : string;

144

begin
s := 1 1;

for i := 1 to n do
s := s + IntToStr (a [i] ) + ' '; F o r m l .L i s t B o x l .Items.Add(s);

end; procedure back I : integer); k var


i : integer; s : string;

begin if k > n then begin


i n c (soluie); tipar; Forml .ListBoxl.Refresh; Forml.ProgressBarl.Position

:= soluie;

end else for i := 1 to n do if c o n t i n u a r e (k,i) then begin


a[k] := i; b a c k ( 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 T F orml.BitBtnlClick(Sender: TObject); begin


ListBoxl.Clear; n := S t r T o I nt(ComboBoxl.I t e m s .Strings[ComboBoxl.Itemlndex]); ProgressBarl.Min := 0;

ProgressBarl.Max:=Factorial(StrToInt(ComboBoxl.Items.Strings [ComboBoxl.Itemlndex]));
P r o g r e s s B a r l .Step := 1; soluie := 0; back(l);

end;

13. BAR DE STATUT


n acest capitol sunt prezentate obiectele care definesc funcionalitatea 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 afia text sau imagine. Colecia de panouri ale unei bare de statut este reprezentat de clasa TStatusPanels. Un panou din colecie este obiect de clas TStatusPanel.

13.1. TStatusBar
Reprezint o bar - amplasat de obicei n partea de jos a ferestrei - i care afieaz informaii despre aplicaia n curs de execuie. Spre exemplu, n bara de acest tip, aplicaia M icrosoft W ord afieaz: numrul paginii curente, numrul de pagini din documentul curent, poziia cursorului etc.

Ierarhie________________________________________
TObject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TStatusBar.

Definit n_______________________________________
com ctrls.pas

Pagina_______________________________________ _
Win32

Proprieti_____________________________________
P I.
Panels

p ro p e rty Panels: TStatusPanels; Informaia pe un TStatusBar este afiat n panouri ( en gl. panels) ali niate de obicei la stnga. Proprietatea Panels este o colecie de astfel de panouri. La momentul proiectrii aplicaiei se poate seta numrul panourilor i caracteristicile lor, folosind proprietatea Panels din O bject
146

Inspector. Pe ecran va apare un editor de panouri cu ajutorul cruia se

pot manipula panourile deja existente. Tot cu ajutorul acestui panou se pot aduga noi panouri sau se pot terge unele dintre panourile deja existente. P2.
Canvas

p ro p e rty Canvas: TCanvas; Furnizeaz acces la suprafaa de desenare a unei componente de tip
TStatusBar.

E xem plu: Urmtoarea aplicaie exemplific modul de lucru cu proprietatea Canvas a TStatusBar-\i\u\: suprafaa de desenare va fi colorat la apariia eveni mentului OnTimer - al unei componente TTimer - cu o culoare aleatoare.
procedure TForml.TirnerlTimer (Sender: TObject); var
r : TRect;

begin
S t a t u s B arl.Canvas.Brush.Color := r a n d o m ($FFFFFF + 1);

/ icuet sdi. / nld-i tlbh r := Rect(0,3,100,StatusBarl.Height-1);


S t a t u s B a r l .Canvas.F i llRect(r);

end;

P3.

SimplePanel

p ro p e rty SimplePanel: Boolean; Indic dac componenta de tip TStatusBar are unul sau mai multe panouri. P4.
SimpleText

p ro p e rty SimpleText: string; Reprezint textul care va afiat n panoul componentei de tip TStatusBar , cnd aceasta are proprietatea SinglePanel setat la true.

Evenimente
E l.
On Resize

p ro p e rty OnResize: TNotifyEvent; Apare cnd component de tip TStatusBar este redimensionat la momentul execuiei aplicaiei. E2.
O nD rawPanel

p ro p e rty OnDrawPanel: TDrawPanelEvent; Apare cnd un o component de tip TStatusPanel trebuie redesenat. Tipul TDrawPanelEvent este definit astfel: TDrawPanelEvent = procedure(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect) of object;
R ect reprezint noua dimensiune a componentei de Panel de tip TStatusPanel. Acest eveniment apare doar dac proprietatea Style a componentei Panels este setat la psO wnerD raw .

13.2. TStatusPanels
Este o colecie de obiecte de tip TStatusPanel.

Ierarhie

______________________________________ _____________

TObject -> TPersistent -> TCollection -> TStatusPanels.

Definit n_____________________________________________________
com ctrls

Proprieti___________________________________________________
P I.
Items

pro p erty \{ems[Index\ Integer]: TStatusPanel; default; Este o list indexat cu panourile din colecie. Pentru a afla numrul acestora se poate folosi proprietatea Count a lui TCollection.

148

Metode__________________
M l.
TStatusPanels

Este constructorul clasei. M2.


A dd

function Add: TStatusPanel; Adaug o component de tip TStatusPanels la o component de tip TStatusBar. Sunt atribuite valori implicite pentru noul panou. Proprie tile lui pot fi setate mai trziu, accesndu-1 prin intermediul vectorului
Items.

13.3. TStatusPanel
Reprezint un singur panou dintr-o component de tip TStatusBar. Ierarhie
TO bject -> TPersistent -> TCollectionltem -> TStatusPanel.

Definit n_____________________________
com ctrls.pas

Proprieti
P I.
Alignm ent

p ro p e rty Alignment: TAlignment; Specific cum este afiat textul n interiorul unui panou. Valori posibile pentru aceast proprietate sunt: taLeftJustify, taRightJustify, taCenter.
N um e S c in n ilic a ie A lin ia z textul n p a rte a stn g a panoului. A lin ia z textul n p artea d reapt a panoului. C en treaz textul n panou.

taLeftJustify TaRiluJtixtify TaCenter

P2.

Bevcl

p ro p e rty Bevel: TStatusPanelBevel; Indic tipul marginii panoului. Valori posibile pentru Bevel sunt:

149

N um e

S e m n ific a ie P anou! nu are nici o m arg ine i pare plat. Panoul are o m arg in e care creaz im p resia c panoul este scobit. Panoul are o m a rg in e care cre az im p resia c panoul este ridicat.

PbNone phLow ered pbR aised

P3.

Text

p ro p e rty Text: string; Indic textul afiat n panou, dac valoarea proprietii Style este psText. P4.
Style

p ro p e rty Style: TStatusPanelStyle; Indic felul n care este afiat textul din panou. Valori posibile pentru
Style sunt:
N um e S e m n ific a ie n p a n o u este afiat irul ataat p roprietii Text. C o n in u tu l p an o u lu i v a fi d e se n a t la m om entul ex ecu ie ap licaiei p rin in term ediul liandlerului de ev en im en t

PsText PsOwnerDraw

TSlatusB ar.O nD raw P anel.

P5.

Width

p ro p e rty Width: Integer; Indic dimensiunea, n numr de pixeli, (pe orizontal) a panoului. E xem plul 1: Urmtoarea aplicaie 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 crerii formei, barei de statut i sunt create dou panouri n care se va afia poziia cursorului de mouse. Dac mouse-ul trece pe deasupra celor dou componente (TButton i TEdit), atunci bara de statut va deveni simpl i va afia un text sugestiv. Valorile proprietilor obiectelor de pe forma Form l sunt:
object StatusBarl: TStatusBar
Panels = < item Text = 'X = ' Width = 50

item Text = 'Y=' Width = 50

end>
SimplePanel =

False

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure T F o r m l .ButtonlMouseMove(Sender: TObject;
Shift: TShiftState; X,Y: Integer);

begin
S t a t u s B a r l .SimplePanel := true; S t a t u s B a r l .SimpleText := 'Trec pe deasupra unui buton';

end ; procedure T F o r m l .E d i t l M ouseMove(S e n d e r : TObject;


Shift: TShiftState; X, Y: Integer);

begin
S t a t u s B a r l .SimplePanel := true; S t a t u s B a r l .SimpleText := 'Trec pe deasupra unei cutii de editare';

end; procedure T F o r m l .FormMouseMove(Sender: TObject;


Shift: TShiftState; X, Y: Integer);

begin
S t a t u s B a r l .SimplePanel := false; S t a t u s B a r l .P a n e l s .I t e m s [0].Text := 'X = '+IntToStr(X); StatusBarl.Panels.Items[l].Text ;= 'Y= '+In t T o S t r (Y ) ;

end;

E xem plul 2: Urmtoarea aplicaie creeaz unei componente TStatusBar dou pa nouri. Pe cel de al doilea se vor afia - cu ajutorul unui tim er - numerele de la 1 la 10. Pe primul panou se va afia un text sugestiv cnd s-a ajuns la 10.
var
i : integer;

procedure TForml.FormCreate( Sender: TObject); begin Timerl .Enabled -= true; .


i := 0; / / d e cate o i s-a a p elat e v en im en tu l O n T im er r

end; procedure TForml.TimerlTimer( Sender: TObject); begin


StatusBarl.Panels.Items[1].Text := IntToStr(i);

151

p < j i M ) ii i ) i w t i i > i i 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 i i i i i ...............

if i = 10 then begin
S t a t usBarl.P a n e l s .I t e m s [0].Text := 'Am ajuns la 10! Timerl .Enabled := false; //o p resc tim er-ul

14. MANIPULATOR DE PANOURI


n acest capitol sunt prezentate dou componente: TPageControl i TTabSheet. TPageControl este o component ca permite utilizatorului s afieze multiple panouri (pagini) ntr-o aceeai fereastr. Fiecare pagin este o compo nent de tip TTabSheet. Paginile sunt total suprapuse, iar la un moment dat una singur este vizibil. Pe suprafaa ei se pot amplasa componente. Fiecare pagin are ataat un buton amplasat pe marginea componentei TPageControl. Trecerea de la o pagin la alta se face cu ajutorul butoanelor ataate.

end;
i n c (i );

end;

14.1. TPageControl
Este un control care permite utilizatorului s foloseasc multiple pagini (ferestre) ntr-o aceeai suprafa. n fiecare moment o singur pagin este visibil. Fiecare pagin se comport ca o form, adic pe suprafaa ei se pot amplasa componente. Pentru fiecare pagin apare n partea de sus (de obicei) a lui TPageC ontrol cte un buton prin a crui apsare pagina ataat lui va deveni vizibil. O pagin este un obiect de tipul TTabSheet. La momentul proiectrii aplicaiei crearea unei noi pagini se realizeaz prin click dreapta pe componenta TPageControl iar apoi prin selectarea comenzii NewPage.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TW inControl -> TCustomTabControl -> TPageControl.

Definit n_____________________________________________________
com ctrls.pas

Pagina_______________________________________________________
Win32

152

153

Proprieti__________________________________________ _________ PI.


A ctiveP age

p ro p e rty ActivePage: TTabSheet; Indic pagina activ. Prin setarea acestei proprieti A ctiveP age va deveni pagina vizibil.

P2.

PageC ount

p ro p e rty PageCount: Integer; Indic numrul de pagini din TPageControl.

P3.

Pages

p ro p e rty Pages[Index: Integer]: TTabSheet; n P ages se afl toate paginile lui PageControl. Prin intermediul lui Index se poate accesa fiecare pagin n parte.

P4.

HotTrack

p ro p e rty HotTrack: boolean; Indic dac textul nscris pe un tab se lumineaz cnd cursorul de mouse trece pe deasupra lui.

P5.

MultiLine

p ro p e rty MultiLine: Boolean; Indic dac este permis afiarea tab-urilor pe mai multe linii. n caz contrar i dac lungimea total a tab-urilor este mai mare dect cea a TPageControl-u\u\, dou sgei i vor permite utilizatorului s navigheze printre tab-uri.

P6.

TabPosition

p ro p e rty TabPosition: TTabPosition; Indic poziia n care s apar tab-urile unui TPageControl. Valori posibile pentru TabPosition sunt tpTop i tpBottom.

154

E xem plu: Urmtoarea aplicaie seteaz dimensiunea i stilul textului din cutia de editare E d itl. Pentru aceasta este folosit o component TPageControl cu dou pagini (create la momentul proiectrii programului). Pe prima pagin se afl o cutie de editare Edit2, n care utilizatorul introduce dimensiunea textului cutiei de editare E d itl i un buton de tip Default (Default := tru e), la a crui apsare se seteaz dimensiunea textului din cutia E d itl la valoarea coninut n Edit2. Pe a doua pagin se afl 4 cutii de control (componente de tip TCheckBox ) corespunznd celor patru stiluri de font: bold (ngroat), italic (nclinat), underline (subliniat), strikeout (tiat). Valorile proprietilor obiectelor de pe forma F orm l sunt:
object PageCo n troll: TPageControl object T a b S h e e t l : TTabSheet
Caption = 'Dimensiune' object Edit2: TEdit Text = '12'

end object Buttonl: TButton


Caption = 'executa' Default = True

end end object T a b S h e e t 2 : TTabSheet


Caption = 'F o n t '

object C h e c k B o x l : TCheckBox
Caption = 'bold'

object C h e c k B o x 2 : TCheckBox
Caption = 'italic'

end object C h e c k B o x 3 : TCheckBox


Caption = 'underline'

end object C h e c k B o x 4 : TCheckBox


Caption = 'strikeout'

end end end object Editl: TEdit


Text = '2B or not 2B = F F '

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


var
s t i l ,b o l d , i t a l i c ,underline,strikeout:TFontStyles;

155

procedure TForml .FormActivate (Sender begin


b old italic underline strikeout := := := := [fsbold]; [fsitalic]; [fsunderline]; [fsstrikeout];

TObject);

end; procedure T F o r m l .Butt o n l C l i c k (S e n d e r : TObject); begin


E d i t l . F o n t .Size := StrToInt(Edit2.Text);

end; procedure T F o r m l .CheckBoxlClick(Sender: TObject) begin if C h e c k B o x l .Checked then stil := stil + [fsbold] else stil := stil - [fsbold];
E d i t l .F o n t .Style := stil;

end; procedure T F o r m l .CheckBox2Click(Sender: TObject) begin if C h e c k B o x 2 .Checked then stil := stil + [fsitalic] else stil := stil - [fsitalic];
E d i t l .F o n t .Style := s t i p

end; procedure TForml,CheckBox3Click(Sender: TObject) begin if C h e c k B o x 3 .Checked then stil := stil + [fsunderline] else stil := stil - [fsunderline];
E d i t l .F o n t .Style := stil;

end; procedure T F o r m l .CheckBox4Click(Sender: TObject) begin if C h e c k B o x 4 .Checked then stil := stil + [fsstrikeout] else stil := stil - [fsstrikeout];
E d i t l . F o n t .Style := stil;

end; procedure TForml.TabSheetlEnter(Sender: TObject) begin


E d i t 2 .SetFocus;

end;

156

Metode
M l.
FindNextPage

function FindNextPage^CMrPage: TTabSheet;


G oForward, CheckTabVisible: Boolean):

TTabSheet; Returneaz urmtoarea (precedenta) pagin din cadrul lui


TPageControl. Dac G oF orw ard este tru e, se va returna o pagin aflat

dup pagina curent, n caz contrar una aflat naintea celei curente. Dac CheckTabVisible este tru e se va cuta printre paginile care au proprietatea TabVisible tru e , n caz contrar lundu-se n calcul toate paginile existente. M2.
Select Next Page

p ro ced u re SelectNextPage(Go/wiwi/Yi: Boolean); Permite utilizatorului s selecteze urmtoarea pagin. G oF orw ard are aceeai nsemntate ca la proprietatea precedent.

Evenimente__________________________________________________
E l.
OnChange

p ro p e rty OnChange: TNotifyEvent; Apare cnd un nou tab (component de tip TTabSheet) este selectat. E2.
OnChanging

p ro p e rty OnChanging: TTabChangingEvent; Apare exact nainte de a se selecta o nou pagin. Tipul
TTabChangingEvent este definit astfel:

type TTabChangingEvent = p rocedure (Sender: TObject; v a r AllowChange: Boolean) o f object;


A llowC hange indic dac este permis sau nu selectarea acelei pagini.

14.2. TTabSheet
Este o pagin dintr-o component TPageControl.
157

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TTabSheet.

Definit n_____________________________________________________
com ctrls.pas

Proprieti___________________________________________________
P I.
P agelndex

p ro p erty Pagelndex: Integer; Furnizeaz acces la numrul de ordine al unei pagini din cadrul lui PageControl. P2.
PageC ontrol

p ro p e rty PageControl: TPageControl; Indic componenta de tip TPageControl care conine TTabSheet-u\. P3.
Tablndex

p ro p e rty Tablndex: Integer; Indic numrul de ordine al tabului paginii curente din cadrul unui vector de tab-uri vizibile. P4.
TabVisible

p ro p e rty TabVisible Boolean; Indic dac tab-ul obiectului TTabSheet este vizibil n TPageControl.

Metode__________________________________ ___________________
M l.
Create

c o n stru c to r Cred.tc(A Owner: TComponent); Este constructorul clasei.

158

Evenimente
E l.
OnHide

p ro p e rty OnHide: TNotifyEvent; Apare cnd proprietatea Visible a paginii este setat la false. E2.
OnShow

p ro p e rty OnShow: TNotifyEvent; Apare cnd proprietatea Visible a paginii este setat la true. Exem plu: Urmtoarea aplicaie creeaz la momentul execuiei 10 pagini de tip TTabSheet. Apoi, cu ajutorul unei componente TUpDown, navigheaz printre ele. Handlerele de evenimente pentru forma F orm l sunt:
procedure T F o r m l .FormCreate(Sender: TObject); var i: integer;
pPage; TTabSheet;

begin for i .= 0 to 9 do begin


pPage := T T a b S h e e t .Create(Forml) ; p P a g e .PageControl := PageControll; p P a g e .Caption := 'P a g i n a '+Int T o S t r (i );

end; end; procedure TForml.UpDownlClick(S e n d e r : TObject;


Button: TUDBt n T y p e ) ;

begin
P a g e C o n t r o l l .SelectNextPage(Button = b t N e x t ) ;

end;

159

15. RIGLE
n acest capitol este prezentat componenta TTrackBar care const dintrun cursor ce se poate deplasa de-a lungul unei rigle marcate.

15.1. TTrackBar

_i_i

Este o component ce conine un cursor care se poate deplasa de-a lungul unei rigle marcate. La momentul execuiei, micarea (deplasarea) curso rului se poate face cu ajutorul mouse-ului, cu ajutorul tastelor <Up>, <Down>, <PgUp>, <PgDown> sau prin atribuirea unei valori proprietii Position.

ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TTrackBar.

Definit n___________________________________________ ______ __


com ctrls.pas

Pagina
Win32

__________ _______ _

Proprieti___________________________________________
P I.
Position

p ro p e rty Position: Integer; Indic poziia curent a cursorului pe rigl. Poziia cursorului poate lua valori n intervalul [Min..Max]. P2.
Max

p ro p e rty Max: Integer; Indic valoarea poziiei maxime pe care o poate avea cursorul.

160

P3.

Min

p ro p e rty Min: Integer; Indic valoarea poziiei minime pe care o poate avea cursorul. P4.
Frequency

p ro p e rty Frequency: Integer; Specific din cte n cte uniti apar marcajele pe rigl. O rigl este mprit n Max - Min + 1 uniti. Dac Frequency este 1, atunci pentru fiecare unitate este desenat cte un marcaj. Dac Frequency este 2, atunci cte un marcaj este desenat la fiecare dou uniti. P5.
LineSize

p ro p e rty LineSize: Integer; Specific numrul de poziii cu care se va mica cursorul cnd sunt apsate tastele sgeat n sus (<Up>) sau sgeat jos (<Down>). P6.
PageSize

p ro p e rty PageSize: Integer; Specific numrul de poziii cu care se va mica cursorul cnd sunt apsate tastele <PageUp>, sau <PageDown>. P7.
Orientation

p ro p e rty Orientation: TTrackBarOrientation; Specific aezarea componentei TTrackBar. Valori posibile pentru
O rientation sunt:
V a lo a r e S e m n ific a ie C o m p o n e n ta TTrackBar este o rien tat orizontal. P o ziia Min se a fl la st n g a p o ziiei Max. C o m p o n e n ta TTrackBar este o rie n ta t vertical. P o ziia M in se afl d e asu p ra po ziiei Max.

IrHorizotilal trVertical

P8.

TickStyle

p ro p e rty TickStyle: TTickStyle; Indic tipul marcajelor riglei. Valori posibile pentru TickStyle sunt:

161

V a lo a r e

S e m n ific a ie M arcajele su n t au to m at afiate pe rigl. Pasul cu care su n t afiate este d a t de p ro p rietatea Frequency. Im p licit nu este afiat nici un m arcaj, d a r a cestea pot fi am p lasate cu a ju to ru l m eto d ei SetTick. N ic i un m arcaj nu este afiat pe rigl.

tsAuto tsM anual tsNone

P9.

TickMarks

p ro p e rty TickMarks: TTickMark; Un cursor poate fi nsoit opional de o rigl marcat. TickMarks specific poziia riglei fa de cursor. Valori posibile pentru TickMarks sunt:
V a lo a r e S e m n ific a ie M arcajele se afl su b cu rso r sau la dre a p ta curso ru lu i, a ce st lucru d e p in z n d de p ro p rietatea Orientation. M arcajele se afl d easu p ra sau la stnga curso ru lu i, a ce st lucru d e p in z n d de p ro p rietatea Orientation. M arcajele se a fl de am b ele pri ale cursorului.

tmBottoniRiglU tniTopLeft tiuBolh

Metode
M l.
SetTick

pro ced u re SetTick(Va/Me: Integer); Amplaseaz un semn de marcare pe rigl la poziia Value e [Min .. Max]. Aceast metod se apeleaz doar cnd valoarea proprietii TickStyle este tsM anual. Exem plu: Urmtoarea aplicaie genereaz la apsarea butonului Buttonl 10 marcaje pe rigla componentei T rackB arl. Marcajele sunt amplasate n poziii aleatoare. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object TrackBarl: TTrackBar
Max = 20 Orientation = trHorizontal Frequency = 1 Position = 0
TickMarks = tmBottomRight

162

TickStyle = tsManual

end object Buttonl: TButton


Caption = 'Marcaje'

end

1landlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.ButtonlClick(Sender: TObject); var
poz, i : integer;

begin for i := 1 to 10 do begin


poz := TrackBarl.Min + random(TrackBarl.Max-TrackBarl.Min + 1); TrackBarl.SetTick(poz);

end; end;

Evenimente
E l.
OnCliange

p ro p e rty OnChange: TNotifyEvent; Apare cnd poziia cursorului se schimb. E xem plul 1: Urmtoarea aplicaie const dintr-o form pe care sunt amplasate o component TTrackBar i o component TlmageList. Aceasta din urm conine imagini introduse de ctre programator la momentul proiectrii aplicaiei. Dup lansarea aplicaiei n execuie, numrul poziiilor TrackBar -ului va fi setat la numrul imaginilor din list. n acest fel, fiecrei poziii a cursorului i va corespunde o imagine din list. Prin micarea cursorului se va desena pe ecran imaginea corespunztoare din list. Handlerele de evenimente ale obiectelor de pe forma F orm 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:
Urmtoarea aplicaie afieaz n cutia de editare E d itl numere aleatoare din intervalul 1..100. Numerele sunt afiate la evenimentul OnTimer al obiectului Tim erI. Viteza de afiare (valoarea proprietii Interval a lui TTimer) este modificat cu ajutorul unei componente TTrackBar. Valori mici ale proprietii Position nseamn vitez mare de generare. Valori mari ale proprietii Position nseamn vitez mic de generare. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Editl; TEdit
Text = 'Editl'

end object TrackBarl: TTrackBar


Orientation = trHorizontal Frequency = 1 Position = 1

end object 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 gradaie pe scala lui TTrackBar valoreaz 200 de milisecunde

//p e n tru intervalul lui Tim erl

end;

Exemplul 3:
Urmtoarea aplicaie seteaz cu ajutorul unei componentei TrackB arl dimensiunea fontului etichetei L a b e ll. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Labell: TLabel
Caption = Labell' Font.Height = -13 Font.Name = 'Courier New'

164

end object TrackBarl: TTrackBar


Max = 2 0 Orientation = trVertical Frequency = 1 Position = 0 TickMarks = tmBottorciRight TickStyle = tsAuto

end

I l;mdlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.TrackBarlChange(Sender: TOfcnect); begin
I.ibel 1. Font.Size := TrackBarl.Position + 10; ,

and;

16. MENIURI
Componentele de meniu permit ataarea unui meniu unei forme (componenta TMainMenu) sau unei componente ( TPopUpM enu). Componenta TMainMenu ncapsuleaz bara principal de meniu mpreun cu meniurile drop-down ataate ei. Componenta TPopUpM enu ncapsuleaz un meniu popup (care apare la click dreapta pe o component). Un meniu este alctuit din itemuri de meniu care sunt obiecte de clas TMenuItem. Accesarea unui item de meniu se face cu ajutorul proprietii Items a lui TMainMenu i TPopUpMenu. La sfritul acestui capitol sunt prezentate cteva funcii utile n manipularea i prelucrarea meniurilor la momentul execuiei aplicaiei.

16.1. TMenu
Este clasa de baz pentru meniuri W indows. Din ea deriv TMainMenu i TPopupMenu.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TMenu.

Definit n
menus.pas

Proprieti___________________________________________________
P I.
Items

property Items: TMenuItem;


Specific item-urile unui meniu. Aceast proprietate este util dac do rim s prelucrm meniul la timpul execuiei programului. La momentul proiectrii aplicaiei proprietatea poate fi editat din O bject Inspector.

166

1*2.

Handle

p ro p e rty Handle: HMENU; Este handle-ul la meniu. 1*3.


WindowHandle

p ro p e rty WindowHandle: HWnd; Este handle-ul la fereastra care folosete acest meniu.

Metode
M l.
Findltem

function Findltem (l/fl/e: Word; K ind: TFindltemKind): TMenuItem; Gsete un item i l returneaz. Aceast metod este util pentru a cuta un anumit item ntr-un meniu (inclusiv n submeniuri). Meniul poate fi identificat prin unul dintre urmtoarele trei lucruri: scurttur (shortcut), identificatorul mesajului WM COMMAND i handle. Valori posibile pentru Kind sunt:
V a lo a r e S e m n ific a ie M eniul este c u tat d u p m esajul W M _C O M M A N D . M eniul este cu tat d u p id en tificatorul W indow s. M eniul este c u ta t d u p scurttur.

fkC om m and JkHandle jkShortC ut

Exem plu: Urmtoarea aplicaie realizeaz cutarea unui item de meniu dup scurttura ataat lui. Este folosit o component de tip THotKey n care utilizatorul este solicitat s introduc combinaia de taste dup care se va realiza cutarea.
procedure TForml.ButtonlClick(Sender: TObject); var meniu : TMenuItem; begin
meniu := 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

ncapsuleaz o bar de meniu mpreun cu meniurile drop-down. Unita tea de baz la un meniu sunt item-urile. De exemplu, bara principal de meniu a D elphi -ului are item-urile (File, Edit, Search, View, Project, Run, Component, D ataB ase, Tools i Help), iar meniul File are item-uri precum: New, Open,
Save, Save A s ,...

Pentru a ataa un meniu unei forme, Ia timpul proiectrii aplicaiei, amplasai pe form o component de tip TMainMenu, iar apoi executai dublu click pe ea. Pe ecran va aprea un utilitar care v va ajuta la crearea unui meniu:
f j Forml.MainMenul

Precum vedei, exist un cmp marcat, unde putei introduce un nume de item (meniu) principal. S-l denumim File (n O bject In spector setai proprie tatea Caption la valoarea 'File'). Pe ecran va aprea:
g"

Form l.M ainM enul

H0E3

F ile j..........j

Exist un cmp marcat pentru adugare de item-uri (submeniuri) la meniul File, i un cmp pentru adugarea unui nou item n bara de meniu, deci pe acelai nivel cu File. Lucrurile evolueaz de aici ncolo tot aa, la fiecare pas avei posibilitatea fie s adugai un nou item la bara principal, fie s adugai un item (submeniu) la unul din meniurile existente. Pentru a aduga un subitem la un item existent executai click dreapta pe respectivul submeniu i alegei C reate Submenu. Pentru a insera un item se execut click dreapta pe itemul

168

naintea cruia se dorete inserarea i apoi se alege Insert. Pentru a terge un item poziionai-v pe el i apoi apsai tasta D elete. Item-urile din bara principal de meniu se acceseaz cu ajutorul proprietii Menu (care este de tip TMainMenu) a lui TForm. Item-urile (submeniurile) se acceseaz cu ajutorul proprietii Items a lui TMainMenu. Fiecare item este o component Delphi, deci acesta i va da automat un nume. Acest nume se formeaz adugnd la titlu un numr. De exemplu, dac pe l'orm nu mai exist alt component cu numele F ile, atunci item-ul care se vede mai sus va primi numele de F ilei. Dac exist mai multe item-uri (com ponente) cu acelai titlu, ele vor primi n ordinea crerii numele F ile i, F ile i,...

Ierarhie
TO bject -> TPersistent t> TComponent -> TMenu -> TMainMenu.

Definit n
menus

Pagina______
Standard.

Proprieti
1*1.
AutoM erge

p ro p e rty AutoMerge: Boolean; Indic dac meniurile de pe alte forme pot fuziona cu meniul de pe forma principal. Dac dorii 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 setai proprietatea acestuia (de pe forma secundar) la tru e. In toate cazurile avei grij ca proprietatea AutoM erge pentru meniul formei principale s rmn false. Modul n care fuzioneaz meniurile este controlat cu ajutorul proprietii G rouplndex a lui TMenuItem.
Kxeinplul 1:

S presupunem c pe forma principal (F o rm 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, Com pile, Tools i Window. Aceste meniuri le-am creat la momentul proiectrii aplicaiei. Pe forma F orm l mai avem un buton B uttonl care va face forma F orm l
169

activ. n urma execuiei programului de mai jos, meniul formei F orm l dup apsarea butonului Buttonl va avea urmtoarele item-uri astfel:
File, Run, Compile, Tools, Window.

Valorile proprietilor obiectelor de pe forma F orm l sunt:


object Buttonl: TButton
Caption = 'Buttonl'

end object MainMenul: TMainMenu object Filei: TMenuItem


Caption = 'File' Grouplndex = 1

end object editl: TMenuItem


Caption = 'Edit' Grouplndex = 2

end object Viewl: TMenuItem


Caption = 'View' Grouplndex = 2

end object Helpl: TMenuItem


Caption = 'Help' Grouplndex = 4

end end

iar pentru forma Form2:


object MainMenul: TMainMenu obj ect Runl: TMenuItem
Caption = 'Run' Grouplndex = 1

end object Compilai: TMenuItem


Caption = 'Compile' Grouplndex = 2

end object Toolsi: TMenuItem


Caption = 'Tools' Grouplndex = 3

end object Windowl: TMenuItem


Caption = 'Window' Grouplndex = 3

end end

Handlerele de evenimente ale componentelor formei F orm l sunt:


procedure TForml.ButtonlClick(Sender: TObject); begin
Form2.SUow;

end;

170

Exemplul 2:
Urmtorul 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 opiunii corespunztoare care va apare la execuia unui click dreapta. Vom folosi mai nti o componet TRichEditl n care vom putea edita text. O alt component folosit este TMainMenuJ care conine trei meniuri: meniul File cu submeniurile:
Open - care permite deschiderea unui fiier existent pentru care vom folosi o component O pen D ialogI; Save - care permite salvarea documentului curent realizat cu ajutorul unei componente S a veD ia lo g l ; Close - care permite nchiderea aplicaiei;

meniul Format care cuprinde submeniurile: B old ; Italic', Bullets and numbering; Size.

meniul Help.

Submeniurile Bold i Italic permit boldarea i italicizarea textului selec tat, submeniul Bullets an d numbering permite numerotarea unor sec vene de text, iar submeniul Size permite setarea dimensiunii textului. Meniul Help determin apariia unei a doua forme, F o rm l , n care poate fi scris un text privitor la utilizarea aplicaiei. Vom mai folosi o component P opU pM enul care s ne permit selectarea uneia dintre opiunile ce vor fi afiate la realizarea unui click dreapta. Vom mai folosi i o component C olorD ialogl care va fi disponibil n momentul n care dorim setarea unei culori pentru fundal sau text. Proprietile obiectelor de pe forma F orm l sunt:
object RichEditl: TRichEdit
PopupMenu = PopupMenul

end object MainMenul: TMainMenu object Filei: TMenuItem


Capfion = 'File' object Closel: TMenuItem Caption = 'Close' Shortcut = 16451

171

end object Savel: TMenuItem


Caption = Save' Shortcut = 16467 OnClick = SavelClick

end object openl: TMenuItem


Caption = ' Open 1 Shortcut = 16463

end end object Optionsl: TMenuItem


Caption = 'Format' object Boldl: TMenuItem Caption = 'Bold' Shortcut = 16450

end object Italici: TMenuItem


Caption = 'Italic' Shortcut = 16457

end object Bulletsandnumberingl: TMenuItem Caption = 'Bullets and numbering' end object Sizel: TMenuItem
Caption = 'Size' OnClick = SizelClick

end end object helpl: TMenuItem


Caption = 'help' Shortcut = 112 OnClick = helplClick

end end object PopupMenul: TPopupMenu


MenuAnimation = [maTopToBottom] object Colori: TMenuItem Caption = 'Color' object Backgroungl: TMenuItem Caption = 'Backgroung' OnClick = BackgrounglClick

end object extl: TMenuItem


Caption = 'Text' OnClick = extlClick

end end object Fontl: TMenuItem


Caption = 'Font' object Bold2: TMenuItem Caption = 'Bold' OnClick = Bold2Click

end 172

object Italic2: TMenuItem


Caption = 'Italic' OnClick = Italic2Click

end object Underlinel: TMenuItem


Caption = 'Underline' OnClick = UnderlinelClick

end object Strickeoutl: TMenuItem


Caption = 'Strickeout OnClick = StrickeoutlClick

end end end object ColorDialogl: TColorDialog end object OpenDialogI: TOpenDialog nd object SaveDialogl: TSaveDialog and

I Iandlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.BackgrounglClick(Sender: TObject); begin if ColorDialogl.Execute then RichEditl.Color:^ColorDialogl.Color; nd; procedure TForml.extlClick(Sender: TObject); begin if ColorDialogl.Execute then RichEditl.SelAttributes.Color := ColorDialogl.Color; end; procedure TForml.SizelClick(Sender: TObject); var s : string; begin
s := 11 ;

if InputQuery('Input Box', size', s) then RichEditl.SelAttributes.Size := StrToInt(s); end; procedure TForml.SavelClick(Sender: TObject); begin
If SaveDialogl.Execute

then RichEditl.Lines.SaveToFile(SaveDialogl.FileName); end; procedure TForml.Bold2Click(Sender: TObject); begin if 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); begin if 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); begin if 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


form2 .ShowModal ;

end;

Metode
M l.
M erge

p ro ced u re 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. M 2.
Unmerge

p ro ced u re Unmerg e(Menu: TMainMenu); Este inversa operaiei M erge.


174

16.3. TPopUpMenu
Un meniu TPopUp este asemntor cu un TMainMenu. Apar ns unele diferene: cnd 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

Proprieti___________________________________________________
IM.

Alignment
property Alignment: TPopupAlignment; Specific poziia unde apare meniul cnd utilizatorul execut click dreapta pe un control. Valori posibile pentru Alignment sunt:
V a lo a re S e m nificaie Colul din stnga sus al m eniului apare pe poziia cursorului de mouse. Centrul m arginii de sus a m eniului apare pe poziia cursorului de mouse.

paLeft paCenter paRight

Colul din dreapta sus al m eniului apare pe poziia cursorului de mouse.

Im plicit este paLeft. P2.

AutoPopup
property AutoPopup: Boolean; Specific dac meniul popup apare cnd se execut click dreapta pe o component.

Exemplu:
Urmtorul exemplu conine un meniu TPopUp care se activeaz la executarea unui click dreapta pe butonul Buttonl. Item-urile acestui meniu sunt nlime, Latime i FontMare i au fost create n momentul proiectrii aplicaiei. La selectarea itemului nlime, cutia de editare Editl devine activ i utilizatorul este solicitat s introduc nlimea butonului Buttonl. La selectarea itemului Latime, cutia de editare Edit2 devine activ i utilizatorul este solicitat s introduc limea butonului Buttonl. La apsarea itemului FontMare, fontul titlului butonului Buttonl este mrit la 15, iar apoi, la o nou apsare, este readus la mrimea iniial (8). Pe form mai exist dou butoane - Button2 i Button3 -care sunt de tip Default pentru cele dou cutii de editare. Valorile proprietilor obiectelor de forma Forml sunt:
object Buttonl: TButton PopupMenu = popupMenul end object Button2: TButton Caption = 'Schimba latime' Default = True Enable = False end object Button3: TButton Caption = 'Schimba inaltime' Default = True Enabled = False end object Editl: TEdit Visible = False end object Edit2: TEdit Visible = False end object PopupMenul: TPopupMenu object Inaltimel: TMenuItem Caption = 'Inaltime' OnClick = InaltimelClick end object Latimel: TMenuItem Caption = 'Latime' OnClick = LatimelClick end object 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
K 11 I 1 . Show; c

h 11 Iori2.Enabled:=true ; i Mut Ion .Enabled;=false; I.Iil 1 .SetFocus; :

and;
inocodure TForml.InaltimelClick(Sender: TObject); liagln
l '.i III A .Show;

Mul l.on3.Enabled: =true; l i ton 2.Enabled: =false; ui l.I i 2.SetFocus ; -i i '

aud;
procedure TForml.Button2Click(Sender: TObject); var U t : integer; i. bagin 1,\ : strtoint (Editl .Text) ; i I u tor,] .Width:=lat; ti and ; procedure TForml.Button3Click(Sender: TObject); var inalL : integer; bagin ii, 1r :=strtoint (Edit2 .Text) ; ii l n Lonl.Height:=inalt ; it 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 afiat meniul popup. Un meniu popup poate fi ataat la mai multe controale, cu ajutorul proprietii

PopupMenu a lui TControl.

177

Metode
M l.

Popup
procedure Pop up (A- Y: Integer); , Afieaz 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 afiat.

16. 4. TMenuItem
Conine proprietile metodelor necesare pentru a prelucra un item de meniu.

Ierarhie________________________________________________ _____
TObject -> TPersistent -> TComponent -> TMenuItem.

Definit n________________________________________________ __
menus

PI.

Caption
property Caption: string; Indic textul ataat unui item de meniu.

P2.

Items
property Itemsl/ne/ex: Integer]: TMenuItem; default; Furnizeaz acces la subitem-urile (submeniurile) unui meniu.

P3.

Count
property Count: Integer; Indic numrul de subitem-uri ale unui meniu.

E xem plu 1: Urmtoarea aplicaie tiprete etichetele ataate 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);
//tipresc in ListBox submeniurile itemului meniu

var i : integer; begin ListBoxl.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;

Exem plu 2: Urmtoarea aplicaie construiete - 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 subm eniurile item ului m eniu in subarborele de rdcin nod

var i : integer; fiu : TTreeNode; begin

179

i := 0;
// pentru fiecare subm cniu

while i < meniu.Count do begin


// creez un fiu in arbore

fiu := TreeViewl.Items .AddChild (nod, meniu.Items[i].Caption);


// apelez recuri v

AfiseazaMeniuri(meniu.Items[i], fiu); i := i + 1; end; end; procedure TForml.ButtonlClick(Sender: TObject); var i : integer; nod : TTreeNode; begin i := 0; while i < MainMenul.Items.Count do begin
// pentru fiecare m eniu din bara principala de m eniu // creez cate un nod in arbore

nod := TreeViewl.Items.A d d (nil,MainMenul.Items[i ].Caption);


// si apelez recursiv pentru subm cniuri

AfiseazaMeniuri(MainMenul.Items[i], nod); i := i + 1; end; end;

P4.

Hint
property Hint: string; Specific textul care apare cnd 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 lng 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:
V a lo a re S e m nifica ie N u apare nici o ruptur n m eniu. Aceast situaie este implicit. M eniul printe este rupt nc ntr-o coloan. Item ul curent va fi pus

mbNone mbBarBreak

n capul noii coloane. 0 existente.

bar separ noua coloan de cele deja

mbBreak

M en iul printe este rupt nc ntr-o coloan. Item ul curent va fi pus n capul noii coloane.

P8.

Menulndex
property Menulndex: Integer; Indic numrul de ordine al unui item (meniu) n cadrul meniului printe. Numrul de ordine al primului item (meniu) este 0.

P9.

Parent
property Parent: TMenuItem; Specific itemul printe al unui meniu.

P10.

ShortCut
property ShortCut: TShortCut Determin combinaia de taste pe care utilizatorul trebuie s o tasteze pentru a accesa un meniu mai rapid. De obicei, aceast combinaie 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 aplicaii fuzioneaz. 181

Aceast proprietate este util atunci cnd aplicaia are mai multe forme fiecare dintre acestea avnd 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 disprea 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 disprea 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 dect item-urile din bara principal a meniurilor, celelalte item-uri secundare ne-intrnd 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 dorii s le schimbai trebuie s tii c un item din bara principal de meniu are valoarea lui Grouplndex mai mare sau egal dect 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, respectndu-se ordinea cresctoarea a valorilor Grouplndex; dac unele item-uri din bara de meniu a formei secundare au acelai Grouplndex cu unele item-uri din bara de meniu a formei princi pale, atunci toate aceste item-uri (din meniul formei principale) vor disprea 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 acelai grup. n caz afirmativ, doar un item din grup poate fi selectat la un moment dat. n faa lui va aprea un cercule.

Metode
M l.

Add
procedure Add (Item: TMenuItem); Adaug un item de meniu la sfritul vectorului Items. procedure A dd(const fem s: array of TMenuItem); Adaug mai multe itemuri la sfritul vectorului Items.

182

M 2.

Delete
procedure Delett(Index: Integer); terge item-ul cu numrul de ordine Index, din cadrul meniului curent.

M 3.

Remove
procedure Rem o ve(ltem: TMenuItem); terge itemul Item din meniu.

M 4.

Insert
procedure Insert {Index: Integer; Item: TMenuItem); Insereaz Item pe poziia Index.

M 5.

IndexOf
function IndexOf(/?em: TMenuItem): Integer; Returneaz numrul de ordine al unui item n cadrul listei de itemuri a printelui su.

M 6.

Click
procedure Click; Simuleaz execuia unui click de mouse ca i cum utilizatorul l-ar fi executat. Handlerele de evenimente corespunztoare acestui eveniment sunt executate i ele.

Evenimente__________________________________________________
E l.

OnClick
property OnClick: TNotifyEvent; Apare cnd se execut click pe un item de meniu.

Exemplu: Urmtorul program construiete o bar principal de meniu. Pentru aceasta el folosete 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 crui apsare se adaug

183

la meniul existent un nou item avnd ca nume textul din cutia de editare). Valorile proprietilor obiectelor de pe forma Forml sunt:
object Editl: TEdit TabOrder = 0 Text = 'Editl' end object Buttonl: TButton Caption = 'Add' Default = True TabOrder = 1 OnClick = ButtonlClick end object MainMenul: TMainMenu end

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:


procedure TForml.ButtonlClick(Sender: TObject); var n o u :TMenuItem; begin nou := TMenuItem.Create(MainMenul) ; nou.Caption:=Editl.Text; Menu.11 ems.A d d ( nou); Editl.Clear; Editl.SetFocus; end;

S presupunem c avem construit bara principal a meniului:

File

Edit

Tools

Help

; [Edit?

Acum dorim s adugm submeniuri la unul dintre meniurile deja cre ate. Dorim s adugm itemuri la meniul File. Vom folosi aceleai componente ca i la exemplul anterior, doar att c aici vom aduga 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 printele, noului meniu adugat, care nu mai este M ainM enul , ci este F ile i , i linia n care se adaug meniul. Adugarea n continuare de subitemuri la (sub)itemurile curente se face la fel i va genera meniuri cu mai multe nivele ca n imaginea urmtoare:
View Customize (his Folder... Arrange icons Line Up Icons Refresh Paste

3 Properties

_ l i Folder Shortcut W irZ ip File J j] Text Document

r / 1 Bitmap Image ' i j W ave Sound y | Microsoft W ord Document

j? ] Other Office Documents...

Un item din bara principal a meniului poate fi ters (la momentul execuiei) n dou moduri: 1. Folosind metoda Delete:
Forml.Menu.Items.Delete(1);

care va terge itemul cu numrul 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 execuiei) tot n dou moduri. Presupunem c meniul File are item-urile: Open, Save, New,

Close.
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 numrul 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 n o u :TMenuItem; begin nou := TMenuItem.Create(Forml) ; nou.Caption:=Editl.Text; M e n u .Items.Insert(2,nou); end;

Inserarea unui item la meniul File se face n felul urmtor:


procedure TForml.ButtonlClick(Sender: TObject); var nou:TMenuItem; begin nou := TMenuItem.Create(Filei) ; n o u .Caption:=Editl.Text; Filei.Insert(0,nou); Editl.Clear; Editl.SetFocus; end;

Exemplu:
Urmtoarea aplicaie simuleaz un editor de text rudimentar. Acest editor const dintr-o cutie de editare multilinie (Memol ). Pe lng 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 fiier gol, Open este folosit pentru a deschide un fiier pentru editare, Save este folosit pentru a salva n fiier textul aflat la momentul actual n cutie, iar Find este folosit pentru a ne indica dac un ir de caractere este sau nu subir pentru textul din cutie. Dac a fost creat un nou fiier cu comanda New, atunci comenzile Save i New devin inoperante pn n momentul n care o schimbare intervine n cutia Memol (evenimentul OnChange). Pe form vom avea urmtoarele componente: 186 un meniu construit cu itemurile specificate anterior, n care utiliza torul poate introduce text; o cutie de editare multilinie (Memo]);

o component TOpenDialog n care utilizatorul introduce numele fiierului ncrcat; o component TSaveDialog n care utilizatorul introduce numele fiierului 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.Execute then Memol.Lines.LoadFromFile(OpenDialogI.FileName); end; procedure TForml.SavelClick(Sender: TObject); begin if SaveDialogl.Execute then Memol.Lines.SaveToFile(SaveDialogl.FileName); end; procedure TForml.NewlClick(Sender: TObject); begin Memol.Clear; Memol.SetFocus; Savel.Enabled:=false; Ne w l .Enabled:=false; end; procedure TForml.FindlClick(Sender: TObject); begin if FindDialogl.Execute then; end; procedure TForml.MemolChange(Sender: TObject); begin New l .Enabled:=true ; Savel.Enabled:=true; end; procedure TForml.FindDialoglFind(Sender: TObject); var i :integer; o k :boolean; begin for i:=0 to Memol.Lines.Count do if Pos(FindDialogl.FindText, Memol.Lines.Strings[i ]) <>0 then o k :=true; if not ok then ShowMessage('Nu exista1i else ShowMessage(1Exista'); end;

187

16.5. Funcii care prelucreaz meniuri


F I.

NewMenu
function Ne\vMenu(0uwr: TComponent; const AName: string; Items: array o f 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 ataat meniului. AName este numele meniului aa cum va fi el referit n cod. Alignment specific unde trebuie s apar meniul relativ la poziia mouse-ului. AutoPopup este true dac meniul apare la click - dreapta pe componenta ataat 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 ataat lui. AShorCut este combinaia de taste folosit pe post de scurttur. AChecked indic dac itemul de meniu este sau nu bifat. AEnabled indic dac itemul de meniu este sau nu disponibil pentru a fi
apsat.

AOnClick este handlerul evenimentului OnClick ataat itemului. AName este numele meniului aa cum apare el n cod.

188

F4.

NewSubMenu
function Ne wSubMenufconst A Caption: string; hCtx: Word; const AName: string; Items: array o f TMenuItem; AEnabled: Boolean): TMenuItem; Creeaz un item de meniu mpreun cu subitemurile ataate.

ACaption este eticheta ataat lui. AEnabled indic dac itemul de meniu este sau nu disponibil pentru a fi
apsat.

AName este numele meniului aa cum apare el n cod. Items este vectorul cu itemurile de pe primul nivel al submeniului.
Exem plu: Urmtoarea aplicaie construiete la momentul execuiei aplicaiei un meniu principal avnd trei itemuri de meniu. Metoda Eveniment repre zint handlerul de evenimente al itemurilor de meniu i trebuie declarat n seciunea public a clasei TForml.
uses menus , var Meniul_Principal : TMainMenu; bara_principala : array of TMenuItem; procedure TForml.Eveniment(Sender : TObject); begin / acest eveniment se executa l apasarea unui item de meniu / a 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); var i : integer; begin

' 189

/ eliberez memoria alocata / for i := 0 to 2 do bara_principala[i].Free; Finalize(bara_principala); Meniul_Principal.Free; end;

Exem plul 2: Urmtoarea aplicaie construiete o bar principal de meniu mpreun cu submeniurile drop-down ataate. Ataarea unui subitem la un item de meniu s-a fcut cu ajutorul metodei Add a itemului printe.
uses menus; var Meniul_Principal : TMainMenu; bara_principala : array of TMenuItem; bara_secundara : array of array of TMenuItem; procedure TForml.Eveniment(Sender : TObject); begin / acest eveniment se executa l apasarea unui item de meniu / a 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, j : integer; begin
/ / bara principala de meniu are 3 itemuri

SetLength(bara_principala,

3);

//fiecrui item din bara principala // ii corespunde un sir de subitemuri // acestea sunt stocate in vectorul bara_secundara

SetLength(bara_secundara, 3); for i := 0 to 2 do begin 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));;
/ / ataam submeniul itemului printe

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); var i,j : integer; begin / eliberez memoria alocata / for i := 0 to 2 do begin for j := 0 to 1 do bara_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:
Urmtoarea aplicaie construiete o bar principal de meniu mpreun cu submeniurile drop-down ataate. Ataarea unui subitem la un item de meniu s-a fcut cu ajutorul funciei NewSubMenu.
uses menus; var Meniul_Principal : TMainMenu; bara_principala : array of TMenuItem; bara_secundara : array of array of TMenuItem; procedure TForml.Eveniment(Sender : TObject); begin / acest eveniment se executa l apasarea unui item de meniu / a ShowMessage('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) ; / f e a e subitem de meniu are doua itemuri /icr for j := 0 to 1 do bara_secundara[i][j] := Newltem('SubM'+IntToStr(j ), 0, false, true, Eveniment, 0, 'SubMeniu '+IntToStr (j ) ) / ataarea submeniului l meniu s-a fcut cu ajutorul metodei SubMenu / a

191

bara_principala[i ] := NewSubMenu('File'+IntToStr(i) , 0, 'Meniu'+IntToStr(i ), bara_secundara[i]) end; Meniul_Principal := N e w M e n u ( F o r m l Meniu',bara_principala); end ; procedure TForml.FormClose(Sender: TObject; var Action: TCloseAction); var i,j : integer; begin / eliberez memoria alocata / for i := 0 to 2 do begin for j := 0 to 1 do bara_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. SCURTTURI
O scurttur este o combinaie de taste pe care utilizatorul o folosete pentru a efectua rapid o aciune (spre exemplu, apsarea unui item de meniu). O combinaie 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 combinaia de taste la apsarea creia se va executa handlerul eveni mentului OnClick.

17.1. TShortCut
Tipul TShortCut ofer o modalitate de a reprezenta aceste combinaii de taste sub forma unui numr ntreg. Tipul TShortCut este definit n unit-ul classes astfel:
TShortCut = Lo w (Word) .. High(Word);

17.2. THotKey

Este un control care permite utilizatorului s introduc i s vizualizeze o combinaie de taste ce va fi folosit ulterior pe post de scurttur.

Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TCustomHotKey -> THotKey.

Definit n_____________________________________________________
comctrls.pas

Pagina______________________________________________________
Win32

193

Proprieti___________________________________________________
P I.

HotKey
property HotKey: TShortCut; Conine combinaia curent de taste.

P2.

ln.valid.Keys
property InvalidKeys: THKInvalidKeys; Permite specificarea anumitor combinaii de taste care vor fi considerate invalide. Valori posibile pentru InvalidKeys sunt din mulimea:
V a lo a re S em nificaie Tastele simple, ftr modificatori, nu pot fi folosite pe post de hotkey. C om binaiile <Shift>+Tast sunt invalide. C om b inaiile <Ctrl>+Tast sunt invalide. Com b inaiile <Alt>+Tast sunt invalide. C om b inaiile <Shift>+<Ctrl>+Tast sunt invalide. Com b inaiile <Shift>+<Alt>+Tast sunt invalide. C om binaiile <Ctrl>+<Alt>+Tast sunt invalide. C om b inaiile <Shift>+<Ctrl>+<Alt>+Tast sunt invalide.

kcNone hcShift hcCtrl hcAlt hcShiftCtrl hcShiftAlt hc.CtrlAlt licShiftCtrlAlt

P3.

Modifiers
property Modifiers: THKModifiers; Specific tastele care vor fi folosite pe post de modificatori. Utilizatorul nu va mai fi obligat s introduc ntreaga combinaie de taste, ci doar tasta nemodificator. Valori posibile pentru Modifiers sunt una sau mai multe din urmtoarea mulime:
V a lo a re S em nificaie Tasta < Shift> va fi folosit drept modificator. Tasta < C trl> va fi folosit drept modificator. Tasta <A lt> va fi folosit drept modificator.

hkShift hkCtrl hkAlt

194

17.3. Funcii i Proceduri


F I.

ShortCut
function ShortCut(/ve>: Word; Shift: TShiftState): TShortCut; Creeaz i returneaz un shortcut (scurttur) pe baza combinaiei de taste Key + Shift.

F2.

ShortCutToKey
procedure ShortCutToKey(5AortCw/: TShortCut; var Key. Word; var Shift: TShiftState); Returneaz combinaia de taste (sub forma perechii Key, Shift) care alc tuiete scurttura ShortCut.

F3.

ShortCutToText
function ShortCutToText(5/ortCf: TShortCut): string; Convertete o scurttur ntr-un ir de caractere.

E xem plu: Urmtoarea aplicaie tiprete n componenta ListBoxl toate scurtturile itemurilor de meniu ale meniului principal al formei.
procedure TForml.TiparesteShortCut(meniu : TMenuItem); var
i : integer;

begin
L i s t B o x l .I t e m s . A d d (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 T F o r m l .ButtonlClick(Sender : TObject); var


i : integer;

begin
i := 0;

while i < M a i n M e n u l .Items.Count do begin


/ /pentru fiecare item din meniul principal Ti p a r e s teShortCut(MainMenul.I t e m s [i ]);

195

:= i

+ 1;

end; end;

F4.

TextToShortCut
function TextToShortCut(7eA7: string): TShortCut; Convertete irul Text (care conine o combinaie valid de taste) ntr-o scurttur.

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 reine doar pointeri la zonele de memorie n care sunt alocate elementele. TList este o clas care implementeaz o list general. Se pot face adu gri, inserri, tergeri de elemente n orice poziie. 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 secvenial. 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 adugri, inserri, tergeri, cutri, sortri, etc. de elemente.

Ierarhie______________________________________________________
TObject -> TList.

Definit n_____________________________________________________
classes.pas.

Proprieti___________________________________________________ PI.
Items
property ltems[lndex\ Integer]: Pointer;

Items este lista cu pointerii la obiecte.

P2.

Count
property Count: Integer; Returneaz numrul de obiecte din list.

197

Metode
M l.

Add
function Add (Item: Pointer): Integer; Adaug un nou obiect la sfritul listei.

M 2.

Assign
procedure Assign(LM : TList; AOperator. TListAssignOp = laCopy; ListB: TList = nil); Copiaz elementele unei liste n alt list. Dac parametrul ListB lipsete, atunci procedura Assign combin lista curent (referit prin Seif) cu lista ListA . Combinarea se face n funcie de valoarea parametrului AOperator. Dac parametrul ListB este prezent, atunci procedura Assign nlocuiete toate elementele listei curente (referit prin Seif) cu elementele listei ListA, iar apoi combin lista curent cu lista ListB. Combinarea se face n funcie de valoarea parametrului AOperator. Modurile posibile de combinare a dou liste (valorile parametrului AOperator) sunt:
V a lo a re E x p licaie Lista destinaie conine intersecia cclor do u liste. Suprascrie lista destinaie cu valorile listei surs. E lim in elementele listei destinaie care apar i n lista surs. Lista destinaie conine reuniunea celor dou liste. nlocuiete elementele listei destinaie cu elementele listei surs care nu apar n destinaie. Lista destinaie conine diferena sim etric celor do u liste.

laAnd laCopy laDestUnique laOr laSrcUnique laXor

M 3.

Insert
procedure Ins&rtdndex: Integer; Item: Pointer); Insereaz un obiect pe poziia Index n list. Primul element are numrul de ordine 0.

M 4.

Delete
procedure De\ete(Index: Integer); terge din list elementul de pe poziia Index.

198

M5.

Remove
function Remove(Item: Pointer): Integer; terge din list prima apariie a obiectului Item.

M 6.

Clear
procedure Clear; virtual; terge toate obiectele din list.

M 7.

IndexOf
function IndexOf(/rem: Pointer): Integer; Returneaz numrul de ordine al primei apariii a obiectului Item n list. Dac lista nu conine un asemenea obiect, atunci se returneaz-1.

M 8.

Move
procedure M o ve( Q< rind ex, Newltidex: Integer); Schimb poziia itemului de pe poziia Curlndex pe poziia Newlndex.

M 9.

Exchange
procedure Exchange(/n<r/<?x/, Index2: Integer); Schimb ntre ele dou elemente aflate pe poziiile Indexl i lndex2 n list.

E xem plu: Urmtoarea aplicaie genereaz, la apsarea butonului Buttonl, o list cu 10 elemente. La apsarea butonului Button2, sunt interschimbate dou elemente alese aleator din list.
procedure T Form l. B u t t o n l C l ic k (S en de r: T O b je c t); var i : in t e g e r ; p : ''in t e g e r ; begin L i s t a := T L is t.C r e a te ; // adaug 10 elemente aleatoare la lista for i := 1 to 10 do begin new ( p ) ; p~ := random (100); L i s t a . A d d( p ) ; end;

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; end; procedure TForml.Button2Click(Sender: TObject); var i, il, i2 : integer; begin
// aleg doua elemente la intam plare 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]~ ))); end;

M 10. Sort procedure Sort(Compare: TListSortCompare); A plic algoritmul de sortare Q u ic k so rt asupra elementelor unei liste. Funcia care compar dou obiecte din list are tipul TListSortCompare i trebuie furnizat de ctre programator. Tipul ei este:
TListSortCompare = function (Iteml, Item2: Pointer): Integer;

Funcia de comparare trebuie s ntoarc: valoare mai mic dect zero dac Iteml este mai mic dect Item2, zero dac Iteml este egal cu Item2, valoare mai mare dect zero, dac Iteml este mai mare dect Item2.

Urmtoarea aplicaie construiete o list care conine numere. La apsarea butonului Buttonl lista va fi construit i afiat n ListBoxl. La apsarea lui Button2 lista va fi sortat, afiat n ListBox2 i apoi distrus. Valorile proprietilor obiectelor de pe forma Forml sunt:
object Buttonl: TButton Caption = 'Adauga' end object Button2: TButton Caption = 'Sorteaza'

200

Enabled = False end

I Iandlerele de evenimente ale obiectelor de pe forma Forml sunt:


var Lista : 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 sortata for i := 0 to lista.Count - 1 do L is tB o x 2 . Item s .Add( In t T o S t r (in t e g e r ( L i s t a . I t e m s [ i]~) ) ) ; L is t a . C le a r ; // golete lista L i s t a . Free; //distruge lista end; procedure TForml.ButtonlClick(Sender; TObject); var i - integer; p : ^integer; begin Lista := TList.Create; for i := 1 to 10 do begin n e w ( ); 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 secvenial. D in 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 numrul 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 sfritul cozii.

M 2.

Peek
function Peek: Pointer; Returneaz un pointer la primul element din coad.

M 3.

Pop
function Pop: Pointer; Returneaz un pointer la primul element din coad dup care l terge.

202

Exem plu: Urmtoarea aplicaie construiete i afieaz coninutul unei cozi.


uses contnrs; 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;


// afiarea 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 vrful stivei. M 2.

Peek
function Peek: Pointer; Returneaz un pointer la elementul din vrful stivei.

M 3.

Pop
function Pop: Pointer; Returneaz un pointer la elementul din vrful stivei dup care l terge.

Exem plu: Urmtoarea aplicaie construiete i afieaz o stiv.


uses
c o n tn rs ;

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
s p i : T S ta c k ; : ''in t e g e r ; : in t e g e r ;

begin
// constructia stivei

:= T S t a c k .C r e a t e ;
1

for i := begin

to

10

do

new ( p ) ; p~ := r a n d o m (1 0 ); s .P u s h (p);

end;
// afiarea si tergerea stivei

while s .C o u n t > 0 do begin


p := S . P o p ; Show M essage( I n t T o S t r ( p A) ) ; d is p o s e ( p ) ;

end;
s .F r e e ;

end;

204

19. FIIERE, DIRECTOARE l DISCURI


n pagina Win3.1 a Paletei de Componente, exist un grup de compo nente destinate navigrii printre discurile, directoarele i fiierele 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 fiier din directorul curent. Proprietatea FileName stocheaz numele i calea fiierului curent selec tai. Componenta TFilterListBox permite specificarea unui filtru pentru fii erele afiate ntr-o component TFileListBox. Aceste componente pot fi conectate ntre ele, astfel nct modificrile 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 afia structura de directoare din discul curent selectat. Observaie: Aceste componente permit doar navigarea prin structura de discuri, directoare i fiiere, dar nu permit manipulare acestora (spre exemplu nu permit tergerea, redenumirea, adugarea de fiiere).

19.1. TFileListBox

fii

Este o cutie folosit pentru afiarea fiierelor dintr-un director.

Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TCustomListBox -> TFileListBox.

205

Definit n
filectrl.pas

Pagina______________________________________________________
Win3.1

Proprieti___________________________________________________ PI.
Directory

property Directory: string;


Determin directorul curent pentru cutia cu lista de fiiere. Pentru a afia fiierele din directorul dorit, modificai proprietatea Directory.

P2.

Drive

property Drive : char;


Specific pentru care unitate de disc se afieaz fiierele. Dac se schim b unitatea, se va schimba i directorul curent ale crui fiiere sunt afiate.

P3.

FileEdit

property F ile E d it: TEdit;


Indic cutia de editare (component de tip TEdit) n care sunt afiate numele fiierelor selectate.

Exemplu:
Urmtoarea aplicaie folosete componentele:

TFileListBox, pentru afiarea tuturor fiierelor dintr-un director;


cutie de editare {Editl), care va fi valoarea proprietii FileEdit, cutie de editare (Edit2), n care utilizatorul va introduce directorul pentru care se listeaz coninutul); un buton (Buttonl) de tip Default, cu ajutorul cruia se schimb directorul curent.

Valorile proprietilor componentelor de pe forma Forml sunt:


object Forml: TForml object FileListBoxl: TFileListBox FileEdit = Editl end

206

object Editl: TEdit Text = 1*.*' end object Buttonl: TButton Caption = 'Schimba Directorul' Default = True end object Edit2: TEdit Text = 'c :\ ' end end

I 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 fiierului selectat.

P5.

FileType
property FileT ype: TFileType; Specific atributele fiierelor care vor fi afiate ntr-o cutie cu lista de fiiere. Deoarece FileType este o mulime, valorile ei vor fi submulimi ale urmtoarei mulimi:
V a lo a re S em nificaie Se afieaz fiierele cu atributul read-only. Se afieaz fiierele cu atributul hidden. Se afieaz doar acele fiiere cu atributul system. Se afieaz doar num ele de volum . Se afieaz directoare. Se afieaz fiierele cu atributul archive. Se afieaz fiiere fr nici un atribut special.

ftReadOnly /[Hidden ftSystem ftVolumeID ftDirectory ft Archive /[Normal

207

P6.

Mask

property Mask : string;


Specific fiierele care pot fi afiate. Mask este o masc pentru fiiere, ce poate include i caractere speciale (spre exemplu *.cpp). Se pot specifica mai multe mti, care trebuie s fie desprite prin (spre exemplu *.cpp;*.pas).

Observaie:
Specificarea unei mti pentru fiiere se poate realiza mai simplu, folosind componenta TFilterComboBox.

P7.

ShowGlyphs

property ShowGlyphs : boolean;


Indic dac lng numele fiierului poate aprea i un bitmap care s indice tipul fiierului.

Observaie:
Pe lng aceste proprieti TFileListBox motenete o parte din proprie tile lui TCustomListBox, proprieti pe care le-am ntlnit i la

TListBox. Atenie:
Numele fiierelor dintr-un TFileListBox nu pot fi prelucrate (terse, create, sau modificate) cu ajutorul proprietii Items.

Metode______________________________________________________
M l.

Update

procedure Update;
Redeseneaz lista cu fiiere afiate n componenta TFileListBox curent. Aceast operaie este necesar atunci cnd un fiier este ters sau creat, cu ajutorul unei alte aplicaii (spre exemplu Windows Explorer).

Evenimente
E l.

OnChange

property O nC hange: TNotifyEvent;


208

Apare cnd coninutul cutiei se schimb. Spre exemplu, acest eveniment este generat cnd se schimb directorul pentru care componenta TFileListBox afieaz coninutul.

Exemplu:
Urmtoarea aplicaie seteaz tipul fiierelor afiate ntr-o component

TFileListBox.
Vom folosi o component TCheckListBox care are itemurile ReadOnly, Hidden, System, VolumeID, Directory, Archive, Normal indicnd care dintre atribute sunt active pentru fiierele afiate de FileListBoxl. V;ilori le proprietilor componentelor de pe forma Forml sunt:
object C h e c k L is tB o x l: T C h e c k L is tB o x
Ite m s . S tr in g s ' R e a d - O n ly ' 1H id d e n ' ' S yste m ' = (

' VolumeID'
1D ir e c t o r y ' 1A r c h iv e ' 1 o r m a l1) N

end

I landlerele de evenimente ale obiectelor de pe forma Forml sunt:


procedure T F o rm l. F o rm C re a te ( S e n d e r : T O b je c t) ; begin
F i l e L i s t B o x l . F ile T y p e := C h e c k L is t B o x l. C h e c k e d [6] [ ftN o r m a l] ;

:= true;

end; procedure T F o rm l. C h e c k L is t B o x lC lic k C h e c k ( S e n d e r : T O b je c t ) ; var


s ta re : T F ile T y p e ; [];

begin
s ta re :=

if C h e c k L is t B o x l. C h e c k e d ! 0] I daca itemul ReadOnly este bifat I then s t a r e := s t a r e + t f t R e a d O n l y ] ; if C h e c k L is tB o x l .C h e c k e d [1] / / daca itemul Hidden este bifat then s t a r e := s t a r e + [ f tH id d e n ] ; if C h e c k L is tB o x l .C hecked[2 ] // daca itemul System este bifat then s t a r e := s t a r e + [ ftS y s te m ] ; if C h e c k L is t B o x l. Checked [3 ] // daca itemul VolumeID este bifat then s t a r e := s t a r e + [ft V o lu m e lD ] ;

209

ii i i i i

if CheckListBoxl .Checked[4] //daca itemul Directory este b f t ia then stare := stare + [ftDirectory]; if CheckListBoxl .Checked[5] //daca itemul Archive este b f t ia then stare := stare + [ftArchive]; if CheckListBoxl .Checked[6] //daca itemul Normal este b f t ia then stare := stare + [ftNormal]; FileListBoxl-FileType := stare; end;

19.2. TDirectoryListBox
Afieaz 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 ____________________________________________ _____
W ild . 1

Proprieti PI.
Directory

property Directory : string;


Indic directorului a crui structur este afiat.

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 afiat structura de directoare.

P4.

FileList
property F ile L ist: TFileListBox; Leag o cutie cu lista de directoare ( TDirectoryListBox) cu o cutie cu lista de fiiere ( TFileListBox). Dup realizarea unei asemenea legturi, n TFileListBox vom avea fiierele 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), numrul de ordine Index. Primul director din list


are indicele 0. M 2.

OpenCurrent
procedure OpenCurrent; Deschide directorul curent. Metoda este echivalent cu executarea unui dublu click pe directorul respectiv.

M 3.

Update
procedure Update; Reafieaz lista cu directoare pentru a reflecta ultimele modificri.

Evenimente__________________________________________________
E l.

OnChange
property OnChange : TNotifyEvent; Apare cnd un nou director este selectat.

211

Exem plu: Urmtoarea aplicaie conine o component TDirectoryListBox, o com ponent TFileListBox ataat componentei TDirectoryListBox, o etichet Labell care afieaz numele i calea directorului curent i o cutie de editare multilinie care afieaz coninutul fiierului selectat din cadrul cutiei TFileListBox. Valorile proprietilor obiectelor de pe forma Forml sunt:
object DirectoryListBoxl: TDirectoryListBox DirLabel = Labell FileList = FileListBoxl end object Memol: TMemo ScrollBars = ssBoth end

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:


procedure TForml.FileListBoxlClick(Sender: TObject); begin if FileListBoxl.Itemlndex <> -1 then Memol.Lines.LoadFromFile(FileListBoxl.FileName); end;

19.3. TDriveComboBox
Afieaz unitile de disc disponibile n sistem i permite selectarea uneia dintre uniti.

Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomComboBox -> TDriveComboBox.

Definit n
jilectrl.pcis

Pagina
Win 3.1

Proprieti___________________________________________________
P I.

DirList
property DirList TDirectoryListBox; Face legtura ntre o cutie cu lista de directoare i o cutie de drivere ('TDriveComboBox). Cnd o nou unitate este aleas, este afiat 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 O nC hange: TNotifyEvent; Apare cnd utilizatorul alege o nou unitate.

E2.

OnDropDown
property OnDropDown : TNotifyEvent; Apare cnd utilizatorul apas sgeata din dreapta a componentei afind astfel o list drop-down.

Exem plu: Aplicaiei prezentate mai sus i atam o component TDriveComboBox pe care o vom lega de componenta DirectoryListBoxl. Pentru aceasta vom seta (la momentul proiectrii aplicaiei) proprietatea DirList la valoarea DirectoryListBoxl'.
object DriveComboBoxl: TDriveComboBox DirList = DirectoryListBoxl end

In urma acestei operaii navigarea se poate face prin toate discurile disponibile n sistem.

213

19.4. TFilterComboBox
Ofer posibilitatea utilizatorului s afieze i s manipuleze filtre pentru fiiere.

Ierarhie
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomComboBox -> TFilterComboBox.

Definit n
filectrl.pas

Pagina
Win3.1

Proprieti
P I.

FileList
property F ile L ist: TFileListBox; Conecteaz o cutie filtru cu o cutie cu list de fiiere ( TFileListBox).

P2.

Filter
property Filter : TFileListBox; Specific un filtru de fiiere. Pentru a crea un asemenea filtru sunt necesari urmtorii pai: introducei un text semnificativ pentru tipul de fiiere pe care l dorii (de exemplu Fiiere PAS), introducei caracterul | . Nu lsai nici un spaiu ntre ceea ce este nainte sau ceea ce este dup acest caracter, tastai masca de fiiere (de exemplu *.pas). De exemplu, pentru fiierele de tip cpp Filter poate conine urmtorul ir: Fiiere PAS|*.pas

Dac dorii mai multe mti, separai-le prin intermediul caracterului ; (De exemplu, n D elphi, la deschiderea unui fiier (meniul Open) avem o TComboListBox care poate deschide mai multe tipuri de fiiere ce pot avea extensiile *.pas,*.bpg,*.dpr,*.dpk. Pentru a realiza acest lucru Filter trebuie s conin textul Delphi files|*.pas;*.bpg;*.dpr;*.dpk .

214

Dac dorii mai multe filtre, atunci separai-le cu caracterul | (de exem plu, dac dorim s avem dou filtre, una pentru fiiere Delphi (cu extensiile *.pas,*.bpg,*.dpr,*.dpk) i una cu fiiere text (cu extensia (.txt).), atunci Filter trebuie s conin irul Delphi files|*.pas;*.bpg;*.dpr;*.dpk]Text files|*.txt Exem plu: Aplicaiei de la exemplul precedent i mai adugm pe form o compo nent TComboListBox la care setm proprietatea FileList la valoarea

FileListBoxl.
object FilterComboBoxl: TFilterComboBox FileList = FileListBoxl end

Observaie: Extensia implicit este *.*. P3.

Mask
property Mask : string; Returneaz irul folosit drept filtru.

Evenimente
E l.

OnChange
property OnChange : TNotifyEvent; Apare cnd un nou filtru este ales.

E xem plul 1: Urmtoarea aplicaie const dintr-un sistem de navigare prin structura de fiiere, directoare i discuri a calculatorului curent. Componenta TFileListBox are ataat o component de tip TPopUp care are un singur item cu numele Delete1. La apsarea acestuia fiierul selectat este ters. Valorile proprietilor obiectelor de pe forma Forml sunt:
object DirectoryListBoxl: TDirectoryListBox DirLabel = Labell FileList = FileListBoxl end

215

object FileListBoxl: TFileListBox PopupMenu = PopupMenul end object FilterComboBoxl: TFilterComboBox FileList = FileListBoxl end object DriveComboBoxl: TDriveComboBox DirList = DirectoryListBoxl end object PopupMenul: TFopupMenu object Deletel: TMenuItem Caption = 'Delete' end end

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:


procedure TForml. DeletelClick (Sender TObject); begin If FileListBoxl.Itemlndex = -1 then ShowMessage(1 Nici un fiier selectat') else if DeleteFile(FileListBoxl.FileName) then begin FileListBoxl.Update; ShowMessage('Fiierul a fost sters cu succes'); end else ShowMessage('Fiierul nu a putut fi sters'); end;

E xem plul 2: Dac dorim s tergem mai multe fiiere selectate, atunci va trebui s setm proprietatea MultiSelect la valoarea true. n aceast situaie nu avem la dispoziie o proprietate care s ne returneze itemurile selectate, de aceea le parcurgem pe toate i testm care sunt selectate i care nu (proprietatea Selected): Noul handler de evenimente pentru itemul Delete este:
procedure TForml.DeletelClick(Sender: TObject); var i : integer begin if FileListBoxl.Itemlndex = -1 then ShowMessage(1 Nici un fiier 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(Fiierul ' + 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 fiier pe disc.

Ierarhie______________________________________________________
TObject -> TStream -> THandleStrecim -> TFileStream.

Definit n____________________________________________________
classes.pas

Proprieti___________________________________________________
P I.

Position
property Position : integer; Specific poziia capului de citire/scriere n cadrul fiierului. Primul octet din fiier are Position = 0 .

P2.

Size
property Size : integer; Indic lungimea fiierului n octei.

Metode______________________________________________________
M l.

Read
function Read(var Bujfer; Count: Longint): Longint; Citete Count octei din fiier n irul Bujfer. Octeii sunt citii ncepnd din poziia indicat de proprietatea Position. Dup citire Position se va mri cu Count (n cazul n care nu se ajunge la sfrit de fiier).

M 2.

Write
function Write(const Bujfer; Count: Longint): Longint; Scrie n fiier Count octei 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:
V a lo a re S e m n ific aie

SoFromBeginning SoFromCurrent SoFromEnd

Offset este m ai mare sau egal cu 0 i este luat de la nceputul fiierului. Position va avea valoarea lui Offset. Position va deveni Position + Offset. Offset este mai m ic sau egal dect 0 i este luat fa de sfritul fiierului, deci Position va deveni Size-Offset.

M 4.

Create
constructor Create(const FileName: string; Mode: Word); Este constructorul clasei. FileName este numele fiierului care urmeaz s fie prelucrat. Mode este tipul prelucrrii i are ca valoare rezultatul aplicrii operatorului o r ntre modul de deschidere i modul de partajare. M odul de deschidere poate lua una dintre valorile:
V a lo a re S e m n ific a ie Creeaz un fiier. D ac acest fiier exist, atunci este deschis la scriere.

FmCreate FmOpenRead FmOpenWrite fmOpenReadWrite

Deschide un fiier la citire. Deschide un fiier la scriere. U n fiier deschis la scriere este mai nti vidat. Deschide un fiier i pentru citire i pentru scriere.

M odul de partajare poate lua una din valorile:


V a lo a re S e m n ific a ie Alte aplicaii nu pot deschide fiierul. Alte aplicaii pot deschide fiierul la citire dar nu i pentru scriere. Alte aplicaii pot deschide fiierul pentru scriere, dar nu i pentru citire. Alte aplicaii pot citi sau scrie n acest fiier fr nici o restricie

FinShare Exclusive fmSha reDeny Write finShareDenyRead finShareDenyNone

Observaie:
Manipularea fiierelor i a coninutului lor se mai poate face i cu ajutorul funciilor FileCreate, FileOpen, FileWrite, FileRead, FileClose.

218

Aceste funcii sunt definite n unitul system.pas. O alt categorie de funcii specializate pentru manipularea datelor unui fiier sunt cele clasice din Turbo Pascal: AssignFile, Reset, Rewrite, Read,

Write, CloseFile.

Exemplu:
Urmtoarea aplicaie const dintr-o form pe care sunt amplasate dou butoane. La apsarea lui Buttonl, n fiierul numere.txt sunt tiprite numerele de la 0 la 10. La apsarea lui Button2, sunt citite i afiate numerele din fiierul numere.txt.
procedure TForml.ButtonlClick(Sender: TObject); var f : TFileStream; sir : string i : integer; p : Pointer; begin f := TFileStream.Create('c :\numere.t x t fmCreate); for i := 0 to 9 do begin 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; begin f := TFileStream.Create('c :\numere.t x t f m O p e n R e a d ) ; getmem(p, 2); while f.Position < f.Size do begin .Read (p'1, 2 ) ; sir := string(p^); sir := trim(sir); / elimin s a i l de l inceputul s s a s t l r l i / ptie a i friu iuu ListBoxl.Items-Add(sir); end; f .Free; end;

219

19.6. Structuri i funcii utile pentru lucrul cu fiiere, directoare i discuri


n acest subcapitol sunt prezentate funcii i structuri de date utile pentru manipularea fiierelor i a numelor de fiiere.

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 Size Name Attr

- reprezint tampila de timp a fiierului. - este lungimea, n octei, a fiierului.


- este numele fiierului n format 8.3.

- sunt atributele fiierului; un fiier poate avea unul sau mai


multe atribute dintre urmtoarele (se combin cu ajutorul operatorului AND):
V a lo a re V a lo a re n u m e ric $00000001 $00000002 $00000004 $00000008 $00000010 S em nificaie Fiier Read-Only. Fiier ascuns. Fiier sistem. Identificator de volum . Director Fiier arhiv. Orice alt fiier.

FaReadOnly FaHidden FaSysFiie faVotumeID FaDirectoiy FaArchive FaAnyFile

$00000020
$0000003F

FindData - include informaii suplimentare la fiier.

19.6.2. Atributele fiierelor


F I.

FileAge
function FileAge(const FileName: string): Integer; Returneaz data crerii fiierului FileName. Valoarea ntoars de aceast funcie poate fi convertit la tipul TDateTime cu ajutorul funciei

FileDateToDateTime.
F2.

FileDateToDateTime
function FileDateToDateTime(F('/eDar<?: Integer): TDateTime; Convertete o valoare ntreag (timpul n format D O S ) ntr-un obiect de clas TDateTime.

F3.

FileGetAttr
function FileGetAttr(const FileName: string): Integer; Returneaz atributele fiierului FileName. Dac a aprut o eroare se returneaz -1.

F4.

FileSetAttr
function FileSetAttr(const FileName: string; Atir. Integer): Integer; Seteaz atributele fiierului FileName la valoarea Attr.

19.6.3. Cutare de fiiere


F5.

FileExists
function FileExists(const FileName: string): Boolean; Returneaz true dac exist fiierul FileName.

F6.

FindFirst
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; Returneaz primul fiier din calea Path, care are atributele specificate de Attr. Rezultatul este returnat n F. Dac a fost gsit un fiier cu atributele specificate atunci funcia returneaz valoarea 0. n caz contrar este returnat o eroare Windows.

221

F7,

FindNext
function FindNext(var F: TSearchRec): Integer; Returneaz urmtoarea apariie a unui fiier care are atributele specifi cate de anteriorul apel al lui FindFirst.

F8.

FindClose
procedure FindClose(var F: TSearchRec); Termin o secven de instruciuni FindFirst / FindNext. FindClose, apelul lui FindNext este invalid. Dup

E xem plu: Urmtoarea aplicaie numr cte fiiere cu extensia pas se afl n directorul curent.
procedure TForml.ButtonlClick(Sender: TObject); var NrFis : integer; F : TSearchRec; dir: string; begin NrFis := 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 fiierul cu numele Name n lista de directoare DirList. Direc toarele din aceast list trebuie s fie separate ntre ele prin Dac este gsit un fiier, atunci este returnat mpreun cu calea complet spre el.

222

19.6.4. Manipulri de fiiere


FIO .

DeleteFile
function DeleteFile(const FileName: string): Boolean; terge fiierul cu numele specificat. Returneaz true dac operaia reuete.

F II.

RenameFile
function RenameFile(const OldName, NewName: string): Boolean; Redenumete numele fiierul OldName n NewName. Returneaz true dac operaia se ncheie cu succes.

19.6.5. Manipulri de extensii


F12.

ChangeFileExt
function ChangeFileExt(const FileName, Extension: string): string; Schimb extensia fiierului FileName la Extension.

F13.

ExtractFileExt
function ExtractFileExt(const FileName: string): string; Returneaz extensia unui fiierului cu numele FileName.

Exem plu: Urmtoarea aplicaie afieaz ntr-o component TListBox toate exten siile fiierelor aflate n directorul curent.
procedure TForml-ButtonlClick(Sender: TObject); va r F : T S e a r c h Rec; dir: string; begin dir := GetCurrentDir; if F i n d F i r s t ( dir+'\*.*', faAnyFile, F) = 0 then begin L i s t B o x l .Items .Add(ExtractFileExt(F.Name)); w hile FindNext(F) = 0 do L i s t B o x l .I t e m s .Add(ExtractFileExt(F.Name)); end; FinaClose (F) end;

223

19.6.6. Manipulri de ci
F14.

ExtractFilePath
function ExtractRelativePath(const BaseName, DestName: string): string; Returneaz calea fiierului FileName, inclusiv caracterele (:) i (\ ).

F15.

ExtractFileDir
function ExtractFileDir(const FileName: string): string; Returneaz calea fiierului FileName. Ultimele caractere vor fi diferite de (:) i (\ ).

F16.

ExtractFileDrive
function ExtractFileDrive(const FileName: string): string; Returneaz driverul pe care se afl fiierul FileName.

F17.

ExtractFileName
function ExtractFileName(const FileName: string): string; Returneaz numele unui fiier dintr-un ir ce conine i calea i drive-ul.

F18.

ExpandFileName
function ExpandFileName(const FileName: string): string; Returneaz numele i calea complet a fiierului FileName. Acest lucru se face prin concatenarea directorului curent la numele fiierului dat ca parametru.

F19.

ExtractRelativePath
function ExtractRelativePath(const BaseName, DestName: string): string; Returneaz calea relativ a fiierului DestName la calea BaseName. Acest lucru se face prin eliminarea subirului comun lui DestName i BaseName i nlocuirea lui cu irul '..V.

224

F20.

ExtractShortPathName
function ExtractShortPathName(const FileName: string): string; Convertete calea i numele fiierului la formatul 8.3, adic numele fiierelor i directoarelor au cel mult 8 caractere, iar extensiile au cel mult 3 caractere.

19.6.7. Operaii asupra directoarelor F21.


GetCurrentDir
function GetCurrentDir: string; Returneaz directorul curent.

F22.

SetCurrentDir
function SetCurrentDir(const Dir. string): Boolean; Seteaz directorul curent la Dir. Funcia returneaz valoarea true dac operaia de schimbare a directorului a reuit.

F23.

CreateDir
function CreateDir(const Dir: string): Boolean; Creeaz directorul Dir.

F24.

ForceDirectory
function ForceDirectories(Dir: string): Boolean; n mod normal, sistemele de operare D O S i Windows nu permit crearea dect a unui singur director la un moment dat. Funcia ForceDirectories creeaz ntreaga cale de directoare specificat n irul Dir.

F25.

RemoveDir
function RemoveDir(const Dir: string): Boolean; terge directorul Dir. Funcia returneaz true dac operaia de tergere a reuit.

Atenie!
Directorul trebuie s fie vid nainte de a fi ters!

225

i ** ?*

\i

; -H i i j f

F26.

DirectoryExist
function DirectoryExists(/Vme: 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. Manipulri de discuri


F28.

DiskSize
function DiskSiz s(Drive: Byte): Int64; Returneaz capacitatea, n octei, a discului Drive. Funcia returneaz -1 dac discul nu exist.

F29.

DiskFree
function DiskFree(Drive: Byte): Int64; Returneaz numrul de octei liberi de pe discul Drive. Funcia retur neaz -1 dac discul nu exist.

226

20. ITEMURI
Cuvntul item eticheteaz o larg categorie de obiecte: iruri de caractere, imagini, etc. Mediul D elphi pune la dispoziia programatorului componente cu ajutorul crora acesta poate prelucra i afia aceste item-uri. Dintre acestea amintim: TListBox, TComboBox, TListView, TTreeView. TListBox este o component care afieaz itemuri dintr-o list de iruri de caractere. Accesarea itemurilor se face cu ajutorul proprietii Items. Se poate specifica numrul de coloane pe care acestea vor fi afiate cu ajutorul proprietii Columns. TComboBox combin o cutie de editare cu o list drop down. Lista drop down se acceseaz prin apsarea butonului - pe care este desenat o sgeat aflat la dreapta cutiei. Utilizatorul poate selecta un item din list sau poate scrie direct n cutia de editare. TListView permite afiarea 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 afiarea i prelucrarea unei liste cu item-uri. Aceste itemuri pot fi prelucrate att la momentul proiectrii aplicaiei (cu Objectlnspector care va afia un String List Editor), prin intermediul pro prietii Items, ct i la momentul execuiei aplicaiei, tot cu ajutorul acestei proprieti.

Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomListBox -> TListBox.

Definit n_______ _____________________________________________


stdctrls.pas

Pagina
Standard

227

Proprieti PI.
Columns

property Columns: Integer;


Specific numrul de coloane vizibile fr a avea un scrollbar orizontal. Im plicit este 0, ceea ce nseamn c nu este permis afiarea 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 arta n felul urmtor:
^na Cristina Maria loana Marcel Bianca <1 Raul Cosmin Timea Corina D an Marius 1

P2.

Items

property Items: TStrings;


Specific itemurile sub forma unor iruri de caractere. Aceast proprie tate este folosit pentru a aduga, insera, terge itemuri dintr-o list de itemuri. Folosii proprietile i metodele lui TString pentru a manipula aceste itemuri.

Exemplu:
Urmtoarea aplicaie 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 apsarea tastei <Enter>, textul aflat n cutia de editare va deveni un item al ListBox-ului.
procedure T F o r m l .B u t t o nlClick(Sender: TObject); begin B u t t o n l .Default:=true; B u t t o n l .Caption:='A d d ' ; L i s t B o x l .Items.Add(Editl.Text); Editl.Clear; E d i t l .S e t Focus; end;

228

Exemplu:
Urmtoarea procedur insereaz ntr-un TListBox zece item-uri repre zentnd numerele de la 1 la 10:
procedure TForml.ButtonlClick(Sender: TObject); var i : integer; begin for i := 1 to 10 do ListBoxl.Items.Add (IntToStr(i)) ; end;

P3.

Sorted

property Sorted: Boolean;


Specific dac item-urile din list sunt sortate alfabetic. Folosii ^orted pentru a sorta alfabetic item-urile din lista de item-uri. Dac Sorte4 este true, atunci adugarea sau inserarea unui item se va face cu respectarea ordonrii alfabetice existente. P4.

IntegralHeight

property IntegralHeight: Boolean;


Specific dac se pot afia i itemuri pariale. Dac IntegralHeight este

false atunci se poate afia doar o parte din Item', de exemplu, dacg un
item nu ncape s fie afiat ntreg n partea de jos a cutiei, atunci e va fj | afiat doar parial, putnd fi fcut n ntregime vizibil prin a c io ^ ,.^ scrollbar-ului vertical. P3.

Itemlndex

property Itemlndex: Integer;


Indic numrul 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 atribuii o valoare juj Itemlndex (n timpul execuiei programului), atunci itemul avnd num rul de ordine specificat va fi selectat. Dac sunt permise Multi-se|ectjj atunci Itemlndex va ntoarce numrul de ordine al itemului activ. P4.

Toplndex

property Toplndex: Integer;


Indic numrul de ordine al celui mai de sus item afiat.

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 numrul de item-uri selectate, dac sunt permise multiselecii. SelCount este ReadOnly. P8.

Selected

property Selected|7/it/ex: Integer]: Boolean;


Determin dac itemul cu numrul de ordine Index este selectat. n caz afirmativ se returneaz true, iar n caz contrar se returneaz false.

Exemplu:
Pentru a utiliza operaiile de inserare respectiv tergere de item-uri, vom realiza urmtorul program care conine dou forme. Pe prima form se gsesc: o component ListBox 1 la care vom aduga, insera i terge item uri; o cutie de editare Editl prin intermediul creia vom introduce item urile; un buton Buttonl care are titlul Add i la a crui apsare coninutul cutiei de editare va fi adugat ca ultim item al lui ListBox; un buton Button2 care are titlul Delete i la a crui apsare itemul selectat va fi ters; un buton Button3 care are titlu Insert i la a crui apsare va fi afiat o nou form ( Form2) care conine o cutie de editare n care utilizatorul introduce poziia n care va fi inserat (n ListBox) coninutul cutiei de editare de pe forma Form l. Butonul Buttonl de pe forma a doua va avea titlul Ok i va fi un buton Default la a crui

230

apsare se va produce operaia de inserare. Butonul Button2 de pe forma a doua va fi un buton numit Cancel folosit n cazul n care nu se mai dorete inserarea. La inserare se mai face un test: dac poziia pe care se insereaz este mai mare dect numrul total de item-uri din ListBox, atunci aceast operaie nu se mai execut. U n itl.p a s va conine urmtoarele handlere de evenimente.
procedure TForml.FormCreate(Sender: TObject); var ok : boolean; begin if not ok then begin Buttonl.Default:=true; Buttonl.Caption;='A d d 1; Button2 .Caption:= 1Delete '; 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 U nit2.pas va arta astfel:


procedure TForm2 .ButtonlClick(Sender: TObject); var nr ; integer; begin nr := StrToInt(Editl.Text); if nr <= Forml.ListBoxl.Items.Count then begin Forml.ListBoxl.Items.Insert(nr,Forml.Editl.Text); Form2 .Hide; Forml.Edi tl .SetFocus; end else Form2 .Editl.SetFocus;

231

E d i t l .Clear; end; procedure TForm2.Button2Click(Sender: begin F o r m 2 .Hide; F o r m l .E d i t l .SetFocus; end; TObject);

E xem plu: Urmtoarea aplicaie terge item-urile selectate (n acest caz este permis selectarea mai multor item-uri). Avem pe o form dou butoane, unul intitulat Add, iar cellalt intitulat Delete. Mai avem, de asemenea, i o cutie de editare E d itl i o cutie L istB oxl. La apsarea primului buton, coninutul cutiei E d itl va fi adugat ca item al cutiei L istB oxl. Vom selecta mai multe itemuri; la apsarea celui de-al doilea buton, itemurile selectate vor fi terse.
procedure T F orml.ButtonlClick(Sender: TObject); begin L i s t B o x l .I t e m s . A d d (Editl.T e x t ) ; end; procedure T F orml,Button2Click(Sender: TObject); va r i : integer; begin ListBoxl.ExtendedSelect := true; ListBoxl.MultiSelect := true; i := 0; w h i l e i < L i s t B o x l .Items.Count do if L i s t B o x l .Selected[i] then L i s t B o x l .I t e m s .Delet e ( i ) else i := i + 1; end;

Metode
M l.
C lear

p ro ced u re Clear; terge toate item-urile dintr-o cutie de listare (ListBox). M 2.


ItemRect

function ItemRect(/fem: Integer): TRect;

232

Returneaz dreptunghiul ce nconjoar itemul cu numrul 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 tru e, atunci ItemAtPos returneaz - 1 , iar dac Existing este false, atunci se returneaz indexul ultimului item + 1. E xem plu: Urmtorul exemplu folosete o component TListBox. Itemurile din ea se pot aduga la momentul proiectrii aplicaiei. La trecerea cursorului de mouse pe deasupra unui item, acesta devine selectat. Folosind programul precedent, vom mai scrie acum doar urmtoarea procedur:
procedure T F o r m l .ListBoxlMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);

var
p : Tpoint; n r : integer;

begin
ListBoxl.MultiSelect := false; p . x := X; p . y := Y; nr := L i s t B o x l .ItemAtPos(p, true) ; L i s t B o x l .Itemlndex := nr;

end;

Evenimente
E l.
OnDrawItem

p ro p e rty OnDrawItem: TDrawItemEvent; Apare cnd un item trebuie afiat. Tipul TDrawItemEvent este definit astfel: TDrawItemEvent = p ro c e d u r e(Control: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState) o f object;

233

TDrciwItemEvent include urmtorii parametri:


P a r a m e tr u C ontrol Index R ect State S e m n ific a ie R eferire le co n tro lu l c o n in n d item ul Indexul item u lu i C o o rd o n a te le d rep tu n g h iu lu i care in c lu d e item ul S ta re a item ului, care in d ic d ac item ul este selectat, b ifa t, fo calizat, etc.

E2.

O nM easureltem

p ro p e rty OnMeasureltem: TM easureltemEvent; Apare cnd un item trebuie afiat. Tipul TM easureltemEvent este definit astfel: TM easureltemEvent = p ro c e d u r ^(Control: TWinControl; Index: Integer; v a r Height: Integer) of object;
O nM easureltem este de tipul TM easureltemEvent care conine urmtorii

trei parametri:
P a ra m e tru C ontrol Index H eight S e m n ific a ie S p e c ific co n tro lu l c o n in n d item ul. S p e c ific a in d ex u l item ului S p e c ific n lim e a item ului

Parametrul Index identific poziia itemului n ListBox. Parametrul Height specific nlimea 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
TO bject -> TPersistent -> TComponent -> TControl -> -> TW inControl -> TCustomComboBox -> TComboBox.

234

Definit n________________________________________ _ __ stdctrls.pas

Pagina_____________________________________________________
Standard

Proprieti________________________________________ ____ PI.


D ropD ownCount

property DropDownCount: Integer;


Indic numrul maxim de item-uri care pot fi afiate fr a fi nevoie de un scrollbar vertical.

P2.

D roppedD ow n

property DroppedDown: Boolean;


Indic dac lista drop-down este afiat. La momentul execuiei ea poate fi afiat prin execuia unui click pe sgeata din dreapta controlului.

P3.

Itemlndex

property Itemlndex: Integer;


Indic numrul de ordine al itemului curent selectat (cel care este afiat 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 aduga sau terge itemuri folosind proprietile lui TStrings.

Exemplu:
Urmtoarea aplicaie adaug zece item-uri (constnd 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

235

ComboBoxl.Items.A

d d (IntToStr(i)) ;

end;
P5.
Style

property Style: TComboBoxStyle;


Specific modul de comportare a componentei ComboBox. Valorile pe care le poate lua Style sunt:
V a lo a r e S e m n ific a ie C re a z o list d ro p-dow n cu o cutie de editare, utilizatorul av n d p o sib ilita te a introducerii de text n cu tia de editare. C re az o list d ro p-dow n a vnd o cutie de e ditare n care u tilizato ru l nu p oate in tro d u ce m anual un text. C re az o cu tie de e ditare cu o c o m p o n e n t TLislBox sub ea. D im e n siu n ea acesteia d ep in d e d e p roprietatea Height. C re az o list dro p-dow n cu o cutie de editare, u tilizatorul a v n d p o sib ilitatea introducerii de tex t n c u tia de editare. Item u rile au d im e n siu n ea sp ec ifica t de p ro p rietate a hem H eight. C n d treb u ie s fie a fiat lista d ro p -d o w n cu item u ri, apare e v en im en tu l OnDrawItem. C re az o list d ro p-dow n cu o cutie de e d itare, u tilizatorul a v n d p o sib ilita te a in troducerii de te x t n cu tia d e editare. Item u rile au d im e n siu n e variab il. C nd treb u ie s fie afiat lista d ro p -d o w n , cu item uri, a p ar ev en im en tele OnDrawItem i OnM ensureltem.

csDropDown csD ropDownList csSimple

csO wnerD raw Fixed

csOwnerDrawVarible

Exemplu:
Urmtoarea componente construiete i gestioneaz afiarea unei Pentru aceasta folosim o component TPopupMenu ataat componentei TComboBox. Componenta TPopupMenu are item-urile:
TComboBox. A d d - folosit pentru a aduga un nou item la lista drop-down; D elete - pentru a terge item-ul curent selectat; View care conine dou subitem-uri (D ropD ow n i DropD ownList) folosite pentru a seta modul de comportare a TComboBox- ului.

aplicaie

La adugarea unui item se va afia 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 crui apsare se va nchide forma
Form2.

236

I landlerele de evenimente de pe forma F orm l sunt:


procedure T F o r m l .A d d l C l i c k (S e n d e r : T O b j e c t ) ;

begin if F o r m 2 .ShowModal = mrOk


then C o m b o B o x l .Items.A d d (Form2.E d i t l .T e x t );

nd;
procedure T F o r m l .Del e t e l C l i c k (S e n d e r : TObject); begin if C o m b o B o x l .Itemlndex <> -1 then C o m b o B o x l .Items.Delete(ComboBoxl.Itemlndex); end; procedure TForml.DropDownlClick{Sender: T O b j e c t ) ;

begin
<\miboBoxl.Style := csDropDown;

nd,
procedure TForml.DropDownListlClick(Sender: T O b j e c t ) ;

begin
('oinboBoxl.Style := csDropDownList;

end;

Handlerele de evenimente de pe forma Form2 sunt:


procedure T F o r m 2 .F o r m S h o w (S e n d e r : TObject); begin Rdi t l .Clear; F.ditl .SetFocus; end;

P6.

Sorted

p ro p e rty Sorted: Boolean; Indic dac item-urile din lista Items sunt sortate alfabetic. Setarea acestei proprieti la tru e va sorta alfabetic aceste item-uri.
VI. MaxLength

p ro p e rty MaxLength: Integer; Indic numrul maxim de caractere pe care utilizatorul le poate intro duce n cutia de editare a componentei TComboBox.

231

iM ti,

P8.

SelText

property SelText: string;


Reprezint textul selectat din cutia de editare ataat componentei TComboBox. Poziia primului caracter selectat precum i numrul de caractere selectate sunt returnate cu ajutorul proprietilor SelStart, respectiv SelLength. P9.
Canvas

property Canvas: TCanvas;


Furnizeaz accesul la suprafaa de desenare n momentul n care proprietatea Style are una din valorile c sO wnerD raw V ariable sau
csO w nerD raw Fixed.

Metode M l.
C lear

___________________________________________________

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 cnd se execut click pe sgeata din dreapta a unei componente TComboBox. n acest moment se deschide lista drop-down.

238

E3.

OnDrawItem

p ro p e rty OnDrawItem: TDrawItemEvent; Apare cnd un item trebuie afiat. Tipul TDrawItemEvent este definit astfel: TDrawItemEvent = pro ced u re( Cont rol: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState) of object; Semnificaia parametrilor acestui eveniment este:
P a ra m e tru C ontrol Index R ect State S e m n ific a ie C o n tro lu l care co n in e item -ul. Indexul item -ului. D rep tu n g h iu l care n c o n jo a r item -ul. S tarea item ului. P o ate fi selectat, b ifat sau are focus.

E4.

OnM easureltem

p ro p e rty OnMeasureltem: TMeasureltemEvent; Apare cnd un item trebuie afiat. Evenimentul O nM easureltem apare naintea evenimentului OnDrawItem. Tipul TM easureltemEvent este definit astfel: TM easureltemEvent = p ro c e d u r e(Control: TWinControl; Index: Integer; v a r Height: Integer) o f object; Semnificaia parametrilor acestui eveniment este:
P a ra m e tru C on trol Index H eigh t S e m n ific a ie C o n tro lu l care co n in e item -ul. In d ex u l item -u lu i. n lim e a d rep tu n g h iu l care n co n jo ar item -ul.

20.3. TColorBox
culoare.

TColorBox reprezint un combo box din care utilizatorul poate selecta o

Ierarhie
TO bject- > TPersistent- > TComponent- > TControl- >Twin Control

239

- >TCustom ListControl- >TCustom Com bo-> ->TCustom Com boB ox->TC ustom ColorBox->TC olorBox

Definit n_____________________________________________________
System .pas

Pagina_______________________________________________________
A dditional

Proprieti __________________________________________________
P I.
ColorsN am e

p ro p e rty ColorNames[/W ei': Integer]: string;


ColorN am es este folosit pentru a obine numele uneia dintre culorile din lista de culori existent n ColorBox. Proprietatea ne d numele culorii aflat pe poziia 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

p ro p e rty Colors [Index-. Integer]: TColor;


C olor este folosit pentru a obine 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.).

E xem plul 1: La apsarea unui buton s se coloreze forma n culoarea al crei indice va fi specificat. Vom folosi un buton B u tton l, o cutie ColorBox! i o cutie de editare E d itl n care vom meniona indicele culorii. Handlerele de evenimente ale obiectelor de pe forma F orm l sunt date de:
procedure T F o r m l .But t o n l C l i c k (S e n d e r : TObject) begin E d i t l .SetFocus; F o r m l .Color:=ColorBoxl.C o l o r s [strtoint(Editl.Text) ] ; end;

240

P3.

Style

p ro p e rty 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:
S ty le S em n ifica ie 16 culori co n stan te din unitul G rap h ics. A cestea su n t c o n sta n te (ex. clRed, clBlue ) ce re p re z in t v alo ri fixe R G B.

cbStandardColors

ColorBox a fiea z p rim ele

cbExtendedColors

ColorBox in clu d e clMedGray.

clM oneyGreen,

clSkyBlue,

clCream,

cbSystem Colors cblncludeN one cblncludeD efault

ColorBox in clu d e c o n sta n ta sim b o lic a culorii care reflect


v a lo a re a sp ec ifica t n W in d ow s C ontrol P anel.

ColorBox in c lu d e clNone. A c ea st o p iu n e are e fe c t nu m ai d a c Style in clu d e cbSystemColors ColorBox in clu d e clNone. A c ea st o p iu n e are e fe ct num ai d ac Style in clu d e cbSystemColors
P rim a n re g istra re conine o culoare Custom (obinuit).

cbCustomColor

C n d u tilizato ru l selecteaz n re g istra re a Custom, ColorBox afieaz un Color Dialog din care u tilizatorul s p o a t alege o cu lo a re p en tru Custom.

cbPrettyNames

ColorBox a fieaz cu lo rile n c uvinte i nu c a i constant, cu lo are de tip string. D e ex em plu, v a afia R ed n loc d e clRed.

P4.

Selected

p ro p e rty Selected: TColor; Specific culoarea curent selectat. Exem plul 2: La apsarea unui buton s se coloreze forma n culoarea selectat din
ColorBox.

Vom avea pe form un buton Buttonl i o cutie C olorB oxl. Handlerele de evenimente ale acestor obiecte sunt:
procedure T F o r m l .BitBtnlClick(Sender: TObject); begin
Forml.Color:=ColorBoxl.Selected;
en d ;

241

Metode M l.
A ddltem

procedure A ddltem (Item'. String; A O b ject : TObject);


Adaug un item n lista drop-down de itemi.

M2.

Clear

procedure Clear; override;


terge tot textul din cutia de editare i toi itemii din lista de itemi.

M3.

ClearSelection

procedure ClearSelection; override;


Deselecteaz orice item selectat din lista drop-down.

M4.

CopySelection

procedure CopySelection (D estination : 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 afiarea de item-uri ntr-o varietate de moduri.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> ->TCustomListView -> TListView.

Definit n_____________________________________________________
com ctrls.pas

242

Pagina
Win32

Proprieti_______________________________________________ PI.
Column

property Co\umn{Index: Integer]: TListColumn;


Indic coloana cu numrul 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 adugate i la momentul proiectrii aplicaiei cu ajutorul lui ListView Columns E ditor care apare pe ecran la dublu click pe proprietatea Columns din Objectlnspector.

P4.

ItemFocused

property ItemFocused: TListltem;


ItemFocused conine 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 conine lista itemurilor unei componente TListView. Aceste ite muri pot fi prelucrate i la momentul proiectrii aplicaiei prin dublu click pe proprietatea Items din Objectlnspector. Pe ecran va apare

ListView Items Editor:

243

a
Items N ew Item Item Properties Caption: Image Index: State Index:

OK

Cancel

Help

P6.

L argelm ages

p ro p e rty Largelmages: TCustomlmageList; Specific care list cu imagini este ataat ListView- ului curent. Aceast proprietate este valabil doar cnd proprietatea ViewStyle este setat la vslcon. Dac L argelm ages este nevid, atunci fiecare item are ataat o imagine. P7.
Sm alllm ages

p ro p e rty Smalllmages: TCustomlmageList; Specific care list cu imagini este ataat ListView- ului curent. Aceast proprietate este valabil doar cnd proprietatea ViewStyle este setat la vsSmalllcon. Dac Sm alllm ages este nevid, atunci fiecare item are ataat o imagine. P8.
M ultiSelect

p ro p e rty MultiSelect: Boolean; Indic dac utilizatorul poate selecta mai multe item-uri la un moment dat. Implicit este false. P9.
SelCount

p ro p e rty SelCount: Integer; Indic numrul de item-uri selectate la un moment dat. P10.
Selected

p ro p e rty Selected: TListltem;

244

Returneaz primul item selectat dintr-o component TListView. P il.


ShowColumnH eaders

p ro p e rty ShowColumnHeaders: Boolean; Este valabil doar dac ViewStyle are valoarea vsR eport i indic dac taburile reprezentnd capete de coloane sunt afiate. P12.
Topltem

p ro p e rty 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

p ro p e rty ViewStyle: TViewStyle; Specific modul n care sunt afiate item-urile unei ListView. Valori posibile pentru ViewStyle sunt:
V a lo a r e S e m n ific a ie F iecare item ap are c a un icon cu textul ata a t lui su b el. U tilizatorul l p o ate m u ta n orice a lt p o ziie n interiorul TListV iew -uM curent. Fiecare item ap are c a un icon cu textul a ta a t la d re a p ta lui. U tilizato ru l l p o ate m u ta n orice alt p o z iie n interiorul TListViewului curent. F iecare item ap are c a un icon cu o e tic h et la d re a p ta lui. Item -urile su n t a ran jate n co lo an e i nu p o t fi m utate n o ric e loc d in cadrul TListView- ului curent. F iecare item este a fiat p e p ro p ria lui linie. C e a m ai din stnga c o lo a n co n in e icon-ul item -u lu i m p re u n cu te x tu l a ta a t lut. Iar apoi, u rm to a re le co lo an e co n in u rm toarele su b ite m u ri (se tie c un su b item n u p o ate av ea la rndul su subitem -uri).

vslcon

vsSmalllcon

vsList

vsReport

P14.

SortType

p ro p e rty SortType: TSortType; Indic felul n care sunt aranjate item-urile dintr-un TListView. Valori posibile pentru SortType sunt:
V a lo a r e S e m n ific a ie N ici o so rtare n u are loc. Item -u rile s u n t so rta te cre sc to r pe b a z a p ro p rietii Data a lui TListltem. V a trebui im p le m e n ta t e v en im en tu l OnCompare.

stNone stData

245

i i t i f i i i i iii

?5 i i {-r f

V a lo a r e

S e m n ific a ie Item -u rile su n t so rtate co n fo rm p ro p rietii Caption a lui TListltem. Item -u rile su n t sortate c resctor p e b a z a p ro p rietilo r Data i Caption a lui TListltem. D ac e v en im en tu l OnCompare nu e ste im p le m e n ta t atunci el va fi ignorat.

stText stBoth

P15.

HotTrack

p ro p e rty HotTrack: Boolean; Indic dac item-urile sunt luminate n momentul n care cursorul de mouse trece pe deasupra lor.

Metode
M l.
Arange

p ro ced u re Arrange(CW e: TList Arrangement); Aranjeaz item-urile ntr-o ListView. Valori posibile pentru Code sunt:
V a lo a r e S e m n ific a ie A lin ia z item -u rile d e -a lungul m uchiei in ferio are a ferestrei. A lin ia z item -u rile d e -a lungul m u ch iei d in stn g a a ferestrei. A lin ia z item -u rile de-a lungul m uchiei din d re a p ta a ferestrei. A lin ia z item -u rile d e -a lungul m uchiei su p erio are a ferestrei.

arAlignBottom arAlignLeft arA lignRight arAlignTop

M 2.

FindCaption

function 'mdCwption(StartIndex: Integer; Value : string; Partial, Inclusive, Wrap: Boolean): TListltem; Returneaz item-ul care are ataat eticheta Value. Cutarea se face ncepnd de la item-ul Startlndex. Dac item-ul nu este gsit, atunci se returneaz nil. Dac Wrap este tru e, atunci, dac item-ul nu este gsit, cutarea se continu de la nceputul listei. M 3.
G etltem At

function GetItemAt(X, Y?Integer): TListltem; Returneaz item-ul aflat la poziia (X, Y) fa de colul din stnga sus al cutiei TListView-ului.

246

M 4.

G etN earestltem

function GetNearestItcm(Po//i?: TPoint; D irection : TSearchDirection):


TListltem; Returneaz cel mai apropiat item de punctul Point. Cutarea se poate face n direciile: sus (sdAbove), jo s (sdB ellow ), dreapta (sdRigth), stnga (sdLeft ) sau n toate direciile(srM//). M 5.
Scroll

procedure ScrolKDX, DY: Integer);


Defileaz coninutul ferestrei cu D X respectiv D Y pixeli. M 6.
U pdateltem

procedure U pdatcltem s( First Index, L astlndex : Integer);


Redeseneaz
L astlndex].

item-urile

avnd

indexul

intervalul

[Firstlndex,

M 7.

IsEditing

function IsEditing: Boolean;


Indic dac un item oarecare este n curs de editare.

Evenimente__________________________________________________ E l.
OnChange

property OnChange: TLVChangeEvent;


Apare cnd un nou item este selectat sau proprietile 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 cnd un item este ters. Tipul TLVDeletedEvent este definit astfel: TLVDeletedEvent = procedure(Sender: TObject; Item: TListltem) of object;

247

E3.

O nlnsert

property Onlnsert: TLVDeletedEvent;


Apare cnd un nou item este inserat. E4.
O nCom pare

property OnCompare: TLVCompareEvent;


Apare cnd dou item-uri trebuie comparate pentru sortare. Tipul TLVCom pareEvent este definit astfel: TLVCompareEvent = pvocedurc(Sender: TObject; Item l, Item2: TListltem; D a ta : Integer; var Com pare : Integer) of object; Item-urile comparate sunt Item l i Item2. Dac Item l este mai mic dect Item2, atunci valoarea lui Com pare trebuie setat la o valoare negativ. Dac Item l este egal cu ltem 2 , atunci valoarea lui Com pare trebuie setat la valoarea zero. Dac Item l este mai mare dect Item2, atunci valoarea lui Com pare trebuie setat la o valoare strict pozitiv. E5.
OnEditing

property OnEditing: TLVEditingEvent;


Apare cnd utilizatorul ncepe s editeze eticheta ataat 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, setai la false valoarea lui
AllowEdit.

E6.

O nEdited

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 cnd utilizatorul staioneaz cteva momente deasupra unui item. Tipul TLVlnfoTipEvent este definit astfel: TLVInfoTipEvent = p ro ced u r e(Sender: TObject; Item . TListltem; v a r InfoTip: string) of object; E8.
O nData

p ro p e rty OnData: TLVOwnerDataEvent; Apare nainte ca un item s fie afiat. Tipul TLVOwnerDataEvent este definit astfel: LVOwnerDataEvent = p ro c e d u r e(Sender: TObject; hem: TListltem) of object; Pentru ca acest eveniment s apar trebuie ca proprietatea O wnerD ata s fie true.

20.5. TListltems
Este lista de item-uri ce apar ntr-o component TListView.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TListltems

Definit n_____________________________________________________
com ctrls.pas

Proprieti___________________________________________________
P I.
Count

p ro p e rty Count: Integer; Indic numrul de item-uri din cadrul vectorului Item. P2.
Item

p ro p e rty ltem[Index: Integer]: TListltem; Furnizeaz acces la item-urile unei liste prin intermediul numrului de ordine al item-ului. Primul item are numrul de ordine 0.

249

P3.

Owner

property Owner: TCustomListView;


Returneaz componenta TListView care manipuleaz item-urile din
TListltems.

_ Metode____________________________________________ _
M l.
A dd

function Add: TListltem; Adaug un item la sfritul listei. M 2.


D elete

p ro ced u re Delet e(Index: Integer); terge item-ul cu numrul de ordine Index, din cadrul listei curente. M 3.
C lear

p ro ced u re Clear; terge toate item-urile din cadrul listei curente. M 4.


Insert

function Jnscrt(I/idex: Integer): TListltem; Insereaz un item pe poziia Index. Acesta va putea fi apoi accesat cu ajutorul proprietii Items. M 5.
IndexO f

function IndexOMValue: TListltem): Integer; Returneaz numrul de ordine al item-ului Value n cadrul listei de item uri.

250

20.6. TListltem
Este o clas care ncapsuleaz proprietile, metodele i evenimentele specifice unui item dintr-o list TListltems.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TListltem

Definit n_____________________________________________________
com ctrls.pas

Proprieti___________________________________________________ PI.
Caption

property Caption: string;


Indic textul care eticheteaz un item.

P2.

D ata

property Data: Pointer;


Reprezint datele asociate item-ului.

P3.

Checked

property Checked: Boolean;


Indic dac un semn de bifare apare n stnga item-ului.

P4.

Focused

property Focused: Boolean;


Indic dac item-ul are focus.

P5.

Imagelndex

property Imagelndex: TImageIndex;


Specific numrul de ordine a imaginii (n cadrul unei componente TImageList) care este ataat ca icon item-ului curent. Dac proprietatea TListView. ViewStyle este vslcon, atunci Imagelndex este indicele ima ginii din lista ataat proprietii TListView.Largelmages, n caz contrar indicele este din lista TListView.Smalllmages.

251

P6.

Index

p ro p e rty Index: Integer; Indic numrul de ordine al unui item n cadrul TListltems. Primul item are numrul de ordine 0. P7.
S elected

p ro p e rty Selected: Boolean; Specific dac item-ul este selectat. P8.


Subitems

p ro p e rty Subitems: TStrings; Specific lista de subitem-uri ataat item-ului curent. Folosii proprie tile lui TStrings pentru a manipula aceast list. P9.
ListView

p ro p e rty ListView: TCustomListView; Indic componenta de tip TListView care conine item-ul curent. Proprietatea este R eadO nly. P10.
O wner

p ro p e rty Owner: TListltems; Indic componenta de tip TListltems care conine item-ul curent. Proprietatea este ReadO nly. P il.
Statelndex

p ro p e rty Statelndex: TImageIndex; Indic care imagine din TListView: :Statelm ages este asociat cu item-ul curent.

Metode_____________________________________________________ _
M l.
D elete

p ro ced u re Delete; terge item-ul care o apeleaz.

252

M 2.

G etPosition

function GetPosition: TPoint; Returneaz coordonatele colului din stnga sus al unui item n cadrul unei componente TListView. M 3.
SetPosition

p ro c e d u re SetPosition(const Value : TPoint); Seteaz colul din stnga sus al item-ului la poziia Value n cadrul componentei TListView. Controlul trebuie s aib proprietatea ViewStyle setat la vslcon sau vsSmalllcon. M 4.
M akeVisible

p ro ced u re MakeVisibleffYzrZ/a/OA': Boolean); Defileaz lista cu item-uri pn cnd item-ul care apeleaz aceast m etod devine vizibil/parial vizibil. M 5.
U pdate

p ro ced u re Update; Redeseneaz un item. Acest lucru este necesar dac item-ul i-a schimbat proprietile (Icon, C aption . ..) M 6.
D isplayR ect

function DisplayRect(Coafe: TDisplayCode): TRect; Returneaz dreptunghiul care mrginete item-ul. Valori posibile pentru Code sunt:
V a lo a r e drB ou nds d r lro n d rL a b el S e m n ific a ie R etu rn e az d rep tu n g h iu l care m rg in ete n treg item -ul inclusiv icon-ul i eticheta. R etu rn e az d rep tu n g h iu l care m rg in ete icon-ul item -ului. R etu rn e az d rep tu n g h iu l care m rg in ete e tic h eta item -ului. R etu rn e az d rep tu n g h iu l care m rg in ete n tre g item -ul inclusiv icon-ul i etic h eta , e x clu z n d coloanele. n c az u l V iew Style este vsR eport.

d rSelectB oun ds

253

20. 7. TTreeView
Permite afiarea 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 printele lor. Arborele reprezentat ntr-o component TTreeView poate fi accesat cu ajutorul proprietii Items care este de tipul TTreeNodes. Aceast clas manipu leaz arborele ca un tot. Accesarea unui nod particular din arbore se face cu ajutorul proprietii Item a clasei TTreeNodes. Fiecare nod al arborelui este un obiect de tipul TTreeNode. Un nod din arbore are ataat un text (proprietatea Text) i eventual o imagine (proprietatea Imagelndex - care indic numrul de ordine al unei imagini din cadrul unei componente TImageList).

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomTreeView -> TTreeView.

Definit n__________________________________________________ _
com ctrls.pas

Pagina_______________________________________________________
Win32

Proprieti PI.
Indent

____________________________________________

property In d e n t: integer;
Indic numrul de pixeli care sunt folosii pentru indentare n cazul expandrii 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 proiectrii aplicaiei cu

254

ajutorul TreeV iew Item s E ditor, care este afiat la dublu click pe proprietatea Items din O bject Inspector:

OK

..-C ancel'" j 1 -

Heip

Butoanele N ew ltem i N ewSubltem adaug cte un nod frate/fiu la nodul curent selectat. E xem plul 1: U rmtoarea procedur afieaz n ListB oxl textul ataat nodurilor arborelui reprezentat n componenta TreeView 1:
procedure TForml.ButtonlClick(Sender : T O b ject) ; var
i : integer;

begin
for i := 0 to T r e e V i e w l .I t e m s .Count - 1 do L i s t B o x l .Items.Add(TreeViewl.I t e m s .Item[i].Text); end;

E xem plul 2: Urmtorul exemplu pune la dispoziia utilizatorului - n momentul n care acesta execut click pe un nod al arborelui - informaii despre acest nod, i anume: textul ataat; numrul fiilor; indicele absolut; indicele relativ (n cadrul listei fiilor printelui); nivelul pe care se afl n arbore; nodul printe (pentru nodurile de pe nivelul 0 printe este considerat chiar T reeV iew l.

Aceste informaii sunt afiate ntr-o cutie de tip TListBox. Un nod poate fi selectat i cu ajutorul tastelor <Up>, <Down>, deci dac

255

dorii ca aceste informaii s le obinei i cnd v plimbai prin arbore cu ajutorul sgeilor, copiai coninutul acestui handler n handlerul ataat evenimentului O nKeyPres (nlocuind bineneles 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, printe : TTreeNode; begin nod := TreeViewl.GetNodeAt(X, Y ) ; if nod = nil then ShowMessage('Nici un nod selectat!') else begin ListBoxl.Clear; ListBoxl.Items.Add('Text 1 + nod.Text); ListBoxl.Items .Add ('Numar fii : '+ 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)); printe := nod.Parent; if printe <> nil then ListBoxl.Items.Add('Printe:'+parinte.Text) else ListBoxl.Items.Add('Printe: TreeViewl'); end; end;

P3.

Selected

p ro p e rty S e le c te d : TTreeNode; Specific nodul selectat dintr-o component TTreeView. Nodul selectat este ncadrat ntr-un dreptunghi colorat. P4.
RightClickSelect

p ro p erty R ightC lickSelect: boolean; Indic dac proprietatea Selected returneaz noduri selectate cu butonul din dreapta al mouse-ului.

256

P5.

ShowButtons

p ro p e rty ShowButtons : boolean; Indic dac butoanele (+), (-) apar n partea stng a fiecrui nod cmc are subnoduri. Dac ShowButtons este true, atunci acesie Iniiiuiiii' vor aprea i la apsarea lor nodul respectiv se va expanda sau colapsn. P6.
ShowLines

p ro p e rty ShowLines : boolean; Indic dac sunt afiate liniile care leag un nod printe de nodurile fii. P7.
ShowRoot

p ro p e rty S h o w R o o t: boolean; Indic dac sunt afiate liniile care leag nodul root de restul nodurilor. P8.
Topltem

p ro p e rty T o p lte m : TTreeNode; Indic cel mai de sus nod vizibil. P9.
Images

p ro p e rty Images : TImageList; Reprezint lista cu bitmap-urile ce se afieaz la stnga nodurilor unui TTreeView. Unui nod i se poate ataa o imagine fie la momentul proiectrii aplicaiei (prin intermediul lui TreeView Item s E ditor) fie la momentul execuiei aplicaiei prin intermediul proprietii
TTreeN ode::Imagelndex.

Exem plu: S exemplificm puin lucrul cu aceste proprieti. Construim un arbore (n componenta T reeV iew l) Ia momentul proiectrii aplicaiei. Tot la momentul proiectrii aplicaiei construim i un meniu Popup (cu meniurile AfiseazaLinii, AfiseazaRadacina, AfiseazaButoane, Indent, NodulSelectat, NodulDinVarf, care corespund proprietilor ShowLines, ShowRoot, ShowButtons , Indent, Selected i Topltem) pe care l atam la T reeV iew l. Itemurile de meniu NodulSelectat i N odulDinVarf vor afia valorile proprietilor Selected i Topltem, iar meniul Indent va afia o fereastr de dialog n care uilizatorul este solicitat s introduc o valoare pentru

257

proprietatea Indent. Valorile proprietilor obiectelor de pe forma F orm l sunt:


object PopupMenul: TPopupMenu object AfiseazaRadacinal: TMenuItem

Caption = ' AfiseazaRadacina' Checked = True


end object AfiseazaLiniil: TMenuItem

Caption = ' AfiseazaLinii Checked = True


end object AfiseazaButoanel: TMenuItem

Caption = ' AfiseazaButoane1 Checked = True


end object Indent1: TMenuItem

Caption = 'Indent'
end object Noduldinvarf1: TMenuItem

Caption = 'Nodul din varf


end object NodulSelectatl: TMenuItem

Caption = 'Nodul Selectat'


end end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml. AfiseazaRadacinalClick(Sender: TObject); begin AfiseazaRadacinal.Checked := not AfiseazaRadacinal.Checked; TreeViewl.ShowRoot := not TreeViewl.ShowRoot; end; procedure TForml. AfiseazaLiniilClick(Sender: TObject); begin AfiseazaLiniil.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); var NrSir : string ; begin

InputQuery(' Cutie de dialog', 'Introduceti numrul 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 = nil then ShowMessage('Arbore vid') else ShowMessage('Nodul din varf are eticheta ' + nod.Text);
end; procedure TForml.NodulSelectatlClick(Sender: TObject); var

nod : TTreeNode;
begin

nod := TreeViewl.Selected; if nod = nil then ShowMessage('Nici un nod selectat!') else ShowMessage('Nodul selectat are eticheta + nod.Text);
end;

Metode
M l.
AlphaSort

function A lphaS ort: boolean; Sorteaz nodurile n ordine alfabetic dup eticheta ataat fiecruia. M 2.
FullC ollapse

p ro c e d u re FullCollapse; Colapseaz toate nodurile dintr-o structur arborescent. Vor rmne afiate doar nodurile de pe primul nivel. Instruciunea:
TreeViewl.FullCollapse;

va colapsa arborele din cutia T reeV iew l. M 3.


FullExpand

p ro c e d u re FullExpand; Expandeaz toate nodurile. Fiecare (sub)nod apare sub nodul printe. Dac ShowButtons este tru e, atunci toate caracterele (+) sunt transfor mate n (-).

259

Instruciunea:
TreeViewl.FullExpand;

va expanda arborele din cutia T reeV iew l. M 4.


LoadFromFile

p ro ced u re Lo ad F ro m F iIe (F(7eAfa//1e : string); ncarc o structur de noduri dintr-un fiier cu numele FileName. M 5.
SaveToFile

p ro ced u re SaveToFile( FileName : string); Salveaz o structur de noduri ntr-un fiier cu numele FileName. Forma n care se salveaz un arbore este urmtoarea (un fiu apare indentat fa de printele lui): a aa ab aba abb abc ac M 6.
G etN odeAt

function GetNodeAt(X, Y : integer) : TTreeNode; Returneaz nodul gsit la poziia (X , Y). Coordonatele sunt calculate fa de colul din stnga sus al cutiei TtreeView (care are coordonatele (0,0)). E xem plu: Urmtoarea aplicaie returneaz eticheta ataat nodului aflat la poziia n care este apsat butonul mouse-ului. Vei observa c un nod va fi detectat chiar dac punctul unde mouse-ul este apsat este la dreapta nodului sau la stnga lui:
procedure TForml.TreeViewlMouseDown(Sender: TObject;

Button: TMouseButton,Shift: TShiftState; X, Y: Integer);


var

nod : TTreeNode;
begin

nod := TreeViewl.GetNodeAt(X, Y); if nod <> nil

260

then ShowMessage('A fost selectat nodul cu eticheta 1 +

nod. Text)

end;
M 7.
G etH itTestlnfoAt

function GetHitTestInfoAt(X, Y: Integer): THitTests; Returneaz poziia punctului de coordonate (X,Y) fa de controlul TTreeView i fa de nodurile din arborele pe care l conine. Valorile returnate de funcie sunt:
V a lo a r e h tA bove htB elow htT oR ight htToLeft htN ow here S e m n ific a ie Pu n ctu l se g sete d e asu p ra co n tro lu lu i TTreeV iew . Punctul se g sete su b controlul TTreeV iew . Pu n ctu l se g sete la d re a p ta c o n tro lului TTreeV iew . P u n ctu l se g sete la stn g a co n tro lu lu i TT reeV iew . P u n ctu l se g sete n interiorul controlul TT reeV iew , d a r su b ultim ul nod. P u n ctu l se g sete p e b itm ap -u l sau pe e tic h e ta a so c ia t unui no d Punctul se g sete p e bu to n u l a so c ia t nodului. P u n ctu l se g sete pe b itm ap -u l a so c ia t unui nod. P u n ctu l se g se te pe in d en tarea unui nod. P u n ctu l se g sete pe e tic h eta (tex tul) ata a t unui nod. Pu n ctu l se g sete la d re a p ta unui nod.

htO n hem htO nButton htO n lcon htO n lndent htO n L abel htO nR ight

Evenimente__________________________________________________
E l.
O nColapsing

p ro p e rty OnCollapsing: TTVCollapsingEvent; Apare cnd un nod este pe cale s fie colapsat. Tipul TTVCollapsingEvent este definit astfel: TTVCollapsingEvent = p ro c e d u r e(Sender: TObject; Node: TTreeNode; v a r AllowC ollapse: Boolean) o f object;
N ode este nodul pe cale de a fi colapsat. Setai A llow C ollpase la false pentru a nu permite colapsarea nodului Node.

261

E2.

O nC ollapsed

p ro p e rty OnCollapsed: TTVExpandedEvent; Apare dup ce un nod al arborelui a fost colapsat. Tipul TTVExpandedEvent este definit astfel: TTVExpandedEvent = p ro ced n re(Sender: TObject; Node: TTreeNode) o f object; N ode este nodul colapsat. E3.
OnExpanding

p ro p e rty OnExpanding: TTVExpandingEvent; Apare cnd un nod este pe cale de a fi expandat. Tipul TTVExpandingEvent este definit astfel: TTVExpandingEvent = procedure(5enrfer: TObject; Node: TTreeNode; v ar AllowExpansion: Boolean) o f object;
N ode este nodul care urmeaz s fie expandat. Setai AllowExpansion la false pentru a nu permite expandarea nodului Node.

E 4.

OnExpanded

p ro p e rty OnExpanded: TTVExpandedEvent; Apare cnd un nod al arborelui este expandat (dac are fii). Tipul TTVExpanded este definit astfel: TTVExpandedEvent = procedureCSenc/er TObject; Node: TTreeNode) of object; N ode este nodul expandat. E xem plu: Urmtoarea aplicaie va afia un mesaj sugestiv n momentul n care apar evenimentele O nC ollapsed, O nCollapsing, OnExpanded i
OnExpanding:

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.TreeViewlCollapsed(Sender: TObject;

Node: TTreeNode);
begin

ShowMessage('Nodul cu eticheta '+Node.Text + ' a fost colapsat');


end;

262

procedure TForml.TreeViewlCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean); begin

ShowMessage('Nodul cu eticheta '+Node.Text + ' va fi colapsat');


end; procedure TForml.TreeViewlExpandedlSender: TObject;

Node: TTreeNode);
begin

ShowMessage('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;

Exem plu: Urmtoarea aplicaie afieaz ordinea n care vor fi expandate i colapsate nodurile arborelui reprezentat n componenta T reeV iew l. Vom folosi dou butoane (B uttonl i Button2) care vor realiza colapsare respectiv expandare ntregului arbore (evenimentele O nCollapsed, O nC ollapsing , OnExpanded i OnExpanding sunt implementate ca n aplicaia precedent). Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Buttonl: TButton

Caption = 'Colapseaza'
end object 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 cnd un nod este ters. E6.
OnEditing

property OnEditing: TTVEditingEvent;


Apare cnd textul ataat 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;
N ode este nodul care este editat. Setai A llow E dit la false pentru a nu permite editarea textului ataat nodului Node.

E7.

O nEdited

property OnEdited: TTVEditedEvent;


Apare dup ce textul ataat unui nod a fost editat. Tipul TTVEditedEvent este definit astfel: TTVEditedEvent = procedure(Se/ifer: TObject; N ode: TTreeNode; var S: string) of object;
N ode este nodul al crui text a fost editat, iar S este noua valoare a textului ataat nodului.

E8.

OnChanging

property OnChanging: TTVChangingEvent;


Apare cnd selecia (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; Setai valoarea lui AllowChange la false pentru a nu permite ca nodul actual s fie deselectat. E9.
O nChanged

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 mouseului. Pentru a intercepta acest fel de schimbare implementai eveni mentul OnM ouseUp. Tipul TTVChangedEvent este definit astfel: TTVChangedEvent = p ro c e d u r e(Sender: TObject; Node: TTreeNode) o f object; N ode este noul nod selectat.

Exemplu:
Urmtoarea aplicaie intercepteaz selectarea unui nou nod reprezentat ntr-o component TTreeView. Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:
procedure TForml. TreeViewlChange(Sender: TObject;

Node: TTreeNode);
begin

ShowMessage('A fost selectat nodul cu eticheta + Node.Text) ;


end; procedure TForml.TreeViewlMouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


var

nod : TTreeNode;
begin

nod := 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 funcionalitatea unei liste cu nodurile unei structuri arborescente.

Ierarhie_________________________ ____________________________
TO bject -> TPersistent -> TTreeNodes

Definit n_____________________________________________________
com ctrls.pas

265

Proprieti PI.
Count

property Count: Integer;


Numr nodurile unei structuri arborescente.

P2.

Item

property Item [Index: Integer]: TTreeNode;


Returneaz nodul cu numrul de ordine Index.

P3.

O wner

property Owner: TCustomTreeView;


Indic componenta de tip TTreeView, proprietar a listei curente de noduri.

Metode_____________________________________________________ _ M l.
A dd

function Add(N ode: TTreeNode; const S: string): TTreeNode;


Adaug un nod arbore la sfritul listei de noduri din care face parte N ode (pe acelai nivel n arbore). Dac Node este fiu al root-ului, atunci nodul adugat va fi ultimul element al listei nodurilor fiu a root-ului, deci pe acelai nivel cu Node. S este valoarea proprietii Text al nodului nou adugat.

M2.

A ddF irst

function AddFirst(AWe: TTreeNode; const S: string): TTreeNode;


Adaug Node ca prim element al listei nodurilor din care face parte, (deci pe acelai nivel n arbore ca i Node).

M3.

A ddC hild

function AddChild(Node: TTreeNode; const S: string): TTreeNode;


Nodul Node este adugat ca i ultim fiu al lui Node.

266

M4.

AddF irstChild

function AddChildFirst(AWe: TTreeNode; const S: string): TTreeNode; Nodul N ode este adugat ca i prim fiu al lui Node. M 5.
Insert

function Insert(AWe: TTreeNode; const S: string): TTreeNode; Insereaz nodul care apeleaz aceast metod dup nodul N ode , pe acelai nivel. M 6.
D elete

p ro ced u re Delete(Node: TTreeNode); terge nodul specificat, mpreun cu fii si. M 7.


C lear

p ro c e d u re Clear; terge toate nodurile dintr-un arbore. M 8.


BeginU pdate

p ro ced u re BeginUpdate; Blocheaz redesenarea cutiei care afieaz un arbore n cazul unei modificri (inserare, tergere) aprute n structura acestuia. Acest lucru ajut la mrirea vitezei de lucru n cazul prelucrrii arborilor. Repermiterea redesenrii arborelui se face cu EndUpdate. M 9.
EndU pdate

p ro ced u re EndUpdate; Repermite desenarea arborelui dup o execuie a unor operaii de modificare a acestuia. Se apeleaz neaprat dup BeginUpdate. E xem plu: Urmtoarea aplicaie construiete (ntr-o component TTreeView) un arbore binar complet cu un numr fixat de nivele (care este citit dintr-o cutie de editare).

267

Valorile proprietilor obiectelor aflate pe forma F orm l sunt:


object Buttonl: TButton

Caption = ' ConstruiesteArbore'


end object Editl: TEdit

Text = '2'
end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


var

nivele : integer; {$R *.DFM}


procedure TForml.ConstruiesteArbore(nod : TTreeNode;

niv : integer); / a e s aprocedura t e u e declarata i seciunea public /cat rbi n


var

NodNou : TTreeNode;
begin if 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); var rdcin : TTreeNode; begin

nivele := StrToInt(Editl-Text); TreeViewl.Items.BeginUpdate; TreeViewl.Items-Clear; / e garborele e i t n / tr xset rdcin := TreeViewl.Items .Add (nil,' 0 ' ; ) //rdcin a b r l i roeu ConstruiesteArbore(rdcin, 1); TreeViewl.Items.EndUpdate; TreeViewl .FullExpand; / a i e /f
end;

20.9. TTreeNode
Reprezint un nod din cadrul listei cu noduri a unei componente
TTreeNodes.

Ierarhie
TO bject -> TPersistent -> TtreeNode

268

Definit n
com ctrls.pas

Proprieti___________________________________________________ PI.
A bsolutelndex

property Absolutelndex : integer;


Indic indicele absolut al unui nod n lista de noduri. Primul nod din list are indexul 0.

P2.

Count

property C o u n t: integer;
Indic numrul 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 avnd 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 H asC hildren: 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 printe.

P7.

IsVisible

property IsV isible: boolean;

269

**** HtWMwwMtf+t HHUmmnn w

ttm

m N #

Indic dac un nod este vizibil ntr-o cutie de afiare. Un nod se consi der a fi vizibil dac are indicele 0 sau dac toi prinii lui sunt expandai.

P8.

Item

p ro p e rty Item [Index integer] : TTreeNode; Furnizeaz acces la nodul cu indicele Index din cadrul listei de noduri fiu al nodului curent.

P9.

Level

p ro p e rty L e v e l: integer; Indic nivelul n arbore al nodului care a apelat aceast proprietate. Nodul cel mai de sus (root) are nivelul 0, toi fii lui au nivelul 1, .a.m.d.

P10.

Parent

p ro p e rty P a re n t: TTreeNode; Identific nodul printe al nodului care a apelat aceast proprietate.

P il.

Selected

p ro p e rty S e le c te d : boolean; Determin dac nodul curent este selectat.

P12.

Text

p ro p e rty T e x t: string;
Text este textul asociat unui nod.

P13.

D ata

p ro p e rty D a ta : pointer; Pointeaz spre o structur de date asociat nodului curent.

P14.

TreeView

p ro p e rty TreeV iew : TCustomTreeView; Indic componenta TTreeView care afieaz acest nod.

270

Metode
M l.
Collapse

p ro c e d u re Collaps e(Recurse: Boolean); Colapseaz un nod. Dac Recurse este tru e, toi fiii acestui nod sunt colapsai, iar la urmtoarea expandare a nodului respectiv fiii vor fi colapsai. Dac Recurse este false, fiii nu sunt colapsai, iar la urmtoarea expandare a nodului respectiv, fiii acestuia vor avea aceasi stare ca i nainte de apelul Collapse. M 2.
Expand

p ro ced u re Expand (Recurse: Boolean); Expandeaz un nod. Dac Recurse este tru e , atunci toi fiii acestui nod sunt expandai. M 3.
D elete

p ro c e d u re Delete; terge nodul care o apeleaz, mpreun cu fiii acestuia. De asemenea este eliberat ntreaga memorie asociat nodurilor terse. M4.
D eleteChildren

p ro c e d u re DeleteChildren; terge toi fiii nodului care o apeleaz i elibereaz memoria asociat. M 5.
G etF irstC hild

function GetFirstChild: TTreeNode; Returneaz primul fiu al nodului care o apeleaz. Dac acesta nu are fii, se retumez nil. M6.
G etLastChild

function GetLastChild: TTreeNode; Returneaz ultimul fiu al nodului care o apeleaz.

M 7.

GetNext

function GetNext: TTreeNode; Returneaz urmtorul nod al listei de noduri, indiferent dac acesta este sau nu vizibil. M 8.
G etPrev

function GetPrev: TTreeNode; Returneaz precedentul nod al listei de noduri, indiferent dac acesta este sau nu vizibil. M 9.
GetNextSibling

function GetNextSibling: TTreeNode; Returneaz urmtorul nod (vizibil sau nu) aflat pe acelai nivel cu cel care apeleaz aceast metod. M 10. GetPrevSibling function GetPrevSibling: TTreeNode; Returneaz precedentul nod (vizibil sau nu) aflat pe acelai nivel cu cel care apeleaz aceast metod. M I I . G etN extVisible function GetNextVisible: TTreeNode; Returneaz urmtorul nod vizibil. M 12. G etPrevV isible function GetPrevVisible: TTreeNode; Returneaz precedentul nod vizibil. M 14. IndexO f function IndexOf(Va/e: TTreeNode): Integer; Dac Value este fiu al nodului care a apelat aceast metod, atunci IndexO f returneaz indicele acestuia. Primul copil are indicele 0. Dac nu, se returneaz -1 .

272

M 15. M akeVisible p ro ced u re MakeVisible; Face un nod vizibil. Dac acesta nu este vizibil, atunci toi prinii si vor fi expandai pentru ca acest nod s fie vizibil. M 16. M oveTo p ro ced u re MoveTo (Destination: TTreeNode; M ode: TNodeAttachMode); M ut un nod. Modul n care se face aceast mutare depinde de valoarea lui M ode. Valori posibile pentru M ode sunt:
V a lo a r e N aA dd S e m n ific a ie A d a u g nodul care o ap eleaz la sfritul listei de noduri, c o n fo rm m eto d ei Add. A d a u g nodul care o ap eleaz la n c e p u tu l listei, conform m eto d ei AddFir.st. A d a u g nodul care o ap eleaz la sfritul listei n o d u rilo r fii ai no d u lu i D estin ation , c o n fo rm m etodei A ddC h ild. A d a u g a n o d u l c o n fo rm m eto dei A ddF irstC h ild. In se re az n o d u l co n fo rm m etodei Insert.

naA ddF irst

n a A d d C h ild na A d d C h ild F irst n a ln se rt

M 17. AlphaSort function AlphaSort: Boolean; Sorteaz cresctor nodurile copii ale nodului curent. Sortarea se face pe baza proprietii Text. M 18. D isplayR ect function DisplayRect(7ex9/i/y: Boolean): TRect; Returneaz dreptunghiul care mrginete un nod din arbore. Dac TextOnly este tru e, atunci este returnat doar dreptunghiul care ncon joar textul unui nod, n caz contrar este returnat ntreaga linie (din cadrul lui TTreeView ) pe care se afl nodul curent. M 19. EditText function EditText: Boolean; Permite utilizatorului s editeze textul ataat unui nod. Dup apelarea acestei metode n locul textului apare o csu de editare care conine

textul ataat nodului respectiv. M 20. EndEdit p ro ced u re EndEdit(Cance/: Boolean); ncheie editarea textului ataat 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, clD kG ray, clFuchsia, clG ray, clGreen, clLime, clLtG ray, clM aroon, clN avy , clOlive, clPurple, clRed, clSilver, clTeal, clWhite, i clYellow), fie cu sistemul de culori definit de C o n tro l P anel (clA ctiveB order, clActiveCaption, clAppW orkSpace,
clBackground, clBtnFace, clBtnHighlight, clBtnShadow, clBtnText, clCaptionText, clGrayText, clHighlight, clHighlightText, clInactiveBorder, clInactiveC aption, cllnactiveCaptionText, clMenu, clMenuText, clScrollBar, clW indow, clW indowFrame, i clWindowText).

Totodat, o culoare se poate specifica sub forma unui numr pe 4 octei. Ultimii trei octei specific intensitile pentru sistemul RGB (Red, Green, Blue), astfel, valoarea 00FF0000 reprezint albastru cu intensitate maxim, 0000FF00 reprezint verde cu intensitate maxim, 000000FF reprezint rou cu intensitate maxim, OOFFFFFF reprezint culoarea alb, iar 00000000 reprezint culoarea neagr.

21.2. Funcii pentru prelucrarea culorilor


F I.
ColorToIdent

function ColorToIdent( Color: Longint; v a r Ident: string): Boolean; Dup apel, Ident va conine numele culorii C olor (spre exemplu, clBlack, clW indow). Dac culorii respective nu-i este ataat o cons tant, atunci funcia returneaz false.

275

F2.

IdentToC olor

function IdentToColor(const Ident: string; v a r Color: Longint): Boolean; Dup apel, C olor va conine culoarea reinut n Ident sub forma unui ir de caractere reprezentnd numele constantei de culoare (exemplu: clW hite , clWindowText). F3.
ColorToRGB

function ColorToRGB (Color: TColor): Longint; Returneaz culoarea Color n format RGB. Asta nseamn neglijarea informaiei 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, clW indowText) care s identifice culoarea Color, atunci este returnat aceasta. n caz contrar, este returnat, 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 repre zentat 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 ________________________________________________
TO bject -> TPersistent -> TGraphic

Definit n_____________________________________________________
graphics.pas

276

Proprieti_________________________ __________________________
P I.
H eight

p ro p e rty Height: Integer; Specific nlimea, n pixeli, a imaginii. Fiecare obiect grafic trebuie s i defineasc propriile lui funcii de tip G et i Set pentru accesarea i setarea valorii acestei proprieti. P2.
Width

p ro p e rty Width: Integer; Specific limea, n pixeli, a imaginii. Fiecare obiect grafic trebuie s i defineasc propriile lui funcii de tip G et i Set pentru accesarea i setarea valorii acestei proprieti. P3.
Empty

p ro p e rty Empty: Boolean; Indic dac obiectul are o imagine ncrcat n el. Proprietatea este R ead Only. Fiecare obiect grafic, descendent din TGraphic trebuie s i defineasc propria lui metod de tip G et pentru a accesa valoarea acestei proprie ti.

Metode______________________________________________________
M l.
LoadFromFile

p ro ced u re LoadFromFile(const FileName: string); Citete fiierul cu numele FileName i i ncarc coninutul ntr-un obiect grafic. M 2.
SaveToFile

p ro ced ure SaveToFile(const FileName : string); Salveaz imaginea grafic ntr-un fiier.

277

Evenimente
E l.
OnChange

p ro p e rty OnChange: TNotifyEvent; Apare de fiecare dat cnd imaginea grafic se schimb. E2.
O nProgress

p ro p e rty OnProgress: TProgressEvent; Apare cnd imaginea grafic se schimb ncet (ncrcare, transformare etc.). Tipul TProgressEvent este definit astfel: TProgressEvent = p ro ced u re (Sender: TObject; S tage: TProgressStage; P ercentD one: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string) of object; unde: Stage este de tip: TProgressStage = (psStarting, psRunning, psEnding); i indic unde ne aflm: la nceputul schimbrii, n timpul schim brii, sau la sfritul schimbrii;
PercentD one indic aproximativ cam ct la sut din transformare s-

a realizat;
R edraw N ow indic dac imaginea poate fi desenat pe ecran;

R specific poriunea din imagine care s-a schimbat i trebuie redesenat;


M sg conine un mesaj specificnd tipul de transformare care este

executat. Descendenii acestei clase pot genera evenimentul O nProgress prin apelarea metodei P rogress (care este de tip protected). Deoarece TGraphic nu are reprezentare n Com ponent P alette , progra matorul trebuie s atribuie el nsui un handler de evenimente la momentul execuiei aplicaiei.

278

21.4. TBitmap
Un bitm ap 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______________________________________________________
TO bject -> TPersistent -> TGraphic -> TBitmap

Definit n_____________________________________________________
graphics.p a s

Proprieti___________________________________________________
P I.
Canvas

p ro p e rty Canvas: TCanvas;


Canvas furnizeaz acces la suprafaa de desenare a bitmap-ului.

P2.

M onochrome

p ro p e rty Monochrome: Boolean Indic dac bitmap-ul va afia monocrom imaginea pe care o conine. P3.
Handle

p ro p e rty Handle: HBitmap; Este un handle - la obiectul de tip bitmap - folosit n apeluri ale func iilor API. P4.
HandleType

p ro p e rty HandleType: TBitmapHandleType; Indic dac bitmap-ul este de tip DDB (D evice D ependent B itm ap ) sau DIB (D evice Independent Bitm ap). Bitmap-urile de tip DDB se dese neaz mai rapid pe ecran, iar cele de tip DIB sunt stocate n memorie ntr-un format standard recunoscut de ctre toate dispozitivele, inclusiv imprimante.

279

P5.

ScanLine

p ro p e rty ScanLine]/?ovv: Integer]: Pointer; O imagine n formatul bitmap este stocat ca o matrice de pixeli. Este astfel posibil accesarea rapid - prin intermediul proprietii ScanLine - a fiecrei linii a acestei matrici. Proprietatea este folosit doar pentru bitmap-uri de tip DIB. E xem plu: Urmtoarea aplicaie adaug 20 de uniti la culoarea fiecrui pixel al unui bitmap.
p ro c e d u re var

T F o r m l.ButtonlClick(Sender: TObject);

i, j : Integer; b : TBitMap; P : PByteArray;


b e g in i f O pen P i c tureDialogl.Execute th e n b e g in

:= TBitMap.Create;

/ / inc.arc o im agin e dintr-un fi ie r

b.LoadFromFile(OpenPictureDialogl.FileName); f o r i := 0 t o b.height -1 d o //pen tru fie c a re linie


b e g in

P := b.ScanLine[i]; f o r j := 0 t o b.width -1 d o
P[j] end; := p [ j ] + 20; / / a d au g 20 la v aloarea fie c ru i pixel

Canvas .Draw (0 , 0, b) ; / / d esen ez im agin ea in coltu l din stan ga sus a fo rm e i b .F r e e ; //e lib e re z m em oria
end; end;

Metode
M l.
LoadFrom Resource

p ro ced u re LoadFromResourceID(/n.s*mce: THandle; ResID: Integer); ncarc un bitmap dintr-o resurs ntr-un obiect de tip TBitmap. Identifi catorul de resurs, pentru bitmap, n cadrul modulului executabil Instance este ResID.

280

M2.

LoadFrom ResourceName

p ro c e d u re 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) W indows.

Ierarhie______________________________________________________
T O bject -> TPersistent -> TGraphic -> Tlcon

Definit n_____________________________________________________
graphics

Proprieti___________________________________________________ PI.
Handle

p ro p e rty Handle: HIcon; Este un handle - la obiectul de tip icon - folosit n apeluri ale funciilor - API.

21.6. TMetaFile
O imagine poate fi stocat n dou modaliti: bitmap i metafile.
Bitmap-ul este, n majoritatea cazurilor, o reprezentare ineficient a unei imagini. Pur i simplu stocheaz culoarea fiecrui pixel n parte. M etafde, 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 afiare. Intern, un metafile este un vector de structuri care conin primitivele folosite pentru desenarea imaginii. TMetaFile ncapsuleaz un metafile mbuntit.

281

Ierarhie
TO bject -> TPersistent -> TGraphic -> TmetaFile

Definit n_____________________________________________________
graphics.p a s

Proprieti___________________________________________________ PI.
M M H eight

property MMHeight: Integer;


Indic nlimea obiectului metafile n uniti de 0,01 milimetrii. Aceast proprietate ofer o mai mare acuratee i o independen fa de dispo zitivul cu care a fost creat imaginea metafile.

P2.

MM Width

property MMWidth: Integer;


Indic limea obiectului metafile n uniti de 0,01 milimetrii. Acest proprietate ofer o mai mare acuratee i o independen fa de dispozi tivul 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 aplicaiei sau al programatorului care a creat acest metafile. Proprietatea este Read-Only.

21.7. TJpeglmage
Delphi pune la dispoziia programatorilor clasa TJpeglm age pentru stocarea i manipularea imaginilor JPG i JPEG. Aceast clas nu are repre zentare n ComponentPallete.

282

Folosind proprietile i metodele ei i componenta Thnage putei construi o component de afiat imagini JPG.

I e r a r h i e ______________________________________________
TO bject -> TPersistent -> TGraphic -> TJpeglmage.

Definit n_____________________________________________________
jpeg.pas

Proprieti___________________________________________________ PI.
Com pressionQ uality

property CompressionQuality: TJPEGQualityRange;


Indic raportul dintre calitatea imaginii i mrimea fiierului n care este stocat imaginea. Tipul TJPEGQualityRange este un domeniu cuprins ntre 1 i 100. O calitate mare indic un fiier mare, iar o calitate mic un fiier mic.

P2.

GrayScale

property Grayscale: Boolean;


Indic dac imaginea jpeg va fi afiat alb negru sa color. O afiare alb negru este folosit n cazul n care se dorete vitez mare de afiare.

P3.

Height

property Height: Integer;


Indic limea, n pixeli, a imaginii jpeg.

P4.

Width

property Width: Integer;


Indic nlimea, 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 TJPEGPerformance definit astfel: tipul

type TJPEGPerformance = (jpBestQuality, jpBestSpeed);


P6.
PixelForm at

property PixelFormat: TJPEGPixelForm;


Specific numrul de bii folosii pentru a reprezenta un pixel. Valori posibile pentru PixelForm at sunt date de TJPEGPixelFormat = (jf24Bit, jffiBit). P7.
Scale

property Scale: TJPEGScale;


Indic dimensiunile imaginii cnd aceasta este afiat. Valori posibile pentru Scale sunt:
V a lo a r e jsF u llS ize S e m n ific a ie Im ag in ea este a fiat ia d im eniunile originale. Im ag in ea este a fiat la ju m ta te din dim en siu n ile iniiale. T im pul de afiare este de a sem en ea ju m ta te din cel ne ce sar afirii la d im e n s iu n ile o riginale. Im a g in e a e ste a fiat la un sfe rt din d im e n siu n ile iniiale. T im p u l de afiare e ste de a sem en ea un sfert din cel n e ce sar afirii la d im e n siu n ile o rig in ale. Im a g in e a este a fiat la 1/8 din dim en siu n ile iniiale. T im pul de afiare este d e ase m e n e a 1/8 din cel n e ce sar afirii la dim en siu n ile o riginale.

js H a lf

js Q u a r te r

jsE ig h th

Exemplu:
Urmtoarea aplicaie ncarc o imagine jpg i o afieaz ntr-o compo nent TImage. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object I m a g e l : TImage Stretch = True end object Buttonl: TButton
Caption = 'Buttonl'

end object OpenPictureDialogl: TOpenPictureDialog


Filterlndex = 2

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:

284

uses jpeg;
p ro c e d u re var

T F o r m l .ButtonlClick(Sender: TObject);

: TJ p e g l m age;

b e g in i f OpenPict u r eDialogl.Execute th e n b e g in

x ;= T J p e glmage.Create; x.LoadFromFile(OpenPictureDialogl.FileName); I m a g e l .Picture.Assign(x)


end; end;

21.8. TGraphicsObject
Este o clas abstract, de baz pentru obiectele care ncapsuleaz o unealt grafic W indow s precum TPen, TBrush, TFont.

Evenimente
E l.
OnChange

p ro p e rty OnChange: TNotifyEvent; Apare cnd un obiect grafic se schimb. Deoarece obiectul TG raphicsO bject nu are reprezentare n Com ponent P alette, programatorul trebuie s-i atribuie singur un handler de eveni mente la momentul execuiei programului. Vom exemplifica acest lucru pentru obiectul TPen.

21.9. TBrush
Reprezint culoarea i modelul folosite pentru a umple suprafee nchise.
TBrush ncapsuleaz obiectul pensul (HBRUSH) din W indows.

Ierarhie______________________________________________________
T O bject -> TPersistent -> TG raphicsO bject -> TBrush

Definit n_____________________________________________________
graphics.pas

28.S

Proprieti
P I.
Bitmap

p ro p e rty Bitmap: TBitmap; Specific o imagine care este folosit drept model. Aceast imagine trebuie s fie un ptrat cu latura de 8 (opt) pixeli. Dac este mai mare se va folosi un ptrat de 8x8 din colul din stnga sus al imaginii atribuite acestei proprieti. P2.
C olor

p ro p e rty Color: TColor; Specific culoarea pensulei. P3.


Style

p ro p e rty Style:TBrushStyle; Specific stilul de haurare. Valori posibile pentru Style sunt: bsSolid, bsC lear, bsH orizontal , bsVertical, bsFDiagonal, bsBDiagonal, bsC ross, bsD iagC ross. Dac proprietatea Bitmap are atribuit o valoare, atunci valoarea pro prietii Style nu are nici un efect. P4.
Handle

p ro p e rty Handle: HBrush; Identificatorul W indow s pentru acest obiect.

21.10. TPen
Reprezint culoarea i stilul folosit pentru a trasa curbe. TPen ncap suleaz obiectul stilou (HPEN) din W indows.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TG raphicsO bject -> TPen

Definit n_____________________________________________________
graphics.p a s

286

Proprieti PI.
Color

p ro p e rty Color: TColor; Specific culoarea liniei.

P2.

Style

p ro p e rty Style: TPenStyle; Specific stilul liniei. Valori posibile pentru Style sunt:
V a lo a r e P sS o tid PsD ash P sD o t p sD a sh D o t p sD a sh D o tD o t P sC le a r L in ie continu. Linie alc tu it d in tr-o serie de liniue m ai m ici. L inie punctat. Linie n care altern eaz lin iu ele i p unctele Linie a lc tu it d in tr-o serie de com binaii liniu, punct, punct. N ici o linie nu este desenat. S e m n ific a ie

P3.

M ode

p ro p e rty Mode: TPenMode; Specific modul n care culorile pensulei i culorile canvasului interacioneaz. Valori pentru M ode sunt:
V a lo a r e P m B lack Pm W hite P m N ot Pm C opy P m N o lC o p y P m X or n to td e a u n a n eg ru . n to td e a u n a alb. Inversul c u lo rii fundalului. C u lo area sp ec ifica t n p ro p rietate a C olor. Inversul c u lo rii sp ec ifica t n p ro p rietate a C olor. Se a p lic o p erato ru l X O R ntre c u lo a re a fu ndalului i cca a creio n u lu i. S e m n ific a ie

P4.

Width

p ro p e rty Width: Integer; Specific limea 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______________________________________________________
TO bject -> TPersistent -> TG raphicsO bject -> Tfont

Definit n_______________________________________________ __
graphics.pas

Proprieti_____________________________ ______________________
P I.
Color

property Color: TColor;


Specific culoarea textului. P2.
Size

property Size: Integer;


Specific nlimea fontului n numr de puncte. P3.
H eight

property Height: Integer;


Specific nlimea fontului n numr de pixeli. Relaia dintre Size i
Height este urmtoarea: H eight = Size * ScreenPixelsPerlnch / 72.

P4.

Style

property Style: TFontStyles;


Specific modul n care sunt desenate caracterele fontului. Style este o variabil de tip mulime deci are ca valoare o submulime din urmtoa rele elemente:

288

Valoare
F sB o ld F slta lic Fs U nderline F sStrikeout T e x t n g ro at. T e x t nclinat.

Sem nificaie

T e x t subliniat. T e x t t ia t n d o u cu o linie o rizontal.

P5.

Pitch

property Pitch: TFontPitch;


Indic dac toate caracterele fontului au aceeai lime. Valorile permise pentru Pitch sunt:
Valoare
fp F ix e d fp V a ria b le f p D efault

Sem nificaie
T o a te caracterele au aceeai lim e. A cest lucru este folosit la coduri surs. C aracterele au lim e variab il. A cest lucru este util la e ditare de texte. L im e a carac te re lo r d ep in d e de font.

P6.

Name

property Name: TFontName;


Este numele fontului.

P7.

Handle

property Handle: HFont;


Este identificatorul obiectului de tip font.

Observaie:
Setarea proprietilor unui obiect de tip TFont poate fi fcut ntr-o form vizual cu ajutorul componentei TFontDialog.

Exemplu:
Urmtoarea aplicaie tiprete un text pe fereastra aplicaiei. Valorile proprietilor 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 t e then begin
Im a g e l. C anvas. Font := 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 ta e s t e un t e x t ' ) ;

end;
end;

21.12. TCanvas
Furnizeaz spaiul de desenare pentru obiecte care i pot desena o imagine pe suprafa.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TCanvas

Definit n_____________________________________________________
graphics.pas

Proprieti___________________________________________________ PI.
Brush

property Brush: TBrush;


Specific culoarea i modelul de haurare pentru suprafee nchise sau fundal uri.

P2.

Font

property Font: TFont;


Specific fontul folosit cnd se va scrie un text pe o imagine.

P3.

Pen

property Pen: TPen;


Specific tipul de pen folosit.

P4.

PenPos

property PenPos: TPoint;


Specific poziia curent a creionului de desenare.

290

P5.

C lipRect

property ClipRect: TRect;


Specific marginile suprafeei de desenare. Operaiile de desenare exe cutate n afara acestui dreptunghi sunt invalide. P6.
CopyM ode

property CopyMode: TCopyMode;


Specific modul n care imaginea se va comporta cnd va fi pus pe suprafaa de desenare. Valori posbile pentru CopyM ode sunt:
V a lo a r e S e m n ific a ie U m p le d rep tu n g h iu l d estin aie cu negru. In v e rse az im a g in e a de p e ecran i ig n o r im a g in e a surs. C o m b in im ag in ea de pe Canvas i cea din b itm ap -u l surs fo lo sin d o p e ra to ru l O R. C o m b in im ag in ea de pe Canvas i cea din b itm ap -u l surs fo lo sin d o p erato ru l A N D . C o p ia z im ag in ea su rs pe Canvas. In v e rse az im a g in e a de p e Canvas i rezultatul l c o m b in cu cea din b itm a p -u l su rs fo lo sin d o p erato rul B oolean O R . C o m b in im a g in e a de pe Canvas cu c ea din b itm ap -u l surs folo sin d o p erato ru l B oolean X O R. C o m b in im ag in ea de pe Canvas i cu cea din b itm ap -u l surs fo lo sin d o p erato ru l B oolean O R . U m ple d rep tu n g h iu l d estin aie eu alb.

cm B lachiess cm D stlnvert anM ergeP aint cm SrcAnd iinSrcC opy cmSrcF.mse cin S n liivcrt n n S r c lainl cmW hitcnt'ss

O bservaie: Valoarea implicit este cm SrcCopy. P7.


Pixels

property Pixels[X, Y: Integer]: TColor;


Specific culoarea pixelului de coordonate (X,Y) din interiorul spaiului 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 r e S e m n ific a ie A re e fe ct d o ar cn d tex tu l este tip rit cu m e to d a TextR ect, i v a tru n c h ia tex tu l la d im e n siu n ea d rep tu n g h iu lu i n care se d o rete d esen area. n sp ate le te x tu lu i tip rit se v a d e se n a un fundal care v a astu p a p o riu n ea din im agine peste care s-a suprapus dreptunghiul te x tu lu i.

E T 0 _ C L IP P E D

E T O jO P A Q U E

Metode
Ml. Arc

procedure Arc(X7, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);
Deseneaz un arc, de-a lungul unei elipse. Elipsa este mrginit de dreptunghiul care are coordonatele punctelor din colurile stnga sus i dreapta jos egale cu (XT, Y l) repspectiv (X2, Y2). Arcul este delimitat de interseciile 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 obinut din intersecia elipsei cu drepta care trece prin (X3, Y3) i prin centrul elipsei) i terminnd cu cel de al doilea punct (cel obinut din intersecia elipsei cu drepta care trece prin (X4, Y4) i prin centrul elipsei).

Exemplu:
Urmtoarea aplicaie deseneaz un arc de cerc din care lipsete 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, 100, 50, 0, 100, 50);

end; M2. Chord

procedure Chord(A7, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);
Deseneaz o figur nchis, delimitat de o elips (mrginit 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, plecnd de la (X3, Y3) i pn la (X4, Y4). Dac (X3, Y3), (X4, Y4) nu se afl pe peri metrul elipsei, atunci se vor considera cele mai apropiate puncte de pe elips i care se afl i pe dreapta curent.

Exemplu:
Urmtoarea aplicaie deseneaz o suprafa nchis sub forma unei jum ti de cerc. Suprafaa va fi haurat 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 ru s h .C o lo r : = c lG re e n ; C a n v a s . C h o r d ( 0 , 0, 1 0 0 , 1 0 0 , 0, 5 0 , 100, 50);

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:
Urmtoarea aplicaie deseneaz un cerc care are centrul n mijlocul fe restrei 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
Raza : i n t e g e r ; C e n tru X , C e n tru Y : i n t e g e r ,-

begin
R a z a := 1 0 0 ; / / raza cercului C 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 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 en tru X - R a z a , C e n tru Y - R a za , C entruX + R aza, C e n tru Y + R a z a ) ;

end;

293

Exemplul 2:
Urmtoarea aplicaie 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
Raza : i n t e g e r ; C e n tru X , C e n tru Y : in te g e r;

begin
R a z a := 1 0 0 ; / / raza cercului exterior C 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 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 za , C e n tru Y - R aza, C e n tru X + R aza, C entruY + R a z a ) ; R a z a := 5 0 ; / / raza cercului interior C a n v a s . E l l i p s e (C e n tru X - R aza, C e n tru Y - R aza, C entruX + R aza, C entruY + R a z a ) ;

end;

Aceast aplicaie are ns un neajuns. Dac desenm 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
Raza : i n t e g e r ; C e n tru X , C e n tru Y : in te g e r;

begin
R a z a := 5 0 ; / / raza cercului exterior C e n t r u 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 ; C a n v a s . E l l i p s e (C e ntruX - R a za , C e n tru X + R aza, 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 entruX - R aza, C entruX + R aza, / / coordonatele centrului C e n tru Y - R a za , C entruY + R a z a );

C e n tru Y - R aza, C e n tru Y + R a z a ) ;

end ;

Exemplul 3:
Urmtoarea aplicaie deseneaz elipse pe form. La apsarea mouse-ului se reine colul din stnga sus al dreptunghiului care are laturile tangente la elips. Colul din dreapta jos al acestui dreptunghi va fi punctul n care se elibereaz mouse-ul.
var
f i n a l : b o o l e a n = true; X S t a r t , Y S t a r t , Xtem p , 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 anvas.B rush. S ty le := b s C l e a r ;

end; procedure T F o r m l . Form MouseD own( S e n d e r : T O b j e c t ;


B u t t o n : T M ouseB utton; 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
C a n v a s . P e n .M o d e := 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 Ytem p -. = Y; f i n a l := false;

end; procedure T F o r m l . F o r m M o u s e M o v e ( S e n d e r : T O b j e c t ;
S h ift: T S h iftS ta te ; X, Y: I n t e g e r ) ;

begin if not f i n a l then begin


Canvas . E l l i p s e ( X S ta r t , Y S ta r t, Canvas . E l l i p s e ( X S ta r t, Y S ta rt, Xtemp := X; Y tem p := Y; X temp, Y t e m p ) ; / / terg vechiul // segment X, Y) ; II desenez noul segment

end; end; procedure T F o r m l . Fo rm M ouseU p ( S e n d e r : T O b j e c t ;


B u t t o n : T M ouseB utton; S h i f t : T S h i f t S t a t e ; X, Y: in te g e r);

begin
C a n v a s . P e n .M o d e := p m B la c k ; Canvas . E l l i p s e (X S ta rt, Y S ta r t, f i n a l := true; X, Y) ; // trasez segmentul definitiv

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). Seciunea desenat este determinat de dou drepte care trec prin centrul elipsei i prin punctele de coordonatc
(X3, Y3), (X4, Y4).

?'1S

Exemplu:
Urmtoarea aplicaie deseneaz un sector de cerc reprezentnd 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, 49, 49, 0);

end;

M5.

FillRect

procedure FillRect(const Rect: TRect);


Haureaz dreptunghiul Rect cu modelul i culoarea curente (specificate de obiectul TBrush).

Exemplu:
Urmtoarea aplicaie deseneaz dreptunghiuri de dimensiuni i culori aleatoare. Generarea dreptunghiurilor se face pn la apsarea unei taste.
var
fin al : 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 ) ; begin while not f i n a l do begin


C a n v a s. B r u s h .C o lo r : = ran d o m ($ 1 0 0 0 0 0 0 ); C an v as. F i l l R e c t (R e c t(random (400), random (400), ran d o m (400), random ( 4 0 0 ) ) ) ; A p p lic a tio n . ProcessM essages;

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 K ey ; C h a r ) ; begin f i n a l := true; end;

M6.

FloodFill

procedure FloodFillfX, Y: Integer; Color: TColor; FillStyle: TFillStyle);


Haureaz o suprafa, care nu este neaprat dreptunghiular. Suprafaa haurat conine punctul (X,Y) i este mrginit de alte suprafee care au toate culoarea C olor sau toate nu au culoare Color. Valori posibile pentru FillStyle sunt:

296

V a lo a r e fsS u rfa ce

S e m n ific a ie H a u re a z su p ra fa a care are cu lo are C olor. P ro cesu l este o p rit cnd to a te p u n ctele care u rm eaz s fie co lorate nu au c u lo a re a C olor. H a u re a z su p ra fa a care nu are cu lo a re a in d icat d e p aram etru l C olor. P ro cesu l este o p rit n m o m en tu l n care to ate p u n c te le care u rm e a z s fie co lo rate au cu lo a re a C olor.

fs B o rd e r

Exemplul 1:
Urmtoarea aplicaie genereaz o gril cu 100 de csue i coloreaz aleator 50 de csue.
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 : by te; X, Y : i n t e g e r ;

begin
C a n v as. P e n .C o lo r
/ / g en era m g rila

:= c l G r e e n ; 0, 200, 200);

C a n v a s . R e c t a n g l e (0, for i := 1 to 9 do

begin
C a n v a s . MoveTo (1 , i * 2 0 ) ; // trasam liniile orizontale C a n v a s . L in e T o (200, i * 2 0 ); C a n v a s .MoveTo ( i * 2 0 , 1 ) ; // trasam liniile verticale C a n v a s . L in e T o ( i * 20, 2 0 0 );

end;
// sclcctam aleator 50 de puncte // si hauram csuele care le conine 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 := r a 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:
Urmtoarea aplicaie genereaz (la apsarea unui buton) o gril cu 100 csue. 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] of
t c o l o r = ( c l r e d , c llim e , c ly e llo w , c lb lu e , c ln a v y , c lg re en , c lp u rp le , c lfu c h s ia , c i t e a i ) ; c lo liv o ,

2 ()7

p r o c e d u r e T F orm 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 x ,y ,i ; in te g e r; b e g in x := 0 ; y := 0 ; f o r i := 1 t o 10 d o b e g in I m a g e l. C a n v as.M o v e T o (x ,y ); I i h a g e l . C a n v a s . L i n e T o ( x , 4 50) ; x := x + 5 0 ; end; x := 0; y := 0; f o r i : = l t o 10 d o b e g in I m a g e l. C a n v as.M o v e T o (x ,y ); Im a g e l.C a n v a s. L in e T o (4 5 0 ,y ) ; y := y + 5 0 ; end; end; p r o c e d u r e T F o r m l . Im a g e lM o u s e D o w n ( S e n d e r : TObj e c t ; B u tto n ; T M o u se B u tto n ;S h ift: T S h i f tS ta te ; X, Y: I n t e g e r ) ; b e g in I 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 ) ] ; Im 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 ); end;

M7.

Fram eRect

procedure Fram eRect(const Reef. TRect);


Deseneaz un dreptunghi. Marginea are lime 1 i este desenat cu setrile proprietii Brush. Interiorul dreptunghiului nu este afectat. M 8.
M oveTo

procedure MoveTo(X, Y: Integer);


Mut cursorul grafic n poziia (X,Y). M 9.
LineTo

procedure LineTo(X, Y: Integer);


Deseneaz o linie din poziia PenPos pn n poziia (X,y). PenPos devine (X,Y ).

298

Exemplu 1:
Urmtoarea aplicaie traseaz, pe form, un segment ntre punctele de coordonate (10 ,2 0 ) 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 in e T o (100, 2 5 0 );

end;

Exemplul 2:
Urmtoarea aplicaie traseaz segmente cu ajutorul mouse-ului. Pentru aceasta trebuie s implementm evenimentele OnM ouseDown i
OnMouseUp. procedure T F o r m l . Form M ouseD own( S e n d e r ; T O b j e c t ;
B u t t o n : T M o u seB u tto 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 ) ;

begin
C a n v a s .M oveTo(X , Y) ;

end; procedure T F o r m l . F o r m M o u s e U p ( S e n d e r : T O b j e c t ;
B u t t o n : T M ouseB utton; 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
C a n v a s . L ineT o(X , Y) ;

end;

Exemplul 3:
Dorim ca segmentul trasat s aib o anumit grosime. Pentru aceasta folosim o cutie de editare (E d itl) 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 id 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 as.P en .W id th := S t r T o I n t ( E d i t l . T e x t ) ;

except on E C o n v e r t E r r o r do C a n v a s . P e n . W i d t h := 1; 299

end; end;

Exemplul 4:
Urmtoarea aplicaie deseneaz segmente de dreapt cu ajutorul mouseului. Segmentele trasate pot avea diferite culori. Selectarea culorii de desenare se face cu ajutorul unei componente de tip TColorDialog. Handlerele pentru evenimentele OnMouseDown i OnM ouseUp sunt cele din aplicaia 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 e then 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 trasm segmentele la fel ca n aplicaia PaintBrush, i anume dorim s fixm unul din capetele segmentului iar cellalt capt s l plimbm pn n momentul n care ne vom decide asupra locului n care l fixm.
var
f i n a l : b o o l e a n = true; X S t a r t , Y S t a r t , Xtem p, Ytemp : i n t e g e r ;

procedure T F o r m l . Form MouseD own( S e n d e r : T O b j e c t ;


B u t t o n : T M o u seB u tto 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 ) ;

begin
C a n v a s . M o v e T o (X, Y ) ; C a n v a s . P e n .M o d e := pm Not; 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 . F orm M o useU p( S e n d e r : T O b j e c t ;


B u t t o n : T M o u seB u tto 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 ) ;

begin
C a n v a s .M o v eT o (X S tart, Y S t a r t ) ; C a n v a s . P e n . Mode := p m B la c k ; C a n v a s . L i n e T o (X, Y) ,- // trasez segmentul definitiv f i n a l := true;

300

end;

procedure T F o r m l . F o rnM ouseM ove ( S e n d e r : T O b j e c t ;


S h ift: T S h iftS ta te ; X, Y: I n t e g e r ) ;

begin if not f i n a l then begin


C a n v as.M o v e T o (X S ta rt, Y S t a r t ) ; C a n v a s . L i n e T o (Xtemp, Ytemp) ; // terg vechiul segment C a n v as.M o v e T o (X S ta rt, Y S t a r t ) ; C a n v a s . L i n e T o (X, Y) ; // desenez noul segment Xtem p := X; Y tem p : = Y ;

end; end;

Exem plul 6: Urmtoarea aplicaie traseaz o linie curb pe o form. Linia va urma traiectoria cursorului de mouse.
var
fin al : b o o l e a n = true;

procedure T F o r m l . Form MouseD own( S e n d e r : T O b j e c t ;


B u t t o n : T M ouseB utton; 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
f i n a l := false; C a n v a s . MoveTo (X, Y )

end; procedure T F o r m l . F o r m M o u s e M o v e ( S e n d e r : T O b j e c t ;
S h ift: T S h iftS ta te ; X, Y: In teg e r);

begin if not f i n a l then C a n v a s . L i n e T o ( X , Y ) ; end; procedure T F o r m l . F o rm M ouseU p( S e n d e r : T O b j e c t ;


B u t t o n : T M ouseB utton; S h i f t : T S h i f t S t a t e ; X, Y: In teg e r);

begin
fin al := true;

end;

Exemplul 7:
Urmtoarea aplicaie traseaz linii de diferite lungimi i le ordoneaz dup lungime folosind metoda bublesort. Culoarea fiecrei linii va fi 301

generat aleator. Vom folosi un RadioGroup cu dou butoane care ne vor permite s alegem modul de sortare al liniilor (cresctor sau descresctor). Valorile proprietilor obiectelor de pe forma F orm l sunt:
object I m a g e l : T Im a g e
W i d t h = 321 H e i g h t = 313

end object B i t B t n l : T B i t B t n
C a p tio n = ' t r a s e a z a '

end object R a d i o G r o u p l : T R a d i o G r o u p
C a p tio n = 'o r d o n a r e ' Item ln dex = 0 Item s. S trin g s = ( 'c re sc to r' ' d e s c r e s c t o r ')

end

Handlerele de evenimente ale obiectelor de pe forma F orm 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 : in te g e r;

begin
Im a g e l. C anvas. B ru sh .C o lo r : = c lw h ite ; Im a g e l.C a n v a s .R e c ta n g le ( 0 ,0 , Im ag e l.W id th ,Im a g e l.H e ig 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 : = random (65535*256); 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;

Im ag e l.C a n v as.M o v e T o (x ,y ) until y >= I m a g e l . H e i g h t ; Im ag e l.R e fre sh ;

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 :in te g e r;

begin for 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 i d t h ) deseneaz;

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

begin
g s i t := true; t : = a [i J ; a [ i ] := a [ i + 1 ) ;
ati+1] := t ;

end;
deseneaza

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: in te g e r;

begin for 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 ) ; deseneaza;

repeat
g a sit for i := false; := 1 to I m a g e l . H e i g h t div 2 do

if a [ < a [i+1] then i] begin g a s i t := true;


t := a [i ] ; a [ i ] :=a [ i + 1 ] ; a [ i +1 ] : = t ;

end;
deseneaza

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 ) ; begin case 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 rd o n a re _ d e s c r e s c a to r ;

end; end;

M10. Polygon procedure Polygon(Po/>i?s: array of TPoint);


Deseneaz o linie poligonal nchis care are vrfurile descrise n vec torul Points. Ultimul punct este automat unit cu primul. Interiorul poligonului va fi haurat cu modelul i culoarea curente descrise n proprietatea Brush.

Exemplul \ :
Urmtoare aplicaie deseneaz un poligon oarecare. Vrfurile poligo nului sunt alese aleator. 303

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[0..10] of T P o i n t ;


i : b y te ;

begin for i end;

:= 0 to 10 do a [ i ] := P o i n t ( r a n d o m ( 4 0 0 ) , C anvas.P o ly g o n (a );

random (4 0 0 ));

Exemplul 2:
Urmtoarea aplicaie deseneaz un poligon regulat cu un numr specificat de vrfuri.
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 circumscris u n g h i, pas : re a l ; n : i n t e g e r ; / / numrul de laturi i : in te g e r; C e n tru X , C e n tru 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 ti num rul de l a t u r i ' , n r_ sir)

then begin
// te r g ecranul

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 , n := S t r T o I n t ( n r _ s i r ) ; S e tL en g th (a, n ) ; r a z a := 1 0 0 ; C e n t r u 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

C lie n tH e ig h t);

begin
a [ i ] . x := C e n t r u 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 r u 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. M 12. Rectangle p ro c e d u re Rectangle(A7, Y1,X 2, Y2: Integer); p ro c e d u re Rectangle(const R e c t TRect); Deseneaz un dreptunghi. Marginea va fi desenat conform cu setrile proprietii Pen, iar interiorul conform setrilor proprietii Brush. Exem plu: Urmtoarea aplicaie deseneaz dreptunghiuri pe o form. La apsarea mouse-ului se reine colul din stnga sus al dreptunghiului. Colul din dreapta jos al dreptunghiului va fi punctul n care se elibereaz butonul mouse-ului.
var
f i n a l : b o o l e a n = true; X S t a r t , Y S t a r t , X temp, Ytemp : i n t e g e r ;

procedure T F o r m l . F o rm M o u s e D o w n ( S e n d e r : T O b j e c t ;
B u t t o n ; T M ouseB utton; S h i f t : T S h i f t S t a t e ; X, Y: In teg e r);

begin
C a n v a s . P e n . Mode := pm Not; 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 ; end;

procedure T F o r m l . Fo rm M ouseM ove( S e n d e r : TObj e c t ;


S h ift: T S h iftS ta te ; X, Y: I n t e g e r ) ;

begin if not f i n a l then begin


Canvas . R e c ta n g le ( X S ta r t , Y S ta r t, C anvas .R e c ta n g le (X S ta rt, Xtemp := X; Ytemp := Y; Y S ta rt, X tem p, Y t e m p ) ; //terg vechiul //segment X, Y) ; //desenez noul segment

end; end; procedure T F o r m l . F orm M ou seU p ( S e n d e r : T O b j e c t ;


B u t t o n : T M ouseB utton; 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
C a n v a s . P e n .M o d e := p m B la c k ;

305

C anvas. R e c ta n g le (X S ta rt, Y S ta rt, f i n a l := t r u e ; end;

X, Y) ; //trasez segmentul definitiv

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 1S e n d e r : T O b j e c t ) , b eg in C a n v a s . B r u s h . S t y l e := b s C l e a r ; end,-

M 13. TextOut p ro ced u re TextOut(T, Y: Integer; const Text : string); Scrie un text i apoi poziioneaz cursorul grafic Ia sfritul Iui. E xem plu 1: Urmtoarea aplicaie afieaz vertical un text care este dat ntr-o cutie de editare. Vom folosi o cutie de editare E d itl i un buton la apsarea cruia 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 : in te g e r; i : in te g e r;

begin
X : = 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 p e aceeai 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 as. T ex tO 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;

E xem plu 2: Acest exemplu este o generalizare a exemplului precedent: dndu-se un text ntr-o cutie de editare, acesta va fi tiprit oblic, literele nefiind neaprat unele sub altele, ci aleator pe coloana respectiv. Culoarea fiecrei 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 : in te g e r;

begin
x : = 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 aceeai 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 := 2 0 ;
C an v as . Fon t . Col o r
: = Random ( FFFFFF) ;
II fieca re

caracter va avea o alta

/ / culoare aleasa aleator C a n v a s.T e x tO 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 tiprit neaparat sub precedentul

x : = x + random (2 0 ); i : = i + 1; u n til i > le n g th (E d itl.T e x t); end;

M 14. TextWidth function TextW idth(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. M 15. TextHeight function TextHeight(const Text-, string): Integer; Returneaz nlimea, 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: Urmtoarea aplicaie deseneaz un text n mijlocul ferestrei curente. Aplicaia conine dou butoane, o cutie de editare i o component TFontDialog. La apsarea butonului B u tton l se schimb fontul cu care va fi desenat textul n fereastr. La apsarea butonului Buttonl se deseneaz textul (din cutia de editare E d itl ) centrat n fereastr. Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:
procedure TForml.ButtonlClick(Sender: TObject);

307

C e n tru X ,

C en tru Y ,

in a ltim e ,

latim e

: in te g e r;

begin
C e n t r u X := C l i e n t W i d t h div 2 ; / / centrul ferestrei C e n t r u 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 a s . 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 t O u t ( C e n t r u X - l a t i m e div 2, C e n t r u 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 ) ; begin if 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 Editl end -

end;

M 16. D raw p ro ced u re Draw(A", Y: Integer; Graphic: TGraphic); Copiaz un desen, specificat de parametrul Graphic, pe canvas, n poziia de coordonate (X,Y ). Imaginea copiat poate s fie bitmap, icon sau metafile, i va fi desenat ntr-un dreptunghi cu colul din stnga sus de coordonate (X,Y), conform setrilor lui CopyM ode. Exem plu: Urmtoarea aplicaie ncarc o imagine n obiectul h (de tip TBitmap) i o afieaz 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 ad 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 i d t h 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 re e ;

end;

M 17. StretchDraw p ro c e d u re StretchDraw(const Rect: TRect; Graphic: TGraphic ); Copiaz un desen, specificat de parametrul G raphic , pe canvas, n dreptunghiul Rect. Imaginea copiat poate s fie bitmap, icon sau 308

metafile, i va fi redimensionat astfel nct s umple n ntregime dreptunghiul Rect. M 18. D rawFocusRect p ro c e d u re DrawFocusRect(const Rect: TRect); Deseneaz un dreptunghi care d senzaia c are focus. Acest lucru se realizeaz folosind operatorul XOR. M 19. CopyRect p ro c e d u re Copy Rec t(D<?.vr: TRect; Canvas: TCanvas; Source: TRect); Copiaz o parte a canvas-ului (parametrul Canvas ) specificat prin drep tunghiul Source pe suprafaa de desenare curent n dreptunghiul Det. Exem plu: Urmtoarea aplicaie salveaz o parte din imaginea desenat pe form ntr-un fiier pe disc.
procedure T F o r m l .F o r m K e y D o w n ( S e n d e r : T O b j e c t r var K ey : Word; S h i f t : T S h i f t S t a t e ) ; begin if 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 := 1 0 0 ; b . W i d t h := 2 0 0 ; // copiez un dreptunghi 200x100 b . C a n v a s . C o p y R e c t ( R e c t (0 , 0, 2 0 0 , 1 0 0 ) , F o r m l.C a n v a s , R e c t ( 1 0 , 10, 21 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 t e // salvez imaginea bmp then 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 ree;

110));

end; end;

Evenimente
E l.
OnChange

p ro p e rty OnChange: TNotifyEvent; Apare dup ce o imagine s-a schimbat. Acest eveniment este generat dup ce a fost apelat una din metodele care schimb coninutul Canvasului. 309

E2.

OnChanging

property OnChanging: TNotifyEvent; Apare nainte de a se schimba o imagine. Acest eveniment este generat nainte de a fi apelat una din metodele care schimb coninutul Canvasului. Deoarece componenta TCanvas nu are propria ei reprezentare n C om ponent Pallete, programatorul trebuie s-i asigneze un handler de evenimente. Urmtorul exemplu arat cum se poate atribui la momentul execuiei (la apsarea unui buton) cte un handler de evenimente la fiecare dintre evenimentele OnChange i OnChanging. Prototipurile acestor evenimente trebuie declarate n seciunea 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 ) ;

Implementrile sunt urmtoarele:


var HDupa, H In a in te : T N o tify E v en 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 ) ; begin if A s s i g n e d ! HD upa) / 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 s s a g e ( ' D u p a ') ,end;

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 Show M essage( ' 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 n C h a n g e ) / testez daca exista un alt handler instalat / then HDupa := C a n v a s . O n C h a n g e ; / i caz afirmativ il rein /n
C a n v a s . O nChange : = 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 n C h a n g i n g ) then H I n a i n t e := C a n v a s .O n C h a n g i n g ;
C a n v a s . O nC hanging := n a i n t e ;

C a n v a s . L i n e T o ( 1 0 0 , 1 0 0 ) ; // desenez ceva pe suprafaa formei B u t t o n l . E n a b l e d := false;

end;

310

21.13. TGraphicControl
Este o clas de baz pentru toate controalele care nu au propria lor fereastr. Scopul acestor obiecte este de a afia text i imagine pe suprafaa lor. Ele nu pot primi focus.

Ierarhie______________________________________________________
T O bject -> TPersistent -> TComponent -> TControl ->TG raphicControl

Definit n_____________________________________________________
controls.pas

Proprieti___________________________________________________
P I.
Canvas

p ro p e rty Canvas: TCanvas; Furnizeaz, controlului grafic, o suprafaa pentru desenare. Proprietatea este R eadO nly.

Metode______________________________________________________
M l.
Paint

p roced ure Paint; La primirea mesajului W M P A IN T , controlul iniializeaz canvas-ul i apeleaz metoda Paint. In aceast clas metoda Paint nu face nimic, dar descendenii trebuie s o redefineasc pentru a indica modul n care se deseneaz suprafaa unui control.

21.14. TPaintBox
Furnizeaz o component TCanvas n interiorul unui dreptunghi, preve nind desenarea n afara marginilor acestuia.

Ierarhie______________________________________________________
TObject -> TPersistent -> TComponent -> TControl -> -> TGraphicControl -> TPaintBox

311

Definit n

graphics.pas

Pagina
System

Proprieti______
P I.
Canvas

p ro p erty Canvas: TCanvas; Reprezint suprafaa de desenare. Exem plu: Urmtoarea aplicaie deseneaz un grafic de funcie de un sigur parametru. Forma aplicaiei conine 4 cutii de editare n care utilizatorul este solicitat s introduc domeniul i codomeniul funciei, o compo nent TPaintBox n care se va realiza desenarea i un buton (B u tto n l) la a crui apsare se va declana desenarea.
function f ( x begin
R esu lt : re al) : re al;

:= 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 : in te g e r; maxy : r e a l ;
//d o m en iu l si codom eniul fu n ciei

m i n x , m axx, m in y ,

begin
m in x maxx m iny maxy := S t r T o F l o a t ( E d i t l . T e x t ) ; := S t r T o F l o a t ( E d i t 2 . T e x t ) ; := S t r T o F l o a t ( E d i t 3 . T e x t ) ; := S t r T o F l o a t ( E d i t 4 . T e x t ) ;

S e tL e n g th ( a ,300);

for i := 0 to 299 do begin


/ / i n vecto ru l a sunt sto ca te p erech ile (xj'(x)) in coordon ate ecran

a [i ] .x : = i ; a [ i ] . y := t r u n c ( ( f (m in x + i * a b s ( m a x x - m in x ) - m in y ) / (m axy-m iny)*300);

/ 300)

end;
P a i n t B o x l . C a n v a s . P o l y l i n e (a ) ; / / se deseneaza fu n cia

312

end;

21.15. TImage
Permite afiarea unei imagini pe ecran. Aceast imagine este valoarea proprietii Picture. Poate fi icon, bitmap, metafile, sau orice alt obiect grafic definit de utilizator.

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> -> TG raphicControl -> TImage.

Definit n
extctrls.pas

Pagina
A dditional

Proprieti PI.
AutoSize

p ro p e rty AutoSize: Boolean; Dac AutoSize este truc, atunci controlul n interiorul cruia se afieaz imaginea se va redimensiona n funcie de dimensiunile acesteia.

P2.

Stretch

p ro p e rty Stretch: Boolean; Indic dac imaginea trebuie s se redimensioneze astfel nct s ocupe ntreaga suprafa a controlului.

P3.

Center

p ro p e rty Center: Boolean; Indic dac imaginea trebuie centrat n interiorul controlului. Aceast proprietate nu are nici un efect dac proprietile AutoSize sau Stretch sunt setate la true.

313

P4.

Picture

property Picture: TPicture; Specific imaginea afiat.

Exemplul 1:
Pe o form avem o component Tlm age cu ajutorul creia dorim s afim o imagine aflat ntr-un fiier pe disc. Pentru aceasta ne folosim de o component TO penPictureD ialog care ne faciliteaz selectarea fiierului cu imaginea. La apsarea butonului B uttonl vom realiza selectarea fiierului cu imaginea i afiarea acesteia pe form n componenta I m 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

if

O p e n D ia lo g I. E x ec u te

then 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 f o lo s it d e m eto d a L oadF rom F ile a lui TPicture / / p e n tru a n c rca o im a g in e dintr-u n f i ie r a fla t p e disc.

end;

Exemplul 2:
Urmtoarea aplicaie afieaz textul DELPHI 7 a crui dimensiune crete pe msur 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 afiat textul, o component TrackB arl cu ajutorul creia vom seta viteza de transformare a dimensiunii caracterelor textului, o component T im erl pentru a afia la intervale regulate textul modificat i un buton
B itB tn l.

Proprietile obiectelor de forma F orm l sunt:


object I m a g e l : T lm a g e
L eft = 0 T op = 0 W i d t h = 400 H e i g h t = 400

end object B i t B t n l : T B i t B t n
C a p tio n = 'E x e c u ta ' O n C lick = B i t B t n l C l i c k

end object T r a c k B a r l : T T r a c k B a r
Min = 1 P o sitio n = 1

314

end o b j e c t T i m e r l : TTim er E nabled = F a ls e I n t e r v a l = 500 end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


p r o c e d u re T F orm l. B i tB t n l C l ic k ( S e n d e r : T O b je c t); b e g in x := 1 5 0 ; y := 5 0 ; I m a g e l . C a n v a s . F o n t . S i z e := 10; T im e rl.E n ab led := tru e ; end; p ro c e d u re T F o rm l.T im erlT im e r(S e n d e r: T O b je c t); b e g in 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; Im ag e l.C anvas.R efresh; 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 th e n i f y + 2 * I m a g e l. C a n v a s. T e x tH e ig h t( ' t ') > I m a g e l. H eig h t th e n b e g in 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 ; Im a g e l.C a n v a s .R e c ta n g le (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 tO u t(x ,y ,'D E L P H I 7 ' ) ; y := y + 60; end e l s e b e g in 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 ; Im a g e l. C anvas. R e c ta n g le (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 := Im ag el. C anvas. F o n t. S ize+ 3 ; I m a g e l . C a n v a s . T e x t O u t ( x , y , 'DELPHI 7 ' ) ; end e lse e x it; end;

La apsarea butonului B itB tnl vom seta coordonatele punctului n care va apare iniial textul si vom seta proprietatea Enabled a componentei Tim erl ca fiind tru e. La fiecare urmtor interval de timp vom redesena textul cu un font mai mare. Ne vom opri n momentul n care textul depete nlimea ferestrei considerate (Im agel .Height). De asemenea, se poate seta i culoarea cu care va fi afiat textul.

315

21.16. TShape
Reprezint o curb care poate fi trasat pe o form.

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> -> TG raphicControl -> TShape.

Definit n___________________________________________________
extctrls.pas

Pagina_____________________________________________________
Additional

Proprieti__________________________________________________ PI.
Brush

property Shape: TShapeType;


Specific culoarea i modelul de haurare 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 r e StC ircle stE llipse stR ectangle stR ou ndR ect stRoundSquare slSquare S e m n ific a tic C u rb a este un cerc. C u rb a este o elips. C urba este un dreptunghi. C urba este un d reptunghi cu colurile rotunjite. C u rb a este un ptrat cu colurile rotunjite. C u rb a este un ptrat.

Urmtoarea aplicaie schimb succesiv, la apsarea butonului B u tto n l , proprietatea Shape a unui obiect de tip TShape .: Valorile proprietilor obiectului TShape sunt:
object S h a p e l : T S h a p e
W i d t h = 121 H e i g h t = 65 Shape = s tS q u a r e

end

Handlerele de evenimente ale obiectelor de pe forma F orm l 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 S h a p e l . S h a p e = s t C i r c l e then S h a p e l . S h a p e : = s t R e c t a n g l e else 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______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> -> TG raphicControl -> TBevel.

Definit n_____________________________________________________
extrctrl.pas

Pagina______________________________________________________
A dditional

Proprieti___________________________________________________
P I.
Style

p ro p erty Style: TBevelStyle; Indic stilul chenarului. Valori posibile pentru Style sunt:
V a lo a r e b sL o w ered b sR a ised S e m n ific a ie C h en aru l este adncit. C h en aru l este ridicat.

317

P2.

Shape

property Shape: TBevelShape; Indic forma curbei. Valori posibile pentru Shape sunt:
V a lo a r e S e m n ific a ie n tre a g a c o m p o n en t apare rid ica t s-au scobit, n funcie de v a lo a re a p ro p rietii Style. n tre a g a m arg in e a co m p o n en tei apare rid ica t s-au scobit. D o ar m a rg in e a de sus a co m p o n en tei este afiat. D o ar m a rg in e a de jo s a co m p o n en tei este afiat. D o ar m a rg in e a stn g a co m p o n en tei este afiat. D oar m a rg in e a d re a p t a co m p o n en tei e ste afiat.

bsBox
bsF ram e b sT opL ine bsB ottom Line bsLeflLine

bsRiglitUne

21.18. TSplitter
Este o component care poate mpri zona client n dou panouri redimensionabile la momentul execuiei programului. Pentru a obine cele dou panouri redimensionabile, procedai astfel: aezai pe form primul panou, i aliniai-l la stnga (proprietatea
Align va fi setat la valoarea alLeft);

aezai pe form (la dreapta primului panou) o component TSliptter ; ea se va alinia automat la stnga (va fi lipit de marginea din dreapta a primului panou); aezai pe form cel de al doilea panou i aliniai-l astfel nct s ocupe ntreaga zon client rmas disponibil (proprietatea Align va fi setat la valoarea alClient); acum componenta TSplitter se va afla ntre cele dou panouri; rulai aplicaia; cele dou panouri pot fi redimensionate automat la momentul execuiei programului.

O bservaie: Nu doar panourile pot fi folosite, ci orice alt control ce poate fi aliniat (are proprietatea Align)\

Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> -> TG raphicControl -> TSplitter.

318

Definit n
extctrlx.pax

Pagina
A dditional

Proprieti PI.
B eveled

pro p erty 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 M inSize , 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 r e rsN one S e m n ific a ie Nu ;ne loc nici o red im en sio n are. O linie cslc d esen at pen tru a in dica n o u a p o ziie a splitter-ului. Keiliim-iiMonare e le ctiv se face d oar d u p ce este e lib e ra t butonul de tium sc. K cilim cn sio n area p a n o u rilo r i m u ta re a c o n co m iten t cu m icarea m ouse-ului. splitter-u lu i se face

rsLine

rs U pdate

Evenimente
E l.
OnCanResize

property OnCanResize: TCanResizeEvent;


Apare cnd utilizatorul ncearc s mite splitter-ul. 319

E2.

O nM oved

property OnMoved: TNotifyEvent;


Apare dup ce utilizatorul a terminat de mutat splitter-ul. E3.
O nPaint

property OnPaint: TNotifyEvent;


Apare cnd splitter-ul trebuie s se redeseneze.

21.19. TImageList
Este o colecie de imagini de aceeai dimensiune, fiecare dintre acestea putnd fi accesat prin intermediul unui indice. Dac ncercai s adugai la lista cu imagini o imagine cu dimensiuni mai mari dect cele setate cu ajutorul proprietilor Height i Width, aceast imagine va fi rupt n imagini mai mici care vor fi adugate la list. Deci n loc de o imagine vei avea mai multe. Dac din contr ncercai s adugai la list o imagine cu dimensiunile mai mici dect cele specificate cu ajutorul proprietilor Height i Width atunci lista va rmne nemodificat, la ea neadugndu-se nimic. De aceea este foarte important s setai corect aceste dimensiuni, iar apoi s adugai doar imagini de acest fel. Acest lucru l putei face ncrcnd n prealabil imaginea nu direct n list ci ntr-un obiect de tip TBitmap - de unde i putei citi dimensiunile - iar apoi dup ce setai dimensiunile listei, s o adugai la ea. Schimbarea dimen siunilor imaginilor listei la momentul execuiei programului va duce la pier derea informailor din ea. ncrcarea unei imagini ntr-o list se poate face i la momentul proiec trii aplicaiei, prin adugarea pe form a unei componente TImageList i apoi execuia a dublu click pe ea. Pe ecran va apare un Im ageListEditor care v permite s prelucrai o list cu imagini la timpul proiectrii aplicaiei. Cu acest editor pot fi ncrcate i imagini de diferite dimensiuni, dar nu se va putea vedea dect o parte din ele (conform cu Options).

Ierarhie
TObject->TPersistent->TCo/nponent->TCustomImageList->TImageList

Definit n
controls.pas

320

Pagina
Win32

Proprieti________________________________________________ _ PI.
Count

p ro p e rty Count: Integer; Indic numrul de imagini dintr-o list. P2.


Height

p ro p erty Height: Integer; Indic nlimea n pixeli a unei imagini. Datorit faptului c n list pot fi stocate doar imagini de aceeai dimensiune, la schimbarea acestei valori, lista va 1 vidat. 1 IM.
Width

p ro p e rty Width: Integer; Indic limea n pixeli a unei imagini. Datorit faptului c n list pot fi stocate doar imagini de aceeai dimensiune, la schimbarea acestei valori, lista va fi vidat. 1*4.
BlendColor

p ro p e rty BlendColor: TColor; Specific culoarea care este folosit n momentul n care proprietatea
D rawingStyle are una din valorile dsFocus sau dsSelected.

P5.

D rawingStyle

p ro p e rty DrawingStyle: TDrawingStyle; Indic felul n care va fi desenat o imagine de ctre metodele obiectului TlmageList. Valori posibile pentru D rawingStyle sunt:
V a lo a r e dsF ocu s S e m n ific a ie D esen eaz im a g in e a a m e ste c at 2 5 % cu c u lo are specificat de ctre B lendC olor. D ese n e az im a g in e a am e ste c at 50 % cu cu lo a re sp ec ifica t de c tre B len dC olor. D e se n e az im a g in e a fo lo sin d d o a r cu lo a re de funda) (p ro p rietatea

d sS e lec te d d sN o rm a l

V a lo a r e B kC olor). d sT ra n sp a ren t

S e m n ific a ie

D esen eaz im a g in e a nein n d cont de p ro p rietatea B kC olor.

Urmtorul exemplu demonstreaz felul n care este desenat o imagine dintr-o list n funcie de valoarea lui D rawingStyle. Vom folosi o component Tlm ageList n care ncrcm la momentul proiectrii aplicaiei o singur imagine. Mai folosim o component Tlm age n care afim imaginea din list, i o component TComboBox n care ncrcm cele patru stiluri de desenare: dsFocus, dsS elected , dsN orm al, dsTransparent (sub forma unor iruri de carac tere cu acelai nume). La schimbarea itemului selectat din TComboBox se va schimba i felul n care este desenat imaginea:
procedure T F o r m l .C o m b oBoxlChange(S e n d e r : TObj e c t ); var r:TRect; begin if C o m b o B o x l .Text = 'dsFocus' then Im a g e L i s t l .DrawingStyle := dsFocus else if C o m b o B o x l .Text = dsSelected' then ImageListl.DrawingStyle := dsSelected else if C o m b o B o x l .Text = dsNormal' then ImageListl.DrawingStyle := dsNormal else ImageListl.DrawingStyle := dsTransparent;
r - = I m a g e l .ClientRect; . I m a g e l .C a n v a s .Brush.Color := clWhite; I m a g e l .C a n v a s .FillRect(r) ; ImageListl .Draw(Imagel.Canvas ,0,0,0); //desenam prima imagine din l s a it

end;

Metode
M l.
A dd

function Add (Image, Mask: TBitmap): Integer; Adaug imaginea Image mpreun cu masca Mask la lista cu imagini. Mask poate s fie nil. A ddlcon function AddIcon(//wage: Tlcon): Integer; Adaug un icon la lista cu imagini.

M 2.

322

M3.

A ddlm ages

p ro ced u re A ddlm ages(Va/ne: TCustomlmageList); Adaug imagini dintr-o alt list cu imagini. M 4.
C lear

p ro ced u re Clear; terge toate imagiile din list. M 5.


D elete

p ro c e d u re Delete(Index: Integer); terge imaginea cu numrul de ordine Index din list. M 6.


D raw

p ro c e d u re Draw (Canvas: TCanvas; X, Y, Index: Integer; Enabled: Boolean=True); Deseneaz imaginea cu numrul de ordine Index pe suprafaa Canvas la poziia (X,Y). Aceast imagine este desenat n conformitate cu proprie tatea D rawingStyle. M 7.
FileLoad

function \\6Lo'd(ResType: TResType; Name: string; M askColor: TColor): Boolean; ncarc, n lista cu imagini, din fiierul Name, tipul de resurs specificat. Valori posibile pentru ResType sunt: rtBitmap, rtlcon, rtCursor. M 8.
GetBitm ap

p ro ced u re GetBitmap(//it/e\: Integer; Image: TBitmap); Returneaz imaginea cu numrul de ordine Index din lista cu imagini. M 9.
G etlcon

p ro ced u re GetIcon(/<ie;t: Integer; Image: TIcon); Returneaz imaginea cu numrul de ordine Index, sub forma unui icon. M 10. Insert p ro ced u re Insert(/cfe;c: Integer; Image, Mask: TBitmap); 323

Insereaz un bitmap i masca ataat lui pe poziia Index a unei liste cu imagini. M I I . Insertlcon p ro c e d u re InsertIcon(/afe*: Integer; Im age : Tlcon); nsereaz un icon pe poziia Index+l a unei liste cu imagini. M 12. M ove p ro c e d u re M ove(CurIndex, Newlndex: Integer); Mut imaginea de pe poziia Curlndex n poziia Newlndex. M 13. Replace p ro ced u re Rep\ace(Index: Integer; Image, Mask: TBitmap); nlocuiete imaginea cu numrul de ordine Index din list cu o alt imagine (Image) mpreun cu masca asociat ei. M14. R eplacelcon p ro ced u re ReplaceIcon(/rtctex: Integer; Image: Tlcon); nlocuiete imaginea de pe poziia Index cu un Icon.

Evenimente_____
E l.
OnChange

p ro p e rty OnChange: TNotifyEvent; Apare cnd lista se schimb (o imagine este adugat, tears,...).

22. TIMERE - COMPONENTA TTimer


Timer-ele ntiineaz utilizatorul despre scurgerea unui interval de timp. ntiinarea se produce prin generarea unui mesaj. Programatorul D elphi 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 indow s ofer funcii API pentru prelucrarea timer-elor. Mediul D elphi ncapsuleaz aceste funcii n componenta TTimer.

22.1. TTimer

Componenta TTimer ncapsuleaz funciile API ale tim er-e lor W indow s. Un tim er este o rutin care msoar repetat scurgerea unui interval de timp. Dup scurgerea acestui interval de timp - a crui valoare este indicat de ctre proprietatea Interval - sistemul este notificat prin apelarea evenimentului OnTimer. Datorit faptului c tim er- ul depinde de viteza cu care sunt prelucrate mesajele din coada de mesaje, intervalul scurs va fi aproximativ.

Ierarhie______________________________________________________
TO bject->TPersistent->TCom ponent->TTim er

Definit n_____________________________________________________
extctrls

Pagina_______________________________________________________
System

Proprieti___________________________________________________
P I.
Enable

p ro p e rty Enabled: Boolean; Specific dac ti.uer-ul rspunde la evenimentul OnTimer. Dac Enable este tru e , atunci controlul rspunde normal la acest eveniment, n caz contrar evenimentul nu va fi apelat. 325

P2.

Interval

p ro p e rty Interval: Cardinal; Specific numrul de milisecunde dintre dou apeluri consecutive ale handlerului de evenimente OnTimer.

Evenimente
E l.
OnTimer

p ro p e rty OnTimer: TNotifyEvent; Apare de fiecare dat cnd trec In terval milisecunde de la ultimul eveniment OnTimer. E xem plul 1: Urmtorul exemplu folosete dou componente de tip TTimer i o cutie de editare de tip TEdit. La fiecare cinci secunde n cutia de editare este afiat textul Au mai trecut 5 secunde . Acest text este afiat timp de dou secunde apoi cutia de editare este curat. Proprietile obiectelor de pe forma F orm l sunt:
object Editl: TEdit Enabled = False end object Timer1: TTimer
Interval = 5000

end object Timer2: TTimer Enabled = False


Interval = 2000

end

Handlerele de evenimente ale obiectelor de pe forma F orm 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: Urmtoarea aplicaie afieaz n bara de titlu a formei cte secunde s-au scurs de la pornirea aplicaiei.
var
i : integer; titlu : string;

procedure TForml.FormCreate(Sender: TObject); begin


i := 1; titlu := Caption; //ttu fo ill rmei

end; procedure TForml.TimerlTimer(Sender: TObject); begin


Caption := titlu + ' 1 + 'Au trecut ' + IntToStr(i)+ 1 secunde de la pornirea aplicaiei'; i nc(i );

end;

E xem plul 3: Urmtoarea aplicaie realizeaz apariia la un interval dat de timp a unei forme pe care este afiat un text. Obiectele de pe forma folosit vor fi un T im erl i o etichet L a b ell n care va fi scris textul care dorim sa fie afiat. Dimensiunea, culoarea i celelalte proprieti ale textului se pot seta din O bject Inspector. Vom realiza aceast aplicaie folosind proprietile TransparentColor i AlphaBlend ale formei F on u l. Proprietile formei F orm 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 1Ac-liveCaption TransparonLColor = True Font.Color clWindowText Font.Height = -11 Font .N - r e = 'MS Sans Serif' rin Font.St yle = [] Text I e iqht: = 13 l object Labell: TLabel Caption = 'Sa invatam DELPHI 7!' Color = clActiveCaption

327

Font.Color = clYellow Font.Height = -27 Font.Name = 'MS Sans Serif' Font.Style = [fsBold]

end object T i m e r l : TTimer


Interval = 50 OnTimer = TimerlTimer

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt: var


aparent : boolean;

procedure TForml.TimerlTimer(Sender: TObject); begin aparent := not apa r e n t ; if aparent then begin Forml.TransparentColor := false; Forml.AlphaBlend := false;
F o r m l .AlphaBlendValue := 255;

end else begin


Forml.TransparentColor := true; Forml.AlphaBlend := true; Forml.AlphaBlendValue := 0;

end; end; procedure T F o r m l .F o r m S h o w (S e n d e r : TObject); begin aparent := true; end

Exem plul 4: Urmtorul exemplu va afia un text, liter cu liter, cu o anumit frecven. Vom considera o component Im agel i o component OnTimer 1. Vom afia literele cu o frecven' data de valoarea proprietii Interval a obiectului OnTim erI. Vom seta 25 dimensiunea textului i culoarea albastru. Dac lungimea textului depete limea pe care am setat-o pentru Im agel, atunci vom continua scrierea pe rndul urmtor. La lansarea n execuie a programului, textul va ncepe s se scrie din colul stnga sus al imaginii Im agel.

328

Proprietile evenimentelor de pe forma F orm l sunt:


object Imagel: Tlmage
Left = 0 Top = 0 Wi d t h = 400 Height = 400 AutoSize = True

end object Timerl: TTimer


Interval = 100 OnTimer = TimerlTimer

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure T F o r m l .T i m e r l T i m e r (S e n d e r : TObject); begin
:= 'Acesta este un exemplu simplu de lucru'+ ' cu componenta OnTimer.'; i m a g e l .C a n v a s .F o n t .Size := 25; i m a g e l .Canvas.F o n t .Style := [fsbold]; i m a g e l .Canvas.Font.Color := clblue if i > length(text) then text

else if x > imagel.Width then begin


y x := y + 50; := 50;

end else begin


imagel.Canvas.TextOut(x,y,text[i]);
X := X + 30;

i n c (i );

end ; procedure T F o r m l .F o r m S h o w (S e n d e r : TObject); begin


X

:= 10; := 10;

end;

329

23. FERESTRE DE DIALOG


Cutiile de dialog sunt ferestre complexe n care utilizatorul este solicitat s-i introduc opiunile referitor la felul n care se va executa n continuare aplicaia. 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 TComm onDialog. Afiarea unei ferestre de dialog este modal i se face ape lnd metoda Execute. Aceast metod ntoarce valoarea tru e dac utilizatorul i-a setat opiunile dorite i a apsat butonul Ok. Metoda ntoarce valoarea false dac utilizatorul a apsat butonul Cancel. Apsarea unuia dintre butoanele O k sau Cancel nu conduce la efectuarea vreunei operaii de ctre componenta de dialog. Programatorului i revine sarcina de a scrie codul ce se va executa dup apsarea unuia dintre butoanele O k sau Cancel. Cutiile de dialog simple sunt create i afiate cu ajutorul unor funcii (spre exemplu ShowM essage). Ele sunt folosite pentru a afia un text ctre utilizator (procedura ShowM essage) sau pentru a citi un text introdus de ctre utilizator.

23.1. TCommonDialog
Este strmoul comun al tuturor componentelor ce reprezint o cutie de dialog. Din el deriv TO penDialog, TSaveDialog, TPrintD ialog, TColorDialog,
TO penPictureDialog, TSavePictureD ialog, TFontDialog, TPrinterSetupDialog, TFindDialog, TReplaceD ialog.

Ierarhie___________________________________________________ __
T O bject -> TPersistent -> TComponent -> Tcom monDialog

Definit n_____________________________________________________
dialogs.hpp

330

Proprieti P I.
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;


Afieaz fereastra cutiei de dialog. Toate cutiile de dialog enumerate mai sus sunt vizibile doar la momentul execuiei aplicaiei, dup ce s-a apelat metoda Execute. Fiecare component va suprascrie aceast m etod pentru afiarea propriei cutii de dialog. O fereastr de dialog const dintr-o parte specific (spre exemplu, componenta TOpenDialog este destinat selectrii unui fiier, componenta TColorD ialog este destinat selectrii unei culori, etc.) i dou butoane (unul etichetat cu Ok iar cellalt cu Cancel). Metoda returneaz true dac utilizatorul a fcut o selecie valid i a apsat butonul Ok. n caz contrar (cnd este apsat butonul Cancel) metoda returneaz false.

Evenimente E l.
OnShow

property OnShow: TNotifyEvent;


Apare cnd cutia de dialog este afiat.

331

E2.

OnHide

p ro p e rty OnClose: TNotifyEvent; Apare cnd cutia de dialog este nchis.

23.2. TOpenDialog
Afieaz o cutie de dialog pentru a selecta i deschide fiiere. Pe ecran este afiat:

Look in:

jBnj
i D oc j Examples j Help

j Lib J Objrepos J Ocx j Projects J P vcs

L_J Source ~ * D e ls L U s u =1 iTj Deploy jf f j License ^>1 Readme, cnt Readme

j Images
J Include

j Quickrpt

File name: Files of type: P * O pen a sjead-only j 3

pen Cancel

Ierarhie
TO bject -> TPersistent -> TComponent -> TComm onDialog -> -> T O penD ialog .

Definit n
dialogs.pas

Pagina
D ialogs

Proprieti PI.
FileName

p ro p e rty FileName; TFileName;

332

Indic numele i calea ultimului fiier selectat.

Exemplu:
Urmtoarea aplicaie ncarc ntr-o component TMemo textul aflat ntrun fiier. Numele i calea fiierului sunt selectate cu ajutorul unei componente TOpenDialog. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Buttonl: TButton
Caption = 'Deschide Fiier'

end object OpenDialogI: TOpenDialog


Filter = 'Fiiere P ascalj* .pas'

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml . ButtonlClick(S e n d e r : TObject); begin if O p e n D i a l o g I .Execute then M e m o l .L i n e s .LoadFromFile(OpenDialogI.File N a m e ) ; end;

P2.

Files

property Files: TStrings;


Returneaz o list cu numele i cile fiierelor selectate. Selectarea mai multor fiiere este posibil numai n cazul n care flagul ofAllowM ultiSelect din cadrul proprietii O ptions este true.

Exemplu:
Urmtoarea aplicaie afieaz ntr-o component TListBox numele tutu ror fiierelor selectate. Fiierele sunt selectate cu ajutorul unei compo nente TOpenDialog. Valorile proprietilor obiectelor de pe forma F orm l su n t:.
object Buttonl: TButton
Caption = 'Afiseaza nume'

end object OpenDialogI: TOpenDialog


Filter = 'Fiiere Pascal|* .pas' Options = [ofHideReadOnly, ofAllowMultiSelect, ofEnableSizing]

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:

333

procedure T F o rml.ButtonlClick(Sender: TObject); begin if Op e n D i a l o g I .Execute then L i s t B o x l .Items.Assign(OpenDialogI.F i l e s ) ; end;

P3.

F ilter

property Filter: string;


Specific un filtru pentru selecia de fiiere. Filtrul este creat la fel ca i la TComboListBox. P4.
Filterlndex

property Filterlndex: Integer;


Specific care filtru s fie ales cnd se deschide o cutie de dialog. Filtrele n cadrul proprietii Filter au ataate numere de ordine. Primul filtru are numrul de ordine 1, al doilea 2, etc. Dac se ncearc accesarea unui filtru care are numrul de ordine mai mare dect numrul total de filtre, atunci este ales primul filtru (cel cu numrul de ordine 1). P5.
DefaultExt

property DefaultExt: string;


Specific extensia implicit pentru un fiier. Acest lucru este util n momentul n care utilizatorul tasteaz un nume de fiier far extensie. La acest fiier este adugat extensia DefaultExt. Spre exemplu dac extensia fiierelor a fost setat la .pas (OpenDialogI.DefaultExt : = 1 a s '), atunci, dac utilizatorul tasteaz numele fiierului far extensie p (de exemplu u n itl), implicit este unitl.pas. P6.
H istoryList

property HistoryList: TStrings;


Este o list cu fiierele care au fost deja deschise. P7.
InitialD ir

property InitialDir: string;


Indic directorul curent care va aprea implicit cnd se deschide o cutie de dialog. Dac nu se specific nici un director atunci InitialD ir va fi directorul curent de lucru.

334

P8.

O ptions

property Options: TOpenOptions;


Descrie felul n care se comport fereastra de dialog.

Evenimente__________________________________________________ E l.
O nCanClose

property OnCanClose: TCloseQueryEvent;


Apare cnd utilizatorul nchide cutia de dialog printr-o operaie diferit de Cancel. Aceste eveniment este util atunci cnd selecia unui nume de fiier este incorect. Acest eveniment trebuie s i spun utilizatorului de ce cutia de dialog nu poate fi nchis. Tipul TCloseQ ueryEvent este definit astfel: TCloseQueryEvent = procedure(5e<ier: TObject; var CanClose: Boolean) of object; Pentru a preveni nchiderea dialogului setai variabila CanClose la false.

E2.

O nFolderChange

property OnFolderChange: TNotifyEvent;


Apare cnd utilizatorul schimb directorul al crui coninut este curent afiat n cutia de dialog.

E3.

OnTypeChange

property OnSelectionChange: TNotifyEvent;


Apare cnd utilizatorul selecteaz un alt filtru pentru fiierele afiate n cutia de dialog.

E4.

OnSelectionChange

property OnSelectionChange: TNotifyEvent;


Apare cnd utilizatorul modific coninutul cutie de dialog. Acest lucru poate nsemna: selectarea unui nou fiier sau director, selectarea unui nou filtru, crearea unui director etc.

335

23.3. TSaveDialog
Afieaz o cutie de dialog asemntoare cu cea de tipul Save As. Utilizatorul poate specifica aici modul i locul de salvare a unui fiier.

Ierarhie
TO bject -> TPersistent -> TComponent -> TCommonDialog -> -> TO penDialog -> TSaveDialog.

Definit n
dialogs.pas

Pagina
D ialogs

Observaii:
Componenta TSaveDialog nu introduce nici o proprietate, metod sau eveniment nou fa de cele ntlnite la TOpenDialog.

!:

Exemplu:
Urmtoarea aplicaie salveaz ntr-un fiier textul aflat ntr-o compo nent TMemo. Numele i calea fiierului n care se va face salvarea este selectat cu ajutorul unei componente TSaveDialog. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Buttonl: TButton
Caption = 'Salveaza'

end object SaveDialogl: TSaveDialog


DefaultExt = 'txt' Filter = 'Fiiere text|*.t x t '

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


I I
(

procedure TForml.ButtonlClick(Sender: TObject); begin if S a v e D i a l o gl.Execute then M e m o l .L i n e s .SaveToFile(SaveDialogl.F i leName); end;

336

Observaie:
Mediul D elphi pune la dispoziia programatorului nc dou compo nente de dialog pentru ncrcat i salvat fiiere cu imagini. Ele se nu mesc TO penPictureDialog i TSavePictureD ialog i au aceleai proprie ti ca i componentele TOpenDialog i TSaveDialog. Singura diferen este faptul c TO penPictureDialog i TSavePictureD ialog pun la dispo ziia programatorului filtre pentru fiierele cu imagini. Filtrele implementate sunt:
A l 1 (*.j p g ;*.jp e g ;*.b m p ;*.i c o ;*.e m f ; . wmf) JPEG Image File {*.j pg,*.jpeg) Bitmaps (*.bmp) Icons (*.ico) Enhanced Metafiles (*.emf) Metafiles (*.wmf)[*.wmf

23.4. TFontDialog
Afieaz o cutie de dialog pentru selectarea unui font:

Font: |M S S a n s Serif M S S a n s S e iif M S Serif Playbill S m all Fonts Sym bol S ystem Tahom a
A.

F on t style: |R e g u la r I J T in i Ita lic B o ld B o ld Ita lic _ l _ J S a m ple


:

Size: J1 [ 1 1 1 Cancel OK

23

E ffe c ts f~ IS trik e o u t

A a B tA O o U n d e rlin e Color: | B la c k [ Script: _ e ritia l E u ro p e a n

Ierarhie
TO bject -> TPersistent -> TComponent -> TCommonDialog -> -> TFontDialog.

337

Definit n
dialogs.pas

Pagina______________________________________________________
D ialogs

Proprieti___________________________________________________ PI.
Font

property Font: TFont;


Specific fontul selectat. Cnd utilizatorul alege un font i apas butonul Ok, fontul selectat este valoarea lui Font.

Evenimente
E l.
OnApply

property OnApply: TFDApplyEvent;


Apare cnd utilizatorul apas butonul Apply al ferestrei de dialog. Tipul TFDApplyEvent este definit astfel: TFDApplyEvent = procedure(.SVw/e/': TObject; Wnd: HWND) j

of object;
Wnd este meninut pentru compatibilitate napoi i are aceeai valoare ca i proprietatea Handle.

Exemplu:
Urmtoarea aplicaie seteaz fontul cu care este scris textul din cutia de editare E d itl. Fontul este selectat cu ajutorul unei componente
TFontDialog.

I
I
(

Valorile proprietilor obiectelor de pe forma F orm l sunt:


object Editl: TEdit
Text = 'Acesta este un text!'

end object Buttonl: TButton


Caption = 'Seteaza Font'

end

338 J

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure T F o r m l .Butt o n l C l i c k (Sender: TObject); begin if F o n t D i a l o g l .Execute then E d i t l .F o n t . A s s i g n (FontDialogl.F o n t ); end; procedure T F o r m l .FontDialoglApply(S e n d e r : TObject; Wnd: H W N D ) ; begin E d i t l . F o n t .A s s i g n (FontDialogl.Font) ; end;

23.5. TColorDialog
Afieaz o cutie de dialog pentru selectarea unei culori:

Basic colors:

H r

rrrrrarn mr r {smmmm mr m u m m u u mmmmMuuM wrrrnrmr


r r r r

r n r i i i

Custom colors: r r r r

r r r r r r r r
ColoilSolid OK Cancel

Hue:fT2T
al: f i 74 Lum. J

Red: p T Green: ['215 glue: [ S F

43*

A d d to Custom Colors

Ierarhie
TO bject -> TPersistent -> TComponent -> TCommonDialog -> -> TFontDialog

Definit n
dialogs.pas

339

Pagina
D ialogs

Proprieti________________________________________________ _ PI.
Color

property Color: TColor;


Returneaz culoarea selectat.

Exemplu:
Urmtoarea aplicaie selecteaz cu ajutorul unei componente
TColorDialog culoare de fond a formei principale.

Handlerele de evenimente ale obiectelor de pe forma Form l 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 t e then 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.

Custom Colors

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=ValoareH exa (spre exemplu ColorA=808298). Se pot specifica cel mult 16 culori prelucrate (de la ColorA la ColorP).

Exemplu:
Urmtoarea aplicaie 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 te; R a n d o m C o lo r : i n t e g e r ;

begin with C o l o r D i a l o g l do begin


C u s t o m C o l o r s . C l e a r ; //te r g culorile deja existente for i := 0 to 15 do

begin
R a n d o m C o lo r := r a n d o m ) $ 1 0 0 0 0 0 0 ) ; C u s t o m C o l o r s . A d d ( ' C o l o r ' + c h r ( o r d ( ' A ' ) + i ) + =' IntT oH ex(R andom C olor, 6 ) ) ; +

340

end; end; end;

23.6. TFindDialog
Afieaz o cutie de dialog care permite introducerea unui text care va fi cutat ntr-un fiier:

Find w hat:

I-

M a tc h w h ole w o rd only

D ire c tio n

C ancel

'
Ierarhie

' r y p ^ - own.

TO bject -> TPersistent -> TComponent -> TCommonDialog -> -> TFindDialog.

Definit n
dialogs.pas

Pagina
D ialogs

Proprietti PI.
FindText

p ro p e rty FindText: string; La apsarea butonului FindN ext, FindText va primi ca valoare irul introdus n cutia Find what de ctre utilizator.

P2.

O ptions

p ro p e rty Options: TFindOptions; Seteaz modul de comportare a cutiei TFindDialog.

341

TFindOptions este un tip mulime, deci Options va fi o submulime din urmtoarele valori:
V a lo a r e frD o w n frF in d N ex t frM a trh C a se frR ep la c e S e m n ific a ie S e lecteaz bu to n u l de rad io D o w n. C n d a ceast va lo a re nu este in clu s n O ptions, n sea m n c b uto n u l radio U p este selectat. A c est flag este setat cnd u tilizato rul a p as pe butonul F in d N e x t S e lecteaz cu tia de control M a tc h C ase . Se ap lic num ai la T R eplaceD ialog. A c est flag in d ic faptul c ap lic aia treb u ie s n lo c u ia sc d o a r p rim a a pariie a lui FindText. Se ap lic n u m ai la T R eplaceD ialog. A c est flag in d ic faptul c a p lic aia tre b u ie s n lo c u ia sc to ate a p ariiile lui FindText. S e lecteaz c u tia de co n tro l M a tc h W h o le W o rd . A fie az un buton de H elp.

frR ep la c e A ll frW h o le W o rd frS h o w H elp

P3.

Position

p ro p e rty Position: TPoint; Indic coordonatele colului din stnga sus al ferestrei de dialog.

Metode______________________________________________________
M l.
CloseD ialog

pro ced u re CloseDialog; nchide cutia de dialog, lsnd ns toate proprietile acesteia neschim bate.

Evenimente__________________________________________________
E l.
OnFind

p ro p e rty OnFind: TNotifyEvent; Apare cnd butonul FindN ext este apsat. n acest handler de eveni mente utilizatorul poate i trebuie s scrie codul necesar cutrii unui subir ntr-un ir. La prima vedere s-ar prea c operaia de cutare a textului este fcut automat de ctre aceast component. Acest lucru este total greit, 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 cnd butonul FindN ext este apsat. Exem plu: Urmtoarea aplicaie caut un text ntr-o component TRichEdit. Munca de cutare este simplificat deoarece componenta TRichEdit furnizeaz metoda FindText pentru cutarea unui ir de caractere. Handlerele de evenimente ale obiectelor de pe forma F orm l 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
F in d D ia lo g l. P o sitio n F in d D ia lo g l.E x e cu te ; := 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 ) ;

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


poz : i n t e g e r ; S t a r t P o z , L u n g im e : In teg e r;

begin with R i c h E d i t l do begin if S e l L e n g t h <> 0 then 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 ca zu l in ca re am m ai g a s it c e l pu in inca o a p a riie a irului / / incep ca u ta rea d u p a selecia curenta

else S t a r t P o z := 0; // incep cautarea de la inceputul textului


L u n g im e := L e n g t h ( T e x t ) - S ta rtP o z;
/ / lungim ea textului in care ca u t

poz

:= 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 , L u n g im e , [ s t M a t c h C a s e ] ) ; if p o z <> - 1 then SetF ocus;


//s e le c te z textul g a sit

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

end else S h o w M e s s a g e ( ' T e x t u l c a u t a t n u m a i a p a r e c a s u b s i r ' ) ; end; end;

Exem plu: Urmtoarea aplicaie realizeaz cutarea unui text ntr-o component TMemo. Deoarece nu mai avem la dispoziie o metod aa de puternic

343

de cutare (precum metoda FindText a lui TRichEdit) vom folosi funcia Pos mpreun cu restrngerea irului n care se realizeaz cutarea. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object B u t t o n l : T B u t t o n
C a p tio n = 'C a u ta '

end object 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 = [fr D o w n , f r D i s a b l e M a t c h C a s e , f r D i s a b l e U p D o w n , f r D i s a b l e W h o l e W o r d , f rW h o le W o rd ]

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


var
S : string; poz, in a in te : in te 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 in d D ia lo g l. P o sitio n F in d D ia lo g l. E x e c u te ; p o z := 1;
// in cep cau tarea clin p o z iia c u ren ta a cu rso ru lu i

:= P o i n t (M em ol. L e f t + M e m ol. W i d t h , M e m o l . T o p ) ;

in ain te

:= M e m o l. S e l S t a r t

- 1;

// S va in d ica tex tu l in care e x ecu tam cau tarea

S := c o p y (M em ol. L i n e s . T e x t , M em ol. S e l S t a r t , l e n g t h (M em ol. L i n e s . T e x t ) - M e m ol. 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


poz : i n te g e r ; S t a r t P o z , L u n g im e : In teg e r;

begin
// c a u t iru l d o rit in te x tu l S

poz

:= 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 = 0 then S h o w M e s s a g e ( ' T e x t u l c a u t a t n u m a i a p a r e c a s u b s i r ' ) else begin


// m arch ez te x tu l g a sit

M e m o l. S e l S t a r t := p o z + i n a i n t e - 1; M e m o l. 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 e m ol. 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 ;
// re str n g cau tarea

S := c o p y ( S ,

p o z + 1 , l e n g t h (s ) );

end; end;

344

23.7. TReplaceDialog
Afieaz o cutie de dialog de tip Find-Replace pentru cutare i nlocuire de text.
Replace
Find w hat: R e p la ce with: ] | ~ '-;i j '"

UM

f~

M a tch w h ole w ord only M a tch case

-----------------------Cancel ------------------------

Ierarhie
TO bject -> TPersistent -> TComponent -> TCommonDicdog -> -> TFindDialog -> TReplaceDialog.

Definit n
dialogs.p a s

Pagina_______________________________________________
D ialogs

Proprieti____________________________________________ PI.
ReplaceText

property ReplaceText: string;


Conine textul care trebuie s nlocuiasc FindText.

Observaie:
Celelalte metode i proprieti sunt preluate de la TFindDialog.

345

Evenimente
E l.
OnReplace

property OnReplace: TNotifyEvent;


Apare cnd unul din butoanele Replace sau ReplaceAll este apsat. In interiorul acestui handler de evenimente programatorul trebuie s scrie o secven de cod care se va executa cnd se dorete nlocuirea unui ir ntr-un text.

Exemplu:
Urmtoarea aplicaie efectueaz cutarea i nlocuirea unui ir ntr-un text dat. nceperea procesului de cutare se realizeaz la apsarea butonului B uttonl. Valorile proprietilor obiectelor de pe forma F orm l sunt:
object Forml: TForml

ActiveControl = Memol object Buttonl: TButton Caption = 'nlocuiete' TabOrder = 0 OnClick = ButtonlClick
end object ReplaceDialogl: TReplaceDialog

Options = [frDown, frDisableMatchCase, frDisableWholeWord] OnReplace = ReplaceDialoglReplace


end end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


var

S : string; poz, inainte : integer;


procedure TForml.ButtonlClick(Sender: TObject); begin

ReplaceDialogl.Position := Point(Memol.Left + Memol.Width, Memol.Top); ReplaceDialogl.Execute; poz := 1;


/ / incep ca u ta rea din p o z iia curen ta a cursorului

inainte := Memol.SelStart - 1;
/ / S va indica textul in care executam cau tarea s i eventual inlocu irea

S := copy(Memol.Lines.Text, Memol.SelStart, length(Memol.Lines.Text) - Memol.SelStart);


end;

346

proced ure var

TForml.ReplaceDialoglReplace(Sender: TObject);

poz : integer; StartPoz, Lungime: Integer;


b e g in i f frReplace i n ReplaceDialogl.Options / / d a ca se fa c e in locu irea p a s cu p a s th e n b e g in / / caut irul dorit in textul S

poz := pos(ReplaceDialogl.FindText, S); i f poz = 0 t h e n ShowMessage('Textul cautat nu mai apare ca subsir')


e ls e b e g in / / m a rch ez textul g a sit

Memol.SelStart := poz + inainte - 1; Memol.SelLength := length(ReplaceDialogl.FindText) ;


/ / inlocu iesc textul si in cutia de d ia lo g 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;
/ / restrn g ca u ta rea s i inlocuirea

S
end; end e ls e end;

:= copy(S, poz+1,length(S));

/ / in locu irea s e f a c e cu R ep la ce A l l ...

23.8. TPrinterSetupDialog

3 .

Genereaz o cutie de dialog pentru configurarea imprimantei:

Ierarhie
TO bject -> TPersistent -> TComponent -> TComm onDialog -> -> TPrinterSetupDialog.

Definit n
dialogs.p a s

Pagina
D ialogs

Ml

Plini Setup
Printer Name: Status: Type: Where: Comment: Paper Size: Source: A 4 21 Ox ^97 mm Tractor [Epson

L-0 X80

Properties

Default printer; Ready Epson LX-80Q LPT1:

Orientation (* iPortraij Landscape j

Cancel

Observaie:
Aceast component este singura (dintre cele din pagina D ialogs) pentru care, dup ce este apsat butonul Ok, programatorul nu mai trebuie s scrie cod. Ea configureaz automat imprimanta n funcie de opiunile setate de ctre utilizator.

Exemplu:
Urmtoarea aplicaie configureaz imprimanta.
p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g in i f PrinterSetupDialogl.Execute t h e n ShowMessage('Imprimanta a fost setata.') e l s e ShowMessage('A fost apasat butonul Cancel.'); end;

23.9. TPrintDialog
Afieaz o cutie de dialog pentru setarea modului n care vor fi tiprite paginile trimise pentru listat la imprimant.

348

Print
- Printer Name: Status: Type: W here: Comment: Default printer; Ready Epson LX-800 LPT1: Properties

Print range & All

C opies.................................................... N umber of copies: [

p
12 r j (7 Collate

r
OK

Cancel

Ierarhie
TO bject -> TPersistent -> TComponent -> TComm onDialog -> -> TPrintDialog.

Definit n_____________________________________________________
dialogs.p a s

Pagina______________________________________________________
D ialogs

Proprieti___________________________________________________
P I.
Copies

property Copies: Integer;


Indic numrul de copii care trebuie fcute. Dac Copies este 0 sau 1, atunci csua cu Number of Copies din cutia de dialog va indica 1. P2.
FromPage

property FromPage: Integer;


Indic numrul paginii de la care s nceap listarea.

349

P3.

ToPage

property ToPage: Integer;


Indic numrul paginii pn la care s se fac listarea.

P4.

M axPage

property MaxPage: Integer;


Indic numrul maxim al unei pagini pe care utilizatorul o poate intro duce pentru tiprire. Acest lucru este posibil doar dac flagul poPageN um s este setat.

P5.

M inPage

property MinPage: Integer;


Indic numrul minim al unei pagini pe care utilizatorul o poate introduce pentru tiprire.

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 a lo a r e prA U P ages p rS electio n S e m n ific a ie Butonul AU este selectat, deci toate paginile fiierului vor fi tiprite. Butonul S e le c tio n este selectat, deci se listeaz selecia curent a textului. Butonul P a g es este selectat, deci utilizatorul poate intervalul de pagini care vor tl tiprite. introduce

p rP a g eN u m s

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

opiune 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:
Urmtoarea aplicaie implementeaz lucrul cu proprietile obiectului
TPrintDialog.

Valorile proprietilor obiectelor de pe forma F orm l sunt:


o b ject end o b ject

Buttonl: TButton Caption = 'Tiprete' PrintDialogl: TPrintDialog Collate = T r u e Options = [poPageNums, poDisablePrintToFile]

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


u ses

printers;
p roced ure var

TForml.ButtonlClick(Sender: TObject);

i, p : integer;
//p e n tr u tip rit o zona continua de p a g in i

de_la, pana_la : integer;


b e g in

PrintDialogl.MinPage := 1; PrintDialogl.MaxPage := 10; //avem maxim 10p gini de t p r t a ii


i f PrintDialogl.PrintRange / / tip re sc to a te p a g in ile th e n b e g in

= prAUPages

de_la := PrintDialogl.MinPage; pana_la := PrintDialogl.MaxPage;


end e ls e b e g i n / / tip re sc d o a r o p a r te din p a g in i

de_la := PrintDialogl.FromPage; pana_la := PrintDialogl.ToPage;


end; i f PrintDialogl.Execute th e n b e g in

Printer. BeginDoc; / incep tip a rirea / PrintDialogl. Collate / / d a ca c o llate este tru e t h e n f o r i := 1 t o PrintDialogl. Copies d o / pen tru fieca re copie / f o r p := de_la t o pana_la d o / / p en tru fieca re p a g in a
if b e g in //tip r e s c ceva p e fie c a re p a g in a

Printer.Canvas.TextOut(10, 10, 'Pagina ' +

351

IntToStr(p)) ; Printer. NewPage; / / trec la o p a g in a noua


Kc end e l s e / / c o lla te este false f o r p := de_la t o pana_la d o f o r i := 1 t o PrintDialogl.Copies d o b e g in / /tip r e s c ceva p e fie c a re p a g in a

Printer.Canvas.TextOut(10, 10, 'Pagina ' + IntToStr(p)) ; Printer. NewPage;


end;

Printer.EndDoc; / / s e term ina tip a rirea


end; end;

23.10. Funcii care afieaz cutii de dialog


F I.
CreateM esscigeDialog

function CreateM essageDialog(const Msg: string; DlgType: TMsgDIgType; Buttons: TMsgDlgButtons): TForm; Creeaz o cutie de dialog care va afia 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 a lo a r e m tW a m in g m tE rro r m tln form ation m tC onfirm ation m tC ustom S e m n ific a ie Cutia de dialog conine un sem n de exclam are galben. Cutia de dialog conine un sem n de stop colorat n rou. Cutia de dialog conine caracterul "i" colorat n albastru. Cutia de dialog conine un sem n de ntrebare colorat n verde. Cutia de dialog conine doar text simplu.

Butoanele amplasate pe cutia de dialog pot fi unul sau mai multe dintre urmtoarele:
V a lo a r e m bY es m bN o m bO k m b C a n cel m b A b o rt m b R etry T ex tu l n sc ris p e b u to n Y es No Ok Cancel Abort Retry

352

V a lo a r e m b Ignore m bA ll inbN oT oA ll m bY esT oA ll m bH elp

T ex tu l n sc ris pe b u to n Ignore AII N o T o A ll Y es T o AU Help

Observaie:
Cutia de dialog nu va fi afiat ci doar creat. Pentru afiarea cutiei de dialog putei folosi metodele clasei TForm.

Exemplu:
Urmtoarea aplicaie afieaz o cutie de dialog n care utilizatorul i exprima intenia cu privire la terminarea aplicaiei curente.
proced ure var b e g in

TForml.ButtonlClick(Sender: TObject);

f : TForm; f := CreateMessageDialog('Dorii sa terminati?, mtConfirmation, [mbOK, mbCancel]); i f f.ShowModal = mrOK t h e n Application.Terminate; f .Free;
end;

F2.

ShowM essage

procedure ShowMessage(const Msg: string);


Afieaz o cutie de dialog simpl care conine un mesaj ctre utilizator i un buton Ok.

Exemplu:
Urmtoarea aplicaie afieaz la apsarea butonului B uttonl data curent.
proced ure b e g in end;

TForml.ButtonlClick(Sender: TObject);

ShowMessage (1 Astzi este: '+DateToStr (Date) )

353

F3.

InputQuery

function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean;


Afieaz 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 ctre parametrul A C aption), un text informativ asupra irului care trebuie furnizat de ctre utilizator (parametrul APrompt), o cutie de editare n care trebuie introdus valoarea solicitat i dou butoane (Ok i Cancel). Valoarea introdus de ctre utilizator va fi retumat n irul Value. Funcia returneaz true dac utilizatorul a apsat butonul Ok i false n caz contrar.

Exemplu:
Urmtoarea aplicaie solicit utilizatorului introducerea unui numr. Aplicaia va face i validarea numrului introdus.
u ses

filectrl;
proced ure var

TForml.ButtonlClick(Sender: TObject);

nr : integer; sir : s t r i n g ;
b e g in i f InputQuery('Cutie th en tr y

de dialog', 'Introduceti un numar', sir)

nr := StrToInt(sir);
except o n EConvertError d o end end;

nr := 0;

F4.

SelectD irectory

function SelectDirectory(const Caption', string; const Root: WideString; out D irectory: string): Boolean;
Afieaz o cutie de dialog care i permite utilizatorului s aleag un director. Caption este eticheta cutiei de dialog. Root este directorul a crui structur va fi afiat. D irectory va conine numele i calea direc torului selectat. Funcia returneaz true dac utilizatorul a selectat un director i a apsat butonul Ok i false n cazul n care utilizatorul a apsat butonul Cancel.

354

Exemplu:
Urmtoarea aplicaie seteaz directorul curent la o valoarea selectat de ctre utilizator.
proced ure var

TForml.ButtonlClick(Sender: TObject);

dir : s t r i n g ; b e g in i f selectDirectory('Selecteaza t h e n SetCurrentDir(dir); end;

D i r e c t o r c :\ ',dir)

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 menin i manipuleaz o dat de tip double. Tipul TDate stocheat o dat calendaristic. Tipul TTime stocheat un timp. Componenta TD ateTim ePicker furnizeaz utilizatorului posibilitatea de alegere n mod sugestiv (dintr-un calendar cu ajutorul mouse-ului) a unei date sau a unui timp. Pe lng aceste obiecte, unitul System.pas pune la dispoziia progra matorului o gam complet de funcii 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 funciile care prelucreaz aceste valori. Intern, o valoare TDateTime esle reprezentat de o variabil double. Partea ntreag reine data, iar partea fracionar reine timpul. Mai precis, n

356

partea ntreag este reinut numrul de zile care au trecut de la data de 12/30/1899. Spre exemplu, data de 21 May 2001 este reinuta ca valoarea 37032. Putem obine data calendaristic reprezentat de o valoare ntreag executnd urmtorul cod:
proced ure var b e g in

TForml.ButtonlClick(Sender: TObject);

data : TDate; data := StrToInt (Editl .Text) ; //i c t a Ed t s a l numrul i t e d r t n ui i l e fa nrg oi ShowMessage(DateToStr(data)) ;
end;

n partea fracionar este reinut ct la sut au trecut din cele 24 de ore ale unei zile. Acest procent este calculat la nivel de milisecunde:
con st

MSecsPerDay = 24 * 60 * 60 * 1000; Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) / MSecsPerDay;

Urmtorul cod transform un numr real cuprins ntre 0 i 1 ntr-un timp stocat ntr-o variabil TDateTime pe care apoi l afieaz.
proced ure var b e g in

TForml.ButtonlClick(Sender: TObject);

data : TTime; data ;= StrToFloat(Editl.Text); ShowMessage(TimeToStr(data) );


end;

24.4. Operatori aritmetici i relaionali


Deoarece valorile de tip dat/timp sunt stocate sub form de valori

double, pentru manipularea acestor variabile pot fi folosii operatorii aritmetici


uzuali (+, -).

Atenie
Folosirea operatorilor aritmetici implic respectarea regulilor de stocare a variabilelor dat/timp. Astfel, dac se dorete mrirea cu o zi a unei date, atunci se adaug o unitate la valoarea respectiv:
proced ure var

TForml.ButtonlClick(Sender: TObject);

t : TDate;

357

b e g in

t := Date; //fu n c ia Date returneaz data curenta ShowMessage (DateToStr (t) ) t t + 1; ShowMessage(DateToStr(t));
end;

Astfel, dac se dorete mrirea cu o secund a unui timp, atunci se adaug o valoarea 1000/MSecsPerDay:
p roced ure var b e g in

TForml.ButtonlClick(Sender: TObject);

t : TTime; t := Time; / fu c i Time retumeaza ora curenta / na ShowMessage(TimeToStr(t)); t := t + 1000/MSecsPerDay; / am adaugat aceasta valoare deoarece / / o secunda are 1000 de milesecunde / ShowMessage(TimeToStr(t));
end;

De asemenea pentru a compara dou variabile dat/timp pot fi folosii operatorii relaionali uzuali (=, <, >, o , >=, <=)

Exemplu:
! Urmtoarea aplicaie compar dou date calendaristice i afieaz un mesaj sugestiv referitor la relaia dintre ele. Datele sunt citite cu ajutorul unei componente TDateTim ePicker care va fi prezentat mai jos n acest capitol. Valorile proprietilor obiectelor de pe forma F orm l sunt:
o b jec t

Buttonl: TButton Caption = 'Compara'

end o b jec t

DateTimePickerl: TDateTimePicker DateFormat = dfshort DateMode = dmComboBox Kind = dtkDate

end o b jec t

DateTimePicker2: TDateTimePicker DateFormat = dfshort DateMode = dmComboBox Kind = dtkDate

end

Handlerul de evenimente al obiectului Buttonl este:


proced ure var

TForml.ButtonlClick(Sender: TObject);

dl, d2 : integer;

358

b e g in

dl := trunc(DateTimePickerl.Date); / vom l a doar p r e reprezentnd d / u ata ata <3.2 := trunc (DateTimePicker2 .Date) ; if 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('>');
end;

24.5. Funcii i proceduri


n cele ce urmeaz sunt prezentate o serie de funcii 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 IncM onth(const Date: TDateTime;


NumberOjMonths: Integer): TDateTime;

Adaug NumberOjM onths la data D ate i returneaz noua dat rezultat. NumberOfMonths poate fi i negativ semnificnd ntoarcerea la o dat precedent lui Date.

F5.

IsLeapYear

function IsLeapYear(Year. Word): Boolean;


Returneaz true dac anul Year este an bisect.

359

F6.

D ecodeTim e

p ro ced u re DecodeTime(77we: TDateTime; v a r 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.
D ecodeD ate

p ro ced u re D ecodeDate(toe: TDateTime; v a r Year, Month, Day: Word); Decodific data stocat n obiectul D ate n valorile componente: an
(year), lun (month) i zi (day).

F9.

EncodeD ate

function EncodeDate( Year, Month, Day: Word): TDateTime; Codific valorile Year, Month, D ay ntr-un obiect de tip TDateTime pe care l returneaz. FIO.
StrToTime

function StrToTime(const S: string): TDateTime; Convertete o valoare ir de caractere care conine valori pentru or, minut, secund, milisecund, ntr-un obiect TDateTime. F II.
TimeToStr

function TimeToStr(T/me: TDateTime): string; Convertete timpul Time ntr-un ir de caractere i returneaz rezultatul. irul returnat va conine ora, minutul i secunda. F12.
StrToDate

function StrToDate(const S: string): TDateTime; Convertete o valoare ir de caractere care conine valori pentru an, lun, zi, ntr-un obiect TDateTime. 360

F13.

D ateToStr

function D ateToStr(toe: TDateTime): string;


Returneaz data curent stocat n obiectul D a te , sub forma unui ir de caractere.

F14.

StrToDateTim e

function StrToDateTime(const S: string): TDateTime;


Convertete o valoare ir de caractere care conine valori pentru an, lun, zi, or, minut, secund, milisecund, ntr-un obiect TDateTime.

F15.

D ateTim eToStr

function DateTimeToStr(Datfe77me: TDateTime): string;


Returneaz data i timpul stocate n obiectul D ateTim e sub forma unui ir de caractere.

F16.

D ayO fW eek

function DayOfW eek (Date: TDateTime): Integer;


ntoarce ziua din sptmn pentru data specificat n variabila Date. Prima zi din sptmn este considerat Duminic. Valorile returnate de funcie sunt numere ntregi n intervalul 1..7.

Exemplu:
Urmtoarea aplicaie afieaz ziua curent din sptmn sub forma unui ir de caractere coninnd numele zilei.
procedure T F o r m l .Butt o n l C l i c k (Sender: T O b ject); var
d: TDateTime; zile: array[1..7]

of string;

begin
ziletl] := 'Duminica'; z i l e [2] := 'L u n i '; z i l e [3] := 'M a r t i '; z i l e [4] := 'Miercuri'; zile [5] := 'Joi ' zile[6] := 'Vineri'; z i l e [7] := 'Sambata'; S h o w M e s s a g e ('Astzi este

' + zile[DayOfWeek(Now)]);

end;

361

24.6. TDateTimePicker
Ierarhie
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TDateTimePicker.

Definit n_____________________________________________________
com ctrls.pas

Pagina
Win32

______________________________________________

Proprieti___________________________________________________ PI.
CalColors

property CalColors: TMonthCalColors;


Indic culorile folosite pentru fiecare parte din calendar. Clasa
TM onthCalColors are urmtoarele proprieti: M onthBackColor, TextColor, TitleBackColor, TitleTextColor, TrailingTextColor care

indic culorile pentru fundalul principal (acolo unde sunt afiate datele), textul cu care aceste date sunt afiate (n cazul n care fac parte din luna curent selectat), fundalul de titlu (acolo unde sunt afiate numele lunii i anul), textul de titlu (care indic numele Junii i anul), textul cu care sunt afiate datele care nu fac parte din luna curent selectat.

Exemplu:
Urmtoarea aplicaie seteaz culorile unui calendar. Pentru aceasta este folosit o component de tip TRadioGroup care are itemurile: M onthBackColor, TextColor, TitleBackColor, TitleTextColor i
TrailingTextColor.

La apsarea butonului Buttonl este afiat o fereastr de dialog ( C o lo rD ia lo g l ) pentru selectarea culorii. n funcie de itemul selectat din R adioG roupl se vor schimba culorile diferitelor pri ale componentei D ateT im eP ickerl. Valorile proprietilor obiectelor de pe forma Form l sunt:
object Buttonl: TButton
Caption = 'Schimba C u l o a r e a 1

end object DateTimePickerl: TDateTimePicker

362

DateFormat = dfShort DateMode = dmComboBox Kind = dtkDate

end object RadioGroupl: TRadioGroup


Caption = 'Culoare calendar' I t e m s .Strings = ( ' o nth B a c k C o l o r ' M 'T e x t C o l o r ' Ti tleBackColor' 'T i tleTextColor' 'TrailingTextColor ')

end object ColorDialogl: TColorDialog end

I landlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure TForml.ButtonlClick(Sender: TObject); begin if C o l o r D i a l o g l . E x e c u te // daca a fost selectata o culoare then // si s-a apasat butonul ok with 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 0 1 2 3 4 : : : : : : ShowMe s s a g e ('Nici un item selectat'); MonthBackColor := ColorDialogl.C o l o r ; TextColor := ColorDialogl.Color; TitleBackColor := ColorDialogl.Color; TitleTextColor := ColorDialogl.C o l o r ; TrailingTextColor := ColorDialogl.C o l o r ;

end; end;

P2.

Kind

property Kind : TDateTimeKind;


Indic dac componenta TDateTim ePicker este folosit ca selector de dat sau de timp. Valori posibile pentru TD ateTim ePicker sunt:
V a lo a r e S e m n ific a ie C o m p o n e n ta v a a fi a i v a m a n ip u la ore. C o m p o n e n ta v a a fia i v a m a n ip u la d a te calendaristice.

dtkTim e dtkD ate

P3.

D ateM ode

property DateMode : TDTDateMode;


Dac valoarea lui D ateM ode este dmComboBox, atunci componenta afieaz (n*cazul n care Kind este setat la dktD ate) un calendar din care utilizatorul poate selecta data dorit. Dac valoarea lui D ateM ode 363

este dm lfpD ow n, atunci componenta nu mai afieaz calendarul prietenos, ci permite utilizatorului s selecteze data (sau timpul) cu ajutorul unei componente TUpDown. P4.
D ate

property Date : TDate;


Indic data selectat de utilizator.

Exemplu:
Urmtoarea aplicaie permite selectarea unei date calendaristice cu ajutorul componentei TDateTim ePicker. La nchiderea calendarului este afiat un mesaj cu data aleas. Fiierul .dfm conine:
object DateTimePickerl: TDateTimePicker
DateFormat = dfLong OnCloseUp = DateTimePickerlCloseUp

end

Handlerul de evenimente este:


procedure T F o r m l .DateTimePickerlCloseUp(Sender: TObject); begin if D a t e T i m e Pickerl-Kind = dtkDate then S h o w M e s s a g e ('Data selectata este:' +
DateToStr(DateTimePickerl.Date));

end;

P5.

Time

property T im e : TTime;
Indic timpul setat de ctre utilizator. P6.
D ateTim e

property DateTime : TDateTime;


Indic data i timpul setate de ctre utilizator. P7.
M axD ate

property M ax D ate: TDate;


Indic data maxim pn la care utilizatorul poate parcurge calendarul.

364

P8.

M inD ate

property M in D ate: TDate;


Indic data minim de la care utilizatorul poate parcurge calendarul. P9.
D ateF orm at

property D ateForm at: TDTDateFormat;


Indic modul n care este afiat o dat. Valori posibile pentru
D ateF orm at sunt:
V a lo a r e ' S e m n ific a ie P e n tru afiare se fo lo se te fo rm atu l s cu rt (ex. 7/11/2 0 0 1 ). P e n tru afiare se fo lo se te fo rm atu l lu n g (ex. 7 n o ie m b rie 2 001).

D fShort DfLong

Evenimente______________________________________________ ___
E l.
OnChange

property OnChange : TNotifyEvent;


Apare cnd utilizatorul selecteaz o dat sau un timp nou. E2.
OnD ropD own

property O nD ropD ow n: TNotifyEvent;


Apare cnd este afiat calendarul din care utilizatorul i poate selecta o dat. E3.
O nCloseUp

property OnCloseUp : TNotifyEvent;


Apare cnd calendarul din care utilizatorul i selecteaz o dat este nchis.

Exemplul 1:
S relum aplicaia construit mai sus n care foloseam dou compo nente TDateTim ePicker pentru compararea a dou date calendaristice. Acolo foloseam un buton care declana compararea celor dou date. Acum vom folosi n locul butonului evenimentul O nC loseU p al celei de a doua componente TDateTimePicker.

365

Noul handler de evenimente va fi:


procedure T F o r ml.DateTimePicker2CloseUp(Sender: TObject); var dl, d2 : integer; begin dl := trunc (DateTimePickerl .Date) ; / / vom lua doar partea d2 := trunc (DateTimePicker2 .Date) ; // reprezentnd data if dl < d2 then S h o w M e s s a g e ('<') else if dl = d2 then ShowMessage (. = ') else S h owMe s s a g e (>'); end;

Exemplul 2:
Urmtoarea aplicaie calculeaz numrul de zile care au trecut de la naterea unui om pn la o dat specificat de utilizator. Vom folosi dou componente TDateTim ePicker n care vom introduce cele dou date: data naterii (n D ateT im eP ickerl) i data curent (n
D ateT im eP ickerl).
procedure T F o r m l .DateTimePicker2CloseUp(Sender: TObject); begin
S h o w M e s s a g e (I n t T o S t r (t r u n c ( DateTimePicker2.Date-DateTimePickerl.Date)) + ' zile');

end;

Exemplul 3:
Urmtoarea aplicaie calculeaz cu cte zile este mai mare o persoan dect cealalt. Vom folosi dou componente TDateTim ePicker n care vom introduce cele dou date: data naterii primei persoane (n D ateT im eP ickerl) i data naterii celei de a doua persoane (n D ateTim ePicker2). Proprietile obiectelor de pe form sunt:
object Labell: TLabel
Left = 56 Top = 104 Width = 143 Height = 13 Caption = Data de natere a persoanei 1'

end object Label2: TLabel


Left = 328 Top = 104 W i d t h = 143 Height = 13 Caption = 'Data de natere a persoanei 2'

end

366

object DateTimePickerl: TDateTimePicker


Left = 56 Top = 120 DateFormat = dfLong

end object DateTimePicker2: TDateTimePicker


Le f t = 328 Top = 120 DateFormat = dfLong

end object Buttonl: TButton


Left = 240 Top = 224 Width = 7 5 Height = 25 Caption = 'Cate Zile?' OnClick = ButtonlClick

end

Handlerele de evenimente sunt:


uses DateUtils; procedure TForml.ButtonlClick(Sender: T O b j e c t ) ; begin
ShowMessage(IntToStr(DaysBetween( DateTimePickerl.Date, DateTimePicker2.Date)) + z i l e ');

end;

367

25. GRIDURI
Grid-urile sunt componente care permit afiarea informaiei 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 numr de celule aflate n stnga i n partea de sus a grid-ului. Celulele fixe sunt specificate prin intermediul proprietilor FixedCols i FixedRows. Accesarea celorlalte celule se poate face fie prin intermediul proprietii Cells (a componentei TStringGrid) fie cu ajutorul metodei C ellR ect (a componentei TD rawG rid) care returneaz dreptunghiul ce nconjoar celula. ntr-o celul a unui grid se poate desena un grafic (componenta T D rawG rid) sau se poate afia un text (componenta TStringGrid ).

25.1. TCustomGrid
Este clasa de baz care definete comportamentul primar al grid-urilor.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomControl -> TCustomGrid

Definit n_____________________________________________________
grids.p a s

Proprieti___________________________________________________ PI.
Col

property Col: Longint;


Indic numrul de ordine al coloanei care conine celula selectat.

P2.

Row

property Row: Longint;


Indic numrul de ordine al liniei care conine celula selectat.

368

P3.

ColCount

property ColCount: Longint;


Indic numrul de coloane ale unui grid.

P4.

RowCount

property RowCount: Longint;


Indic numrul de linii ale unui grid.

Observaie:
Folosind proprietile RowCount i ColCount se poate modifica struc tura unui grid. Coloanele se vor aduga sau terge n partea dreapt a gridului. Liniile vor fi adugate sau terse din partea de jo s a grid-ului.

P5.

DefaultColW idth

property DefaultColWidth: Integer;


Indic limea implicit a coloanelor gridului. Limea unei anumite coloane se poate modifica folosind proprietatea ColWidths.
P 6. DefaultRowH eight

property DefaultRowHeight: Integer;


Indic nlimea implicit a liniilor gridului. nlimea unei anumite linii se poate modifica folosind proprietatea RowHeights.

P7.

ColW idths

property ColW idths[/de;c Longint]: Integer;


Indic limea n pixeli a celulelor fiecrei coloane din grid.

P8.

RowH eights

property RowHeights[/rcefex: Longint]: Integer;


Indic nlimea n pixeli a celulelor fiecrei linii din grid.

P9.

EditorM ode

property EditorMode: Boolean;


Indic dac coninutul celulei curente se poate edita.

369

P10.

FixedColor

property FixedColor: TColor;


Specific culoarea celulelor fixe ale gridului.

P il.

FixedCols

property FixedCols: Integer;


Indic numrul celulelor fixe din marginea stng a gridului. Aceste celule nu pot fi defilate.

P12.

FixedRows

property FixedRows: Integer;


Indic numrul celulelor fixe din partea de sus a gridului. Aceste celule nu pot fi defilate.

P13.

Options

property Options: TGridOptions;


Reprezint un set de opiuni care definesc comportamentul unui grid. Tipul TG ridO ptions este definit astfel: TGridOptions = set of TGridOption; iar tipul TG ridO ption este definit: TGridOption = (goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving, goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor, goThumbTracking);

P14.

LeftCol

property LeftCol: Longint;


Indic numrul de ordine al celei mai din stnga coloane vizibile.

P15.

TopRow

property TopRow: Longint;


Indic numrul 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 r e S e m n ific a fie G rid-ul nu are nici o b a r de defilare. G rid-ul are o b a r o riz o n ta l de defilare. G rid -u l are o b a r v e rtic a l de defilare. G rid -u l are o b a r o riz o n ta l i o b a r v e rtic a l p e n tru defilare.

ssNone ssH orizontal ssVertical ssBoth

P17.

Selection

property Selection: TGridRect;


Specific marginile seleciei curente de celule n grid. Tipul TG ridRect 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 selecie curente. In al doilea caz se indic coordonatele colurilor din stnga sus i dreapta jos ale seleciei curente de celule. Tipul TG ridC oord este definit astfel: TGridCoord = record X: Longint; Y : Longint;

end; Exemplul 1:
Urmtoarea aplicaie calculeaz suma numerelor nscrise n selecia de celule a componentei TStringGrid curente. Utilizatorul poate edita coninutul fiecrei celule.
procedure T F o r m l.ButtonlClick(Sender: TObject); var i , j , s : i nteger; begin
s := 0;

371

with StringGridl do for i := Selection.Top to Selection.Bottom do for j := Sele c t i o n .Left to Selection.Right do


s := s + StrToInt(Cells [j, i]); S h o w M e s s a ge(IntToStr(s ) );

end;

25.2. TDrawGrid
Este o component care permite afiarea de informaie 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______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomControl -> TCustomGrid ->TD rawGrid.

Definit n_____________________________________________________
grids

Pagina
Additional

___________________

Metode M l.
CellRect

function CellRect (ACol, ARow. Longint): TRect;


Returneaz coordonatele ecran ale celulei de la intersecia liniei ARow i coloanei ACol. Dac celula respectiv nu este vizibil se returneaz un dreptunghi vid.

M2.

M ouseToCell

procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);


Returneaz n perechea (ARow, ACol) coordonatele celulei aflate n poziia (X, Y) fa de colul din stnga sus al grid-ului.

372

Evenimente E l.
O nD raw C ell

property OnDrawCell: TDrawCellEvent;


Apare cnd o celul trebuie redesenat. Operaia de redesenare se reali zeaz folosind canvas-ul grid-ului. Tipul TD rawCellEvent este definit astfel: TDrawCellEvent = procedure (Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState) of object; unde:

A C ol i ARow reprezint indicii celulei care trebuie redesenat. R ect este dreptunghiul care mrginete celula. State indic starea celulei. Valorile posibile pentru State sunt din

urmtoarea mulime:
V a lo a r e S e m n ific a ie C e lu la este selectat. C elu la are focus. C elu la este fix.

g oSelected goF ocused goFixed

E2.

OnSelectCell

property OnSelectCell: TSelectCellEvent;


Apare cnd 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 poziia {ARow, A C ol ) poate fi selectat i false n caz contrar.

Exemplul 1:
Urmtoarea aplicaie permite selectarea csuelor pentru care suma dintre coloana i linia pe care se afl este un numr impar.

procedure begin i f (ACol

T F o r m l .StringGridlSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); + ARow)

mod

2 = 0

373

then CanSelect := false eise CanSelect := true; end;

E3.

OnGetEditText

property OnGetEditText: TGetEditEvent;


Apare cnd este dorit valoarea coninut n celula aflat la intersecia 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 coninut n celula (ARow, ACol).

E4.

OnSetEditText

property OnSetEditText: TSetEditEvent;


Apare cnd 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 coninut n celula (ARow, ACol).

Exemplul 2:
Urmtoarea aplicaie calculeaz suma numerelor de pe fiecare linie i fiecare coloan a unei componente TStringGrid i le afieaz 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 proprietilor obiectelor de pe forma F orm l sunt:
object S t r i n g G ridl: TStringGrid
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing]

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure T F o r m l .F o r m C r e a t e (S e nder: TObject); var i, j : integer; begin
// in itia l to a te csu ele s u n t 0

for i := 0 to StringGridl.RowCount - 1 do for j := 0 to StringGridl.ColCount - 1 do

374

StringGridl.Cells[j, i] := IntToStr(0); end;


procedure T F o r m l .StringGridlSetEditText(Sender; TObject; ACol, ARow: Integer; const Value: String); var s, i : integer; begin
// c alcu le z su m a p e lin ia A R o w
S := 0 ;

for i := 1 to StringGridl.ColCount - 1 do
try s := s + StrToInt(StringGridl.Cells[i, ARow]); except on EConvertError do ;

end;
.S t r i n g G r i d l .Cells[0, ARow]
// c alcu le z su m a p e c o lo a n a A C ol
S := 0;

:= I n t T o S t r (s );

for i := 1 to StringGridl.RowCount - 1 do
try s := s + StrToInt(StringGridl.Cells[ACol, except on EConvertError do ; i ]);

end;
S t r i n g G r i d l .Cells[ACol, 0] := IntToStr(s);

end;

25.3. TStringGrid

abc

Este o component care permite afiarea de text ntr-o form tabelar. Accesarea unei celule se face cu ajutorul proprietii Cells.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomControl -> TCustomGrid ->T D raw G rid -> -> TStringGrid

Definit n_____
grids.p a s

Pagina_______
Additional

375

Proprieti PI.
Cells

p ro p e rty Cells [ACol, ARow: Integer]: string; Furnizeaz acces la textul din fiecare celul a unui grid. A C ol indic coloana pe care se gsete celula, iar ARow indic linia pe care se afl celula. Prima linie i prima coloan au indexul 0. E xem plul 1: Urmtoarea aplicaie afieaz n fiecare celul a unei componente TStringGrid suma indecilor liniei i coloanei pe care se afl csua respectiv. In csuele fixe este afiat textul 'Linia x', respectiv Coloana /
procedure TForml.ButtonlClick(Sender: T O b ject); var i , j : integer; begin with StringGridl do begin
/ completam coloana fixa / for i := 0 to RowCount - 1 do Cells[0, i] := 'Linia ' + IntToStr(i);

II completam linia fixa


for 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

p ro p e rty Coh[Index: Integer]: TStrings; Furnizeaz acces la lista de iruri din fiecare coloan a unui grid.

P3.

Rows

p ro p e rty Rows [Index: Integer]: TStrings; Furnizeaz acces la lista de iruri din fiecare linie a unui grid.

376

E xem plul 2: Urmtoarea aplicaie afieaz ntr-o cutie de editare multilinie (M em ol) irurile din linia curent selectat a componentei S trin g G rid l. irurile sunt afiate cte unul pe fiecare linie.
procedure T F o r m l .StringGridlSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin
M e m o l .L i n e s .Assign(S t ringGridl.R o w s [ARow]);

end;

Exem plul 3: Se consider dou matrici. Se cere s se afieze produsul lor. Vom considera fiecare matrice ca fiind reprezentat printr-o component StringGrid. Deci vom avea pe forma F orm l trei componente StringGrid: una corespunztoare primei matrice, o alta corespunztoare 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 (numrul de linii i numrul 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 StringG rid corespunz toare matricelor iniiale. La apsarea acestui buton se va afia un mesaj corespunztor dac numrul de linii ale primei matrice este diferit de numrul de coloane ale celei de-a doua matrice (condiie necesar pentru a se putea efectua produsul a dou matrici). Dac datele introduse sunt corecte, la apsarea acestui buton se vor seta dimensiunile celor trei StringG rid - uri. La apsarea celui de-al doilea buton se va afia n cel de-al treilea StringG rid produsul rezultat din nmulirea matricelor reprezentate n StringG ridurile 1 i 2. Proprietile obiectelor de pe forma F orm l sunt:
object StringGridl: TStringGrid
ColCount = 2 FixedCols = 0 RowCount = 1 FixedRows = 0 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goAlways ShowEditor]

end object StringGrid2: TStringGrid


ColCount = 2 FixedCols = 0 RowCount = 2 FixedRows = 0

377

Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goAlwaysShowEdi t o r ]

end
object S t ringGrid3: TStringGrid
FixedCols = 0 Fi xedR ow s = 0 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing]

end obj ect end obj ect end obj ect end object end obj ect

Editl: TEdit Edit2: TEdit Edit3: TEdit Edit4: TEdit BitBtn]. TBitBtn ;

Caption = 'Calculeaza p r o d u s 1 OnClick = BitBtnlClick

end object BitBtn2: TBitBtn


Caption = 'Aplica' OnClick = BitBtn2Click

end

Handlerele de evenimente ale obiectelor de pe forma F orm l sunt:


procedure c i t i re_matricel; var
i,j : integer;

begin
Forml.StringGridl.Refresh; for i := 0 to F o r m l .StringGridl.ColCount - 1 do for j := 0 to F o r m l .StringGridl.RowCount - 1 do a[i,j] := StrToInt(Forml.StringGridl.Cells[i,j ]);

end; procedure citire_matrice2; var


i,j : integer;

begin
F o r m l .StringGrid2.Refresh; for i := 0 to F o r m l .StringGrid2.ColCount - 1 do for j := 0 to F o r m l .StringGrid2 .RowCount 1 do b[i,j] := StrToInt (Forml.StringGrid2 .Cells [i,j ]) , -

end; procedure T F o r m l .BitBtnlClick(Sender: TObject); var


i,j,k ; integer;

begin
citire_matricel , citire_matrice2 , -

378

F o r m l .S t r i n g Grid3.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


F o r m l .S t ringGrid3.Cells[i,j ] := IntToStr(c[i,j ]);

end; procedure T F o r m l .BitB t n 2 C l i c k (Sender: TObject); begin


F o r m l .Str i n gGridl.ColCount := StrToInt(Forml.E d i t l.Text); F o r m l .S t r i n gGridl.RowCount := StrToInt (Forml.Edit2 .T e x t ) , F o r m l .StringGrid2.ColCount := StrToInt(Forml.Edit3.Text); F o r m l .StringGrid2.RowCount := StrToInt(Forml.E d i t 4 .T e x t ); if Forml.Editl.Text o F o r m l .Edit4.Text

then
S h o w M e s s a g e ('Nu se poate efectua inmultirea! Numrul de '+ ' linii ale primei matrici trebuie sa fie egal cu '+ ' numrul de coloane al matricii a d o u a . ' )

else begin
F o r m l .StringGrid3.RowCount := F o r m l .StringGrid2.R o w C o u n t ; F o r m l .StringGrid3.ColCount := F o r m l .StringGridl.ColCount

end; end;

379

26. TScreen
Reprezint starea ecranului n care ruleaz aplicaia curent. Toate proprietile, metodele i evenimentele acestei componente se refer doar la aplicaia curent chiar dac n sistem mai ruleaz alte aplicaii care, la rndul lor, au forme, controale, etc. active.

Proprieti___________________________________________ ________
P I.
Forms

p ro p e rty Forms [Index: Integer]: TForm; Este un vector care conine toate formele aplicaiei. Prima form are indexul 0. Este posibil ca unele forme s fie create la timpul execuiei aplicaiei. Aceste forme vor intra n calcul doar din momentul n care vor fi instaniate i pn n momentul n care vor fi distruse. P2.
FormCount

p ro p e rty FormCount: Integer; Indic numrul formelor aplicaiei. Aceast proprietate este folosit mpreun cu Forms pentru a manipula toate formele unei aplicaii. Urmtoarea aplicaie const din dou forme. Pe prima form se afl un buton i o cutie de editare multiline. La apsarea butonului se vor afia informaii despre cele dou forme (i anume titlul, nlimea i limea):
procedure T F o r m l .B u t t o nlClick(S e n d e r : TObject); var i : integer; begin
M e m o l .Clear; M e m o l .S c r o llBars:=ssVertical ; for i := 0 to S c r e e n .F o r m C o u n t -1 do

begin
M e m o l .L i n e s .A d d (S c r e e n .F o r m s [i ] .Caption); M e m o l .Lines .Add (IntToStr (S c r e e n .Forms [. ] .H e i g h t ) ) ; i M e m o l . L i n e s .A d d (IntToSt r (S c r e e n .F o r m s [i ] .W i d t h ) );

end; end;

Observm (din informaiile afiate de csua de editare multilinie) c nu conteaz dac forma a doua este sau nu afiat. S facem o aplicaie n care s conteze acest lucru, mai precis s crem o form la timpul 380

execuiei aplicaiei. Pentru aceasta mai folosim un buton la a crui apsare s crem o nou form. Mai nti, apsm primul buton pentru a ne afia informaiile despre formele existente. Observm c doar prima form este recunoscut. Apsm i cel de al doilea buton. O nou form este creat. Acum apsm din nou primul buton i observm c n cutia de editare multilinie vor aprea informaii despre dou forme:
procedure T F o r m l .B u t t o nlClick(Sender: T O b j e c t ) ; v a r i:integer; begin M e m o l .Clear; M e m o l .Sc rollBars:=ssVertical ; for i := 0 to S c r e e n .FormCount-1 do begin M e m o l .L i n e s .Add(S c r e e n .F o r m s [i] .Caption); M e m o l .L i n e s .Add(IntToStr(Screen.F o r m s [i ] .Height)); M e m o l .L i n e s .Add(I n t T o S t r (Screen.Forms[i].Width)); end; end; procedure T F o r m l .But t o n 2 C l i c k (Sender: TObject); v a r Form2:TForm; begin F o r m 2 :=TForm.Create(Application); F o r m 2 .L e f t :=100; F o r m 2 . T o p :=100; Form2.Width:=100 ; F o r m 2 .H e i g h t :=100 ; F o r m 2 .C a p t i o n : = 1b l a b l a '; F o r m 2 .N a m e :='F o r m 2 '; Form2 .Visible:=true; end;

Evident, cu ajutorul lui Forms i FormCount pot fi modificate proprie tile unei forme. Urmtorul exemplu modific titlul i limea primei forme din Forms'.
procedure TForml-ButtonlClick(Sender: TObject); begin S c r e e n . F orms[0].Caption:= 'Noul titlu'; S c r e e n .F o r m s [0].Width:= S c r e e n .F o r m s [0].Width div 2; end;

P3.

ActiveForm

p ro p e rty ActiveForm: TForm; Reprezint forma activ (cea care are focus) a aplicaiei. Este tot o pro prietate R ead-O nly, 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

p ro p e rty CustomForms[/ndex: Integer]: TCustomForm; Este asemntoate cu Forms dar, de data aceasta, sunt luate n calcul nu numai formele ci i paginile de proprieti. P5.
Custom FormCount

p ro p e rty CustomFormCount: Integer; Este asemntoare cu FormCount dar, de data aceasta, pe lng forme sunt numrate i paginile de proprieti. P6.
ActiveCustom Form

p ro p e rty ActiveCustomForm: TCustomForm; Conine forma sau pagina de proprieti care are focus. P7.
DataM odules

p ro p e rty DataModules[/mfe*: Integer]: TDataModule; Este lista cu modulele de date care sunt instantiate la un moment dat de ctre aplicaie. P8.
D ataM oduleCount

p ro p e rty DataModuleCount: Integer; Indic numrul modulelor de date instaniate la un moment dat de ctre aplicaie. P9.
ActiveC ontrol

p ro p e rty ActiveControl: TWinControl; Indic care control este activ, adic are focus. Este tot o proprietate R ead-O nly, iar schimbarea controlului activ se poate face prin inter mediul metodei FocusedControl. Evident, controlul activ se afl pe ActiveForm . La schimbarea controlului Active Control apare evenimen tul O nActiveControlChange. Urmtoarea aplicaie const dintr-o form pe care sunt amplasate dife rite 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 fcut manual, n cazul nostru prin intermediul procedurii Schim baControl care are prototipul definit n seciunea p riv a te a clasei TForm l astfel:
procedure T F o r m l .SchimbaControl (Sender-.TObject) ; begin
E d i t l . T e x t :=Screen.ActiveControl.Name;

end; procedure T F o r m l .Fo r m C r e a t e (S e n d e r : TObject); begin


S c r e e n .O nActiveControlChange:=SchimbaControl;

end;

P10.

Cursors

p ro p e rty Cursors [Index: Integer]: HCursor; Este un vector cu toate cursoarelor disponibile aplicaiei. Un nou cursor poate fi adugat acestei liste n felul urmtor: a. b. c. Creai un cursor folosind editorul de cursoare (spre exemplu: Im age E d it o r ). n vectorul Cursors stabilii-i poziia astfel nct s nu intre n conflict cu alte cursoare deja existente. Obinei un handle la el folosind funcia API L oadC ursor care are doi parametrii: primul este un handle la instana aplicaiei, iar al doilea este numele care identific cursorul.
crMyCursor = 5 ;

const procedure TForml.FormCreate(Sender : TObject) , begin


Scree n . C ursors[crMyCursor] := LoadCursor (Hlnstance, Cursor := crMyCursor; 'NewCursor' ) , -

end;

P il.

Cursor

p ro p e rty Cursor: TCursor; Reprezint cursorul aplicaiei. Dac aceast proprietate este setat la crD efault atunci diferite componente vor putea avea tipul de cursor propriu. De exemplu, la apsarea butonului B u tton l, cursorul aplicaiei va fi setat la crH elp. Chiar dac cursoarele diferitelor componente au alte valori, va fi afiat doar cursorul de help: 383

procedure TForml.ButtonlClick(Sender: TObject); begin Screen.Cursor:=crHelp; end;

P12.

Fonts

p ro p e rty Fonts: TStrings; Este lista cu toate numele de fonturi disponibile n sistem. E xem plul 1: Urmtoarea aplicaie ne returneaz lista cu toate fonturile disponibile n sistem. Pentru aceasta avem nevoie de o cutie de editare multilinie n interiorul creia vom scrie numele fonturilor (cte unul pe linie) i un buton la a crui apsare declanm operaia de detectarea fonturilor. Deci handlerul de evenimente pentru acel buton este:
procedure TForml.ButtonlClick(Sender: TObject); begin Memol.Lines;=Screen.Fonls; end;

E xem plul 2: Urmtoarea aplicaie afieaz 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 schimbm proprietatea Font i de un buton la a crui apsare s iniializm 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

p ro p e rty Height: Integer; Indic nlimea ecranului aplicaiei n numr de pixeli.

384

P14.

Width

p ro p e rty Width: Integer; Indic limea ecranului n numr de pixeli. O bservaie: Aceste dou proprieti pot fi folosite pentru redimensionarea ferestrelor astfel nct s ncap n ecran.

Metode______________________________________________________
M l.
Create

co n stru c to r Create(A Owner. TComponent); override; Creaz o instan a lui TScreen. Nu apelai aceast metod. Mai degrab folosii variabila Screen, care este creat i iniializat de ctre mediu, tot prin intermediul metodei Create. M 2.
D estroy

d e stru c to r Destroy; override; Este destructorul clasei. Nu apelai aceast metod pentru variabila Screen deoarece Delphi face eliberarea resurselor utilizate.

Evenimente
E l.

______________________________________________

O nActiveControlChange

p ro p e rty OnActiveControlChange: TNotifyEvent; Este apelat imediat dup ce focusul se mut la un alt control. E2.
OnActiveFormChange

p ro p e rty OnActiveFormChange: TNotifyEvent; Apare imediat dup ce focusul a fost schimbat la o alt form. Acest eveniment este util doar ntr-o aplicaie cu mai multe forme.

385

27. CLIPBOARDUL
Este un loc de stocare temporar a informaiei rezultat n urma unei operaii de tip Cut sau Copy. Orice tip de dat poate fi plasat n Clipboard. Aceast plasare este totui condiionat de formatele de date pe care le cunoate Clipboardul. Obinerea informaiilor din acest container se face n urma unei operaii de tip Paste. Un lucru important de reinut n privina C lipboard- ului este faptul c coninutul su nu se pierde dect la o nou operaie Cut sau Copy (cnd o alt informaie este depus n el) sau la resetarea Windows-ului. Componenta T Clipboard din D elphi ncapsuleaz funciile Clipboardului Windows. Ea este definit n unitul clipbrd.pas care trebuie inclus de fiecare dat cnd se folosete aceast component non-vizual. Acest unit mai ofer i o funcie C lipboard: function Clipboard: TClipboard; care returneaz o instan a lui TClipboard. D elphi instaniaz un singur obiect C lipboard de fiecare dat cnd este necesar o operaie de tip Cut, Copy sau Paste. Dac aplicaia nu a folosit niciodat Clipboardul atunci funcia C lipboard creaz o instan a lui TClipboard. Dac aplicaia a mai folosit i nainte C lipboardul atunci funcia C lipboard returneaz anterioara instaniere a lui TClipboard. O bservaie: Este indicat s folosii funcia C lipboard dect s instaniai un nou obiect a lui TClipboard.

Proprieti___________________________________________________
P I.
AsText

p ro p e rty AsText: string; ntoarce sau seteaz coninutul Clipboardului sub form de ir de caractere care nu depete 255 de caractere. Aceast proprietate poate fi folosit att pentru obinerea coninutului Clipboardului: sir:=Clipboard. AsText; ct i pentru setarea coninutului Clipboardului:

386

Clipboard. AsText:=sir; Pentru a manipula iruri mai mari de 255 de caractere folosii metodele
SetTextBuf i GetTextBuf

P2.

Formats

p ro p e rty Formats!/nrfe.*: Integer]: Word; Returneaz numrul de formate distincte n care se gsesc datele disponibile n C lipboard la un moment dat. Este Read-Only. P3.
Form atCount

p ro p e rty FormatCount: Integer; Indic numrul de formate ale vectorului Formats.

Metode__________________________________________________
M l.
Assign

p ro c e d u re A ssign(& w ce: TPersistent); ntoarce sau seteaz coninutul Clipboardului. Aceast metod este asemntoare 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 executm urmtoarea instruciune: Clipboard. Assign(Bitmap); iar pentru a obine o imagine din Clipboard executm urmtoarea ins truciune: Bitmap. Assign(Clipboard); M 2.
C lear

p ro ced u re Clear; Se terge coninutul Clipboardului. Metoda C lear este apelat ori de cte ori se face o operaie de tip Cut sau Copy. M 3.
Open

p ro ced u re Open; Deschide Clipboardul pentru a permite copierea de date n el fr a 387

permite altor aplicaii s le altereze. Aceast operaie este util atunci cnd n C lipboard trebuie trimise pe rnd mai multe item-uri de informaie care nu sunt toate disponibile la un moment dat, iar n tot acest timp alte aplicaii nu au voie s acceseze Clipboardul. Dup apelarea metodei Close alte aplicaii au voie s acceseze Clipboardul. Nu este obligatorie folosirea procedurii O pen , dect n cazul n care nu se dorete ca alte aplicaii s altereze coninutul Clipboardului. Oricum, dup apelarea lui Close, toate aplicaiile i pot manipula coninutul. M4.
Close

p ro ced u re Close; nchide C lipboardul dac este cumva deschis. Dup nchidere, acesta poate fi accesat i de ctre alte aplicaii. 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 attea ori de ct a fost apelat Open. E xem plul 1: S facem o aplicaie care are trei butoane. Primul ( B u tton l ) apeleaz metoda Open i deci alte aplicaii nu au voie s acceseze Clipboardul. Al doilea l nchide, adic apeleaz metoda C lose , iar apoi afieaz coninutul lui. Al treilea buton ( Button3 ) adaug date n Clipboard. Datele care sunt adugate sau afiate se iau din cutia de editare E d itl. Handlerele de evenimente pentru cele trei butoane sunt urmtoarele:
procedure TForml.ButtonlClick(Sender: begin TObject);

Clipboard.Open;
end; procedure T F o r m l .Butt o n 2 C l i c k (S e n d e r : TObject); begin

Clipboard.Close;
E d i t l . T e x t := C l ipboard.AsText; end; procedure TForml,Button3Click(Sender; v a r s :string; begin TObject);

s :=Editl.Text;
C l i p B o a r d . S etTextBuf(Pointer (s)); Editl.dead end;

388

Pentru o mai bun nelegere a modului n care funcioneaz acest exemplu v-a ruga s lansai n execuie i aplicaia ClipboardV iew er din Start\Program s\A ccessories. Pentru nceput facem click pe butonul B u tton l. In acest moment n C lipboardV iew er apare mesajul Cannot open C lipboard deci coninutul lui nu va putea fi accesat din alte aplicaii. Pentru a vedea cum funcioneaz Open- urile imbricate mai apsm nc o dat pe B uttonl. Apoi scriem ce dorim n E d itl i apsm Button3. Textul este mutat n Clipboard, dar noi avem afiat mesajul Cannot open Clipboard. Apoi apsm de dou ori pe Button2 (deoarece am deschis Clipboardul de dou ori) i mesajul Cannot open Clipboard va dispare din ClipboardViewer, n locul lui aprnd textul scris de noi. M 5.
GetBufSize

function GetTextBuf( Buffer. PChar; BufSize : Integer): Integer; Returneaz primele BufSize caractere din C lipboard n zona de memorie spre care indic variabila Buffer. Funcia ntoarce numrul de caractere copiate. Acest numr poate fi diferit de BufSize n cazul n care nu sunt suficiente caractere n Clipboard. M 6.
SetTextBuf

p ro ced u re SetTextBuf(Ba//er: PChar); Copiaz zona de memorie spre care pointeaz Buffer n Clipboard. Exem plul 2: S realizm un exemplu care s pun n lumin folosirea acestor dou metode. Pentru aceasta ne vom folosi de dou butoane: primul, B uttonl, care mut coninutul cutiei de editare E d itl n C lipboard i al doilea buton, Button2, la a crui apsare coninutul Clipboardului este copiat n
E d itl.

Cele dou handlere de evenimente sunt:


procedure TForml.ButtonlClick(Sender: TObject); var s:string;
begin

S :=Editl.Text; Clipboard.SetTextBuf(Pointer(s)); end; procedure TForml.Button2Click(Sender: TObject); var p :PChar;


begin

p :=StrAlloc (10) ; Clipboard.GetTextBuf(p,10);

389

Editl.Text:=p;
end;

i componentele pot fi mutate prin intermediul Clipboardului, i anume: M 7.


SetCom ponent

p ro ced u re SetComponent( Component: TComponent); Copiaz o component n Clipboard. M 8.


G etCom ponent

function GetComponent(Owner, Parent: TComponent): TComponent; Returneaz o component aflat n C lipboard i i seteaz acesteia pro prietile O wner i Parent n conformitate cu valorile transmise ca parametru.
Atenie!

Trebuie fcut distincie ntre proprietatea O wner i proprietatea Parent. Proprietatea O wner 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 cnd proprietatea P arent a unei componente poate fi i, de exemplu, un
Panel.

Exem plul 3: Urmtorul exemplu este o aplicaie care conine dou forme, dou butoane i o cutie de editare (toate trei aflndu-se pe forma F orm l). La apsarea lui B uttonl cutia de editare E d itl este copiat n C lipboard, iar la apsarea lui Button2 componenta TEdit din C lipboard este copiat pe forma Form2. Handlerele de evenimente pentru cele dou butoane sunt (nu uitai s includei uniturile C lipB rd 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

end;

n exemplul de mai sus am folosit i procedura R egisterC lass. Este necesar acest lucru: de fapt este necesar nregistrarea oricrei clase care trebuie adus din clipboard. n caz contrar este generat o excepie din clasa EClassNotFound. nregistrarea unei componente nu face ca clasa componentei s fie nregistrat. M 9.
H asForm at

function HasFormat(Forma?: Word): Boolean;


Returneaz true dac printre formatele n care se afl datele din C lipboard se gsete i Format. Unele dintre valorile posibile pentru Form at sunt: CF_TEXT, CF_BITMAP, CF_MET AFILEPICT, CF_PICTURE, CF_OBJECT.

391

28. TApplication
Este o clas care ncapsuleaz o aplicaie WINDOWS. Metodele, proprietile acestei clase reflect fundamentele stabile n Windows privitor la modul de a crea, distruge, menine, etc. o aplicaie. De aceea TApplication simplific interfaa dintre mediul Windows i utilizator cnd acesta scrie aplicaii pentru acest sistem. Fiecare aplicaie Delphi instaniaz automat o variabil numit A pplication de tip TApplication. Aceast component nu este vizual (deci nu apare n ComponentPalette), dar, totui, unele dintre valorile proprietilor pot fi setate la momentul proiectrii aplicaiei din P ro ject\
Options.

Ierarhie______________________________________________________
TO bject -> TPersistent- > TComponent- > TApplication

Proprieti___________________________________________________ PI.
Active

property Active: Boolean;


Returneaz true dac aplicaia este activ i are focus. Active este setat la true n constructorul aplicaiei. Proprietatea este Read-Only.

P2.

ExeName

property ExeName: string;


Este numele aplicaiei. 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 fiierului Help ataat aplicaiei. Valoarea acestei proprie ti 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 H elpFile a lui TForm). n cazul acesta este apelat helpul formei active i nu helpul aplicaiei. P5.
Hint

p ro p e rty Hint: string; Specific irul de caractere care apare ca help hint cnd mouse-ul trece pe deasupra unei componente. Acest ir este afiat cnd apare eveni mentul OnHint. P6.
H intC olor

p ro p e rty HintColor: TColor; Specific culoarea cutiei n care apare afiat help hint-ul. Implicit este
clInfoBk.

P7.

H intHidePause

p ro p e rty HintHidePause: Integer; Specific intervalul de timp dup care help hint-n\ nu va mai fi afiat dac mouse-ul nu se mut de pe componenta respectiv. Implicit este dou secunde i jumtate. P8.
HintPause

p ro p e rty HintPause: Integer; Este intervalul de timp care trebuie s treac nainte ca help hint-u\ s fie afiat cnd mouse-ul se mut pe o component. Implicit este o jumtate de secund. P9.
HintShortPause

p ro p e rty HintShortPause: Integer; Indic intervalul de timp pe care sistemul de operare l ateapt nainte ca s afieze un nou help hint dac unul a fost deja afiat. 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

property Icon: Tlcon; Este iconul aplicaiei care va fi afiat n task-bar. Acest icon poate fi diferit de cel al formei principale a aplicaiei. P il.
MainForm

p ro p e rty MainForm: TForm; Indic care form este principal pentru aplicaie. Valoarea acestei pro prieti este setat la prima form creat cu CreateForm. Aceast valoare nu poate fi modificat la momentul execuiei ci doar la momen tul proiectrii aplicaiei din Project\Options. Cnd forma principal este nchis aplicaia se termin. P12.
ShowHint

p ro p e rty ShowHint: Boolean; Indic dac help hint-w [\e vor fi sau nu afiate n aplicaie. Valoarea implicit este true. P13.
ShowM ainForm

p ro p e rty ShowMainForm: Boolean; Indic dac aplicaia (cnd se va lansa n execuie) va afia sau nu forma principal. Acest lucru este util la crearea serverelor OLE. Implicit este true. P14.
Term inated

p ro p e rty Terminated: Boolean; Indic dac aplicaia a primit sau nu mesajul WM _QUIT care nchide aplicaia. Acest lucru este util n aplicaiile 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 aplicaia. P15.
Title

p ro p e rty Title: string; Indic irul de caractere care apare n dreptul iconului aplicaiei cnd aceasta este reprezentat n task-bar. Acest ir poate fi diferit de 394

proprietatea Caption a formei principale a aplicaiei. Valoarea acestei proprieti este luat din modulul EXE. La momentul proiectrii aplica iei valoarea ei poate fi setat din Projects\O ptions.

Metode
M l.
Create

c o n stru c to r C re a te ^ Owner: TComponent); override; Este constructorul clasei. Aceast metod nu trebuie apelat de ctre programatorul n Delphi, deoarece acesta creaz automat o instan a acestei clase pentru fiecare aplicaie. Aceast instan poate fi accesat prin intermediul variabilei Application. M 2.
D estroy

d e stru c to r Destroy; override; Distruge aplicaia. Nici aceast metod nu trebuie apelat niciodat. Pentru a termina o aplicaie apelai Terminate. M 3.
BringToFront

p ro ced u re BringToFront; Face ca ultima form activ a aplicaiei s fie pus deasupra tuturor celorlalte forme. M 4.
CreateForm

p ro ced u re C vtait\'orm (T onnC lass: TFormCIass; v ar Reference ); Creaz o nou form, a crei referin este pasat lui Reference. Aceast metod este folosit pentru a crea o nou form la momentul execuiei aplicaiei. Proprietarul noi forme create va fi chiar aplicaia. Primul apel al acestei metode va crea forma principal a aplicaiei. M 5.
HandleException

p ro ced u re HandleException(Sender. TObject); Furnizeaz un mod implicit de a prelucra excepii. n momentul n care apare o excepie care trece de toate blocurile try , aplicaia apeleaz metoda HandleException. Dac excepia nu este de tip EAbort atunci

395

este apelat evenimentul OnException (dac exist unul), iar dac nu se afieaz un mesaj privitor la excepia n cauz. M 6.
H elpContext

function f IclpContext( Context: THelpContext): Boolean; Apeleaz help-ul aplicaiei. Context este identificatorul help de context. De exemplu, dac Context are valoarea 100 va fi afiat acel ecran al help-ului care are identificatorul de context egal cu 100. Aceast metod apeleaz evenimentul OnHelp. M 7.
HelpJump

function H elpJum p(const JumplD: string): Boolean; Din nou apeleaz help-ul aplicaiei, de data aceasta topicul cutat n help este dat sub form de string. M8.
Initialize

procedure Initialize;
Aceast metod este prima apelat de ctre orice proiect Delphi. M 9.
M essageBox

function M essageBox(7 'ext, Caption: PChar; Flags: Longint): Integer; Afieaz o cutie de dialog cu unul sau mai multe butoane. Caption este titlul cutiei de dialog, Text este textul afiat n ea i este de obicei o ntrebare. Acest text nu poate fi mai lung de 255 de caractere i este fragmentat de ctre 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 _A P PL M O D A L Este o fereastr modal, deci aplicaia nu va rula n continuare pn cnd aceast fereastr nu este nchis. Primul buton de pc cutia de dialog este cel im plicit. A l doilea buton dc pe cutia dc dialog este cel implicit. A l treilea buton de pe cutia de dialog este cel im plicit. A l patrulea buton de pe cutia de dialog este cel implicit. Este un buton de help. Apsnd acest buton sau

M B _D EFB LITTON 1 M B_D E FB U T T O N 2

M B J3E F B U T T O N 3

M B _D E F B U T T O N 4 M B J tE L P

396

tasta FI este generat evenim entul O nH elp. M B J C O N E X C L A M A T IO N Un sem n de exclam are apare n cutia de dialog. Un icon constnd n litera i ncercuit apare n cutia de dialog. Un sem n de stop apare n cutia de dialog. Cutia conine butonul Ok. Cutia conine butoanele Ok i Cancel. Cutia conine butoanele Retry i Cancel. Cutia conine butoanele Y es i N o. Cutia conine butoanele Y es, N o i Cancel. Cutia conine IGNORE. butoanele A B O R T, R ETR Y i

M B _IC O N IN FO RM ATION

M BJC O N STO P M B _O K M B O K C A N C E L M B _R E T R Y C A N C E L M B _Y E S N O M B _Y E SN O C A N C E L M B_A B O R T R ET R Y IG N O R E

M B R T L R E A D IN G M B_R IG H T

Textul este afiat de la dreapta la stnga n conform itate cu modul de scriere arab. T extul este aliniat la stnga.

Funcia returneaz O, dac nu este destul memorie pentru a o crea, sau una dintre urmtoarele valori:
V a lo a r e ID A B O R T ID C A N C E L IDIGNORE ID N O IDOK IDRETRY IDY ES V a lo a r e N u m eric 3 2 5 7 1 4 6 n se m n ta te Utilizatorul a apsat butonul Abort. Utilizatorul a apsat butonul Cancel. Utilizatorul a apsat butonul Ingnore. Utilizatorul a apsat butonul No. Utilizatorul a apsat butonul Ok. Utilizatorul a apsat butonul Retry. Utilizatorul a apsat butonul Yes.

M 10. M inimize pro ced u re Minimize; Apelai aceast metod pentru a minimiza o aplicaie. Nu confundai aceast metod cu minimizarea unei forme, lucru care se obine prin setarea proprietii WindowStcite a lui TForm.

397

M i l . ProcessM essages

procedure ProcessMessages;
ntrerupe execuia aplicaiei pentru a-i permite Windows-ului s proce seze mesajele din coada de mesaje. Sunt procesate doar acele mesaje care privesc aplicaia curent. Aceast metod este util atunci cnd sunt fcute calcule multe, n acelai eveniment. n acest caz metoda ProcessM essages trebuie apelat periodic pentru ca, de exemplu, inter faa aplicaiei s fie redesenat.

Exemplul 1:
Urmtoarea aplicaie arat cum poate fi folosit P rocessM 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 puin lucrurile i, n locul calculelor complexe, vom implementa un ciclu infinit, deci evenimentul nu se termin. De exemplu, la apsarea butonului aplicaia nu mai poate fi controlat n nici un fel (ci doar prin resetarea calculatorului);
procedure TForml.ButtonlClick(Sender: TObject); var i:integer; begin While true do i := 2 ; end;

Dac aplicaia de mai sus este rulat n interiorul mediului Delphi ea poate fi ntrerupt folosind Run\Program Reset. Dac n interiorul ciclului introducem un P rocessM essages , aplicaia va putea fi controlat fr nici o problem (adic se pot apsa i alte butoane, se pot mri, micora, etc. formele aplicaiei):
procedure TForml.ButtonlClick(Sender: TObject); var i:integer; begin While true do begin
i:=2;

Application.ProcessMessages; if Application.Terminated then Exit; end; end;

398

M 12. Restore p ro c e d u re Restore; Readuce aplicaia la mrimea ei normal. Nu confundai aceast metod cu aducerea unei forme la mrimea normal, lucru care se obine prin setarea proprietii W indowState a lui TForm. M 13. Run pro ced u re Run; Execut aplicaia. D elphi creaz automat un bloc principal al progra mului care apeleaz aceast metod. A tenie ! Nu confundai aceast metod cu lansarea n execuie a unei alte aplicaii, lucru care se poate face, de exemplu, cu CreateProcess. M 14. ShowException p ro c e d u re ShowException(E: Exception); Afieaz mesajul unei excepii. Aceast metod este apelat dac nici un handler de evenimente nu este asociat evenimentului OnException. M 15. Terminate p ro c e d u re Terminate; Termin o aplicaie.

Evenimente
E l.
O nActivate

p ro p e rty OnActivate: TNotifyEvent; Apare cnd o aplicaie devine activ, adic cnd primete focus sau cnd este lansat n execuie. E2.
O nD eactivate

p ro p e rty OnDeactivate: TNotifyEvent; Apare cnd o aplicaie devine inactiv, adic cnd este terminat sau cnd focusul trece la o alta. 399

E3.

OnException

property OnException: TExceptionEvent; Apare cnd o excepie a scpat de toate blocurile except sau finally. n interiorul acestui handler de evenimente trebuie furnizat un nod general de prelucrare a excepiilor. Dac nu exist un astfel de handler de eveni mente este apelat metoda ShowException. E4.
OnHelp

THelpEvent = function ( Com mand : Word; D ata : Longint; v a r C allH elp: Boolean): Boolean of object; p ro p e rty OnHelp: THelpEvent; Apare cnd a fost iniiat o cerere de tip help. E5.
OnHint

p ro p e rty OnHint: TNotifyEvent; Apare cnd cursorul de mouse se mic pe deasupra unui control care poate afia un help-hint. E xem plul 2: Urmtorul exemplu afieaz ntr-un StatusBar hintul componentelor de pe o form. Deoarece TApplication nu este o component vizual, ea nu poate fi afiat n O b ject Inspector, deci nu i se poate ataa direct un handler de evenimente pentru evenimentul OnHint (de fapt nu se poate ataa direct nici un handler pentru nici un eveniment), ci trebuie creat o procedur cu acelai tip de parametri ca i evenimentul, iar apoi trebuie asignat evenimentului n cauz. n cazul nostru procedura se numete AfieazHint, iar definiia ei o includem n seciunea p riv ate a clasei: p ro ced u re AfiseazaHint(Sender:TObject); Implementrile 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;

400

E6.

O nM essage

TM essageEvent = p ro ced u re (v ar Msg: TMsg; v a r Handled: Boolean) of object; p ro p e rty OnMessage: TMessageEvent; Apare cnd sistemul trimite un mesaj aplicaiei. Cu ajutorul acestui eve niment pot fi interceptate toate mesajele pe care Windows-ul le trimite aplicaiei. Totui, deoarece ntr-o secund sunt trimise mii de mesaje, utilizarea acestui eveniment duce la ncetinirea aplicaiei. E7.
OnMinimize

p ro p e rty OnMinimize: TNotifyEvent; Apare cnd aplicaia este minimizat. E8.


OnRestore

p ro p e rty OnRestore: TNotifyEvent; Apare cnd o aplicaie anterior minimizat este adus la forma ei normal. E9.
OnShowHint

p ro p e rty OnShowHint: TShowHintEvent; Apare cnd un help-hint este pe cale de a fi afiat. Acest eveniment este util pentru specificarea modului n care este afiat 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 = p ro ced u re (v ar HintStr: string; v a r CanShow: Boolean; v a r Hintlnfo: THintlnfo) o f object; 401

unde:
HintStr este irul de caractere care conine textul hint- ului; CanShow este tru e dac hint- ul se poate afia; Hintlnfo este o variabil de tip THintlnfo n care sunt reinute:

controlul pentru care se afieaz hint-ul ( HintControl)\ poziia n care este afiat hint-u\ (HintPos)\ limea //(/-ului (HintMaxW idth ); culoarea /imf-ului ( HintColor ); dreptunghiul n interiorul cruia trebuie s se afle mouse-ul pentru ca hint-ul s apar (implicit este dreptunghiul contro lului) ( CursorRect)\ poziia cursorului de mouse n interiorul controlului
(CursorPos)\

numrul de milisecunde care trebuie s treac pn cnd hint- ul este afiat din nou, chiar dac mouse-ul nu a prsit controlul n cauz (implicit este zero ceea ce indic c hint-ul este afiat doar dac mouse-ul pleac i revine apoi pe control)
(ReshowTimeouty,

valoarea proprietii HintHidePause (HideTimeout); irul care va fi afiat ca hint (HintStr).

402

29. TIPRIREA LA IMPRIMANT


Mediul Delphi permite aplicaiilor 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 fiier text, aa c tiprirea de iruri de caractere este identic cu scrierea de text ntr-un fiier pe disc. Urmtorii pai trebuie urmai pentru a tipri un text la imprimant: 1. 2. 3. 4. atribuirea unei variabile fiier text la imprimant; deschiderea fiierului pentru scriere; scrierea de text n el; nchiderea fiierului.

Atribuirea de la punctul 1) se face cu ajutorul procedurii AssignPrn definit n unitul Printers astfel: p ro c e d u re A ssignPrn(var F: Text); n acest caz tiprirea unei linii Ia imprimant n mod text se face n felul urmtor:
uses printers; procedure TForml.ButtonlClick(Sender: TObject); var F: TextFile; begin
AssignPrn(F); Rewrite(F); Writeln(, 'Acesta este un text'); CloseFile(F);

end;

Tiprirea n mod text a tuturor liniilor unei cutii de editare multi-linie se face n felul urmtor (pe form trebuie s se gseasc 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 M e m o l .L i n e s .Count-1 do w r i t e l n ( F , M e m o l .L i n e s .Str i n g s [i )); closeFile (F) end;

29.2. Mod standard Windows


Tiprirea unui text se poate face n dou feluri, i anume: 1. 2. folosind o component TRichEdit n care se introduce textul ce urmeaz a fi tiprit iar apoi apelarea metodei Print\ folosind clasa TPrinter.

Vom analiza pe rnd cele dou variante subliniind avantajele i dezavatajele fiecreia. I. Folosind metoda Print a componentei TRichEdit nu mai trebuie s scriem atta 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 afim o cutie de dialog ( TPrintD ialog ) cu ajutorul creia selectm paginile i numrul de copii care urmeaz a fi tiprite, aceste lucruri nu vor fi luate n considerare de ctre metoda Print care tiprete o singur dat ntreg documentul din cutia de editare respectiv. Ceea ce se poate schimba folosind metoda Print mpreun cu o component TPrintD ialog este tipul imprimantei folosite i, bineneles, proprietile acesteia (care se seteaz apsnd butonul P roperties) din respectiva cutie de dialog. n plus, formatarea textului trebuie fcut n interiorul cutie RicliEdit deoarece o linie prea lung va fi rupt automat (restul fiind trecut pe linia urmtoare) dac se tiprete pe o hrtie prea mic. Setarea dimensiunii unei pagini n RichEdit se face cu ajutorul proprietii PageR ect care este de tipul TRect. Concluzionnd, tiprirea coninutului unei cutiei R ichE ditl se face n felul urmtor:
procedure TEditForm. PrintlClick(Sender: TObject); begin if PrintDialogl.Execute then

RichEditl.Print('Titlul documentului');
end;

n acest exemplu am folosit totui o component TPrintD ialog cu ajutorul creia se poate schimba imprimanta, dimensiunea foii pe care se tiprete, calitatea tipriturii, etc. Parametrul metodei Print este un ir de caractere care va aprea n Print M anager ca titlu al documentului care se tiprete. De obicei, este numele i calea fiierului ce urmeaz a fi trimis la imprimant. 404

II.

TPrinter

O alt modalitate de a tipri la imprimant este oferit de ctre componenta TPrinter. Vom vedea c acest component ne confer un control mai puternic asupra textului tiprit. Delphi instaniaz pentru fiecare aplicaie care folosete aceast component (nonvizual) o variabil de acest tip, numit Printer. Aa c, dac dorii s folosii imprimanta prin intermediul acestei componente, nu apelai niciodat metoda Create, ci folosii variabila deja instaniat Printer. Dar mai nti s vedem care sunt proprietile i metodele acestei componente.

PI.

Canvas

property Canvas: TCanvas;


Reprezint suprafaa de tiprire a paginii curente. Suprafaa foii de hrtie se consider echivalent cu o suprafaa pe care se poate desena, scrie cu ajutorul proprietilor componentei TCanvas. De exemplu, schimbarea fontului, modului de scriere, a pen- ului, brush- ului, etc. se face tot prin intermediul acestei proprieti. De exemplu, pentru ca tiprirea s se fac cu acelai font cu care este scris i textul (n acest exemplul este vorba de tiprirea tot n mod text), vom proceda n felul urmtor:
procedure TForml.PrintlClick(Sender: TObject); var Line: Integer;
PrintText: TextFile;

begin if PrintDialogl.Execute then begin


AssignPrn(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 numrul de copii curent tiprite ale documentului.

P3.

PageH eight

property PageHeight: Integer;


Indic nimea n numr de pixeli a paginii care se tiprete curent. 405

P4.

P age Width

property PageWidth: Integer;


Indic limea n num r de pixeli a paginii care se tiprete curent.

P5.

PageN um ber

property PageNumber: Integer;


Indic numrul paginii care este curent tiprit. Aceast proprietate este automat incrementat de ctre metoda NewPage.

P6.

C apabilities

property Capabilities: TPrinterCapabilities;


Indic capabilitile imprimantei curente. Tipul TPrinterCapabilities este definit astfel: TPrinterCapability = (pcCopies, pcOrientation, pcCollation); TPrinterCapabilities = set of TPrinterCapability; deci capabilitile imprimantei se refer la setrile curente ale driver-ului de imprimant i anume: numr de copii, orientarea i dac indicatorul de tiprire n ntregime a unei copii nainte ca vreo pagin din celelalte copii s fie tiprit este setat.

P7.

Printers

property Printers: TStrings;


Este lista cu toate imprimantele instalate n sistem.

P8.

P rinterlndex

property Printerlndex: Integer;


Este numrul de ordine din lista Printers a imprimantei curent selectate. Dac dorii ca imprimanta implicit s fie cea curent, atunci setai aceast proprietate la -1 .

P9.

Orientation

property Orientation: TPrinterOrientation;


Indic felul n care se va tipri documentul trimis la imprimant. Valori posibile pentru O rientation sunt:

406

V a lo a r e p o P o r tr a it p o L a n d sc a p e

S em n ifica ie D ocum entul se va tipri verical pe pagin. D ocum entul se va tipri orizontal pe pagin.

P10.

A borted

property Aborted: Boolean;


Indic dac utilizatorul a apelat sau nu metoda A bort pentru a termina tiprirea la imprimant.

P il.

Fonts

property Fonts: TStrings;


Reprezint lista fonturilor suportate de ctre imprimant.

P12.

Title

property Title: string;


Este titlul care apare n PrintM anager cnd documentul este tiprit. Aceast proprietate are valoare identic cu parametru metodei Print a lui
TRichEdit.

Metode______________________________________________________ M l.
Create

constructor Create;
Este constructorul clasei. Nu apelai acest constructor deoarece Delphi instaniaz automat un obiect de acest tip i l atribuie variabilei Printer.

M2.

D estroy

destructor Destroy;
Este destructorul clasei. Nici aceast metod nu trebuie apelat deoarece obiectul P rinter este automat distrus.

M3.

N ew Page

procedure NewPage;
Apelarea acestei metode determin ca tiprirea s se fac pe o nou pagin. Proprietatea PageNum ber este incrementat, iar proprietatea Pen 407

a Canvas-\i\u\ este setat la (0,0).

M4.

BeginDoc

procedure BeginDoc;
Se ncepe tiprirea unui nou document la imprimant. Documentul nu este tiprit efectiv dect dup apelarea metodei EndDoc.

M5.

EndDoc

procedure EndDoc;
Termin de trimis la imprimant documentul curent. ntre aceast metod i BeginDoc trebuiesc introduse instruciuni 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 BeginD oc i totui nu s-a putut face tiprirea corect (de exemplu, dac textul care urma a fi tiprit trebuia citit dintr-un fiier care era distrus) trebuie apelat metoda Abort.

M6.

A bort

procedure Abort;
ntrerupe trimiterea unui document spre imprimant. n acest caz toate datele trimise cu ajutorul canvas-ului vor fi pierdute.

Observaie:
n cazul n care se dorete ntreruperea tipririi unui document se folosete PrintM anager- ul.

Exemplul 1:
Tiprirea unei linii de text se face astfel:
uses printers; procedure TPrintForm.BitBtnlClick(Sender: TObject); begin
Screen.Cursor := crHourGlass;

try
Printer.BeginDoc;

try With Printer .Canvas do begin


Font.Name:= ' Arial ; Font.Size:=10;

408

Font.Style:=[fsBold]; TextOut(0,0,'Acesta este un text'); end; Printer.EndDoc; except on Exception do Begin Printer. Abort; Printer.EndDoc; Raise; end; end; finally Screen. Cursor:=crDefault; end; end;

Tiprirea unei imagini se face astfel:


procedure TForml.PrintlClick(Sender: TObject); begin with Printer do begin BeginDoc; Canvas. Draw(0, 0, Imagel.Picture .Graphic) ; {Im aginea v a f i desenat in ) EndDoc; {colul din stnga sus a paginii} end; end;

29.3. Cutiile de dialog


De un mare ajutor pentru utilizator sunt cutiile de dialog TPrintD ialog i TPrinterSetupDialog. Prima dintre ele afieaz un dialog cu privire la docu mentul care urmeaz a fi afiat, mai precis numr de copii, care pagini, n ce ordine, tiprire n fiier, etc. Din pcate, interaciunea cu aplicaia 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 dorete dou copii ale documentului, iar apoi apas pe butonul OK al dialogului, cci nu se ntmpl nimic dac n corpul ataat acestui eveniment (apsarea lui OK) programatorul nu a scris codul corespunztor tiprii docu mentului (de cte ori trebuie), folosindu-se, spre exemplu, de componenta
TPrinter.

n schimb, interaciunea lui TPrinterSetupD ialog cu aplicaia este maxim, fr a mai fi nevoie ca programatorul s scrie nici un rnd de cod pentru setarea imprimantei conform specificaiilor utilizatorului. Folosirea acestei componente nu este necesar deoarece TPrintDialog are un buton denumit P roperties la a crui apsare 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 acelai efect cu cel de la toate componentele de dialog.

Proprieti___________________________________________________
P I.
Copies

property Copies: Integer;


Indic numrul de copii setate n PrinterDialog. P2.
Collate

property Collate: Boolean;


Indic dac cutia de control Collate este vizat sau nu. Dac este vizat, tiprirea n cazul n care Copies este mai mare dect 1 trebuie s se fac astfel: mai nti prima copie a ntreg documentului, apoi a doua etc. Dac nu este vizat, atunci tiprirea trebuie fcut astfel: mai nti prima pagin a documentului de cte ori trebuie, apoi a doua pagin de cte ori trebuie etc. Un exemplu de folosire a lui Collate mpreun cu Copies (celelalte proprieti nu sunt luate n calcul) este urmtorul:
uses Printers; procedure TForml.ButtonlClick(Sender: TObject); var i,k:integer; begin if PrintDialogl.Execute then begin
Printer. BeginDoc; if PrintDialogl.Collate {Se scoate intai prima copie in
intregim e a docum entului) celelalte co p ii)

then for k:=l to PrintDialogl.Copies do {iar apoi begin for i:=0 to Memol.Lines.Count do begin if i mod 59=0 then Printer.NewPage; end;

Printer.Canvas. TextOut(0,12*(i mod 60), Memol.Lines!i]);


{ La ultima pagina trebuie testat c e linie este, pentru ca in caz contrar ) {o sa generai o excepie pentru index in afara lim itelor)

Printer. NewPage;

end

410

else

(s e tiprete mai intai prima pagina de cate ori este necesar}

for k:=l to (Memol.Lines.Count+1 div 60)+l do begin for i:=l to PrintDialogl.Copies do begin for j:=0 to 59 do
Printer.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 csua PrintToFile (de tip CheckBox) este sau nu vizat. Pentru ca aceast csu s apar setai flagul poPrintToFile din pro prietatea Options. Pentru a dezafecta aceast cutie de editare setai flagul
poD isablePrintToFile.

P4.

PrintRange

property PrintRange: TPrintRange;


Indic tipul de tiprire. Valori posibile pentru PrintRange sunt:
V a lo a r e S em n ifica ie Toate paginile sunt tiprite. C orespunde selectrii butonului de radio

prAUPages

AII.
Doar textul selectat este tiprit. Corespunde selectrii butonului de radio Selection. In cazul unei cutii de editare muli linie este mai d ificil de determinat care este textul selectat. D ac folosii o cutie RichEdit, atunci determinarea seleciei se face m ai uor deoarece avei la dispoziie evenim entul OnSelectionChange . Determinarea seleciei se face apoi cu ajutorul proprietilor SelStart i SelLength. Doar paginile ale cror numr de ordine este introdus vor fi tiprite. C orespunde selectrii butonului de radio Pages.

prSelection

prPageN um s

P5.

M inPage

property MinPage: Integer;


Indic cea mai mic valoare pe care utilizatorul o poate introduce pentru a specifica un numr de pagin ce urmeaz a fi tiprit.

411

P6.

M axPage

property MaxPage: Integer; Indic cea mai mare valoare pe care utilizatorul o poate introduce pentru a specifica un numr de pagin ce urmeaz a fi tiprit. Dac utilizatorul introduce un numr de pagin mai mare atunci se semnaleaz un mesaj de eroare. Aceast proprietate poate fi folosit la un editor de texte pentru a specifica numrul de pagini al acestuia.

P7.

FromPage

property FromPage: Integer;


Indic numrul paginii de la care s nceap tiprirea documentului.

P8.

ToPage

property ToPage: Integer;


Indic numrul paginii din document pn la care se face tiprirea.

P9.

Options

property Options: TPrintDialogOptions;


Determin felul cum apare i cum se comport cutia de dialog. Valori posibile pentru Options sunt orice submulime din urmtoarea mulime de flaguri:
V a lo a r e S e m n ific a ie D ezafecteaz cutia PrintToFile. A ceasta v a fi afiat n continuare dar utilizatorul nu o va putea folosi. A fieaz un buton de help. Se permite specificarea unui interval de pagini pentru a fi tiprite. Butonul radio Pages va fi vizibil i va putea fi selectat. Mai trebuie ndeplinit o condiie n plus i anume ca M axPage s lie strict mai mare dect MinPage. A fieaz cutia de control PrintToFile. D ac este setat i flagul poD isablePrintToFile, atunci aceast cutie va fi afiat dar nu va fi activ. Butonul Selection este posibil a fi selectat. A ceasta nseam n c utilizatorul dorete s tipreasc doar textul marcat. A fieaz un mesaj de eroare dac ncercai s trimitei un text ctre o imprimant neinstalat.

poD isablePrintToFile poH elp

poPageNum s

poPrintToFile

poSelection

poW arning

412

30. MULTIMEDIA
Aplicaiile multimedia sunt acele aplicaii care ncorporeaz sunet i imagine. Nu vorbim despre multimedia din jocuri din dou motive: 1. 2. acestea utilizeaz facilitile multimedia la un nivel mult superior; afiarea imaginilor i redarea sunetului n jocuri se realizeaz n majoritatea cazurilor, cu ajutorul DirectX-ului.

O simpl aplicaie multimedia const dintr-o fereastr n care este afiat o imagine. Aplicaii mai complexe conin sunet i imagini animate. Aplicaii i mai complexe permit utilizatorului s interacioneze cu aceste faciliti. Cel mai simplu mod de a ncorpora sunet ntr-o aplicaie se realizeaz folosind funcia API PlaySound. Prototipul C al acestei funcii este: BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound); unde parametrul pszSound specific numele fiierului ce conine sunetul iar parametrul fdw S oun d este o mulime de flag-uri ce indic modul n care va fi rulat sunetul. Spre exemplu, rularea unui fiier cu numele sunet.wav se face prin execuia instruciunii:
PlaySound('sunet.wav', NULL, SND_FILENAME);

n prealabil trebuie s includei unit-ul MMSystem.h. Un mare deza vantaj al funciei PlaySound este acela c ea nu poate rula fiiere cu sunete de lungime mai mare dect memoria disponibil. Mediul Delphi pune la dispoziia programatorului dou componente specializate n manipularea elementelor multimedia: TM ediaPlayer i
TAnimate.

f i

30.1. TMediaPlayer

Controleaz dispozitivele care furnizeaz un driver MCI (M ultim edia Control Interface). Dintre dispozitivele multimedia (care pot fi hard sau soft) amintim: CD-ROM-ul, VCR, secvenializorul MIDI, Scanner, DiscVideo etc. Componenta TM ediaPlayer are o interfa grafic i este alctuit din mai multe butoane. Fiecare dintre acestea poate fi apsat cu ajutorul mouseului, dar ele nu reprezint componente independente. Aceast interfa este:

413

1 1

H ! 1

m
S em n ifica ie

Butoanele care alctuiesc interfaa grafic a acestei componente sunt:


B u to n V a lo a r e

Play Pause Stop Next Prev Step B ark Record Eject

btPlay btPause btStop btNext btPrev btStep btBack btRecord btEject

Ruleaz (play) un clip. Oprete temporar nregistrarea sau rularea. D ac butonul de pauz este deja apsat, o nou apsare va duce la continuarea operaiei ntrerupte. Oprete definitiv rularea sau nregistrarea. Trece la urmtoarea pist. Trece la pista anterioar. Mut nainte cu un numr de cadre. M ut napoi cu un numr de cadre. Pornete nregistrarea. Scoate mediul. A cest buton este utilizat atunci cnd clip-ul curent este rulat de pe un C D sau VCR.

Ierarhie______________________________________________________
TO bject -> TPersistent -> TComponent -> TControl -> TW inControl -> -> TCustomControl.

Definit n_____________________________________________________
m player.pas

Pagina_______________________________________________________
System

Proprieti___________________________________________________ PI.
AutoOpen

property AutoOpen: Boolean;


Specific dac dispozitivul multimedia va fi rulat automat n momentul n care care aplicaia este lansat n execuie. Dac AutoOpen este true, atunci media player-ul ncearc s deschid dispozitivul multimedia specificat n proprietatea D eviceType (sau FileName dac DeviceType este dtAutoSelect). Dac AutoOpen este false, atunci dispozitivul trebuie deschis cu ajutorul metodei Open. 414

P2.

D eviceType

property DeviceType: TMPDeviceTypes; Specific tipul de dispozitiv pe care l poate deschide un media player. Valori posibile pentru D eviceType sunt: dtAutoSelect, dtAVIVideo,
dtC D A udio, dtDAT, dtD igitalV ideo, dtM M M ovie, dtO ther, dtO verlay, dtScanner, dtSequencer, dtV CR, dtV ideodisc, sau dtW aveAudio. Implicit este dtAutoSelect.

P3.

D isplay

p ro p e rty Display: TWinControl; Specific o fereastr folosit de un dispozitiv multimedia care are nevoie de o fereastr pentru ieire. Exemple de dispozitive multimedia care au nevoie de o fereastr de ieire sunt: Animation, AVI Video, D igital Video, O verlay, i VCR. Implicit este nil. n acest caz dispozitivul creeaz automat o fereastr. P4.
StarPos

p ro p e rty StartPos: Longint; Specific poziia de start n cadrul mediului curent. P5.
EndPos

p ro p e rty EndPos: Longint; Specific poziia n interiorul mediului curent la care s se opreasc rularea sau nregistrarea. EndPos este setat conform valorii proprietii
TimeFormat.

P6.

FileName

p ro p e rty FileName: string; Specific numele fiierului n/din care este salvat/ncrcat mediul curent. P7.
Frames

p ro p e rty Frames: Longint; Specific numrul 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 poziia 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 poziie ntr-un clip. Cele mai utilizate formate sunt:
V a lo a r e tfM illisecon ds S em n ifica ie M ilisecunde. Numrul de m ilisecunde stocate ca un numr pe 4 octei. Este folosit mai mult la m ediile audio. Cadre. E ste reprezentat pe 4 octei. E ste folosit la m ediile video, un cadru fiind o imagine.

tfF ram es

P il.

EnabledButtons

property EnabledButtons: TButtonSet;


Indic care din butoanele componentei sunt utilizabile. Valorile posibile pentru EnabledButtons sunt submulimi ale mulimii: {bp P la y , btRecord, btStop, btNext, btPrev, btStep , btBack, btPause, btE ject}.

P12.

Shareable

property Shareable: Boolean;


Indic dac dispozitivul multimedia curent deschis este partajat i altor aplicaii.

Metode______________________________________________________
Principale metode sunt cele care sunt activate de butoanele coninute n componenta TM ediaPlayer.

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 fiierul cu numele specificat de proprietatea
FileName.

S realizm o aplicaie care ruleaz un fiier .wav. Pentru aceasta folosim o component TM ediaPlayer i setm din Object Inspector AutoOpen la true, iar FileName cu numele fiierului .wav. Apoi lansm aplicaia n execuie i apsm butonul de Play.
A tenie !

Componenta TM ediaPlayer nu funcioneaz 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 afiat un clip AVI
(Audio Video Interleaved). Un clip AVI este o succesiune de cadre. Un cadru

417

conine 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_____________________________________________________
com ctrls.pas

Pagina_______________________________________________________
Win32

Proprieti___________________________________________________ PI.
FileName

property FileName: TFileName;


Indic numele fiierului AVI care se dorete afiat 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
aviNone aviFindFolder aviFindFile aviFindComputer aviCopyFiles aviCopyFile

Semnificaie
Clip-ul este furnizat prin setarea proprietii FileName. Indic clip-ul afiat n timpul cutrii unui director. Indic clip-ul afiat n timpul cutrii unui fiier. Indic clip-ul afiat n timpul unui calculator. Indic clip-ul afiat n timpul copierii mai multor fiiere. Indic clip-ul afiat n timpul copierii unui fiier.

418

V a lo a r e a v iR ecycleF ile aviE m p tyR ecycle a viD eleteF ile

S em n ifica ie Indic clip-ul afiat n timpul trimiterii unui fiier n R ecycle B in. Indic clip-ul afiat n timpul golirii lui R e cy c le B in. Indic clip-ul afiat n timpul tergerii unui fiier.

P4.

FrameCount

p ro p e rty FrameCount: Integer; Indic numrul de cadre din clip. P5.


StartFrame

p ro p e rty StartFrame: Smalllnt; Indic numrul de ordine al cadrului care va fi afiat cnd controlul este activat. P6.
StopFram e

p ro p e rty StopFrame: Smalllnt; Indic numrul de ordine al ultimului cadru AVI care este afiat n timp ce controlul este activ. P7.
FrameHeight

p ro p e rty FrameHeight: Integer; Indic nlimea, n pixeli, a fiecrui cadru afiat. P8.
FrameW idth

p ro p e rty FrameWidth: Integer; Indic limea, n pixeli, a fiecrui cadru afiat. P9.
Open

p ro p e rty Open: Boolean; Indic dac clip-ul este ncrcat n memorie i gata pentru derulare. P10.
Repetitions

p ro p e rty Repetitions: Integer; Indic de cte ori va fi repetat secvena de cadre nainte ca proprietatea 419

A ctive s devin false.


P il.

Timers

p ro p e rty Timers: Boolean; Indic dac cadrele sunt afiate ca rspuns la evenimentul OnTimer al unei componente TTimer. Acest lucru este util cnd se dorete rularea n paralel a unui clip muzical. Evenimentul OnTimer va fi responsabil cu derularea clip-ului AVI. Exem plu: Urmtoarea aplicaie ilustreaz folosirea acestei proprieti n cazul unui clip AVI cu 13 cadre. Pe form vom avea o component TTimer i o component TAnimate cu urmtoarele proprieti:
object Animatei: TAnimate
W idth = 60 Height = 39 FileName = 'C :\Program Files\Borland\Delphi7\Demos\CoolStuf\cool.a v i ' StopFrame = 13 Timers = True

end object Timerl: TTimer


Interval = 100 OnTimer = TimerlTimer

end

Handlerele de evenimente ale acestei aplicaii sunt:


var
t : integer;

procedure T F o r m l .Form A c t i v a t e (Sender: TObject); begin


t := 1;

end; procedure TForml.TimerlTimer(Sender: TObject); begin Animatei.Seek(t ); t := 1 + t mod 13; end;

420

Metode
M l.
Play

p ro c e d u re PX'dyiFrom Frame, ToFrame: Word; Count: Integer); Afieaz secvena de cadre care ncepe la cadrul FromFrame term in la cadrul ToFrame , de Count ori. M 2.
Seek

i se

p ro c e d u re Seek(Frame: Smalllnt); Afieaz cadrul cu numrul de ordine Frame. M 3.


Stop

p ro ced u re Stop; ntrerupe derularea clip-ului AVI.

Evenimente______________________________________________
E l.
OnOpen

p ro p e rty OnOpen; TNotifyEvent; Apare cnd valoarea proprietii Open se schimb din false n true. E2.
O nClose

p ro p e rty OnClose; TNotifyEvent; Apare cnd valoarea proprietii Open se schimb din tru e n false. E3.
OnStart

p ro p e rty OnStart: TNotifyEvent; Apare cnd clip-ul ncepe s se deruleze. E4.


OnStop

p ro p e rty OnStop: TNotifyEvent; Apare cnd controlul a terminat de afiat clip-ul AVI.

421

31. DEZVOLTAREA DE COMPONENTE


D elphi nu este doar un mediu pentru dezvoltarea vizual a aplicaiilor 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 bjectP ascal folosind mediul Delphi. Pentru o mai bun nele gere a lor, utilizatorul poate studia codurile surs a ctorva componente aflate n directoarele: ...\DEMOS\PROPEDlT i ..ASOURCEY... Principalele etape necesare pentru a crea o component sunt: 1. 2. 3. 4. 5. 6. 7. 8. nelegerea componentelor; scrierea de proprieti; scrierea de evenimente; scrierea de metode; grafica n componente; editoarele de componente; nregistrarea componentelor; adugarea unei imagini la component.

n final sunt prezentate cteva exemple i sunt discutate cteva tipuri mai speciale de componente, i anume: 1. 2. componente grafice; componente cutii de dialog (engl. dialog boxes).

31.1. nelegerea componentelor


Prima ntrebare la care trebuie rspuns, n acest capitol, este urmtoarea: Ce este o component? Cei care au ajuns pn aici tiu foarte bine rspunsul: O component nu este altceva dect o clas. O clas n cel mai adevrat sens al programrii orientate pe obiecte (OOP). Totui exist unele mici diferene datorate formei noi (necesar programrii sub W indows) n care sunt puse elementele att de cunoscutei clase. i anume, pentru nceput este important s se rein c ntr-o clas intr trei tipuri de informaii:

422

a.

In fo rm aii de stare Indic starea unei componente la un moment dat. n vechile clase aceast informaie era dat de ctre coninutul datelor membre. Aici s-a fcut un pas nainte, crendu-se proprietile. O proprie tate, la cel mai simplu nivel, este legat de o singur dat membr i are aceeai valoare ca i ea. Motivul pentru care au fost create aceste proprieti a fost acela de a asigura o interfa mai puternic ntre programator i datele membre.

b.

In fo rm aii de aciune Indic modul n care componentele pot aciona asupra lor sau asupra mediului nconjurtor. Acest lucru este realizat prin inter mediul metodelor.

c.

Info rm aii de rspuns i dau posibilitatea programatorului s rspund (prin intermediu codului surs) la modificrile care au loc n sistem sau ntr-o aplicaie. Aceste informaii sunt recepionate prin intermediul evenimentelor.

Dei oricare dou componente sunt diferite n unele aspecte, ele au totui i un aspect comun: toate deriv din clasa TComponent care definete 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 D elphi, munca programatorului este uurat. Astfel, n momentul n care dorii s creai o nou component alegei itemul Com ponent din (File\New ) sau din meniul Com ponent alegei submeniul New. Pe ecran va apare fereastra N ew Com po nent ale crei elemente sunt: Class N a m e, A n cesto r Type, P alette P a g e , Unit File N am e i Search Path. n cutia de editare Class N am e se introduce numele noii compo nente. Conform conveniilor acest nume trebuie s nceap cu litera T (de exemplu, TComponentaM ea). n lista de tip drop down A ncestor Type, se alege componenta care este strmoul direct al componentei noastre. Componenta noastr va moteni toate proprietile, metodele i evenimentele din com ponenta strmo (de exemplu, strmoul poate fi: TComponent ). n lista de tip drop down Palette Page, se alege numele paginii din C om ponent P alette n care noua component va aprea cnd va fi introdus n bibliotec.

423

U n it file nam e indic numele i calea unitului ataat componentei (de exemplu: C:\Program Files\Borland\Delphi 7\Lib\ComponentaMea.pas )

S earch p a th indic calea n care este cutat unitul ataat compo nentei.

Acionnd butonul C reate U nit va fi creat urmtorul unit:


unit ComponentaMea; interface uses
Windows, Messages, Forms, Dialogs; SysUtils, Classes, Graphics, Controls,

type
TComponentaMea = class (TComponent)

private
{ Private declarations }

protected
{ Protected declarations }

public
{ Public declarations }

published
{ Published declarations }

end; procedure Register; implementation procedure Register; begin


R e g i s t e r C o m ponents('S a m p l e s ', [TComponentaMea]);

end;
end.

Observm totodat c mediul D elphi a fcut i nregistrarea compo nentei (despre care vom vorbi puin mai ncolo). Fiierele necesare unei componente sunt: un pachet (.DPL) sau o colecie de pachete (.DPC); un pachet compilat (.DCP); un unit compilat (.DCU); un fiier n care este stocat bitmap-ul afiat n C om ponent Pallete (.DCR); un fiier H elp (.HLP).

424

31.2. Scrierea de proprieti


Proprietile i creeaz utilizatorului iluzia c seteaz sau citete valorile unor variabile. De fapt proprietile se comport ca i nite variabile, singura diferen fiind faptul c (proprietile) nu pot fi transmise ca parametru de tip referin (var). Principalul avantaj pentru utilizator este faptul c unele proprieti sunt disponibile n O bject In spector la momentul proiectrii aplicaiei (engl design time), deci munca de setare sau citire a valorilor lor este mult simplificat. Pentru creatorul de componente, proprietile ofer mai multe avantaje: permit ascunderea detaliilor de implementare; permit atribuirea unor valori implicite; permit reducerea numrului de metode disponibile la momentul execuiei aplicaiei. Aceste metode sunt, de fapt, incluse n proprie ti. metodele pentru o proprietate pot fi override, aceasta nsemnnd c ceea ce pentru utilizator pare a fi o aceeai proprietate, n alte componente are implementri diferite.

31.2.1. Tipuri de proprieti


O proprietate poate fi de orice tip. Diferena dintre tipuri este modul n care ele apar n O bject In spector :
Tip dc proprietate
P roprieti sim ple Proprieti de tip enumerare

Semnificaie
Pot fi num erice, character, sau ir. Ele apar in Object Inspector ca i numere, caractere sau iruri. Utilizatorul poate edita direct valoarea lor. D e exem plu proprietile: Top, Height, Caption a lui TForm. Sunt afiate n O bject Inspector sub forma unei liste drop-dow n, toate valorile pe care le poate lua o proprietate de acest tip. D e exem plu, proprietatea Align a lui TMemo. Sunt afiate n Object Inspector ca o mulime. Expandarea acestei proprieti se face executnd dublu click pe sem nul + din faa denumirii proprietii. D up expandare utilizatorul este solicitat s trateze fiecare elem ente ca o m ulim e de valori Booleane: true dac elem entul este inclus, false n caz contrar. D e exem plu, proprietatea Options a lui TOpenDialog. Sunt la rndul lor clase i au propriile lor editoare, denum ite editoare de proprieti. Un editor de proprieti poate fi activat prin click pe butonul (pe care sunt trei puncte) aflat n dreapta valorii proprietii. D c exem plu, proprietatea Font. A ceast proprietate este i de tip m ulim e (de subpio prieti) deoarece n faa denumirii ei (din Object Inspector) apare sem nul i

Proprieti de tip mulime

Proprieti de tip obiect

425

31.2.2. Declararea proprietilor


Pentru a declara o proprietate trebuie specificate trei lucruri: 1. numele proprietii; 2. tipul proprietii; 3. metodele pentru a citi/seta valoarea proprietii. Proprietile pot fi declarate n: seciunea public, fcnd astfel posibil accesarea lor la momentul execuiei aplicaiei; setarea valorii unei astfel de proprieti se face la momentul execuiei programului i doar prin cod; seciunea published, fcnd astfel posibil accesarea lor i la momentul proiectrii aplicaiei; acest lucru face ca proprietatea s fie vizibil n O bject Inspector, deci valoarea ei poate fi setat i la momentul proiectrii (din O bject Inspector).

Un exemplu tipic de declarare a unei proprieti este urmtorul:


type
TComponentaMea=class(TComponent)

private
F N u m a r :integer;

published property N u m r :integer read FNumar write FNumar; end;

O dat membr poate fi accesat i indirect, cu ajutorul unor metode de tipul G et sau Set (care vor fi discutate n seciunea urmtoare):
type
TComponentaMea=class(TComponent)

private
F N u m a r :integer;

procedure SetValoare(Val:integer); function G e t V a l o a r e :integer; published property N u m r :integer read SetValoare write SetValoare; end;

31.2.3. Memorarea intern a datelor


Datele unei proprieti sunt memorate ca date membre ale clasei. Nu exist restricii, dar este de preferat s se respecte nite convenii: Identificatorii pentru datele membre ale proprietilor ncep cu litera F i ncorporeaz numele proprietii. 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 proprietii ataate.

31.2.4. Metode de acces


Sintaxa declarrii unei proprieti permite prilor rea d i w rite s specifice metodele folosite pentru a accesa o dat membr. M etoda R ead Este o funcie care nu are nici un parametru (excepie fcnd proprie tile de tip a rra y i proprietile care mpart aceeai metod read) i returneaz o valoare de acelai tip ca i proprietatea. Aceast metod se folosete cnd este nevoie de valoarea unei proprieti. n acel moment funcia ataat citete valoarea datei membre corespunztoare i o returneaz. Prin convenie numele ei ncepe cu G et i se continu cu numele pro prietii. Singura excepie pentru regula far parametri o au proprietile a rra y care paseaz indeci ca parametri, sau pentru proprietile care au specificatorul index. M etoda W rite Este o procedur care are un singur parametru (excepie fcnd proprie tile de tip a rra y i proprietile care au aceeai metod w rite) i care seteaz datele membre corespunztoare unei proprieti. Parametrul are acelai tip cu proprietatea. Prin convenie, numele procedurii ncepe cu Set i se continu cu numele proprietii. Aceast procedur se apelaz cnd este atribuit o nou valoare proprietii i va seta datele membre la noile valori. De exemplu, s considerm clasa declarat mai sus:
type
TComponentaMea=class(TComponent)

private
F N u m a r :integer;

procedure SetValoare(Val:integer); function Ge t V a l o a r e :integer); published property N u m r :integer read GetValoare write SetValoare; end;

427

Implementrile lui G etV aloare i SetValoare sunt:


procedure TComponentaMea.SetValoare(Val: integer); begin if Val o FNumar then FNumar := Va l ; end; function TComponentaMea.GetValoare:integer; begin GetValoare := FNumar; end;

Observaie:
Funciile de tip G et i Set trebuie declarate n seciunea private a unei clase pentru a nu se avea acces la ele din afara clasei. Mai multe proprieti pot utiliza aceleai metode read i write, folosindu-se pentru aceasta de specificatorul index.

31.2.5. Valori implicite ale proprietilor


In momentul declarrii unei proprieti se poate specifica o valoare implicit pentru acea proprietate. De exemplu, pentru a specifica c valoarea implicit pentru proprietatea /sTrue este true, vom scrie urmtoarea linie:
property IsTrue:boolean = {default=true};

Asta nu nseamn c valoarea iniial a proprietii va fi setat la true (mai general la ceea ce i se atribuie lui default), ci c, n cazul n care valoarea unei proprieti va fi diferit de valoarea lui default, ea va fi salvat n fiierul
.dfin.

Dac redeclarai o proprietate, atunci putei s specificai c ea nu va avea nici o valoare implicit, chiar dac proprietatea strmo are acest lucru, folosind specificatorul nodefault:
property Newlnteger:integer = {nodefault};

31.2.6. Proprieti de tip array


Aceste proprieti pot fi indexate ntr-un mod asemntor cu al vecto rilor. Un exemplu este proprietatea Lines a componentei TMemo. Aceast proprietate reprezint o list indexat de stringuri (AnsiString) care mpreun alctuiesc textul cutie de tip TMemo. Fiecare string poate fi accesat prin inter mediul unui indice. 428

Scrierea unei proprieti de tip array este asemntoare cu scrierea unei proprieti normale, cu unele mici excepii i anume: Declararea proprietii cuprinde unul sau mai muli indeci de un tip specificat. Acest tip poate s fie orice, nu neaprat un tip ordinal. Prile de tip read i write ale unei metode trebuie s fie metode i nu date membre. Metodele ataate prilor read i write au, pe lng parametrii obinuii, i parametrii corespunztori indecilor. Aceti parametri trebuie s fie n ace eai ordine i de acelai tip ca i cei specificai n declararea proprietii.

Exemplu:
type
TComponentaMea=class(TComponent)

private function GetNumberSize(Index:integer):string; public property NumberSize[Index:integer]:string =


{read=GetNumberSize};

end;

Funcia GetNumberSize este:


function T C o mponentaMea.GetNumberSize (I n d e x :integer): string; begin case Index of
0: R e s u l t := "Zero";

100: Result = "Mediu"; 1000: Result = "Mare";

else Result = "Lungime foarte mare"; end; end;

31.2.7. Editoare de proprieti


ntr-un sens mai larg, aceast noiune poate fi definit ca fiind o cutie de dialog prin intermediul creia utilizatorul seteaz valoarea unei anumite proprieti (de exemplu, proprietatea Color a lui TForm). n momentul n care o component este selectat n O bject Inspector, acesta scaneaz toate pro prietile i va crea un editor de proprieti pentru fiecare proprietate n parte. De exemplu, dac proprietatea este de tip integer, atunci un editor de proprieti pentru ntregi va fi creat (implicit este de tipul TIntegerProperty).

429

Toate editoarele de proprieti deriv din TPropertyEditor. Editorul de proprieti este creat pe baza tipului proprietii care urmeaz s fie editat aa cum este el dedus din tipul folosit de ctre RegisterPropertyEditor. Pentru a uura munca programatorului, Delphi-ul pune la dispoziie cteva clase predefmite de editoare de proprieti. O parte din tipurile de edi toare de proprieti predefmite ar fi:
T ip T O rd in a lP ro p erty S em n ifica ie Este clasa de baz pentru toate editoarele de tip ordinal (integer, char, enumerare...). Este editorul im plicit pentru proprietile de tip lo n g i pentru toate subtipurile lui lo n g (in t, 1..10, etc). Este editorul im plicit pentru proprietile subintervale ale lui c h a r ( A ..F ) . Este editorul im plicit pentru numere reale. Este editorul im plicit pentru toate proprietile de tip enumerare. Este editorul im plicit pentru iruri de caractere. Este editorul im plicit pentru un elem ent dintr-o mulim e. A cest elem ent este vzut ca valoare boolean (aparine sau nu mulim ii). Este editorul im plicit pentru proprietile de tip mulim e. A cest editor nu permite editarea direct a m ulim ii, dar va afia o list de sub-proprieti cu fiecare elem ent al m ulimii. Este editorul im plicit pentru proprietile care sunt la rndul lor clase. Va afia num ele clasei i va permite editarea proprietilor obiectului ca sub-proprieti ale proprietii curente. Este editorul im plicit pentru pointeri la m etode (de exem plu, pentru evenim ente). Proprietatea care are un editor de acest tip poate lua ca valoare orice component, de pe forma curent, care are ns acelai tip cu proprietatea. D e exem plu proprietatea A ctiveC on trol a lui TForm. Este editorul im plicit pentru proprieti de tip TC olor. A fieaz 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. A fiea z o list drop-down cu toate fonturile disponibile din sistem . Este editorul im plicit pentru proprieti de tip TFont. Se poate edita sub-properitile individual sau se acceseaz o cutie de dialog. Este editorul im plicit pentru proprieti de tip TC ursor. Se afieaz o list drop-down pentru a se alege un cursor dintre cele disponibile. E ste editorul im plicit pentru proprieti de tip T M odalR esult. Se afieaz o list drop-down pentru alegerea unei valori modale. De exem plu, proprietatea M o d a lR esu lt a lui TBitBtn. de tip ch ar sau

T In teg erP ro p erty T C h a rP ro p erty T F lo a tP ro p erty T E num Property T S trin gP roperty TSetE lem entP roperty

T S etP roperty

T C la ssP ro p erty

T M eth odP roperty

TC o m p o n en tP ro p erty

T C o lo rP ro p erty

T F on tN am eP roperty

TF ontP roperty

T C u rso rP ro p erty

T M odalR esu ltP roperty

T ip T S h ortC u tP roperty T M P F ilenam eP roperty T D a teP ro p erty, TT im eP roperty TD ateT im e P ro p e rty

S em n ifica ie Este editorul im plicit pentru proprieti de tip TShortCut. Permite fie alegerea, fie tastarea unui short-cut. A fieaz o cutie de dialog pentru deschiderea unui fiier media. Sunt editoarele pentru proprietile de tip dat i timp a lui TD ateTim e. Permite editarea datei i timpului mpreun.

Dac dorii s creai alte proprieti mai speciale trebuie ca clasa editorului vostru s derive din unele din clasele descrise mai sus (sau direct din
TProperty Editor).

Observaie:
Un editor de proprieti trebuie creat doar atunci cnd nici unul dintre tipurile implicite nu sunt suficiente. Acest lucru apare dac proprietatea este un obiect. Pentru a manipula comportamentul unei proprieti, utilizatorul trebuie s redefmeasc 4 metode ale lui TPropertyE ditor i anume: M l.
GetAttributes

function GetAttributes: TProperty Attributes; override;


i spune lui O bject In spector despre caracteristicile editorului de pro prieti, pentru ca acesta (O bject In spector) s afieze unealta necesar. G etA ttributes returneaz o mulime de tipul T PropertyAttributes care este alctuit din urmtoarele valori:
V a lo a r e S em n ifica ie Editorul poate s retum eze o list cu valori posibile pentru o proprietate. A ceasta va nsem ana c un buton drop-down va aprea n O b je ct I n sp e c to r la dreapta proprietii. Indic lui O b je ct I n sp e c to r c lista trebuie sortat. Proprietatea are subproprieti care vor fi afiate indentat. Utilizatorul nu poate m odifica valoarea proprietii la timpul proiectrii aplicaiei. Indic c m etoda E d it va afia o cutie de dialog pentru editarea proprietii. Indic lui O b je c tln s p e c to r s afieze proprietatea respectiv n cazul n care exist selectate mai multe com ponente care o au. Permite proprietii s revin la o valoare iniial. C om ponenta trebuie rennoit dup fiecare schim bare a unei

p a V a lu e L ist

p a S o rtL ist p a S u b P ro p erties p a R ea d O n ly

p a D ia lo g

p a M u ltiS elect paRevertable p a A u to U p d a te

431

V a lo a re proprieti.

S e m n ific a ie

Exemple:
E d ito r u l de p ro p riet i T E num Property TSetE lem entP roperty T S etP roperty T C la ssP ro p erty TF ontN am eP roperty T C o lo rP ro p erty A tr ib u te p a M ultiS elect, paV alueL ist, p a S o rtU st, p a R everta b le p a M ultiS elect, p a V a lu eL ist, p a S o rtL ist p a M u ltiS elect, pa S u b P roperties, paR eadO n ly, p a R ev e rta b le p a M ultiS elect, pa S u b P roperties, p aR eadO n ly paM ultiS elect, paV alueL ist, paS ortL ist, p a R ev e rta b le p a M u ltiS elect, p a D ia lo g , paV alueL ist, pa R everta b le p a M ultiS elect, paV alueL ist, paS ortL ist, p a R everta b le T F ontP roperty T S hortC u tP roperty p a M ultiS elect, paS u b P roperties, p a D ia lo g , p a R eadO n ly p a M ultiS elect, paV alueL ist, pa R everta b le

M 2.

GetValue

function GetValue: string; override;


Este o funcie care convertete datele membre ntr-un ir de caractere text pentru a fi afiat n O bject In spector (de exemplu, o mulime este afiat sub forma unui string [ell,el2,...,eln]). Implicit, aceast funcie 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.G e t V a l u e : string; begin
R e s u l t := I n t T o S t r (GetOrdValue);

end;

M 3.

SetValue

procedure SetVaIue(const Value: string); override;


Aceast procedur convertete stringul din coloana cu valori a unei proprieti n valori efective pe care le atribuie datelor membre cores punztoare. Utilizatorul poate tasta un ir de caractere pe care metoda SetValue l va converti la tipul proprietii i l va asigna datelor mem bre. n cazul n care irul nu este corect trebuie generat i tratat o excepie. De exemplu, procedura SetValue pentru tipul integer este: 432

procedure TIntegerProperty.SetValue (const Value: string); var L : Lo n g i n t ; begin


L := StrToInt(Value); S e t O r dValue(L);

end;

Editorul de proprieti mai motenete un set de metode folosit pentru a atribui sau citi diferite feluri de valori:
T ip u l p ro p riet ii T ip o rd in a l S tr in g E v en im e n t T ip V a r ia n t T ip u r i rea le M e to d a G et GetOrdValue G etS trValue G etM ethodV alue G etVarValue GetFIoatVa lue M e to d a S e t SetOrdValue SetStrValue SetM etbod V alue SetV arV alue SetFJoatValue

M 4.

Edit

procedure Edit; override;


Este apelat de fiecare dat cnd utilizatorul apas butonul (...) din dreapta unei proprieti sau cnd pe proprietate se execut dublu click. Acest lucru poate genera, de exemplu, afiarea unei cutii de dialog, pentru a permite editarea proprietii ntr-un mod mai sugestiv dect text simplu (vezi Font sau Color). n interiorul acestei metode urmai paii: a. b. c. d. construii editorul pe care l folosii pentru proprietate; citii valoarea curent i atribuii-o proprietii folosind o metod de tip Ger; cnd utilizatorul selecteaz o nou valoare folosii o metoda Se? ; distrugei editorul de proprieti.

Exemplu:
procedure TColorProperty.Edit;

var begin
try

ColorDialog:

TColorDialog;

ColorDialog

:= T C o l orDialog.Create{Application);

ColorDialog.Color := GetOrdValue; if C o l o r D i a l o g .Execute then SetOrdValue(ColorDialog.C o l o r ) ;

finally
C o l o r D i a l o g .F r e e ;

end;

433

end;

M5.

Activate

p ro ced u re Activate; override; Aceast metod este apelat ori de cte ori proprietatea respectiv devine selectat n O bject Inspector. Acest lucru este util, de exemplu, n cazul n care anumite atribute ale proprietii trebuie sau pot fi determinate doar atunci cnd aceasta este selectat.

Restricii:
Se poate apela doar atunci cnd G etAttributes ntoarce paM ultiSelect i
paSubProperties.

M 6.

AllEqual

function AllEqual: Boolean; override; Este apelat atunci cnd mai multe componente sunt selectate n O bject Inspector. Dac ntoarce tru e, atunci este apelat GetValue. Dac, dim potriv, ntoarce valoarea false, atunci un ir vid este afiat n O bject Inspector.

Restricii:
Se poate apela doar atunci cnd GetAttributes ntoarce paM ultiSelect. M 7.
GetEditLim it

function GetEditLimit: Integer; override; Returneaz numrul de caractere pe care utilizatorul le poate introduce pentru specificarea valorii unei proprieti. Implicit este 255. M 8.
GetName

function GetName: string; override; Returneaz numele proprietii. Toate liniile de subliniere sunt nlocuitre cu spaii. M9.
G etP roperties

p ro ced u re GetProperties(Proc: TGetPropEditProc); override; Aceast metod trebuie redefinit doar pentru a apela P ropertyP roc pentru fiecare dintre sub-proprietile proprietii curent editate i 434

atribuirea de editoare pentru fiecare din acestea. De exemplu, tipul TSetProperty specific cte un editor pentru fiecare element al unei mulimi. Totodat, TClassProperty are nevoie de un editor pentru fiecare element al su deoarece acesta poate fi, de asemenea, o clas:
procedure TClassProperty.GetProperties(Proc: TGetPropEditProc); var I: Integer;
Components: TComponentList;

begin
Components := T C o m p o nentList.Create;

try for I := 0 to PropCount - 1 do


Components.Add(TComponent(GetOrdValue At(I ))); GetComponentProperties(Components, tkProperties, Designer, P r o c ) ;

finally
C o m p o n e n t s .F r e e ;

end; end;

M 10. G etPropType function GetPropType: PTypelnfo; Returneaz un pointer la tipul informaiei proprietii (proprietilor) curent editate. Aceast metod nu mai trebuie redefinit. Felul n care este implementat n TPropertyE ditor este urmtorul:
function TPropertyEditor.G e tPropType: PTypelnfo; begin
Result := FPropList'' [0 ] .Proplnf .PropType''

end;

M I I . GetValues function GetValue: string; override; Este apelat cnd G etAttributes ntoarce paValueList. De exemplu, felul n care este ea implementat pentru tipul TEnuiiiProperty este urmtorul:
procedure T EnumProperty.GetValues(Proc: TGetStrProc); var I: I n t e g e r , EnumType: PTypelnfo;

begin
EnumType := GetPropType;

with G e t T y p e D a t a ( EnumType )" do for I := MinValue to MaxValue do


P r o c (G e t E n u m N a m e (E n u mType, X ));

end;

435

M12. Initialize pro ced u re Initialize; override; Este apelat dup ce editorul de proprieti a fost creat dar nainte de a fi apelat. M 13. GetCom ponent function GetComponent(//!^ejc: Integer): TPersistent; Este returnat a Index-a component editat de acest editor de pro prieti. R estricii: Poate fi apelat doar cnd paM ultiSelect este returnat de ctre
GetAttributes.

Toate acestea fiind fcute nu ne mai rmne dect s nregistrm editorul de proprieti. Prin nregistrarea unui editor se asociaz un tip de proprietate cu un anu me editor de proprieti. Se poate nregistra editorul pentru o anumit proprie tate a unei anumite componente, sau pentru toate proprietile de un anumit tip. nregistrarea unei componente se face cu ajutorul metodei R egisterPropertyE ditor. Ea are prototipul definit astfel:
procedure RegisterPropertyEditor(PropertyType: PTypelnfo; C o mponentClass: TClass; const PropertyName: string
EditorClass: TPropertyEditorClass);

unde: PropertyType

Este un pointer la tipul informaiei pentru tipul proprietii editate aa cum este ea returnat de ctre funcia Typelnfo. De exemplu, Typelnfo (TComponentaMea). Com ponentClass

Este tipul componentei la care se aplic acest tip de editor. Dac acest parametru este nil, atunci tipul de editor se aplic pentru toate proprietile avnd tipul PropertyType.
PropertyN am e

Este numele proprietii la care se restricioneaz acest editor. Dac acest parametru este ( ), atunci acest editor se aplic la toate proprietile avnd PropertyType n ComponentClass. 436

E ditorC lass

Este tipul editorului de proprieti folosit pentru a edita proprietatea specificat. Acesta va fi creat prin apelul
EditorClass. Create.

Exemple:
procedure Register; begin
RegisterPropertyEditor(Typelnfo(TComponent), nil, '' , TComponentProperty); R egisterPropertyEditor(Typelnfo(TComponentName), TComponent, 'Name', TComponentNameProperty); RegisterPropertyEditor(Typelnfo(TMenuItem),T M e n u , '', TMenuItemProperty);

end;

Aceste

trei

funcii

descriu

trei

utilizri

diferite

ale

lui

R egisterP ropertyE ditor:

Prima nregistreaz editorul de proprieti ( TCom ponentProperty ) pentru toate proprietile 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 funcie nregistreaz un editor pentru toate proprietile 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 cnd sunt apelai constructorul i destructorul unei clase. Pentru aceasta vom implementa o component simpl care are un constructor i un destructor. Acetia sunt definii n seciunea public a clasei TComponentaM ea astfel:
constructor Create(AOwner : TComponent); override; destructor Destroy; override;

Implementrile acestor dou metode speciale sunt:


constructor TComponentaMea.Create(AOwner : TComponent); begin inherited C r e 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

end;

destructor TComponentaMea.Destroy; begin


ShowMessage('S-a apelat destructorul.'); inherited Destroy; / se apeleaza de tructorul c a e de baza / s lsi

end;

Urmtorul pas este instalarea acestei componente. Acest lucru l vom realiza accesnd itemul Install din meniul Component. Un mesaj ne va confirma pagina pe care a fost aezat componenta. Selectm componenta din C om ponent P alette i o aezm pe form. n acest moment va fi apelat pentru prima dat constructorul i va fi afiat mesajul scris de noi n corpul constructorului. Aceasta nsemn c obiectele amplasabile pe form (compo nentele) sunt active, ele executnd o anumit secven de instruciuni. Acum s lansm aplicaia n execuie. n acest moment constructorul se va apela pentru a doua oar. Aceasta nseamn c a fost creat un nou obiect de clas TComponentaM ea. La distrugerea formei aplicaiei 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 legtur dintre o apariie n sistem (ca de exemplu apsarea unei taste sau micarea cursorului de mouse) i o secven de instruc iuni (numit handler de evenimente) care rspunde la apariia 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 = p ro ced u re (Sender: TObject) o f object; Handlerele de evenimente trebuie s fie neaprat proceduri, dei compi latorul permite i funcii. Chiar i aa se pot obine informaii de la utilizator prin folosirea de parametrii referin (aa cum se vede mai sus). Componentele folosesc proprietile pentru a crea evenimente. Spre deosebire de majoritatea proprietilor, evenimentele nu folosesc metode n prile cu re a d i w rite, ele accesnd direct datele membre ale componentei. 438

Prin convenie, data membr are acelai nume ca i evenimentul, precedat ns de litera F, iar evenimentul are numele prefixat de cuvntul On:
type
TControl = class(T C om ponent)

private
FOnClick: T N otifyE vent; { declare a field to hold the method pointer }

protected property OnClick: T N otifyE vent read FOnClick write FOnClick; end;

Din punctul de vedere al modului de interaciune evenimentele pot fi mprite n dou categorii: interaciune-utilizator, care sunt generate ntotdeauna de ctre un mesaj Windows; de exemplu, cnd utilizatorul apas un buton de mouse, Windows-ul trimite aplicaiei mesajul WM_LBUTTONDOWN. schimbri de stare, care sunt generate de schimbarea valorilor unor proprieti.

31.5. Grafica n componente


Unul dintre lucrurile cele mai importante dintr-o component este modul n care ea se afieaz pe ecran. Windows-ul ofer un puternic G raphics D evice Interface (GDI) pentru grafice independente de dispozitiv. Dar acest GDI este greu de folosit, necesitnd eforturi serioase din partea programatorilor. Delphiul minimizeaz efortul necesar crerii graficii pentru o component, dndu-i posibilitatea programatorului s se concentreze spre aspectele importante ale unei aplicaii i s neglijeze detaliile. Folosindu-se de proprietatea Canvas a unei componente, programatorul este scutit de lucrul la un nivel sczut cu funcii grafice. Canvas-ul manipuleaz toate resursele grafice ca Pen, Brush, Font, etc. care vor fi alocate i eliberate fr ca programatorul s se mai ocupe de aceasta. Exem plu: Desenarea unei elipse ntr-o fereastr, mai nti folosind funcii API, iar mai apoi folosind avantajele lui Delphi:
procedure T M y W i n d ow.Paint(PaintDC: H D C ; var Paintlnfo: TPaintStruct); var PenHandle, OldPenHandle: HPEN;
BrushHandle, OldBrush.Han.dle-. HBRUSH;

439

begin
PenHandle := CreatePen(PS_SOLID, 1, R G B (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); D e l e t e O b j e c t (PenHandle);

end; procedure TForml.FormPaint(Sender: TObject); begin with Canvas do begin


Pen.Color := clBlue; Brush.Color := clYellow; E l l i p s e (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 proprietile Pen, Brush, Pixels, Font, etc.) sau la un nivel de jos prin apelul funciilor 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 C om 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 instaniaz un editor de componente n momen tul n care componenta este aezat pe form. Tot atunci se determin cte unelte sunt necesare componentei. Aceste unelte sunt afiate n partea de sus a meniului (denumit i speed m enu) de tip popup care apare la click dreapta pe o component aezat pe o form. Fiecare din aceste unelte sunt numite, n limbajul V CL, verbe. Un editor de componente este o clas care deriv din TDefaultEditor. Pentru a adapta comportamentul componentei la necesitile dumneavoastr, trebuie s redefinii cteva metode ale lui TDefaultEditor i anume:

440

M l.

Create

c o n stru c to r Create(AComponent: TComponent; AD esigner. TFormDesigner); override; Este constructorul apelat pentru a crea un editor de componente.
AC om ponent este componenta care urmeaz a fi editat.

M2.

G etVerbCount

function GetVerbCount: Integer; override; Returneaz numrul verbelor pe care editorul vostru le ofer. M 3.
G etVerb

function GetVerb (index: Integer): string; override; Returneaz un ir care reprezint al Index -lea verb din speed menu. Primul verb are numrul de ordine 0, al doilea are numrul de ordine 1, .a.m.d. M 4.
ExecuteVerb

p ro ced u re ExecuteVerb(Index: Integer); override; Lanseaz n execuie al Index-lea verb. Dac utilizatorul execut dublu click pe o component, atunci este apelat ExecuteVerb( 0). M 5.
Edit

p ro ced u re Edit; override; Cicleaz prin toat lista de proprieti a unei componente. Pentru fiecare proprietate, Edit apeleaz EditProperty. Utilizatorul nu trebuie s redefineasc E dit ci doar E ditProperty. M 6.
EditP roperty

p ro c e d u re Ed itProperty (P ropertyE ditor TPropertyEditor; v a r Continue, FreeEditor: Boolean); override; P ropertyE ditor este numele editorului de proprieti care va fi

afiat.
Continue i spune metodei Edit dac s mai cicleze sau nu prin lista de proprieti. F reeE ditor indic dac editorul de proprieti va fi distrus sau nu.

441

M7.

Copy

procedure Copy; override;


Este apelat n momentul n care o component este copiat n
Clipboard. Ceea ce se copiaz n clipboard cnd se d Copy pe o com

ponent este definiia acesteia din fiierul .dfm. De exemplu, pentru o component TLabel, ceea ce se copiaz n C lipboard este:
object Labell: TLabel
Left = 96 Top = 88 W idth = 32 Height = 13 Caption = 'Labell'

end

Ca i n cazul editoarelor de proprieti trebuie fcut i nregistrarea editoarelor de componente. nregistrarea editoarelor de componente se face cu ajutorul procedurii RegisterCom ponentEditor definit astfel:

procedure RegisterComponentditor(
ComponentClass-. TComponentClass; ComponentEditor. TComponentEditorCIass);

unde Com ponentClass i Com ponentEditor sunt pointeri la tipul clasei respectiv la tipul editorului clasei.

31.7. Help pentru componente


Crearea unui fiier 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 fiierul help al acelei componente s fie adugat la helpul Delphi. Acest lucru se poate face folosind utilitarul O penHelp (furnizat odat cu Delphi-ul). Mie personal acest utilitar nu mi-a funcionat, de aceea am adoptat o alt metod: am scris direct n fiierul BcbHelp.cfg care se gsete n directorul Help. n acest fiier am mai adugat dou linii (s presupunem c componenta creat de mine se numete TMyComp, iar fiierul de help pentru ea se numete 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 adugate la pachetele sale cu componente i unde vor fi adugate acestea n

Component Palette.
Pentru a nregistra o nou component urmai etapele descrise mai jos: 1. Adugai o procedur numit R egister la fiierul .PAS. Acesta va arta ceva de genul urmtor:
unit MyBtns; interface type
Scriei interfaa pentru com ponent aici} procedure Register; { aici declarai procedura R eg ister) implementation { Faceli implementarea com ponentei aici} procedure Register;

begin
{nregistrai com ponenta aici}

end; end.

2.

n interiorul procedurii R egister apelai RegisterCom ponents

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 adugat componenta, vectorul cu clasele componentelor. De exemplu, nregistrarea componentei cu numele TDesen pe pagina Samples:
procedura Register; begin
Reg i sterComponents('Sa m p l e s , [TDesen]);

end;

E posibil ca un unit s conin mai multe componente, deci este mai uor s se apeleze o singur dat procedura RegisterCom ponents pentru mai multe componente care vor fi nregistrate pe aceeai pagin:
procedure Register; begin
RegisterComponents!'Samples', [TDesen,T M y C o m p ] );

end;

443

31.9. Adugarea unei imagini la o component


Pentru ca o component s poat fi adugat la C om ponent Palette, trebuie s fie nsoit de o imagine care s o reprezinte. Aceast imagine este un ptrat cu latura de 24 pixeli i care poate fi creat i cu Im age E d ito r i anume: Lansai Im ageE ditor-ul din meniul Tools, submeniul Im ageE ditor. Din meniul File al Im age E ditor-ului alegei submeniul New, iar apoi subsubmeniul C om ponent R esource File (.dcr). Va fi creat o nou fereastr care arat n felul urmtor: Contents este un item pe care facei click dreapta. Va apare un meniu popup din care alegei comanda N ew |Bitm ap. O cutie de dialog v va cere s introducei dimensiunile imaginii (care n cazul nostru vor fi de 24x24). La click dreapta pe item-ul B itm ap] va aprea acelai meniu popup ca i mai nainte, dar de data aceasta sunt disponibile i celelalte item-uri, i anume E d it (cu care editai imaginea), Delete (cu care tergei item-ul Bitm ap) i R enam e (cu ajutorul cruia putei schimba numele itemului B itm 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 fiierului care conine imaginea este identic cu cel .PAS, dar, bineneles, cu extensia .DCR. Dac utilizatorul nu specific nici o imagine, atunci Delphi-ul folosete o imagine oarecare.

31.10. Exemple
31.10.1. O component grafic
Aceast component se afieaz pe ecran sub diferite forme (Cerc, Ptrat,D reptunghi,Elipsa), n funcie de valoarea proprietii M odel (care este de tip enumerare, deci un editor implict de tip TEnumProperty va fi afiat):
unit Desen; interface uses
Windows, Messages, Forms, Dialogs; SysUtils, Classes, Graphics, Controls,

type
T Model=(fCerc,fElipsa,fPatrat,fDreptunghi); TDesen = class(TGraphicControl)

private
F M o d e l :T M o d e l ;

procedure SetDesenModel(Valoare:TModel);

444

protected procedure Paint; override; public constructor Create(AOwner: TComponent); override; published property Model:TModel read FModel write SetDesenModel default fCerc; end; procedure Register; implementation constructor 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; begin p :=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); fElipsa : begin fPatrat if Height>Width then m:=Width else m:=Height; Canvas.Rectangle(p.Left,p.Top, p.Left+m,p.Top+m) ; end; : begin fCerc if Height>Width then m:=Width else m:=Height; Canvas.Ellipse(p.Left,p .Top, p.Left+m,p.Top+m); end; end; end;

445

procedure Register; begin


R e g i s t e r C o m p o nents('Samples 1, [TDesen]);

end; end.

31.10.2. O component grafic cu un eveniment


Este aceeai component din exemplul anterior, dar de data aceasta i-am ataat un eveniment OnChange care, pe lng 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 re a re a de evenimente.
unit Desen; interface uses
Windows, Messages, Forms, Dialogs; SysUtils, Classes, Graphics, Controls,

type
TModel=(fCerc,fElipsa,fPatrat,fDreptunghi); TChangeEvent=procedure(Sender:TO b j e c t ; var Fost;string)

of obj ect ,
TDesen =

class(TGraphicControl)

private
F M o d e l :T M o d e l ; F O n C h a n g e :T ChangeEvent;

s :string; procedure SetDesenModel(Valoare:TModel) ; protected procedure Paint; override; public constructor C r e ate(AOwner: TComponent); override; published
{ Published declarations )

property Model:TModel read FModel write SetDesenModel default fCerc; property O n C h a n g e :TChangeEvent read FOnChange write FOnChange; end; procedure Register; implementation constructor T D e sen.Create(AOwner: TComponent); begin inherited Cr e ate(AOwner);
W i d t h : = 100 ; H e i g h t :=100 ;

446

F M o d e l :=fPatrat ;

end; procedure TDesen. S etDesenModel(Valoare:TModel) ; begin if V a l o a r e o F M o d e l then begin if assigned(FOnChange) then F O n C h a n g e ( e l f ,s ) S ;


F M o d e l :=Valoare; Invalidate;

end; end; procedure T D e s e n .P a i n t ; var p : TRect;


m:integer;

begin
p:=ClientRect; case FModel of f Dre p t u n g h i :

begin
s :='D r e p t u n g h i ';

Canvas. Rectangle(p.Left,p.Top,
p .R i g h t ,p .Bottom) fElipsa

end; : begin
s :='E l i p s a '; C a n v a s .Ellipse(p.Left,p.Top, p .R i g h t ,p .B o t t o m ) ;

fPatrat

end; : begin s :='Patrat' ; if Height>Width then m:=Width else m:=Height;


Canvas.Rectangle(p.Left,p.Top, p .Left+m,p.Top+m)

fCerc

end; : begin
s :='C e r e '; if Height>Width then m:=Width else m:=Height; C a n v a s .Elli p s e ( p .Left,p.Top, p .Lef t+m, p .Top+m) ; end;

end; end; procedure Register; begin


R e g i s t e r C o m p o n e nts('S a m p l e s ', [TDesen]);

end;

end.

31.10.3. O cutie de dialog special


Aceast cutie afieaz un AboutBox. Pentru aceasta copiai fiierul about.pas din directorul ...\BIN n directorul d-voastr de lucru. Acest unit conine o form TAboutBox pe care se afl etichetele cu denumirile ProductName, Version, Copyright, Comments i o component TImage n care va aprea un icon al aplicaiei pentru care creai 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 (TO penD ialog...) 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 afia forma TAboutBox. Deci componentei noastre TAboutBoxDlg i adugm patru proprieti corespun ztoare celor patru etichete de pe forma AboutBox i o metod Execute care va instania o component TAboutBox.
unit AboutDlg; interface uses
Windows, Messages, SysUtils, F o r m s ,D i a l o g s ,About; Classes, Graphics, Controls,

type
TAboutBoxDlg =

class(TComponent)

private
FProductName, FVersion, FCopyright, FComments: string; protected public function E x e c u t e :Boo l e a n , published property ProductName: string read FProductName write FProductName; property Version: string read FVersion write FVersion; property Copyright: string read FCopyright write FCopyright; property C o m m e n t s : string read FComments write FComments; end; var A b o u t B o x :T A b o u t B o x ; procedure Register;

implementation procedure Register; begin


R e g i s t e r C o m p o nents('S a m p l e s ', [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 do

begin
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 iniializeze un dialog cu utilizatorul i deci s returneze rezultatul dialogului. In acest scop am creat componenta TSirDialog care afieaz 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 cellalt de tip Cancel) s-ar fi putut realiza i vizual (aa 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). Aa c am realizat aceast cutie de dialog doar folosind cod surs. Componenta propriu-zis TSirDialog are o proprietate i anume proprietate Sir care va reine 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; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;

type
TSirDialog = class(TComponent) 44 9

private FSir: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; begin f:=TForm.Create(Application); f . ft := 1; f . Le Top := 1 f.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:=50; e .Le ft:=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 Result then FSir:=e.Text; e. Free; bOk.Free; bCancel.Free; f.Free; end; procedure Register; begin RegisterComponents('Samples' [TSirDialog]); , end;

450

end.

31.10.5. O component cu editor de proprieti


Este vorba de o component simpl care are dou proprieti NumeSursa i N um eD estinaie. Acestea reprezint dou nume de fiiere ntre care se va face o operaie de copiere prin intermediul metodei Copiaz. Nimic deosebit pn aici. ns ceea ce am vrut s scot n eviden a fost modul de introducere al numelor celor dou fiiere. Pentru aceasta nu am creat dou proprieti de tip string care s reprezinte cele dou nume, ci am creat o clas care are ca date membre cele dou nume de fiiere. Deci, cum am mai spus i n partea teoretic, o component care are o proprietate cu editor de proprieti are nevoie de cel puin 4 clase i anume:

a.

clasa propriu-zis a componentei


n cazul nostru se numete TCopyComp.

b.

clasa proprietii
Deoarece este nevoie de editoare de proprieti doar atunci cnd valoarea proprietii este o dat complex. n cazul nostru clasa se numete TNumeFisiere.

c.

clasa editorului de proprieti


Trebuie s derive din TPropertyE ditor care trebuie s redefneac cteva metode. n cazul nostru clasa se numete TNumeFisiereProperty i are redefinite metodele Edit i
GetAttributes.

d.

clasa prii de dialog


Const din dou componente TEdit n care se vor introduce numele fiierelor ntre care se va face copierea, dou butoane TButton care vor fi folosite pentru a apela dou cutii de dialog (componente de tip TO penDialog) care vor permite selectarea, din fiierele existente, a celor dou ntre care se face operaia de copiere. Totodat dialogul mai conine dou componente TBitBtn una de tip D efault i alta de tip Cancel al cror scop este evident. Aceast cutie de dialog va arta astfel:

451

m Dialogul

z m m

ok

::

Caflce|

Pentru a nu ncrca un singur fiier, am pus clasele TCopyComp i


TNumeFiiere n alt unit: unit CopyComp; interface uses
Classes, Graphics, Controls, Forms,fmxutils;

type
TNumeFisiere = 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

private protected public procedure Copiaza; published property 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
FiierSursa:=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; begin


CopyFile(FNumeFisiere.FisierSursa,FNumeFisiere.FisierDestinatie);

end; end.

iar unitul care conine clasele TDialogul i TNumeFisiereEditor este:


unit dialog;

453
i

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, CopyComp, StdCtrls, Buttons,Dsgnlntf;

type
TDialogul = 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) public procedure 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;

begin
NumeFisiere := TNumeFisiere(GetOrdValue); NumeEditor := TDialogul.Create(Application);

try
NumeEditor.EditorNume := NumeFisiere; NumeEditor.ShowModal;

finally
NumeEdi 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 aceeai component de mai sus ( TCopyCom p ) la care i mai adugm un item n meniul de context care apare la click drepta pe ea (la timpul proiectrii aplicaiei). Acest nou item se va numi E diteaz Nume i la apsarea lui va aprea cutia de dialog de la proprietatea NumeFisiere. Noua clas, a editorului de componente, se va numi TCopyCom pEditor i va redefini metodele EdilProperty, GetVerbCount, GetVerb i ExecuteVerb. Codul surs de la componenta anterioar rmne acelai, aa c nu l mai rescriu, ci doar adaug la el (la unit-ul dialog) urmtoarele linii:
{A ceste linii se vor aduga n seciunea in terfa ce}

TCopyCompEditor = class(TDefaultEditor)

protected
procedure EditProperty(PropertyEditor- TPropertyEditor; . var Continue, FreeEditor: Boolean); override;

public procedure ExecuteVerb(Index: Integer); override; function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override; end;
{A ceste linii se vor aduga n seciunea im p lem en ta tio n }

procedure TCopyCompEditor.EditProperty(
PropertyEdi tor: TPropertyEdi tor;

var Continue, FreeEditor: Boolean); var


PropName: string;

begin
PropName := PropertyEditor.GetName; if (CompareText(PropName, 'NumeFisiere') = 0) then

456

begin
ProperCyEdi 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 then


Result := 'Editeaz Nume1

else Result := 11; end; procedure TCopyCompEditor.ExecuteVerb(Index: Integer); begin if Index = 0 then Edit; end;

iar n interiorul procedurii Register se va aduga linia:


RegisterComponentEditor(TCopyComp, TCopyCompEditor);

BIBLIOGRAFIE
1. 2. 3. 4. 5. 6. 7. 8. 9. M . Oltean, M . Cocan, C + + B u ilder n A plicaii, Editura Albastr, Grupul M icroinformatica, 1998. M . Oltean, Program area avansat n Delphi, Editura Albastr, Grupul Microinformatica, 1999.

M. Oltean, C. Groan, Program are n C ++B uilder, Editura Albastr,


Grupul Microinformatica, 2000.

Delphi Pages, http://www.delphipages.com. Torry's Delphi Pages, http://www.torry.net. About Dephi Programming, http://delphi.about.com. Project Jedi, http://www.delphi-jedi.org. Delphi32, http://www.delphi32.com. 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, http://www.drbob42.com.
and JBuilder Program m ing Clinic,

16. Delphi-Dolphin, http://www.delphi-dolphin.com. 17. The D elphi Compendium: Delphi Programm ing Resources, http://www.cyber-matrix.com/delphi.html. 18. The D elphi Compendium'. D elphi Programm ing R esources , http://www.cyber-matrix.com/delphi.html.

Delphi este un mediu de programare vizual destinat proiectrii rapide a aplicaiilor Windows. Cartea ofer o imagine de ansamblu, descriind i exemplificnd elementele de baz necesare programrii aplicaiilor In mediul Delphi.

LH m ijiiA . t u j & s i m
400500 str. Observatorului 1 Cluj-Napoca, Romnia tel. 0264.438328*, fax 0264.598263 e-mail:albastra@gmi.ro C. P. 186 Of. Post. Cluj-Napoca 1

LLLiL^lLU^ V l t t i X i t x U L
www.albastra.ro www.gmi.ro

I.S.B.N.

973-650-119-1

S-ar putea să vă placă și