+ All Categories
Home > Documents > U I şlinţific - informaticasalcuta.files.wordpress.com · Delphi este un mediu de programare sub...

U I şlinţific - informaticasalcuta.files.wordpress.com · Delphi este un mediu de programare sub...

Date post: 09-Dec-2018
Category:
Upload: doandien
View: 233 times
Download: 1 times
Share this document with a friend
456
Transcript

U i'i t i i a 'iiI şlinţific:

l’iof. Univ. Dr. Leon ŢâinbuleaI acuitatea tic M atcm aticâ şi Inform aticăI liuversitatca B abcş-B olyai ( luj-N apoca

Uditura Albastră

Director editură Smaranda Derveşteanu

Tehnoredactare computerizată Codruţa Poenaru

CopertaLiviu Derveşteanu

TipăritEDITURA ALBASTRA comanda 166 / 2003

lulitura este acreditată de CNCSIS (Consiliul Naţional al Cercelarii Slinjiliee din invătământul Superior) cu numărul 1142 din 30 iunie 2003 .şi este recomandaţii Consiliului Naţional de Atestare a Titlurilor şi Diplomelor Universitare.

Copyright © 2004Toate d r e p tu r i l e a s u p r a aces te i lucrări a p a r ţ in s.c . C a s a d e L d i tu ra A lb a s t ra s.r.l. R e p ro d u c e r e a i n te g ra lă sau p a r ţ ia la a tex tu lu i s a u a i lu s t r a ţ i i lo r din a c e a s ta c a i l e es le p o s ib i l ă n u m a i c u a c o rd u l p re a la b i l in s c r i s al C a se i de l id i lu ra A lb a s l iu .

CUPRINS

PREFAŢĂ................................................................................................ 9

1..INTRODUCERE................................................................................. 111.1. Limbaj sau mediu de dezvoltare?........................................................ 111.2. Programare Windows............................................................................ 111.3. Cum simplifică mediul Delphi programarea sub W indows?......... 121.4. Obiectele V C L ....................................................................................... 131.5. Componentele........................................................................................ 131.6. Cum se programează sub Delphi......................................................... 131.7. Prima aplicaţie....................................................................................... 141.8. Aplicaţii CLX......................................................................................... 17

1.8.1. Crearea unei aplicaţii CLX.......................................................... 171.8.2. Diferenţele dintre un proiect Delphi 7 şi un proiect K ylix..... 191.8.3. Folosirea funcţiilor API................................................................ 19

2. MEDIUL DE DEZVOLTARE DELPHI............................................ 202.1. Meniul principal..................................................................................... 202.2. Editorul de cod....................................................................................... 222.3. Editorul de form e................................................................................... 232.4. Toolbar............................ ........................................................................ 232.5. Paleta de componente............................................................................ 242.6. Object Inspector..................................................................................... 242.7. Managerul de proiecte........................................................................... 26

3. FIŞIERELE PROIECTULUI.............................................................. 28

4. PROGRAMAREA EXCEPŢIILOR ÎN DELPHI.............................. 31»4.1 .Construcţia try - finally.......................................................................... 324.2. Construcţia try-except........................................................................... 344.3. Generarea unei excepţii......................................................................... 354.4. Clase de excepţii.................................................................................... 35

5. OBIECTE GENERALE......................... ............................................ 395.1. T O bject................................................................................................... 395.2. TPersistent.............................................................................................. 415.3. TCom ponent.......................................................................................... 435.4. TControl.................................................................................................. 445.5. TW inControl.......................................................................................... 60

3

6. FERESTRELE APLICAŢIEI - COMPONtiV TA TFp xn U ^--,;..6.1. T Form .....................................................................................................

7. BUTOANE..........................................................................................7.1. TButton...................................................................................................7.2. TB itB tn...................................................................................................

''7.3. TSpeedButton........................................................................................7.4. TU pD ow n...............................................................................................

8. ETICHETE..........................................................................................8.1. TLabel......................................................................................................8.2. TStaticText..............................................................................................

9. CUTII DE EDITARE...........................................................................9.1. TStrings...................................................................................................9.2. TStringList..............................................................................................9.3. T E dit........................................................................................................9.4. TLabeledEdit.........................................................................................9.5. TM askEdit..............................................................................................9.6. TMemo.....................................................................................................9.7. TRichEdit................................................................................................9.8. TTextAttributes......................................................................................9.9. TParaAttributes......................................................................................

10. BUTOANE RADIO...........................................................................10.1. TRadioButton.......................................................................................10.2. TRadioGroup.......................................................................................

11. COMPONENTE PENTRU OPŢIUNI.............................................11.1. TCheckBox...........................................................................................11.2. TCheckListBox....................................................................................

12. PROGRESUL EXECUŢIEI - COMPONENTA TProgressBar.12.1. TProgressBar.......................................................................................

13. BARĂ DE STATUT.........................................................................13.1. TStatusBar............................................................................................13.2. TStatusPanels.......................................................................................13.3. TStatusPanel........................................................................................

^M A N IP U L A T O R DE PANOURI.....................................................v 14.1. TPageControl.......................................................................................

4

14.2. TTabSheet....................................................................................... 15766

15. RIGLE................................................................................................ 16078 15.1. TTrackBar............................................................................ 1607880 16. MENIURI........................................................................................... 16685 ; r 16.1. TMenu................................................................................................... 16687 16.2. TM ainM enu......................................................................................... 168

16.3. TPopUpMenu....................................................................................... 17516. 4. TM enuItem ......................................................................................... 17816.5. Funcţii care prelucrează meniuri....................................................... 18891

9417. SCURTĂTURI................................................................................... 193

97 17.1. TShortCut.............................................................................................. 19317.2. THotKey............................................................................................... 19317.3. Funcţii şi Proceduri............................................................................. 195

97 101 102HO 18. LISTE, COZI Şl ST IV E ........................................................................... 197112 18.1. TList....................................................................................................... 197

18.2. TOrderedList...................................................................................... . 201H 8 18.3.TQueue.................................................................................................. 20212° 18.4. TStack................................................................................................... 203125

19. FIŞIERE, DIRECTOARE Şl DISCURI............................................... 205129 19.1. TFileListBox........................................................................................ 205129 19.2. TDirectoryListBox.............................................................................. 210130 19.3. TDriveComboBox............................................................................... 212

19.4. TFilterComboBox............................................................................... 214134 19.5. TFileStream.......................................................................................... 217134 19.6. Structuri şi funcţii utile pentru lucrul cu136 fişiere, directoare şi discuri................................................................ 220

19.6.1. Structuri........................................................................................ 220139 19.6.2. Atributele fişierelor.................................................................... 221139 19.6.3. Căutare de fişiere........................................................................ 221

19.6.4. Manipulări de fişiere.................................................................. 223146 19.6.5. Manipulări de extensii................................................................ 223146 19.6.6. Manipulări de căi........................................................................ 224148 19.6.7. Operaţii asupra directoarelor.................................................... 225149 19.6.8. Manipulări de d iscuri................................................................. 226

153 20. ITEM URI...................................................................................................... 227153 20.1. TListBox............................................................................................... 227

20.2. TComboBox......................................................................................... 234

5

20.3. TColorBox........................................................................................... 23920.4. TListView............................................................................................. 24220.5. TListltems............................................................................................. 24920.6. TListltem .............................................................................................. 25120. 7. TTreeView.......................................................................................... 25420. 8. TTreeN odes........................................................................................ 26520.9. TTreeNode............................................................................................ 268

2 l\ GRAFICĂ.......................................................................................... 275'21.1. TColor).................................................................................................. 27521.2. Funcţii pentru prelucrarea culorilor.................................................. 27521.3. TG raphic............................................................................................... 27621.4. TBitmap ...................................................... '........... ............................. 27921.5. TIcon...................................................................................................... 28121.6. TMetaFile.............................................................................................. 28121.7. TJpeglmage.......................................................................................... 28221.8. TGraphicsObject................................................................................. 28521.9. T B rush.................................................................................................. 28521.10. TPen.................................................................................................... 28621.11. TFont............................................................ ....................................... 28821.12. TCanvas............................................................ ................................. 29021.13. TGraphicControl............................................................................... 31121.14. TPaintBox.......................................................................................... 31121.15. TImage................................................................................................ 31321.16. TShape................................................................................................ 31621.17. TBevel................................................................................................. 31721.18. TSplitter.............................................................................................. 31821.19. TImageList......................................................................................... 320

22. TIMERE - COMPONENTA TTim er.............................................. 32522.1. TTim er.................................................................................................. 325

23. FERESTRE DE DIALOG................................................................ 33023.1. TCommonDialog................................................................................ 33023.2. TOpenDialog................................................................................. ...... 33223.3. TSaveDialog........................................................................................ 33623.4. TFontDialog......................................................................................... 33723.5. TColorDialog....................................................................................... 33923.6. TFindDialog......................................................................................... 34123.7. TReplaceDialog.................................................................................. 34523.8. TPrinterSetupDialog........................................................................... 34723.9. TPrintDialog........................................................................................ 34823.10. Funcţii care afişează cutii de dialog............................................... 352

6

24. DATE Şl TIMPURI.......................................................................... 35624.1. T D ate..................................................................................................... 35624.2. TTime.................................................................................................... 35624.3. TDateTime........................................................................................... 35624.4. Operatori aritmetici şi relaţionali...................................................... 35724.5. Funcţii şi proceduri............................................................................. 35924.6. TDateTimePicker................................................................................ 362

25. GRIDURI........................................................................................... 36825.1. TCustomGrid....................................................................................... 36825.2. TDrawGrid........................................................................................... 37225.3. TStringGrid........................................................................................... 375

26. TScreen............................................................................................. 380

27. CLIPBOARDUL.......................................................... .................... 386

28. TApplication.................................................................................... 392

29. TIPĂRIREA LA IMPRIMANTĂ...................................................... 40329.1. Modul T e x t.......................................................................................... 40329.2. Mod standard W indow s..................................................................... 40429.3. Cutiile de dialog................................................................................... 409

30. MULTIMEDIA.................................................................................... 41330.1. TMediaPlayer....................................................................................... 41330.2. TA nim ate.............................................................................................. 417

31. DEZVOLTAREA DE COMPONENTE................................. ........ 42231.1. înţelegerea componentelor................................................................. 42231.2. Scrierea de proprietăţi......................................................................... 425

31.2.1. Tipuri de proprietăţi................................................................... 42531.2.2. Declararea proprietăţilor........................................................... 42631.2.3. Memorarea internă a datelor...................................................... 42631.2.4. Metode de acces.......................................................................... 42731.2.5. Valori implicite ale proprietăţilor............................................. 42831.2.6. Proprietăţi de tip array................................................................ 42831.2.7. Editoare de proprietăţi................................................................ 429

TIntegerProperty............................................................................... 430TCharProperty.................................................................................. 430TColorProperty................................................................................. 430TFontNameProperty........................................................................ 430TFontProperty.................................................................................... 430

7

TCursorProperty................................................. .............................. 430TShortCutProperty............................................................................ 431TMPFilenameProperty..................................................................... 431TDateProperty, TTimeProperty..................................................... 431TDateT imeProperty.......................................................................... 431

31.3. Scrierea de metode.............................................................................. 43731.4. Scrierea de evenimente...................................................................... 43831.5. Grafica în componente....................................................................... 43931.6. Editoarele de componente.................................................................. 44031.7. Help pentru componente.................................................................... 44231.8. înregistrarea componentelor............................................................. 44331.9. Adăugarea unei imagini la o componentă....................................... 44431.10. Exem ple.............................................................................................. 444

31 .10 .1 .0 componentă grafică............................................................. 44431.10.2. O componentă grafică cu un eveniment............................... 4463 1 .10 .3 .0 cutie de dialog specială........................................................ 44831.10.4. A doua cutie de dialog specială.............................................. 44931.10.5. O componentă cu editor de proprietăţi................................. 45131.10.6. Un editor de componente........................................................ 456

BIBLIOGRAFIE...................................................... ............................. . 458

8

PREFAŢĂ*

Delphi este un mediu de programare vizual oferit de către firma Borland International. Versiunea curentă (21 Iulie 2003) este 7.0.

în această lucrare am încercat să oferim o imagine de ansamblu a ceea ce poate oferi mediul Delphi programatorilor.

în capitolul de introducere am prezentat pe scurt elementele necesare programării în mediul Delphi.

Un aspect esenţial al programării în Delphi îl constituie tratarea excepţiilor. O prezentare detaliată a excepţiilor este realizată în capitolul 4. Folosirea mecanismului de tratare a excepţiilor simplifică interceptarea şi tratarea erorilor ce pot apărea pe parcursul execuţiei unei aplicaţii. De aceea recomandăm programatorilor să folosească din plin acest mecanism flexibil şi elegant.

în capitolele următoare (5-30) am realizat o prezentare detaliată a componentelor furnizate de către acest mediu. Pentru fiecare componentă am prezentat câteva exemple practice de funcţionare. Am încercat să atingem majoritatea aspectelor legate de programarea în Delphi începând cu elementele simple, precum butoane, cutii de editare, etichete etc. până la elemente mai complexe precum componentele multimedia.

în ultimul capitol am prezentat modul de creare a componentelor Delphi. Această facilitate oferă atât posibilitatea unei structurări mai puternice a programelor cât şi o modalitate de extindere a mediului Delphi.

10 oct. 03 Autorii

1. INTRODUCERE

Delphi este un mediu de programare sub Windows oferit de către firma Borland. La momentul curent (Iulie 2003) este disponibilă versiunea 7.0 a acestui mediu. Delphi foloseşte limbajul de programare Object Pascal.

Există o versiune a mediului Delphi şi pentru sistemul de operare Linux. Aceasta se numeşte Kylix şi, la data curentă, se află la versiunea 3.0. De remarcat este faptul că se pot crea aplicaţii folosind Delphi pentru Windows care apoi pot fi portate în Kylix şi compilate sub Linux fară nici o modificare. De asemenea, folosind Kylix, se pot crea aplicaţii Linux care pot fi compilate fară modificări şi în mediul Delphi sub Windows.

în acest capitol vom încerca să realizăm o prezentare generală a me­diului de programare Delphi. Vom încerca să răspundem în general la întrebări legate de programare sub Windows şi la felul în care mediul Delphi simplifică programarea sub Windows.

1.1. Limbaj sau mediu de dezvoltare?

Mediul Delphi este un mediu de programare şi nu un limbaj de programare. Aceasta înseamnă că mediul Delphi este un editor (în realitate este cu mult mai mult decât atât) în care programatorul scrie instrucţiuni într-un limbaj de programare.

Mediul de dezvoltare Delphi este un mediu general, aproape indepen­dent de limbajul folosit pentru dezvoltarea de aplicaţii. Spre exemplu, interfaţa mediului Delphi este folosită şi de către mediul C++Builder.

Limbajul de programare folosit de către mediul Delphi este Object Pascal. Acesta diferă faţă de limbajul folosit în mediul Turbo Pascal în prin­cipal prin îmbunătăţirile aduse lucrului cu clase şi obiecte.

1.2. Programare Windows

Programarea sub Windows este o muncă extrem de complicată. Trebuie scris mult cod pentru a crea o fereastră, un buton, sau o cutie de editare. Manipularea acestor obiecte este, de asemenea destul de dificilă pentru un programator obişnuit.

Funcţiile cu ajutorul cărora se construieşte o aplicaţie Windows se numesc funcţii API. Ele sunt scrise în limbajul C, dar pot fi uşor adaptate

11

pentru a ti folosite în Object Pascal. Spre exemplu, funcţia API care creează o fereastră are prototipul:

HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR IpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hlnstance, LPVOID lpparam ) ;

/ / po in ter la num ele clasei de fereastra / / poin ter la şirul care conţine num ele ferestrei // stilul ferestrei/ / coordonatele coltu lu i din stanga sus al ferestrei /// / d im ensiunile ferestreiIIII identi ficatorul p ărin te lu i ferestrei / / identificatoru l m eniului / / identificatoru l aplicaţiei care a creat fereastra / / po in ter la o structura cu datele ataşate ferestrei.

Funcţia întoarce un identificator (de tip HWND) la fereastra nou creată.

în unitul windows.pas, care conţine header-ele Object Pascal pentru majoritatea funcţiilor API, funcţia CreateWindow este translatată astfel:

function CreateWindow(lpClassName: PChar;IpWindowName: PChar; dwStyle: DWORD;X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hlnstance: HINST; lpParam: Pointer): HWND;

Dezvoltarea unei aplicaţii folosind doar funcţii API este dificilă. O simplă aplicaţie care constă dintr-o fereastră pe care sunt amplasate câteva cutii de editare şi butoane poate ajunge uşor la câteva sute de linii. In cele ce urmează vom vedea felul în care Delphi simplifică conceptul de programare sub Windows.

1.3. Cum simplifică mediul Delphi programarea sub Windows?

Firma Borland a creat o bibliotecă de clase şi funcţii care încapsulează funcţionalitatea funcţiilor API. Ea se numeşte VCL (Visual Component Library). Această bibliotecă este implementată în limbajul Object Pascal, însă la ora actuală, există extensii şi pentru limbajul C++.

12

Firma Borland mai dezvoltase o ierarhie de obiecte numită OW L ('Object Windows Library). Această ierarhie a precedat VCL-ul şi a fost destinată pentru aplicaţiile Windows dezvoltate sub Borland C++. Diferenţa esenţială între VCL şi O W L este faptul că obiectele OW L nu au reprezentare vizuală la momentul proiectării aplicaţiei. Folosind OW L -ul trebuie scris doar cod: obiectele trebuie instanţiate manual (apelând constructorul Create), valorile datelor membre trebuie setate prin cod, etc.

Folosind obiectele VCL programarea aplicaţiilor Windows se simplifică în mod semnificativ. Majoritatea obiectelor VCL pot fi manipulate şi la momentul proiectării aplicaţiei cu ajutorul unei unelte soft foarte puternice: Object Inspector (Inspectorul de Obiecte). La pornirea mediul Delphi, Object Inspector apare în partea din stânga a ecranului. Cu ajutorul lui se pot seta valorile datelor membre ale obiectelor VCL şi, de asemenea, se poate naviga prin sistemul de evenimente al unei aplicaţii.

1.4. Obiectele VCL

Pentru ca obiectele VCL să poată fi manipulate în interiorul mediului Delphi, s-au introdus câteva îmbunătăţiri modelului obiectual standard. Cea mai importantă este introducerea proprietăţilor. O proprietate se comportă ca o dată membră: valoarea ataşată ei poate fi citită sau scrisă într-un mod asemănător cu cel al datelor membre. în schimb o proprietatea nu poate fi transmisă unei proceduri ca şi parametru prin referinţă.

1.5. Componentele

Din prunctul de vedere al programatorului, componentele sunt clase care definesc funcţionalitatea unei aplicaţii. Un element definitoriu pentru compo­nente este acela că toate au un strămoş comun, şi anume clasa TComponent. Această clasă implementează un minim de specificaţii necesare unui obiect pentru a putea fi manipulat vizual în interiorul mediului de programare.

1.6. Cum se programează sub Delphi

Am spus mai înainte că mediul Delphi este un mediu de programare vizual. în limbajul folosit de programatori aceste medii de programare se mai numesc şi RAD (Rapid Application Development), adică Dezvoltare Rapidă a Aplicaţiei.

Ce însemnă mediu de programare vizual? în primul rând înseamnă un mediu în care o parte din aplicaţie se realizează fără a scrie cod sursă ci, spre

13

exemplu, cu ajutorul mouse-ului. în plus, partea construită vizual este disponibilă programatorului în aceeaşi formă în care aceasta va fi afişată la momentul execuţiei. Partea cea mai importantă din aplicaţie care se poate construi cu ajutorul mouse-ului este interfaţa. Sistemul de operare Windows a stabilit un set de reguli pe care trebuie să le respecte fiecare aplicaţie pentru a putea fi executată în acest sistem de operare. Fiecare aplicaţie Windows conţine o fereastră, eventual un meniu, butoane, cutii de editare, ş.a.m.d. Există un set finit de obiecte furnizate de către Windows şi care pot alcătui interfaţa aplicaţiei. Iniţial aceste obiecte puteau fi create folosind funcţii API pe care le- am definit în secţiunile precedente. Mediul Delphi a încapsulat fiecare dintre aceste părţi ale unei aplicaţii în câte o clasă (componentă). Aceste componente se găsesc în Paleta de Componente (Component Palette) şi pot fi manipulate cu ajutorul mouse-ului.

Folosind mediul Delphi interfaţa aplicaţiei se construieşte foarte simplu prin plasarea componentelor din Component Palette pe fereastra (forma) aplicaţiei. Plasarea unei componente se face executând click pe reprezentarea acesteia în Paleta de Componente şi apoi încă un click în poziţia în care se doreşte a fi amplasată pe fereastra aplicaţiei. Odată amplasată pe formă o componentă poate fi manipulată (redimensionată, etc.) cu ajutorul mouse-ului sau cu ajutorul Inspectorului de Obiecte (Object Inspector). în cele ce urmează vom încerca să construim câteva aplicaţii simple în care vom pune în lumină conceptele de bază ale programării sub mediul Delphi.

1.7. Prima aplicaţie

Vom construi o aplicaţie care afişează un text către utilizator. Acest lucru se poate realiza în mai multe moduri, şi anume:

1. Folosind o componentă de tip TLabel,2. Folosind o componentă de tip TEdit3. Folosind o cutie de dialog,4. Desenând textul pe fereastră.

1. Folosind o componentă de tip TLabel

Aceasta este cea mai simplă modalitate de a afişa un text pe o fereastră (formă). Principalul avantaj este acela că programatorul nu trebuie să scrie cod sursă la momentul execuţiei programului, ci trebuie doar să seteze valorile câtorva proprietăţi.Pentru aceasta vom crea o nouă aplicaţie (File\New\Application). Apoi vom amplasa pe formă o etichetă în care vom scrie textul dorit. Compo-

14

nentele se găsesc în Paleta de Componente, aflată în partea dreaptă, sub meniul principal. Din pagina Standard a Paletei de Componente selectăm componenta TLabel. Dacă executăm dublu-click pe această componentă ea va fi amplasată în centrul formei. De acolo ea poate fi mutată de către utilizator, cu ajutorul mouse-ului, în orice altă poziţie de pe formă.în momentul amplasării pe formă, orice componentă de tip TLabel are ataşat un text care i-a fost atribuit implicit de către mediul Delphi. Dacă este prima componentă de tip Tlabel, atunci ea are ataşat textul Label!. Dacă este a doua componentă de tip TLabel de pe formă, atunci are ataşat textul Label2. Textul ataşat unei componente de tip TLabel se găseşte stocat în proprietatea Caption. Putem schimba acest text modificând valoarea acestei proprietăţi cu ajutorul Inspectorului de Obiecte. Să presupunem că am schimbat acest text la valoarea „Hello World!” . Atunci valorile unora dintre proprietăţile obiectelor care constituie aplicaţia sunt:

object Forml: TFormlCaption = 'Afiseaza text' object Labell: TLabel

Left = 224 Top = 152 Width = 58 Height = 13Caption = 'Hello World!'

end endNu ne mai rămâne decât să lansăm aplicaţia în execuţie fie apăsând tasta F9, fie executând click pe itemul Run\Run din meniul principal.

Folosind o componentă TEdit

Principalul dezavantaj al folosirii componentei de tip TLabel este acela că textul afişat nu poate fi schimbat de către utilizator la momentul execuţiei aplicaţiei. în unele situaţii acest lucru nu este necesar, dar dacă dorim ca această modificare să fie posibilă vom folosi o componentă de tip TEdit.Componenta de tip TEdit se găseşte tot în pagina Standard a Paletei de Componente. Selectăm această componentă şi o amplasăm pe formă. Numele implicit pe care îl -va primi această componentă este Editl. Textul ataşat acestei componente este stocat de către proprietatea Text. Modificăm cu ajutorul Inspectorului de Obiecte textul ataşat acestei componente. După modificare, valorile proprietăţilor obiectului Editl sunt:

15

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

endLansăm aplicaţia în execuţie. De data aceasta textul afişat poate fi modi­ficat de către utilizator.

Dacă dorim ca textul să apară la apăsarea unui buton atunci mai amplasăm pe formă încă o componentă. Aceasta este de tipul TButton şi se găseşte tot în pagina Standard a Paletei de Componente.

procedure TForml.ButtonlClick(Sender: TObject); begin

Editl.Text = 'Hello World'; end;

3. Folosind o cutie de dialog

Dacă dorim să afişăm un mesaj pentru utilizator atunci putem folosi procedura ShowMessage care afişează o fereastră în care se află textul trimis ca şi parametru. Fereastra afişată mai conţine şi un buton la a cărui apăsare fereastra este distrusă.Pentru realizarea acestei aplicaţii vom amplasa pe formă un buton la a cărui apăsare dorim să se afişeze textul către utilizator sub forma unei cutii de mesaj.Procedura care se apelează la apăsarea butonului este:

procedure TForml.ButtonlClick(Sender: TObject); begin

ShowMessage('Hello World'); end;

4. Desenând textul pe formă

Această aplicaţie desenează textul dorit pe formă, la o poziţie 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 suprafaţa de desenare a unei forme. Una dintre metodele lui TCanvas este TextOut care are ca parametri poziţia şi textul care urmează a fi afişat.

16

Amplasăm pe formă un buton la a cărui apăsare dorim să desenăm un text. Procedura care se apelează în momentul în care se apasă butonul este:

procedure TForml.ButtonlClick(Sender: TObject); begin

Canvas.TextOut(100, 100, 'Hello World!'); end;

1.8. Aplicaţii CLX

Una dintre cele mai importante facilităţi oferite de mediul Delphi 7 este posibilitatea de a crea aplicaţii atât pentru sistemul de operare Windows cât şi pentru Linux.

Aceste aplicaţii pot fi create atât în versiunea pentru Windows a mediului Delphi, cât şi în versiunea pentru Linux.

Mediul de programare oferit de către Borland pentru sistemul de operare Linux se numeşte Kylix. Odată create aplicaţiile pot fi deschise şi compilate fie sub Windows, fie sub Linux.

Aceste aplicaţii (care au posibilitatea de a fi importate dintr-un sistem de operare în altul) au fost denumite aplicaţii CLX (Cross-Platform). Trebuie reţinut că această portabilitate nu este a codului executabil (compilat cu mediul Delphi 7 sau Kylix) ci a codului sursă (generat de către Delphi6 sau Kylix). De asemenea, pentru ca o aplicaţie să poată fi portată de pe o platformă pe alta trebuie să nu conţină apeluri de funcţii API specifice celor două sisteme de operare.

1.8.1. Crearea unei aplicaţii CLX

Din meniul File alegem comanda New | CLX Application.Paleta de Componente va afişa doar acele componente care pot fi

folosite într-o aplicaţie CLX. Alte componente nu au voie să fie folosite.

Exemplu:

Codul sursă al unui unit Delphi 7 (destinat doar pentru platforma Windows) este următorul:

unit Unitl;interfaceuses

Windows, Messages, SysUtils, Variants, Classes,

17

Graphics, Controls, Forms,Dialogs, StdCtrls;

typeTForml = class(TForm)Buttonl: TButton;Editl: TEdit;procedure ButtonlClick(Sender: TObject);

private{ Private declarations }

public{ Public declarations }

end;var

Forml: TForml;

implementation{$R *.dfm)

procedure TForml.ButtonlClick(Sender: TObject); begin

Editl.Text ;= 'Aceasta este o aplicaţie Windows.'; end;end.

Codul sursă al unui unit Delphi 7 (destinat pentru platformele Windows şi Linux) este următorul:

unit Unitl;interfaceuses

SysUtils, Types, Classes, QGraphics, QControls,QForms, QDialogs,QStdCtrls, QMenus, QTypes;

typeTForml = class(TForm)

Editl: TEdit;Buttonl: TButton;procedure ButtonlClick(Sender: TObject);

private{ Private declarations }

public{ Public declarations }

end;var

Forml: TForml;

18

implementation{$R *.xfm}

procedure TForml. ButtonlClick (SenderTObject); begin

Editl.Text := 'Aceasta este o aplicaţie CLX'; end;end.

1.8.2. Diferenţele dintre un proiect Delphi 7 şi un proiect Kylix

Fişierele cu extensia .dfm din Delphi 7 au extensia .xfm în Kylix. Fişierele cu extensia .dof din Delphi 7 au extensia .kof în Kylix. Oricum

aceste fişiere trebuie resetate deoarece mediile de sub cele două sisteme de operare îşi construiesc fişiere cu opţiuni specifice.

1.8.3. Folosirea funcţiilor APIt

Folosirea funcţiilor API specifice unei platforme se poate face doar utilizând directiva $IFDEF care va indica secţiunile de cod ce se vor apela sub sistemul de operare Windows şi cele care se vor apela sub sistemul de operare Linux.

Exemplu:

{ S IF D E F M SW IN D O W S }// aici se va scrie cod ce se va executa doar sub W indow s.

- { $ E N D IF }{ S IF D E F LIN U X }// a ic i se scrie cod care se va execu ta doar sub Linux.{SE N D IF}

19

2. MEDIUL DE DEZVOLTARE DELPHI

Elementele mediului de dezvoltare (IDE) Delphi sunt:

- Meniul principal;- Editorul de cod;- Editorul de forme;- Paleta cu unelte;- Paleta de componente;- Inspectorul de obiecte.

2.1. Meniul principal

| File £dit Search View Project Run Component Database Tools Help ; ':j<None> ; iŞj*

File

Conţine comenzi pentru a deschide (Open, Open Project, Reopen), crea (New), salva (Save, Save All, Save Project As, Save As), închide (Close, Close AH), tipări (Print) proiecte şi fişiere.

Edit

Conţine comenzi pentru operaţiile cu Clipboard-ul (Cut, Paste, Copy), pentru selectarea tuturor componentelor de pe o formă sau a întregului text din Code Editor (Sellect AII), prelucrare componente (Size, Scale, Creation Order, Tab O rder,...).

Search

Conţine comenzi pentru localizare de text în pagina activă a editorului de cod.

View

Conţine comenzi pentru a afişa sau ascunde elemente ale mediului şi proiectului curent.

20

Project

Conţine comenzi pentru a manipula (Add to Project, Remove from Project), a compila (Compile Unit, Make project, Build project) şi a configura (Options) fişierele ataşate unui proiect.

Run

Conţine comenzi pentru executarea (Run, Parameters), depanarea (Step Over, Tracc Into, Trace To Next Source Line, Run To Cursor, Show Execution Point) şi oprirea unei aplicaţii (Program Pause, Program Reset). De asemenea, cu ajutorul comenzilor: Inspect, Add Watch, Evaluate/Modify se pot inspecta valorile unor variabile.

Component

Conţine comenzi pentru crearea (New Component) şi instalarea (Install Component) de componente. Se pot instala şi componente ActiveX (Import ActiveX Control). De asemenea, comenzile Install Packages şi Configure Pallete permit adăugarea şi configurarea paletei cu com­ponente.

DataBase

Conţine comenzi pentru manipularea bazelor de date.

Workgroups

Este folosit pentru manipularea proiectelor mari şi diferitelor versiuni ale unui proiect.

Tool

Conţine comenzi pentru a rula programele utilitare disponibile, fară a părăsi mediul Delphi. De asemenea, se poate manipula şi seta compor­tamentul (Enviroment Options) mediului de dezvoltare.

Help

Conţine comenzi pentru afişarea aplicaţiilor de tip Help (Contents, Index), accesarea paginilor WEB în care se găsesc ultimele informaţii despre mediu (Borland Home Page - care accesează pagina: www.borland.com\index.html. şi Borland Products and Services - care accesează pagina vvww.borland.com\programs\index.html) şi afişarea dialogului About.

21

2.2. Editorul de cod

3 s EUniţi | „ . ,

unit Unit-1; -*>

interface

usesWindows, Messages, SysUtils, Classes, Graphics

typeTF^rml = class(TForm) private

i Private declaratiow f-

publicf Public dec2arat i o n s }■

end;

9: 5 Modified Insert

Si Unitl. pas

Ca orice mediu de programare, Delphi matorul poate scrie codul unei aplicaţii. Acesta care poate deschide mai multe fişiere simultan, ataşat, în partea de sus a ferestrei, un buton cu fişier la altul se face prin click pe butonul ataşat fişierului.

La intrarea în Delphi, sau la crearea unui nou project, editorul de cod conţine textul afişat în imaginea de mai sus. In momentul în care adăugăm la proiect, un unit sau o formă, în editorul de cod se creează o nouă fereastră. Numele de fişiere care sunt modificate în editorul de cod dar care nu au fost salvate sunt afişate cu ca­ractere îngroşate (bold).

Prin execuţia unui click dreapta în editorul de cod, Delphi ne pune la dispo­ziţie un meniu cu comenzile cele mai des folosite de editare, depanare, execuţie a unei aplicaţii.

Alegând Properties avem acces la setările de bază ale editorului, şi anume la culorile, fonturile, etc. folosite.

O componentă poate fi văzută ca şi

are o fereastră unde progra- este un editor ASCII complet Fiecărui fişier deschis îi este

numele lui. Trecerea de la un

Close Page Ctrl+F4

Open File al Cursor Ctrl+Enter

New Edit W indow

Eîrowse Symbol at Cursor

Topic Search F1

Complete class at cursor Shift+Ctrl+C

Add T o*D o I tgm... S hift+Ctrl+T

Toggle Bookmarks

(3oto Bookmarks

Debug

Read Only

Message View

View Explorer Shift+Ctrl+E

Properties

22

cod sursă prin executarea unui click dreapta pe ea şi apoi prin selectarea comenzii View As Text.

2.3. Editorul de forme

HTHTx'i

Este o fereastră în care programatorul aşază componente care vor forma interfaţa vizuală a aplicaţiei. Pentru un mai bun control al poziţiei unde sunt amplasate acestea, Editorul de forme are pe suprafaţa lui o reţea de puncte echidistante.

2.4. Toolbar

închide r <?auRa V izualizare .,- .. muriiue fişiere la VizualizareDeschide proiect proje c i . unit-uri RunProiect ^ j

l i - 0 ; Q*, £» • 11 1 j s

D e s c h id ş /^ , Nfisier / j \

Închide / / \fişier Şterge Trece de ta \ Step

fişiere din forma la unit K*m a |nt0 proiect 51 lnve,s noua

Pauza

StepOver

Toolbar este o scurtătură a comenzilor aflate în meniul principal. în varianta implicită, comenzile pe care le conţine sunt cele specificate în figura de mai sus. Programatorul poate adăuga sau poate şterge butoane din Toolbar prin executarea unui click dreapta pe acesta şi apoi prin bifarea/debifarea itemurilor dorite.

23

2.5. Paleta de componente

Standard | Additional] W in32] Svstemj Internet] Data Access] Data Controls ] Decision Cube ] QReport] D ialo_ii_L

Componentele sunt grupate în pagini. în forma implicită paginile sunt: Standard, Additional, Win32, System DataAccess, DataControl, ADO, InterBase, Midas, InternetExpress, Internet, FastNet, DecisionCube, QReport, Dialogs, Win3.1, Samples, ActiveX, Servers.

Cele mai folosite componente sunt cele din pagina Standard, care conţine cutii de dialog, meniuri, butoane, etc. Pentru a obţine "help" despre fiecare din ele, se execută click pe componenta dorită, iar apoi se apasă F I .

O componentă specială este şi forma. Adăugarea ei la o aplicaţie se face prin comanda File|NewForm.

Programatorul poate crea noi pagini (în Component Palette) şi le poate şterge pe cele existente. Pentru a realiza acest lucru se execută click dreapta pe Component Palette şi se alege Properties.

Aşezarea unei componente pe o formă se poate face în mai multe moduri. Dacă dorim ca amplasarea componentei să fie în mijlocul formei, atunci executăm dublu click pe componenta respectivă. Dacă dorim să plasăm componenta în alt loc decât centrul formei, atunci executăm click pe componentă, iar apoi încă un click în locul dorit pe formă. Colţul din stânga sus al componentei va coincide cu locul unde am executat cel de al doilea click. în aceste două cazuri, dimensiunile componentei vor fi cele implicite. Se pot modifica aceste dimensiuni, fie din Object Inspector (vezi mai jos), fie cu ajutorul mouse-ului.

în cazul în care ştergem o componentă de pe formă, prototipul handlerului de evenimente asociat componentei va rămâne în codul sursă al aplicaţiei deoarece acesta ar putea fi apelat de către alte metode. Ştergerea unui astfel de handler trebuie făcută atât în partea de definiţie a clasei cât şi în implementare. în caz contrar, compilatorul va semnala o eroare.

2.6. Object InspectorObject Inspector face legătura între interfaţa aplicaţiei şi codul scris de

programator. Are două funcţii:

a. setează proprietăţile componentelor aflate pe formă;b. creează şi ajută la navigatul prin handlerele de evenimente. Un

handler de evenimente se execută în momentul în care apare un eve­

24

niment (de exemplu, apăsarea unei taste, a unui buton de mouse, etc.).

în partea de sus a lui se află O bject Selector care conţine toate compo­nentele de pe formă împreună cu tipul lor.

Object Inspector are două pagini:

Object inspector H I

Forml J l ] |Form1 ” 3 |Properties ] Events | Properties Events I

Action ▲ Action Jk.

ActiveControl ActiveControlAlign aINone MenuAlphaBlend False ObjectMenulteiAlphaBlendV alt 255 OnActivate

E l Anchors : [akLeft,akT op] QnCanResizeAutoS croll T fu e ........................ _ ] | OnClick 3 3 E H I H 3 HAutoS fee False OnCloseBiDiMode : bdLeftT oRight OnCloseQuery

Q E orde rlco riî j[bi5ystemMenu, OnConstrainedlBorderS tyle i bsSizeable OnContextPopiBorderWidtti ■0 QnCreate

1 Caption mm OnDbiClickClientH eight :206 OnDeactivate

ClienfWidth j'309 OnDestroy• Coioi c iB tn F a c e O nDockD iop

E l Constraints IfTSizeConstraini OnDockOver

CU3D T rue OnDtagDtop

Cursor crDefault OnDtagOver

DefaultMonitor dmActiveFoim OnEndDock

All shown All shown

pagina proprietăţilor pagina evenimentelor

i. Pagina proprietăţilor

Această pagină setează valorile proprietăţilor unei componente, şi anu­me dimensiunile ei, poziţia în cadrul formei, fonturile folosite, numele ei, etc. Alte proprietăţi pot fi setate la momentul execuţiei programului prin scrierea de cod sursă în cadrul handlerelor de evenimente.

ii. Pagina evenimentelor

Această pagină permite legarea unei componente la evenimentele pro­gramului. Prin executarea unui dublu click pe un eveniment, de exemplu pe OnClick, Delphi creează un handler de evenimente, care este, de fapt, o metodă a unei clase şi care se va executa când apare un eveniment particular (în cazul nostru executarea unui click pe buton). în cazul

25

nostru acest handler de evenimente este (am ales componenta TButton din cadrul paginii Standard):

procedure TForml.ButtonlClick(Sender: TObject); begin

// A ici scriem codul sursa, carc se va executa / / î n m om enlul apasarii butonului Button 1

end;în cazul în care alegem evenimentul OnDblClick handlerul de eveni­mente va arăta în felul următor (am ales în cazul acesta componenta de tip TEdit):

procedure TForml.EditlDblCiick(Sender: TObject); beginend;

Precum se vede şi din cele două exemple, formele şi componentele sunt numerotate (F orm l, Button1, Editl). Dacă am mai fi adăugat pe formă încă o componentă de tip Tbutton, aceasta ar fi fost denumită RadioButton2, etc. Delphi denumeşte automat toate componentele şi handlerele de evenimente. Aceste denumiri pot fi schimbate cu ajutorul lui Object Inspector. Delphi va face schimbări, automat, peste tot unde este necesar (în codul inserat automat de către el, dar nu şi în codul scris de programator).

Atenţie! Object Inspector nu indică valorile proprietăţilor obiectelor în tim­pul execuţiei şi nici în timpul depanării aplicaţiei. El este folosit doar pentru setarea acestor valori la momentul proiectării programelor.

2.7. Managerul de proiecteIPioject Manager

jimagview.eKe ---------- 71 g X— 1 New Remov

Files Path

J l ProiectGfoupI CAPrograme- imagview.exe CAPrograme

- £ j ] IMAGEWIN CAPrograme; IMAGEWIN.PAS CAPrograme

JHl ImageForm CAPrograme

” ifD CAProgramej g VIEWWIN.PAS CAPrograme"~1 ViewForm CAPrograme

26

Pe măsură ce aplicaţia creşte, numărul de fişiere necesare va fi tot mai mare (de exemplu, pot fi adăugate fişiere multimedia, baze de date, unituri Pascal, etc.) şi deci se va face tot mai simţită nevoia unei manipulări cât mai uşoare a acestor fişiere. Delphi se ocupă de manipularea tuturor acestor fişiere şi totodată pune la dispoziţia programatorului un instrument care îi permite acestuia să navigheze uşor printre fişierele ce alcătuiesc un proiect. Acest instrument este denumit sugestiv Project Manager. Butoanele New şi Remove sunt folosite pentru a adăuga un nou proiect, respectiv pentru a şterge un proiect la/din grupul de proiecte curent. Prin click dreapta pe itemul cu numele proiectului se afişează un m eniu ' ce conţine comenzi pentru manipularea fişierelor componente ale proiectului respectiv.

3. FIŞIERELE PROIECTULUI

în acest capitol sunt prezentate fişierele care alcătuiesc o aplicaţieDelphi.

1. Grupul de proiecte

La un moment dat pot fi deschise mai multe proiecte. Doar unul dintre ele va fi activ. Asupra acestuia se pot face prelucrări (editare, execuţie). Manipularea proiectelor dintr-un grup se face folosind Project Manager descris în capitolul anterior.Un grup de proiecte se salvează cu extensia .bpg.Utilitatea unui grup de proiecte nu este mare, el doar scuteşte progra­matorul de a deschide şi închide proiecte separate.

2. Proiectul

Un proiect este un grup de mai multe fişiere care împreună alcătuiesc aplicaţia Delphi. Fiecare fişier reprezintă, pentru aplicaţia din care face parte, o “resursă" care necesită setări speciale pentru a putea fi legată la aplicaţia finală (DLL sau EXE). Pentru a vedea ce fişiere intră în alcă­tuirea unui proiect accesaţi comanda View|Project Manager.

Fişierele care intră în alcătuirea unui proiect sunt următoarele:

3. Fişierul principal al proiectului

Fişierul principal al proiectului are extensia .dpr (şi numele implicit Projectl.dpr) El este punctul central al unei aplicaţii Delphi. El conţine codul principal al unei aplicaţii. Din acest punct îşi începe aplicaţia execuţia. O aplicaţie simplă poate conţine doar acest fişier.

Exemplu:

Codul sursă conţinut în fişierul principal al unei aplicaţii Delphi simple:

program Projectl; uses

Forms,Unitl in 'Unitl.pas' {Forml}; ,

28

{ $R * . RES}

beginApplication.Initialize;Application.CreateForm(TForml, Forml);Application.Run;

end.

4. Fişierul de resurse

Este un fişier care foloseşte formatul standard Windows pentru fişierele de resurse. Are extensia .res. Resursele pot fi icon-uri, bitmap-uri, cursoare, etc. Numele acestui fişier este identic cu cel al proiectului, având însă extensia res. Mediul Delphi manipulează singur acest fişier. Este rareori nevoie ca programatorul să editeze acest fişier.

5. Fişierele ataşate formei

Unei forme îi sunt ataşate două fişiere cu extensiile .pas şi .dfm. Fişierul dfm (Definition Module) conţine imaginea unei forme, adică conţine valorile proprietăţilor ei şi ale componentelor de pe ea. Pentru o formă care conţine o componentă de tip TButton, fişierul dfm este următorul:

object Forml: TForml Left = 315 Top = 242 Width = 275 Height = 226 Caption = 'Forml'Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -3 Font.Name = 'MS Sans Serif'Font.Style = []PixelsPerlnch = 96 TextHeight = 13 object Buttonl: TButton

Left = 128Top = 112 ,Width = 75 Height = 25 Caption = 'Buttonl'TabOrder = 0

end endAceasta poate fi vizualizat cu ajutorul opţiunii View As Text (respectiv View As Form) din meniul de context ataşat unei componente (care apare la click dreapta pe ea).

29

Fişierul .pas conţine declaraţia şi implementarea clasei formei. Pentru o formă vidă (care nu conţine nici o componentă) fişierul .pas este:

unit Unitl;interfaceuses

Windows, Messages, SysUtils, Classes, Graphics,Controls, Forms, Dialogs;

typeTForml = class(TForm) private

{ P rivate declarations ) public

{ Public declarations ) end;

varForml: TForml;

implementation {$R *.DFM}

end.

6. Fişierele unit

Este vorba despre fişiere care nu au ataşate o formă. Ele au extensia .pas şi pot conţine clase, funcţii şi proceduri care pot fi folosite de un pro­gram Delphi.

Observaţii:

1. Majoritatea acestor fişiere sunt create şi manipulate automat de către mediul Delphi.

2. Dacă un fişier ce intră în alcătuirea unui proiect nu se află în acelaşi director cu acesta, atunci Delphi va păstra calea spre el.

3. Programatorul poate folosi P roject M anager pentru a manipula fişierele care alcătuiesc un proiect Delphi. Acesta se poate activa din meniul View, comanda Project M anager, sau apăsând combi­naţia de taste <Ctrl> + <Alt> + <F 11 >.

30

4. PROGRAMAREA EXCEPŢIILOR ÎN DELPHI

Printre condiţiile pe care trebuie să le îndeplinească o aplicaţie pentru a putea fi folosită fără probleme se numără şi robusteţea. Mai precis, o aplicaţie este robustă dacă nu generează mesaje de eroare din a căror cauză să se blocheze şi să se întrerupă. Aceste blocaje pot duce deseori la pierderi de date.

Delphi pune la dispoziţie un mecanism prin care i se permite unei apli­caţii să-şi revină după apariţia unei erori şi să se comporte ca atare, în funcţie de situaţia ivită.

în acest scop s-a introdus noţiunea de excepţie, definită ca fiind o mul­ţime de condiţii care pot genera o eroare care va întrerupe cursul normal al execuţiei unei aplicaţii.

Exemplu:

O situaţie clasică care poate genera o eroare (adică apariţia unei excep­ţii) este împărţirea la 0:

var a, b, c : integer;

a : = 0 ;b := 2;c : = b div a; { în această linie execuţia aplicaţiei se va o p ri |

{ şi va fi afişat un m esaj de eroare)

Interceptarea excepţiilor are ca scop tocmai evitarea opririi aplicaţiilor şi rezolvarea erorilor apărute prin intermediul blocurilor de protecţie. Un astfel de bloc de protecţie este alcătuit din instrucţiuni care se execută în cazul în care a apărut o excepţie. Pentru o bună rezolvare a excepţiilor trebuie cunoscută na­tura acesteia. Totuşi acest lucru nu este necesar, excepţiile putându-se prelucra şi la modul general (în acest caz spunem că avem de-a face cu un cod de curăţire).

Când o eroare apare, aplicaţia generează o excepţie, adică, mai precis, este creat un obiect al excepţiei.

Observaţii:

1. Executând aplicaţia din interiorul mediului Delphi, aceasta se va întrerupe în blocul în care apare excepţia, semnalând-o. Dacă există blocul pentru tratarea excepţiei respective atunci aplicaţia va fi doar

31

întreruptă nu şi terminată. Programatorul poate continua execuţia (cu tasta <F9> sau folosind comanda Run\Run).

2. Executând aplicaţia în afara mediului (deci sub formă de execu­tabil), interceptarea şi rezolvarea excepţiei se va face invizibil pen­tru utilizator. în acest caz, execuţia se va desfăşura ca şi cum nu ar fi existat nici o eroare.

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

4.1. Construcţia try - finally

Este folosită de obicei în cazul alocării unor resurse: alocarea unei zone de memorie care, apoi, datorită apariţiei unei excepţii, nu mai este eliberată, deschiderea unui fişier care, apoi tot din cauza apariţiei unei erori, nu mai este închis, etc.

Sintaxa unei construcţii try - finally este următoarea:

try{instrucţiuni în care e posibil să apară o eroare}

finally{lista cu instrucţiuni care se execu ta indiferent daca a apăru t sau nu o excepţie}

end

Felul în care funcţionează o astfel de construcţie este următorul: se execută instrucţiunile din secţiunea try. Dacă nu a apărut nici o excepţie, atunci se continuă cu execuţia instrucţiunilor din partea finally. Dacă a apărut o excepţie, se sare la partea finally şi se execută instrucţiunile de acolo, iar apoi excepţia este din nou activată.

Exemplul 1:

Apariţia unei erori de împărţire la zero este rezolvată astfel:

a : = 0 ; b := 0 ; try

c : = a div b ; {în m od norm al aici execu ţia aplicaţiei){ar fi încctat, dar acum nu m ai încetează...}

finallyc : = 0 ; {şi c va prim i valoarea zero}

end;

32

Exemplul 2:

Să considerăm acum cazul în care un fişier nu putea fi închis datorită apariţiei unei erori care oprea execuţia aplicaţiei:

Reset(f); b := 0; try

c : = a div b ;{în m od norm al ap licaţia s-ar b loca aici }{şi fişierul f nu ar fi închis}

finallyc : = 0;CloseFile ( f ) ; {acum el este în să închis}

end;

Exemplul 3:

Este posibil ca la un moment dat, în blocul finally să nu rezolvăm toate excepţiile apărute. De exemplu, să presupunem că avem de-a face cu două excepţii de împărţire la zero:

procedure TForml.ButtonlClick(Sender: TObject); var

x, y, b, c, d : integer; begin

d := 0; c:=l; b:=5; try

X : = C div d; y:=b div d;

finally x : = 0 ;

end; end;

în acest caz nu primim nici un mesaj de eroare. Această regulă se respectă doar dacă ulterior (fie în această procedură sau în alta) nu ne folosim de valoarea lui y (de exemplu, afişând-o).

Exemplul 4:

Dacă în schimb avem excepţii de mai multe tipuri şi rezolvăm doar unele dintre ele, atunci vom primi mesaje de eroare şi aplicaţia se va întrerupe:procedure TForml.ButtonlClick(Sender: TObject); var x, b, c, d : integer;

f ; file of char;begin

d:=0; c:=l; b:=5;

33

X :=c div d;CloseFile(f)

end;

ltvallyX:=0;

I Aici ni s e v a sem nala) ţo excepţie de in trare/ieşire)

4.2. Construcţia try-exceptEste folosită atunci când se cunoaşte clar natura erorii apărute. Sintaxa

unei c o n s t a try-except este următoarea:try

^listâ cu instrucţiuni} xc.en<j °c de excepţie}

unde blocm ^ exCepţii este format din instrucţiuni de tipul:

011 identificator: Tip do instrucţiune

Exemplu;*m t*&rţirea la zero, iniţial rezolvată clasic, iar apoi folosind excepţii:

fuţ,^tion M e d i a A r i t m e t i c a (Suma, NumarDeNumere: Integer): be&in Integer;

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

Iar 3cum rezolvată folosind excepţii:

fUtv' S t i o n MediaAr i t m e t i c a ( S u m a , NumarDeNumere: Integer)-.Integer;

ba*int r y Result := Suma div NumarDeNumere ex cep ton EDivByZero do Result 5= Ojend ;

M Q(1u1 care * executa construcţia tr,-e*cep . eSte următorul:

34

Lista de instrucţiuni din blocul try se execută în ordine. Dacă nu apare nici o eroare blocul except este ignorat, continuându-se execuţia cu prima instrucţiune aflată după end. Dacă a apărut o excepţie, controlul este dat celui mai interior handler de excepţie existent. Dacă nu există, atunci el va fi căutat înspre exterior, în alt bloc try-except neterminat încă. Dacă nici aici nu este găsit, se continuă în acest fel până la epuizarea blocurilor try-except, sau până la găsirea handlerului de excepţie corespunzător. Dacă nu este găsit nici unul se generează un mesaj de eroare.

4.3. Generarea unei excepţii

Este utilă în cazul în care dorim să semnalăm ceva care nu apare printre clasele de excepţii cunoscute. Spre exemplu, dorim să semnalăm faptul că un număr nu este într-un interval dat.

Sintaxa generării unei excepţii este următoarea:

raise I n s t a n ţ ă a E x c e p ţ i e i ;

Instanţă a Excepţiei este un obiect şi nu o clasă şi este generat, de obi­cei, direct la faţa locului prin apelul constructorului clasei din care face parte obiectul.

Exemplu:

Dorim să generăm o excepţie dacă un număr nu este în intervalul dat:

function StrToIntRange(const S: string; Min, Max: Longint):Longint;

beginResult := StrToInt(S);if (Result < Min) or (Result > Max)

then raise ERangeError.CreateFmt( '%d nu este înintervalul %d..%d', [Result, Min, Max]);

end;

4.4. Clase de excepţii

Excepţiile sunt încapsulate în clase care au ca strămoş comun clasa Exception, definită astfel:

typeException = class(TObject) public

constructor Create(const Msg: string); constructor CreateFmt(const Msg: string;

35

const Args: array of const); constructor CreateRes(Ident: Integer); constructor CreateResFmt(Ident: Integer;

const Args: array of const); constructor CreateHelp(const Msg; string;

HelpContext: Integer); constructor CreateFmtHelp(const Msg: string;

const Args: array of const; HelpContext: Integer);

constructor CreateResHelp(Ident, HelpContext: Integer); constructor CreateResFmtHelp(Ident: Integer;

const Args: array of const; HelpContext: Integer);

property HelpContext: Integer; property Message: string;

end;

Această clasă are două proprietăţi care specifică un mesaj descriptiv pentru excepţie (Message) şi un context help pentru un eventual help on-line.

Constructorii diferă între ei prin felul în care este furnizat mesajul descriptiv al excepţiei. Astfel, constructorii care au în cadrul lor secvenţa “res” trebuie să-şi construiască mesajul dintr-o resursă de tip string având identi­ficatorul Ident. Constructorii care au în componenţa numelor secvenţa “Fmt” trebuie să-şi construiască mesajul pe baza unui format. Constructorii care au în componenţa numelui secvenţa “Help” trebuie să furnizeze un parametru suplimentar contextul pentru help-ul on-line al excepţiei.

în unitu] SysUtils sunt definite câteva clase de excepţii utile, dintre care amintim cele mai importante:

C la să de excep ţii C a u z a

E A bortE rori care nu trebu ie să afişeze un m esaj de eroare. A ceste erori se m ai num esc erori silenţioase. O eroare silen ţioasă poate fi generată cu Abort.

E A ccessV iola tion Erori de acces invalid al m em oriei.

EC lassN otF ound Erori care sunt cauzate de negăsirea unei clase.

E D atabase E rror Erori la iucrul cu bazele de date.

E D ateT im eE rror Erori la lucrul cu com ponenta TD ateTim e.

E D ivB yZ ero Erori la îm părţirea cu zero a întregilor.

E F C reateE rror Erori la crearea unui fişier.

E F O penE rror Erori la deschiderea unui fişier.

E ln tO verflowErori cauzate de depăşirea num ărului de octeţi a locaţi pentru un în treg în cazul în care se e fectuează calcule.

E ln tfC astE rror Erori la conversia unei interfeţe.

E lnva lidA rgum en t Erori Ia specificarea unui a rgum ent invalid unei funcţii.

36

i l f P M l s jfl» ;

C la să de excep ţii C au z a

E lnva lidC ast Erori la conversii.

E lnva lidG raphic Erori la încărcarea unui tip de grafic necunoscut.

Ehw alidG raphic.O peration Erori la m anipularea im agin ilo r grafice.

E lnva lidG ridO pera tion Erori la m anipularea grid-urilor.

Elii va lidP ointer Erori la folosirea poin terilor invalid.

E U stE rro r Erori la m anipularea listelor (clasele TList, TS tringL ist etc.).

E M enuE rror Erori la m anipulare item -urilor de m eniu.

E O leC trlE rror E rori specifice controale lor A ctiveX .

EO le Exception Erori care apar în m etodele sau p roprietăţile unui obicct OLE.

E O leSysE rror Erori specificc lui ID ispatch.

E O utO fM em ory Erori de m em orie insuficientă la alocare.

E P ackageE rror Erori legate de m anipularea pachetelor.

E P rin ler Erori legate de m anipularea im prim antei.

ET hread Erori legate de m anipularea firelor de execuţie.

E T ree View Error Erori legate de m anipulare com ponentei TTreeView .

E V arian tE rror Erori la m anipularea variant-urilor.

E W in32E rror Erori ale sistem ului de operare.

Exemplul 1:

Dorim să convertim un şir de caractere la un număr întreg. în caz de excepţie atribuim numărului valoarea 0.

procedure TForml.ButtonlClick(Sender: TObject);var nr : integer;

begin trynr := StrToInt(Editl.Text);

excepton EConvertError do nr := 0;

end;ShowMessage(IntToStr(nr));

end;

Exemplul 2:

Rezolvarea excepţiilor generate de accesarea unui nod inexistent dintr-o listă se face astfel:

37

procedure TForml .ButtonlClick(Sender: TObject); var

lista : TList; p : pointer;

beginlista := TList.Create; tryp := lista. Items [lista .Count]

excepton EListError do p := nil

end;end;

Exemplul 3:

Următoarea aplicaţie interceptează şi rezolvă două excepţii de clase EConvertError şi EDivByZero.procedure TForml.ButtonlClick(Sender: TObject);

varnr : integer; x : integer;

beginx := 25; trynr := StrToInt (Editl .Text) ; // s-ar putea sa apara eroare de conversie x : = x div nr; // s-ar putea sa apara impartire la 0

excepton EConvertError do nr := 1; on EDivByZero do x := 0;

end;ShowMessage(IntToStr(x));

end;

5. OBIECTE GENERALE

în acest capitol sunt prezentate principalele clase "strămoş" ale obiec­telor VCL. Aceste clase nu sunt proiectate pentru a fi instanţiate direct. Din ele trebuie derivate alte clase cu o funcţionalitate precisă.

TObject este clasa strămoş a tuturor obiectelor care alcătuiesc ierarhia VCL. Această clasă defineşte funcţionalităţile de bază precum crearea şi alo­carea memoriei necesare, iniţializarea datelor membre, accesarea, distrugerea ctc. a obiectelor VCL.

Obiectele VCL necesită metode speciale pentru atribuirea valorilor proprietăţilor unui alt obiect. Mai mult decât atât, majoritatea obiectelor VCL îşi stochează valorile proprietăţilor pe disc în fişiere cu extensia .dfm (aceste fişiere au fost binare până la versiunea 6, de atunci fiind fişiere text simple). Metodele necesare pentru a citi şi scrie pe/de pe disc sunt definite în clasa TPersistent.

Clasa TComponent introduce metode şi proprietăţi care permit ca obiectele care derivă din această clasă să poată fi manipulate în interiorul mediului Delphi. Obiectele care derivă din TComponent au primit denumirea de componente. O componentă este selectată din Paleta de Componente, aşezată pe formă şi manipulată cu ajutorul Inspectorului de Obiecte.

Clasa TControl este o clasă din care derivă obiectele ce au reprezentare pe formă la momentul execuţiei aplicaţiei. Aceasta înseamnă că aceste obiecte au o dimensiune şi o poziţie stabilă pe formă la momentul execuţiei aplicaţiei. Componentele care derivă din TControl se mai numesc şi controale.

Componentele care derivă din TWinControl au o fereastră proprie şi un identificator la această fereastră. De aceea ele pot primi focus (sunt active). Acesta se manifestă în diverse forme în funcţie de componentă. Spre exemplu, pe un buton care are focus este desenat un dreptunghi punctat.

5.1. TObject

TObject este strămoşul comun al tuturor obiectelor VCL.

Ierarhie

TObject.

39

Definit în

system.pas

Metode_________________________________________ __ _________ __

Ml. Create

constructor Create;

Construieşte un obiect şi iniţializează datele ataşate lui. Clasele care derivă din TObject îşi definesc proprii constructori.

M2. Free

procedure Free;

Distruge un obiect şi eliberează zona de memorie alocată pentru el. Free apelează automat destructorul obiectului.

M3. ClassName

class function ClassName: ShortString;

Returnează, sub formă de şir de caractere, tipul unui obiect referit de o variabilă, şi nu tipul acelei variabile.

Exemplu:

Următoarea aplicaţie afişează tipul variabilei referită de parametrul Sender al unui handler de evenimente. în cazul particular al aplicaţiei prezentate mai jos va fi afişat mesajul TButton.procedure TForml.ButtonlClick(Sender: TObject); begin

ShowMessage(Sender.ClassName); end;

M4. ClassType

function ClassType: TClass;

Returnează tipul unei clase. TClass este referinţă la o clasă şi este definită astfel:

TClass = class of TObject;

Exemplu:

Următoarea procedură afişează numele clasei obiectului stocat în variabila Sender.

procedure TForml.ButtonlClick(Sender: TObject); begin

ShowMessage(Sender.ClassType.ClassName); end;Aplicaţia va afişa mesajul 'TButton'.

M5. ClassParent

class function ClassParent: TClass;

Returnează tipul părintelui obiectului. Pentru un obiect de tip TObject se returnează nil, deoarece acesta nu are nici un strămoş.

Exemplu:

Următoarea procedură afişează numele clasei şi al tuturor claselor strămoş ale unui buton:

procedure TForml.ButtonlClick(Sender: TObject); var

Ref_la_Clasa: TClass; begin

ListBoxl.Clear;Ref_la_Clasa := Sender.ClassType; while Ref_la_Clasa <> nil do begin ,

ListBoxl.Items.Add(Ref_la_Clasa.ClassName);Ref_la_Clasa := Ref_la_Clasa.ClassParent;

end; end;

5.2. TPersistent

Persistenţa este proprietatea obiectelor de a fi salvate şi apoi reîncărcate.TPersistent este strămoşul comun al acelor obiecte care au capacitatea

de a fi atribuite. Spre exemplu, instrucţiunea Destinaţie := Sursa, nu înseamnă neapărat că întreg conţinutul obiectului Sursa va fi copiat în Destinaţie. Spre exemplu, în cazul pointerilor după atribuirea de mai sus Destinaţie şi Sursa vor referi acelaşi obiect. De aceea, TPersistent introduce metodele Assign şi AssignTo pentru a efectua corect această atribuire.

41

Ierarhie

TObject -> TPersistent.

Definit în

classes.

Metode

Ml. Assign

virtual void fastcall Assign(TPersistent* Source);

Copiază conţinutul unui obiect în alt obiect. Apelul standard este:

Destination. Assign(Source);

Exemplu:

Următoarea aplicaţie atribuie cutiei de editare Edit2 obiectul de tip TFont ataşat cutiei de editare Editl.Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Buttonl: TButton Caption = 'AtribuieFont'

endobject Editl: TEdit Font.Height = -19 Font.Name = 'Courier New'Font.Style = [fsBold, fsltalic]

endobject Edit2: TEdit

Font.Height = -27 Font.Name = 'Arial'Font.Style = [fsUnderline, fsStrikeOut]

endHandlerele de evetiimente ale obiectelor de pe forma Forml sunt:

procedure TForml.ButtonlClick(Sender: TObject); begin

Edit2 .Font.Assign(Edi tl.Font) ; end;

M2. AssignTo

virtual void fastcall AssignTo(TPersistent* Dest);

Copiază conţinutul unui obiect în alt obiect. Cele două obiecte pot să nu aibă acelaşi tip. Apelul standard este:

42

Source. AssignTo(Destinatie);

Observaţie:

Nu toate obiectele implementează ambele metode Assign şi AssignTo.

5.3. TComponent

Este strămoşul comun al componentelor VCL. Toate componentele aflate în Component Palette derivă direct sau indirect din TComponent. Clasele care nu îl au pe TComponent ca strămoş (direct sau indirect) sunt clase non- componente.

Principala caracteristică a instanţelor de tip TComponent este faptul că unele proprietăţi ale lor (cele declarate în secţiunea published) pot fi prelucrate la momentul proiectării aplicaţiei prin intermediul lui Object Inspector.

Ierarhie_________________________________________________________

TObject -> TPersistent -> TComponent.

Definit în

classes.pas

Proprietăţi______________________________________________________

PI. ComponentCount

property ComponentCount: integer;

Indică numărul de componente care au componenta curentă drept proprietar.

P2. Components

property Componentsflndex : integer] : TComponent;

Reprezintă vectorul cu toate componentele care au ca şi proprietar componenta curentă. Astfel, acestea pot fi accesate indexat.Variabila Index este cu o unitate mai mică decât ComponentCount, deoarece componentele sunt numerotate de la zero.

P3. Component Index

property Componentlndex : integer;

43

Indică poziţia componentei în vectorul de componente. Prima compo­nentă are indexul zero, iar ultima are indexul cu o unitate mai mic decât numărul indicat de ComponentCount.

P4. Name

property Name : AnsiString;

Name conţine numele componentei.

Exemplu:

Următorul cod afişează (la apăsarea butonului Button1) numele compo­nentelor aflate pe forma Form l a aplicaţiei:procedure TForml .ButtonlClick(Sender: TObject);

vari : integer;

beginfor i := 0 to ComponentCount - 1 do

ShowMessage(Components[i].Name);end;

P5. Owner

property TComponent* Owner;

Indică componenta proprietară a componentei curente.

Observaţii:

1. Forma este componenta proprietar a tuturor componentelor de pe ea. La distrugerea ei vor fi distruse toate componentele de pe ea.

2. Forma, la rândul ei, se află în proprietatea aplicaţiei. De aceea, în momentul în care aplicaţia este distrusă (eliberată din memorie) şi forma este distrusă.

5.4. TControl

Este clasa de bază pentru componentele vizuale - care sunt văzute de utilizator la momentul execuţiei. Defineşte metode, proprietăţi şi evenimente comune pentru toate componentele vizuale, precum: Top, Left, Width, sau Height. Totodată TControl introduce proprietăţi care definesc modul în care apar sau sunt accesibile instanţierile lui. Dintre acestea amintim: Visible, Enabled, Color, Font.

TControl introduce primele evenimente cerute de controalele vizuale: OnClick, OnDblClick, OnMouseDown, OnMouseMove, OnMouseUp, OnDragOver, OnDragDrop, şi OnEndDrag. Aceste evenimente sunt declarate

44

în secţiunea protected a lui TControl, şi, din această cauză, nu se pot accesa decât în clasele derivate din TControl.

Ierarhie_________________________________________

TObject -> TPersistent -> TComponent -> TControl.

Definit î n ________________________________________________

controls.

Proprietăţi______________________________________________________

1*1. BoundsRect

property BoundsRect: TRect;

Returnează dreptunghiul care încadrează controlul. Sistemul de axe de coordonate la care este raportat dreptunghiul are originea în colţul din stânga sus al controlului părinte.

Observaţie:

Valorile câmpurilor Right, Left, Top, Bottom pot fi aflate şi prin intermediul proprietăţilor cu acelaşi nume:

property Top : integer; property Bottom : integer; property Left : integer; property Right : integer;

P2. ClientRect

property ClientRect: TRect;

Returnează dimensiunile (în pixeli) dreptunghiului care reprezintă zona client a controlului. Câmpurile Top şi Left au valoarea 0, iar câmpurile Right şi Bottom indică dimensiunea zonei client a controlului. Valorile pentru ultimele două câmpuri pot fi aflate şi cu ajutorul proprietăţilor:

property ClientHeight : Integer; property ClientWidth : Integer;

Pentru un obiect de tip Tcontrol, ClientHeight are aceeaşi valoare cu Height. Alte clase derivate pot implementa diferit ClientHeight. Pentru o formă avem:

ClientHeight = Height - înălţimea barei de titlul -- marginea redimensionabilă - înălţimea scrolibar-urilor.

45

P3. Caption

property Caption: string;

Specifică titlul controlului. Titlul este folosit pentru identificarea con­trolului de către utilizator. Putem schimba titlul unui buton cu ajutorul următorului cod:

procedure TForml.ButtonlClick(Sender : TObject) begin

Buttonl.Caption := 'AltTitlu'; end;La apăsarea butonului Buttonl se va schimba titlul acestuia (ceea ce se vede scris pe el) cu “AltTitlu”.

P4. Name

property Name: string;

Specifică numele controlului curent. Schimbarea numelui unui control trebuie făcută doar la momentul proiectării aplicaţiei.

P5. PopupMenu

property PopupMenu: TPopupMenu;

Indică meniul popup ataşat controlului. Acest meniu apare în momentul în care utilizatorul execută click cu butonul din dreapta al mouse-ului pe componentă. Pentru mai multe informaţii despre meniuri citiţi capitolul despre meniuri.

P6. Color

property Color: TColor;

Indică culoarea fundalului unui control. Studiaţi tipul TColor pentru mai multe informaţii.

Observaţie:

Pentru a schimba culoarea unui control se ţine cont de următoarea indicaţie: Un control îşi poate modifica culoarea doar dacă are proprie­tatea Color. La schimbarea culorii unui control trebuie să se ţină cont şi de valoarea proprietăţii ParentColor. Dacă valoarea proprietăţii ParentColor pentru componentele de pe formă este setată la true, atunci toate componetele de pe acea formă îşi vor schimba culoarea odată cu schimbarea culorii formei. Dacă, în schimb, proprietatea ParentColor este setată la false pentru unele componente, acestea nu îşi vor schimba

46

culoarea chiar dacă forma (părintele) şi-o schimbă. Implicit ParentColor este setată de Object Inspector la true.

Kxcmplu:

Să presupunem că pe formă avem un buton (Buttonl) şi o componentă de tip TLabel (Labell). Următorul program, la apăsarea butonului, va schimba culoare formei şi a componentei de tip TLabel în roşu:

procedure TForml.ButtonlClick(Sender : TObject); begin

Forml.Color := clRed; end:Dacă setăm ParentColor pentru Labell la false, atunci la apăsarea butonului Buttonl îşi schimbă culoarea doar forma:

procedure TForml.ButtonlClick(Sender: TObject); begin

Labell.ParentColor := false;Forml.Color := clRed;

end;

1*7. Cursor

property Cursor: TCursor;

Specifică imaginea folosită pentru a reprezenta un cursor de mouse, atunci când acesta trece pe deasupra unui control. Valorile standard (furnizate de către TScreen) sunt următoarele constante întregi: crNone, crArrow , crCross, crIBeam, crSize, crSizeNESW, crSizeNS, crSizeNWSE, crSizeWE, crUpArrow, crHourGlass, crDrag, crNoDrop, crHSplit, crVSplit, crMultiDrag, crSQLWait, crNo, crAppStart, crHelp şi crHandPoint.

1*8. Enable

property Enabled: boolean;

Specifică dacă controlul mai răspunde la mouse, tastatură, sau sisteme de timere. Pentru a bloca un buton (de exemplu Buttonl) să mai răs­pundă Ia astfel de evenimente, scriem instrucţiunea:Buttonl.Enable := false;

47

P9. Font

property Font: TFont;

Specifică atributele fontului cu care este scris textul pe sau într-un control. Detalii despre clasa TFont se pot găsi în capitolul despre grafica în mediul Delphi.

P10. Hint

property Hint: string;

Specifică textul care apare când cursorul de mouse este trecut pe deasupra controlului. Pentru ca acest text să apară trebuie ca proprietatea ShowHint să fie setată la true.

P i l . ShowHint

property bool ShowHint;

Stabileşte dacă Help Hint-u\ va apărea în momentul în care cursorul mouse-ului poposeşte pentru puţin timp pe control. Trebuie ţinut cont şi de valoarea proprietăţii ParentShowHint şi anume, dacă ParentShowHint este setat la true, atunci fiecare componentă va afişa propriul ei Help Hint (indiferent de valoarea lui ShowHint), în caz contrar fiecare componentă se va conforma propriului ei ShowHint.

Exemplu:

Să realizăm o aplicaţie care constă dintr-un buton (Button]) şi o cutie de editare (Editl) care să aibă fiecare câte un Help Hint. Valorile proprie­tăţilor obiectelor de pe formă vor fi:

object Buttonl: TButton Hint = 'Apasati-ma'ParentShowHint = False ShowHint = True

endobject Editl: TEdit

Hint = 'Introduceti un text'ParentShowHint = False ShowHint = True

end

P12. Text

property Text: string;

Text conţine textul ataşat unui control. Cu ajutorul acestei proprietăţi poate fi citit textul ataşat unui control, sau se poate ataşa controlului un

48

text. Implicit Text are ca valoare numele controlului. Spre exemplu, într- o componentă de tip TEdit se află înscris iniţial un text reprezentând numele componentei: de exemplu Editl.

P13. Visible

property Visible: boolean;

Specifică dacă un control este vizibil pe ecran la momentul execuţiei aplicaţiei.

Observaţie:

O componentă care derivă doar din TComponent nu poate fi vizibilă la momentul execuţiei deoarece nu are proprietatea Visible. Exemplu de astfel de componentă (care nu este control) este TTimer.

P14. Align

property Align: TAlign;

Indică modul în care se aliniază controlul în cadrul părintelui. Valori posibile pentru Align sunt:

V a lo a re S em n ifica ţie

alN one D im ensiunile şi poz iţia com ponentei răm ân neschim bate.

alT op

C om ponenta se m ută în partea de sus a com ponentei părinte.

Lăţim ea ei devine egală cu lăţim ea com ponentei părinte,

înă lţim ea nu se m odifică *

alB ottom

C om ponenta se m u tă în partea de jo s a com ponentei părinte.

Lăţim ea ei devine egală cu lăţim ea com ponentei părinte.

Înă lţim ea nu se m odifică.*

a l Le ft

C om ponenta se m u tă în partea stângă a com ponentei părinte,

înă lţim ea ei devine egală cu înălţim ea com ponentei părinte.

L ăţim ea nu se m odifică .*

alR igh t

C om ponenta se m ută în partea s tângă a com ponentei părinte,

înă lţim ea ei devine egală cu înălţim ea formei.

Lăţim ea nu se m odifică.*

alC lien t

C om ponen ta se redim ensioneazâ astfel încâ t să um ple zona clien t a com ponentei părinte.

D acă o a ltă com ponentă a ocupat deja o parte din această zonă (are seta tă o valoare d iferită de alN one pentru p roprietatea A lign), atunci com ponenta curentă o cupă restul suprafeţei răm ase neacoperite .

49

* Dacă mai există şi alte componente având setată aceeaşi valoare (dintre: alTop, alBottom, al Left, al Right) pentru proprietatea Align, atunci ele se vor alinia una după alta în ordinea atribuirii valorii pentru această pro­prietate. Spre exemplu, dacă există două componente având proprietatea Align setată la valoarea alTop, atunci una dintre ele (cea căreia i-a fost setată prima dată valoarea alTop) se va lipi de marginea superioară a componentei părinte, iar cealaltă de marginea inferioară componentei deja amplasată.

P15. Anchors

property Anchors: TAnchors;

Indică felul în care componenta este ancorată de părinte. Ancorarea se realizează faţă de una (sau mai multe) dintre marginile componentei părinte. Această operaţie ne asiigură că poziţia componentei - faţă de marginile de care a fost ancorată în cadrul părintelui - nu se modifică. Valori posibile pentru Anchors sunt o submulţime a:

V a lo a re S e m n ifica ţie

akTop C om ponenta este anco rată de m arg inea superioară a com ponentei părinte.

akB ottom C om ponen ta este anco rată de m arg inea in ferioară a com ponentei părinte.

akL eft C om ponenta este a nco rată de m arg inea din stânga a com ponentei părinte.

akR ightC om ponen ta este anco rată de m arg inea din d reapta a com ponentei părinte.

Observaţie:

Dacă o componentă este ancorată de două margini opuse (spre exemplu akTop şi akBottom) atunci, în cazul redimensionării componentei părinte, se vor modifica şi dimensiunile ei astfel încât distanţa la marginile de care este legată să nu se schimbe.

PI 6. AutoSize

property AutoSize: Boolean;

Indică dacă controlul se redimensionează sau nu automat când con­ţinutul lui se schimbă.Exemplu de control având proprietatea AutoSize este TEdit. Setând valoarea proprietăţii AutoSize la true, cutia de editare se va acomoda cu înălţimea textului introdus în ea.

50

P17. DragCursor

property DragCursor: TCursor;

Indică tipul de cursor care este afişat în momentul în care controlul curent este tras (este executată asupra lui o operaţie de tip drag). Implicit are valoarea crDrag.

P18. DragMode

property DragMode: TDragMode;

Determină comportamentul drag and drop al controlului. Valori posibile pentru DragMode sunt:

Valoare Semnificaţie

dmMtmuo/ Controlul nu poate fi tras decât după ce aplicaţia apelează metoda BeginDrag.

dmAutomatic Controlul este gata spre a fi tras. Utilizatorul poate executa în orice moment această operaţie.

P19. Parent

property Parent: TWinControl;

Indică controlul părinte în interiorul căruia este afişat cel curent.

Exemplu:

Următoarea aplicaţie afişează părinţii unui buton, ştiind că acesta este aşezat pe o componentă TPanel.

procedure T F o rm l. B u t t o n l C l i c k {S e n d e r : T O b je c t ) ;var c o n t r o l : T C o n t r o l ;

begin// părinţii unui control ii afişam intr-un LislBox cate unul pe linieL i s t B o x l . C l e a r ;c o n t r o l := S e n d e r as T C o n tr o l ; // converteşte controlul la TControlwhile c o n t r o l <> nil dobegin

L i s t B o x l . I te m s .A dd ( c o n t r o l .Name) ; / / adaugă numele in ListBox c o n t r o l := c o n t r o l . P a r e n t ; / / determină părintele controlului

end; end;în urma execuţiei programului, în ListBoxl vor fi afişate liniile:

Button 1 Panel 1 Form l

51

Metode

Ml. Hide

procedure Hide;Face un control să devină invizibil. Proprietăţile şi metodele controlului sunt disponibile şi dacă acesta nu mai este vizibil. în schimb, un control invizibil nu poate recepţiona mesaje generate de apăsarea tastelor sau a mouse-ului.

M2. Show

procedure Show;

Face ca un control să fie vizibil.

M3. Refresh

procedure Refresh;

Redesenează imediat controlul.

Observaţie:

Dacă nu se apelează această metodă redesenarea controlului se va face doar după procesarea mesajelor trimise de aplicaţie înainte de mesajul de redesenare.

Exemplu:

Dacă dorim să implementăm un contor care afişează într-o căsuţă de editare numerele de la 1 la 1000 (câte unul la un moment dat) atunci următorul cod va afişa în Editl doar numărul 1000:

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

beginfor i := 1 to 1000 do

Editl.Text := IntToStr(i);end;

Codul corect este următorul:procedure TForml.ButtonlClick(Sender: TObject);var i: integer;

beginfor i := 1 to 1000 do begin

Editl.Text := IntToStr(i);Editl.Refresh;

52

end; end ;

M4. ClientToScreen

function ClientToScreen(const Point: TPoint): TPoint;

Converteşte coordonatele unui punct din zona client a controlului în coordonate ecran. Coordonatele ecran sunt stabilite faţă de colţul din stânga sus a ecranului. Acel punct (din colţul din stânga sus al ecranului) are coordonatele (0, 0).

Evenimente

E l. OnClick

property OnClick: TNotifyEvent;

Apare când utilizatorul execută click pe control. Mai poate apărea când:

• utilizatorul selectează un item dintr-o grilă, listă sau combo box prin apăsarea unei săgeţi;

• utilizatorul apasă tasta <Space> în timp ce butonul sau cutia de control are focus;

• utilizatorul apasă <Enter> când forma activă are un buton Default',• utilizatorul apasă <Esc> când forma activă are un buton Cancel-,• utilizatorul apasă o tastă accelerator pentru un buton sau o cutie de

control.

Proprietatea Checked a unui buton radio este setată la true.Valoarea proprietăţii Checked a unei cutii TCheckBox este schimbată. Este apelată metoda Click pentru un item de meniu.

Tipul TNotifyEvent este tipul cel mai simplu de eveniment. El are funcţia de a notifica (a informa) o componentă de o schimbare apărută în sistem. De exemplu, evenimentul OnClick este de tip TNotifyEvent. El doar indică faptul că asupra unei componente s-a executat un click de mouse. Nu se precizează nici poziţia mouse-lui, nici dacă apăsarea butonului a fost însoţită de apăsarea unei taste.Tipul TNotifyEvent este definit în unitul classes astfel:

TNotifyEvent =procedure (Sender: TObject) of object;

unde Sender este obiectul notificat (informat) despre schimbarea apărută în sistem.

53

,#***■ «m irtufff,

E2. OnDblClick

property OnDblClick: TNotifyEvent;

Apare când utilizatorul execută dublu click pe un control.

E3. OnStartDrag

property OnStartDrag: TStartDragEvent;

Operaţia drag-drop constă în apăsarea butonului stâng al mouse-ului pe un control, iar apoi "tragerea" (cu mouse-ul apăsat) controlul într-o altă poziţie, unde butonul de mouse este eliberat.Evenimentul OnStartDrag apare când utilizatorul a început o operaţie de tip drag-drop.Tipul TStartDragEvent este definit astfel:

TStartDragEvent = procedure (Sender: TObject;var DragObject: TDragObject) of object;

unde Sender este obiectul care a început să fie “tras”, iar DragObject este un obiect care conţine informaţii despre operaţia drag-drop curentă. Spre exemplu, DragObject poate conţine informaţii despre cursorul de mouse folosit în această operaţie.

E4. OnDragOver

property OnDragOver: TDragOverEvent;

Apare când utilizatorul trage un obiect pe deasupra unui control. Controlul pe deasupra căruia se trage obiectul va primi acest eveniment. Tipul TDragOverEvent este definit astfel:

TDragOverEvent = procedure(Sender, Source: TObject;X, Y: Integer; State: TDragState; var Accept: Boolean) of object;

Source este obiectul care este tras. Sender este obiectul pe deasupra căruia se trage obiectul Source, iar variabila booleană Accept indică dacă Source poate fi lăsat să cadă (operaţia drop) peste Sender. TDragState este un tip enumerare care conţine valorile:

Valoare Semnificaţie

dsD ragE nter C ursorul dc m ouse intră în suprafaţa de desupra Sem /er-ului.

dsD ragM ove C ursorul de m ouse este plim bat pe deasupra Sevirfer-ului.

dsD ragLeave C ursorul de m ouse părăseşte suprafaţa Sender-u\xu.

54

E5. OnDragDrop

property OnDragDrop: TDragDropEvent;

Apare când utilizatorul “lasă să cadă” obiectul care a fost “tras” .Tipul TDragDropEvent este definit astfel:

TDragDropEvent = procedure(Sender, Source: TObject;X, Y: Integer) of object;

unde Sender este obiectul peste care a fost “tras” Source. (X,Y) este punctul în care butonul mouse-ului este eliberat.

E6. OnEndDrag

property OnStartDrag: TStartDragEvent;

Apare când “tragerea” unui obiect încetează, fie prin lăsarea lui să cadă, fie printr-o metodă de Cancel.Tipul TEndDragEvent este definit astfel:

TEndDragEvent = procedure(Sender, Target: TObject;X, Y: Integer) of object;

unde Sender este obiectul “tras” , iar Target este obiectul care ar putea accepta operaţia drop.

Exemplul 1:

Următoarea aplicaţie permite plimbarea cu ajutorul mouse-ului a unei etichete pe o formă.Valorile proprietăţilor obiectelor de pe forma Forml sunt:object Labell: TLabel Caption = 'Labell'DragMode = dmAutomatic

endHandlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure TForml.Label1StartDrag(Sender: TObject;var DragObject: TDragObject);

beginDragObject := nil;

end;procedure TForml.FormDragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

beginAccept := true;(Source as TLabel).Top := Y;(Source as TLabel).Left := X;

55

end ;

procedure TForml.FormDragDrop(Sender, Source; TObject;X, Y: Integer);

begin(Source as TLabel).Left := X;(Source as TLabel).Top : = Y;

end;

Exemplul 2:

Următoarea aplicaţie constă dintr-o formă pe care se află 5 etichete (componente de tip TLabel) şi o componentă TListBox. Etichetele au ca text ataşat numerele de la 1 la 5. Utilizatorul trebuie să tragă fiecare etichetă în Listboxl. Dacă eticheta este acceptată atunci textul ataşat ei va fi adăugat ca item al lui Listboxl. Nu orice ordine de adăugare a textelor în ListBoxl este permisă. Adăugare etichetelor trebuie să înceapă cu numărul 1 şi trebuie să se continue succesiv cu numerele 2, 3,4 ,5 .Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Labell: TLabel Caption = '1'DragMode = dmAutomatic OnStartDrag = LabellStartDrag

endobject Label2: TLabel

Caption = '2'DragMode = dmAutomatic OnStartDrag = LabellStartDrag

endobject Label3: TLabel

Caption = '31 DragMode = dmAutomatic OnStartDrag = LabellStartDrag

endobject Label4: TLabel

Caption = '4'DragMode = dmAutomatic OnStartDrag = LabellStartDrag

endobject Label5: TLabel

Caption = '5’DragMode = dmAutomatic OnStartDrag = LabellStartDrag

end

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:

56

curent : byte; // care eticheta tichuie adaugata la momentul actual

procedure TForml.FormCreate(Sender: TObject); begincurent := 1;

end;procedure TForml.LabellStartDrag(Sender: TObject;

var DragObject: TDragObject);begin

DragObject := nil; end;procedure TForml.ListBoxlDragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

beginAccept := (Source as TLabel). Caption = IntToStr(curent);

end;procedure TForml.ListBoxlDragDrop(Sender, Source: TObject;

X, Y: Integer);begin

(Sender as TListBox).Items.Add((Source as TLabel).Caption); inc (curent) ; // urmatoarea eticheta de acceptat

end;

v a r

E7. OnMouseDown

property OnMouseDown: TMouseEvent;

Apare când un buton al mouse-ului este apăsat.Tipul TMouseEvent este definit astfel:

TMouseEvent = procedure (Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer) of object;

unde Sender este controlul pe a cărui suprafaţă este apăsat mouse-ul. (X, Y) sunt coordonatele pixel-ului unde cursorul de mouse a fost apăsat.

TMouseButton este un tip enumerare:

TMouseButton = (mbLeft, mbRight, mbMiddle);

şi indică butonul de mouse care a fost apăsat.

TShiftState este o mulţime:TShiftState = set of (ssShift, ssAlt, ssCtrl,

ssLeft, ssRight, ssMiddle, ssDouble);

57

care indică ce taste de control sau ce butoane ale mouselui au fost apăsate în timpul apariţiei acestui eveniment.

E8. OnMouseMove

property OnMouseMove: TMouseMoveEvent;

Apare când cursorul de mouse este mişcat.

Tipul TMouseMoveEvent este definit astfel:TMouseMoveEvent = procedure(Sender: TObject;

Shift: TShiftState;X, Y: Integer) of object;

Parametrii sunt aceeaşi ca la OnMouseDown (schimbând "apăsat" cu "mişcat").

Exemplu:

Următoarea aplicaţie constă dintr-o formă pe care se află o cutie de editare (Editl). La trecerea cursoului de mouse pe deasupra cutiei Editl, culoarea textului înscris în ea va deveni roşie. La ieşirea mouselui de pe cutia de editare culoarea textului înscris în aceasta va fi setată la culoare standard.procedure TForml.EditlMouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);begin

Editl.Font.Color := clRed; end;procedure TForml.FormMouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);begin

Editl.Font.Color := clWindowText; end;

E9. OnMouseUp

Apare când un buton de mouse este eliberat,

property OnMouseUp: TMouseEvent;

Tipul TMouseUpEvent este definit astfel:

TMouseEvent = procedure (Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer) of object;

Parametrii sunt ca şi la OnMouseDown (schimbând apăsat cu eliberat).

58

E10. OnCanResize

property OnCanResize: TCanResizeEvent;

Apare când se încearcă redimensionarea unui control.

Tipul TCanResizeEvent este definit astfel:

TCanResizeEvent = procedure(Sender: TObject;var NewWidth, NewHeight: Integer; var Resize: Boolean) of object;

unde NewWidth şi NewHeight sunt noile dimensiuni ale obiectului. Resize indică dacă modificarea dimensiunilor este acceptată sau nu.

Exemplu:

Să se realizeze o aplicaţie care nu permite redimensionarea formei prin­cipale peste valoarea 300 pentru înălţime şi lăţime. Iniţial forma are ambele dimensiuni (Height şi Width) mai mici decât 300.

Handlerul pentru evenimentul OnCanResize al formei Form l este urmă­torul:

procedure TForml. ForinCanResize (Sender: TObject;var NewWidth, NewHeight: Integer; var Resize: Boolean);

beginif (NewWidth > 300) or (NewHeight > 300)

then Resize := false else Resize := true;

end;

O altă posibilitate de a realiza această aplicaţie (fără a folosi evenimen­tul OnCanResize) este de a seta valorile proprietăţii Constrains astfel:

object Forml: TForml Width = 289 Height = 239 Caption = 'Forml'Constraints.MaxHeight = 300 Constraints.MaxWidth = 300

end

E ll. OnResize

property OnResize: TNotifyEvent;

Apare după ce controlul a fost redimensionat.Acest eveniment poate fi utilizat pentru a ajusta dimensiunile obiectului după redimensionare.

59

Exemplu:

Să se realizeze o aplicaţie care nu permite ca dimensiunile formei principale să nu fie multiplu de 10.Rezolvăm cerinţa problemei implementând handlerul pentru evenimen­tul OnResize al formei Forml:

procedure TForml.FormResize(Sender: TObject); begin

Height := Height - Height mod 10;Width := Width - Width mod 10;

end;

5.5. TWinControl

Este o clasă abstractă pentru toate controalele care au ataşată o fereastră. O importantă caracteristică a lor este faptul că pot primi focus (deci pot interacţiona cu utilizatorul prin intermediul tastaturii).

Ierarhie_______________________________ ________

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

Definit în______________________________ _________

controls.pas

Proprietăţi___________________________________________________

P I. Brush

property Brush: TBrush;

Specifică ce culoare şi ce model este folosit pentru a desena fundalul unui control.

P2. ClientOrigin

property ClientOrigin: TPoint;

Determină coordonatele colţului din stânga sus al controlului.

P3. ClientRect

property ClientRect: TRect;

Indică dimensiunile ferestrei controlului, în număr de pixeli.

60

P4. ControlCount

property ControlCount: Integer;

Indică numărul de componente care sunt copii ai componentei care a apelat această metodă.

P5. Controls

property Controls)Index: Integer]: TControl;

Este un vector care conţine controalele care sunt fii ai controlului care apelează această proprietate.

P6. CtlJD

property Ctl3D: Boolean;

Indică dacă controlul este afişat sau nu 3D. Acest lucru depinde şi de valoarea proprietăţii ParentCtUD.

P7. ParentCtUD

property ParentCtl3D: Boolean;

Este folosită pentru a specifica dacă felul în care arată o componentă(2D sau 3D) depinde sa nu de felul în care arată componenta părinte. Dacă ParentCtl3D este true, atunci felul în care arată o componentă este identic cu felul în care arată componenta părinte. Dacă ParentCtl3D este false, atunci componenta îşi va folosi propria proprietate Ctl3D.

P8. TabOrder

property TabOrder: TTabOrder;

Indică ordinea în care se trece de la un control la altul în cazul în care se apasă tasta <Tab>. Pentru aceasta fiecare control are un număr unic ataşat (TabOrder). Dacă TabOrder este -1 , atunci controlul respectiv nu poate fi accesat cu ajutorul tastei <Tab>. Iniţial, această ordine este ordinea în care sunt aşezate controalele pe formă.

Itxemplu:

Să se realizeze o aplicaţie care afişează Tab-ordinea componentelor de pe o formă.Folosim o componentă TListBox în care afişăm numele componentelor (câte unul pe o linie) şi numărul lor de ordine (conform cu Tab-ordinea).

61

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

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

s : string;begin

ListBoxl.Clear,-for i := 0 to ControlCount - 1 do

if Controls[i] is TWinControl //testu l acesta este necesar then begin / / deoarece pe o form a se po t afla

// si com ponente care nu deriva din TW inC ontro l // spre exem plu T L abel sau TT im er

s := Controls[i].Name; s : = s + ' 1 +

IntToStr((Controls[i] as TWinControl).TabOrder); ListBoxl.Items.Add(s);

end;end;

Metode

M l. CanFocus

function CanFocus: Boolean;

Determină dacă un control poate deveni activ (poate primi focus). Un control invizibil (care are proprietatea Visible setată la false) nu poate primi focus.

M2. Focused

function Focused: Boolean;

Indică dacă controlul este activ (are focus).

M3. SetFocus

procedure SetFocus;

Face ca un control să devină activ (să primească focus).

M4. ControlAtPos

function ControlAtPos(const Pos: TPoint;AllowDisabled: Boolean, AllowWinControls:Boolean=False):

TControl;

Returnează controlul fiu aflat la poziţia Pos.

62

MS. GetTabOrderList

procedure GetTabOrderList(List: TList);

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

M6. Repaint

procedure Repaint;

Redesenează controlul.

M7. ScrollBy

procedure ScrollBy(DeltaX, DeltaY: Integer);

Defilează conţinutul ferestrei controlului cu DeltaX pixeli orizontal (spre dreapta) şi DeltaY pixeli vertical (în jos). DeltaX şi D eltaY pot avea şi valori negative, asta însemnând că conţinutul ferestrei va defila spre stânga, respectiv în sus.

M8. ScaleBy

procedure ScaleBy(M, D: Integer);

Redimensionează un control împreună cu toate controalele conţinute în acesta. M reprezintă factorul cu care va fi multiplicată dimensiunea ori­cărui control, iar D reprezintă numărul cu care va fi împărţită dimen­siunea fiecărui control.Dacă dorim să micşorăm dimensiunea unui control la 75%, atunci M va primi valoarea 3 iar D va primi valoarea 4.

Exemplu:

Reducerea cu un sfert a dimensiunilor tuturor componentelor de pe o formă se face prin următorul cod:

procedure TForml.ButtonlClick(Sender: TObject); begin

ScaleBy(3,4); end;

63

Evenimente

E l. OnEnter

property OnEnter: TNotifyEvent;

Apare când o fereastră-control devine activă (când primeşte focus).

E2. OnExit

property O nE xit: TNotifyEvent;

Apare când o fereastră-control devine inactivă (pierde focus-ul).

E3. OnKeyDown

property OnKeyDown: TKeyEvent;

Apare dacă utilizatorul apasă o tastă în timp ce controlul (pentru care se activează acest eveniment) este activ. Tipul TKeyEvent este definit astfel:

TKeyEvent = procedure (Sender: TObject;var Key: Word; Shift: TShiftState) of object;

Apăsarea unei taste poate fi acompaniată şi de apăsarea unui buton de mouse sau de apăsarea tastelelor <Ctrl>, <Shift>, <Alt>, aceste lucruri fiind specificate în parametrul Shift. Valori posibile pentru Shift sunt o submulţime din următoarele valori constante: ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble. Semnificaţia acestor constante este:

Valoare Semnificaţie

ssShift T asta <Shift> este apăsată.

ssAlt T asta <Alt> este apăsată.

ssClrl T asta <Ctrl> este apăsată.

ssLeft B utonul stâng al m ouse-ului este ţinu t apăsat.

ssRight B utonul drept al m ouse-ului este ţinu t apăsat.

ssMiddle B utonul din m ijloc al m ouse-ului este ţinut apăsat.

ssDouble A fost execu tat un dublu-click.

E4. OnKeyUp

property OnKeyUp: TKeyEvent;

64

Apare în momentul în care utilizatorul eliberează o tastă pe care a apăsat-o într-un moment anterior. Semnificaţia parametrilor este ca şi la OnKeyDown.

E5. OnKeyPress

property OnKeyPress: TKeyPressEvent;

Apare când utilizatorul apasă o singură tastă care are codul ASCII normal, deci, de exemplu, tastele <Shift>, <Ctrl> sau <F1> nu pot genera acest eveniment. Tipul TKeyPressEvent este definit astfel:

TKeyPressEvent = procedure (Sender: TObject; var Key: Char)of object;

Key reprezintă tasta apăsată.

Exemplu:

Următoarea aplicaţie constă dintr-o formă (Form l). Utilizatorul poate scrie un text în bara de titlu a formei prin apăsarea tastelor în timp ce focusul este la forma Form l şi nu la una din componentele ei.

procedure TForml.FormKeyPress(Sender: TObject; var Key: Ch a r ) ; begin

Caption := Caption + Key; end;

65

6. FERESTRELE APLICAŢIEI - COMPONENTATForm '

O aplicaţie W indows constă din una sau mai multe forme (ferestre). Una dintre ele este fereastra principală care va fi afişată în momentul lansării aplicaţiei în execuţie.

Componenta care implementează caracteristicile şi comportamentul unei forme se numeşte TForm.

Această componentă nu are reprezentare în Component Palette şi, de aceea, adăugarea unei noi forme la aplicaţie se realizează prin accesarea comenzii File\NewForm.

O fereastră este împărţită în două zone principale:

- bara de titlu;- zona client.

Bara de titlu se află în partea de sus a formei şi conţine de la stânga spre dreapta:

- meniul sistem;- titlul ferestrei;

trei butoane (Minimizare, Maximizare şi închidere).

Zona client are cea mai mare suprafaţă. Pe ea programatorul aşează con­troale cu ajutorul cărora defineşte funcţionalitatea unei aplicaţii.

6.1. TForm

Ie ra rh ie ____________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TScrollingWinControl -> TForm.

Definit î n _______________________________________

form s.pas

66

Proprietăţi

PI. Active

property Active: Boolean;

Determină dacă o formă este activă sau nu (daca are sau nu focus). La un moment dat, doar o formă poate avea focus. O formă activă este aceea asupra căreia utilizatorul acţionează la momentul curent. Se deosebeşte de toate celelalte forme prin culoare barei de titlu.

P2. ActiveControl

property ActiveControl: TWinControl;

Indică controlul activ care are focus de pe o formă. La un moment dat, doar un singur control poate avea focus. Dacă forma nu este activă, atunci ActiveControl indică componenta care va primi focus în momen­tul în care forma primeşte.

P3. Borderlcons

property BorderIcons:TBorderIcons;

Indică tipurile de iconuri ce pot să apară în bara de titlu a unei forme. TBorderlcons este o mulţime, deci poate lua mai multe valori dintre următoarele:

V a lo a re S em n ifica ţie

BiSystemMenuForm a are un m eniu num it System , care este a fişat Ia apăsarea iconului (din colţul din stânga sus) cu ajutorul căru ia form a poate fi închisă, m axim izată, m inim izată etc.

BiMinimize F orm a are un buton de m inim izat(în colţul din d reap ta sus).

BiMaximize F orm a are un bu ton de m axim izat(în colţul din d reap ta sus).

BiHelp Form a are un buton de help care are desenat pe el un sem n de întrebare.

P4. BorderStyle

property BorderStyle: TFormBorderStyle;

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

67

V a lo a re S em n ifica ţie

BsDiatogForm a nu poale fi redim ensionată. M arginea este în form ă standard.

BxSingle Form a nu poate fi redim ensionată. 0 singură linie ca m argine.

BsNune Form a nu poate fi redim ensionată. N ici o linie viz ib ilă ca m argine.

BsSizeable Form a poate 11 redim ensionată.

BsToolWindow La fel ca şi bxSingle d ar cu un titlu mai mic.

BsSizel'oolWin La fel ca şi bsSizeahle d ar cu un titlu mai mic.

Apare aici termenul de “formă redimensionabilă” . Este vorba de schim­barea dimensiunilor formei cu ajutorul mouse-ului în timp ce aplicaţia este în execuţie. Oricum, schimbarea dimensiunilor formei poate fi făcută şi în timpul execuţiei aplicaţiei, dar fără ajutorul mouse-ului, ci cu ajutorul proprietăţilor ClientHeight şi ClientWidth.

Exemplu:

Să presupunem că la lansarea în execuţie a aplicaţiei forma nu putea fi redimensionată, dar dorim ca la apăsarea unui buton (B uttonl) aceasta să poată fi redimensionată. Atunci handlerul de evenimente ataşat buto­nului Buttonl şi evenimentului OnClick trebuie să conţină linia:

procedure TForml.ButtonlClick(Sender: TObject); begin

Forml.BorderStyle:=bsSizeable; end;

P5. ClientHeight

property ClientHeight: Integer;

Specifică înălţimea, în pixeli, a zonei client a formei. Pentru a determina întreaga înălţime a formei (+ zona de titlu) citiţi valoare proprietăţii Height a lui TControl.

P6. ClientWidth

property ClientWidth: Integer;

Specifică lăţimea, în pixeli, a zonei client a formei.

Exemplu:

Următoarea aplicaţie interschimbă, la apăsarea butonului Buttonl, valoa­rea lăţimii cu valoarea înălţimii zonei client a unei forme (Forml):

68

procedure TForml.ButtonlClick(Sender: TObject);var h :integer;

beginh := Forml.ClientHeight;Forml .ClientHeight := Forml.ClientWidth;Forml.Clientwidth := h;

end;La apăsarea cu număr de ordine par, forma va avea dimensiunile ei originale.

P7. Position

property Position: TPosition;

Specifică dimensiunile şi poziţia pe care o va avea o formă pe ecran. Valorile posibile pentru Position sunt:

V a lo a re S em n ifica ţie

poD esigned Form a va apare pe ecran în aceeaşi poziţie şi cu aceleaşi d im ensiuni ca şi cele setate la tim pul proiectării ei.

poD efault W indow s-ul alege poz iţia şi d im ensiunea formei.

poDefauhPosOnly W indow s-ul va alege doar p oz iţia fo rm ei, d im ensiunile răm ânând cele setate la tim pul pro iectării ei.

poDefaultSizeOnly W indow s-ul va alege doar dim ensiunile form ei, poziţia răm ânând cea de la proiectare.

poScreenCenter Form a va avea poziţie centrală pe ecran şi d im ensiunile pe care le avea de la proiectare.

P8. Visible

property Visible: Boolean;

Specifică dacă o formă este vizibilă sau nu. Dacă Visible este true, atunci forma este vizibilă (asta în cazul în care nu este acoperită parţial sau total de către o altă formă). Dacă o aplicaţie are mai multe forme, atunci cele care au proprietatea Visible setată la true, vor fi vizibile (sau parţial vizibile dacă sunt acoperite de alte forme), iar cele cu proprie­tatea Visible setată la false nu sunt vizibile.

P9. Menu

property Menu: TMainMenu;

Specifică meniul unei forme. Dacă pe formă sunt adăugate mai multe componente TMainMenu, atunci Menu va avea ca valoare prima dintre acestea.

69

P10. Icon

property Icon: TIcon;

Specifică iconul formei.

P ll . WindowState

property WindowState: TWindowState;

Specifică modul în care o formă apare pe ecran. Valori posibile pentru WindowState sunt:

V a lo a re S em n ifica ţie

wsNormal F orm a apare în stare norm ală (nici m in im izată nici m axim izată).

wsMinimized Form a apare în stare m inim izată.

wsMaximized Form a apare în stare m axim izată.

P12. FormStyle

property FormStyle: TFormStyle;

Indică stilul unei forme. Valori posibile pentru FormStyle sunt:

V a lo a re S em n ifica ţie

FsNormal Form a nu este nici o fereastră M DI părin te , nici M DI copil.

FsMDIChild Form a este o fereastră M DI copil.

FsMDIForm Form a este o fereastră M DI părinte.

FsStayOnTopForm ă răm âne afişată pe desktop deasupra tu tro r celorlalte form e care nu au p roprietatea FormStyle seta tă la această valoare.

P13. M odalResult

property ModalResult: TModalResult;

Specifică o valoare pentru care forma va fi închisă dacă este afişată ca modală. Pentru a închide forma, această valoare trebuie să fie mai mare decât 0 (mrNone). Valori posibile pentru ModalResult sunt:

V a lo a re S em n ifica ţie

mrNone V aloare im plicită. Nu are nici o sem nificaţie.

mrOk U tilizatorul a ieşit apăsând un buton de tip Ok.

mrCancel U tilizatorul a ieşit apăsând un buton de tip Cancel.

mrAbort U tilizato ru l a ieşit apăsând un buton de tip Abort.

mrRetry U tilizatorul a ieşit apăsând un buton de tip Retry.

70

V a lo a re S em n ifica ţie

mrIgnore U tilizatorul a ieşit apăsând un buton de tip Ignore.

mrYe.s U tilizatorul a ieşit apăsând un buton de tip Yex.

mrNo U tilizatorul a ieşit apăsând un buton de tip No.

mrAll U tilizatorul a ieşit apăsând un buton de tip AII.

P15. Canvas

property Canvas: TCanvas;

Furnizează acces la suprafaţa de desenare a formei.

Exemplu:

Următoarea aplicaţie desenează pe forma F orm l, la apăsarea butonului Buttonl, un segment de dreaptă:

procedure TForml.ButtonlClick(Sender: TObject); begin

Canvas.MoveTo(10, 10);Canvas.LineTo(100, 200);

end;

P16. PrintScale

property PrintScale: TPrintScale;

Indică modul în care va fi scalată forma pentru a fi tipărită la impri­mantă. Valori posibile pentru PrintScale sunt:

V a lo a re S em n ifica ţie

PoNone N u are loc nici o scalare.

PoProportional Form a este scala tă astfel încâ t tipărită să a ibă cam aceleaşi dim ensiuni ca şi pe ecran.

PoPrintToFit Form a este scala tă astfel încât să încapă în pag ina pe care este tipărită.

P17. TransparentColor

property TransparentColor: Boolean;

Indică dacă una din culorile folosite la desenarea suprafeţei formei va fi afişată drept transparentă. Aceasta înseamnă că unele porţiuni din formă vor fi transparente, prin ele fiind vizibile alte ferestre. Această facilitate nu funcţionează însă decât pentru versiunile mai noi ale sistemului de operare (cel puţin Windows 2000).

71

P18. TransparentColorValue

property TransparentColorValue: TColor;

Indică culoarea transparentă a formei. Dacă se foloseşte o paletă pe 16 biţi atunci se pot folosi doar culori neamestecate.

PI 9. AlphaBlend

property AlphaBlend: Boolean;

Indică dacă forma este translucidă sau nu. Se permit grade diferite de transluciditate a formei (cu ajutorul proprietăţii AlphaBlendValue).

P20. AlphaBlendValue

property AlphaBlendValue: Byte;

Indică gradul de transluciditate al unei forme. Valoarea 255 indică o formă plină, iar valoarea 0 indică o formă complet invizibilă.

Metode___________________________________________

M l. Show

procedure Show;

Afişează forma. Show setează proprietatea Visible la true.

M2. Hide

procedure Hide;

Ascunde forma. Hide setează proprietatea Visible la false.

Exemplu:

Avem o aplicaţie cu două forme. Aceste forme vor fi create în ordinea adăugării lor la aplicaţie, iar în momentul în care lansăm aplicaţia în execuţie va deveni vizibilă prima formă creată (conform cu ordinea Z). Pe fiecare formă avem la dispoziţie câte un buton la a cărui apăsare forma pe care se află devine invizibilă, iar cealaltă devine vizibilă (ac­tivă). Handlerele de evenimente pentru cele două butoane vor arăta astfel:

72

Pentru Unit 1.p as handlerele de evenimente sunt:

procedure TForml.ButtonlClickfSender: TObject); begin

Hide;Form2.Show;

end;Pentru Unit2.pas handlerele de evenimente sunt:

procedure TForm2.ButtonlClick(Sender: TObject); begin

Hide;Forml.Show;

end;

M3. ShowM odal

function ShowModal: Integer;

Afişează forma ca formă modală. Asta înseamnă că utilizatorul trebuie să închidă această formă pentru ca aplicaţia să poată continua.

Exemplu:

Avem o aplicaţie care are două forme. Pe prima formă se află un buton la a cărui apăsare forma Form2 va fi afişată ca modală. Pe a doua formă se află o cutie de editare în care utilizatorul va introduce un text. După închiderea formei Form2, textul aflat în cutia de editare de pe ea va fi introdus în cutia de editare de pe forma F orm l:

Handlerele de evenimente din Unit 1.pas sunt:

procedure TForml.ButtonlClick(Sender: TObject); begin

Form2.ShowModal ;Editl.Text:=Form2.Editl.Text;

end;iar din unitl.pas sunt:

procedure TForm2.FormShow(Sender: TObject); begin

Editl.Clear;Editl.SetFocus;

end;Unit2.pas trebuie inclus în Unit 1.pas.

M4. CloseQuery

function CloseQuery: Boolean;

73

Returnează o valoare booleană pentru a specifica dacă o formă poate fi închisă sau nu.

M5. Close

procedure Close;

închide o formă. Dacă CloseQuery pentru o formă returnează false, atunci operaţia de închidere a formei nu este posibilă. în caz contrar este apelat evenimentul OnClose.

Observaţie:

închiderea formei principale a unei aplicaţii duce la terminarea apli­caţiei.

M6. Release

procedure Release;

Distruge o formă şi eliberează spaţiul de memorie ocupat de ea. Spre deosebire de Free, Release aşteaptă până în momentul în care execuţiile tuturor handlerelor de evenimente de pe formă sunt terminate.

M7. FocusControl

procedure FocusControl(Control: TWinControl);

Componenta Control devine noua valoare a proprietăţii ActiveControl.

M8. SetFocus

procedure SetFocus;

Face ca forma să devină activă. SetFocus apelează metoda SetFocus a controlului indicat de proprietatea ActiveControl.

M9. Print

procedure Print;

Tipăreşte forma.

Exemplu:

Următorea aplicaţie numără câte componente sunt pe formă. Pentru fiecare componentă se va afişa numele ei şi indexul în cadrul listei de componente.

74

Pentru a realiza acest program ne vom folosi de două cutii de editare: E d itl-pentru a afişa numărul componentelor, ListBoxl- pentru a afişa numele şi indexul unei componente în cadrul vectorului de componente (al formei). Afişările descrise mai sus se vor face la apăsare unui buton (Buttonl).

Unit 1.pas va fi conţine următoarele handlere de evenimente:

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

beginEditl.Text:=IntToStr(ComponentCount); for i:=0 to ComponentCount doListBoxl.Items.Add(Components[i].Name+' '+IntToStr(Components[i].Componentlndex));

end;

Evenimente

El. OnActivate

property OnActivate: TNotifyEvent;

Apare când forma este activată (primeşte focus).

E2. OnDeactivate

property OnDeactivate: TNotifyEvent;

Apare când forma pierde focus-ul (nu mai este activă).

E3. OnShow

property OnShow: TNotifyEvent;

Apare când proprietatea Visible este setată la valoarea true.

E4. OnHide

property OnHide: TNotifyEvent;

Apare când proprietatea Visible este setată la valoarea false.

E5. OnResize

property OnResize: TNotifyEvent;

Apare când forma este redimensionată.

75

E6. OnClose

property OnClose: TCloseEvent;

Apare când forma este închisă. Tipul TCloseEvent este definit astfel:

TCloseEvent = procedure{Sender: TObject;var Action: TCloseAction) of object;

Action indică ce acţiune va fi întreprinsă în momentul în care forma este închisă. Valori posibile pentru Action sunt:

V a lo a re S em n ifica ţie

caNone Form a nu este închisă.

vaHide Form a nu este înch isă ci doar ascunsă.

caMinimize Form a nu este înch isă ci doar m inim izată.

caFree Form a este închisă şi m em oria a locată este eliberată.

O bservaţie:

Dacă forma care se închide nu este forma principală a aplicaţiei atunci, la închidere, Action are valoarea cciHide.

Exemplu:

Dorim să realizăm o aplicaţie care să nu poată fi închisă decât dacă cutia de editare E ditl conţine şirul de caractere ‘12345’. Pentru aceasta handlerul de evenimente OnClose va conţine:

procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);

beginif Editl.Text <> '12345'

then Action := caNone;end;

E8. OnCreate

property OnCreate: TNotifyEvent;

Apare când forma este creată.

E9. OnDestroy

property OnDestroy: TNotilylivent;

Apare când forma este distrusă.

76

E10. OnPaint

property OnPaint: TNotifyEvent;

Apare când forma este redesenată.

7. BUTOANE

Butoanele sunt cele mai frecvente componente utilizate într-o aplicaţie Windows.

Cel mai simplu tip de buton este TButton. El are o etichetă definită de proprietatea Caption. Cele mai multe operaţii şi acţiuni sunt executate la apăsarea unui buton. Codul care se execută la apăsarea unui buton trebuie scris în interiorul handlerului de evenimente OnClick.

TBitBtn este un buton pe suprafaţa căruia se poate desena o imagine. Aceasta va fi specificată prin intermediul proprietăţii Glyph.

Butoanele de tip TSpeedButton pot fi grupate în aşa fel încât, la un moment dat, mai multe dintre ele să se găsească în starea apăsat.

TUpDown este o componentă alcătuită din două butoane folosite pentru a incrementa şi decrementa o valoare numerică. Această valoarea poate fi afişată într-o cutie de editare ataşată controlului prin intermediul proprietăţii Associate.

Ierarhie

TObject -> TPersistent -> TComponent -> TControl -> -> TWinControl -> TButtonControl -> TButton.

Definit în_____________________________________________________

stdctrls.pas

Pagina_______________________________________________________

Standard.

Proprietăţi___________________________________________________

PI. Cancel

property Cancel: Boolean;

Indică dacă butonul este sau nu de tip Cancel. Dacă este un buton Cancel, atunci la apăsarea tastei d is c • se execută handlerul de eveni­

78

mente asociat lui OnClick. Mai multe butoane de pe o aceeaşi formă pot fi în acelaşi timp butoane Cancel. în acest caz, la apăsarea tastei <Esc>, primului buton de tip Cancel vizibil i se va executa handlerul de evenimente asociat evenimentului OnClick.

P2. Default

property Default: Boolean;

Indică dacă butonul este sau nu de tip Default. Dacă este un buton Default, atunci la fiecare apăsare a tastei Enter, se execută handlerul de evenimente asociat lui OnClick. Excepţie de la aceasta se face în momentul în care un alt buton are focus (pe el este desenat punctat un dreptunghi), în acest caz executându-se handlerul asociat butonului selectat. Dar, în cazul în care nici un buton nu este selectat, sau un alt control este activ, la apăsarea tastei Enter se execută handlerul de evenimente asociat butonului Default. Cazul cu mai multe butoane Default este tratat ca şi cazul cu mai multe butoane Cancel.

P3. M odalResult

property ModalResult: TModalResult;

Indică dacă şi cum închide butonul forma (modală) părinte. Când butonul este apăsat, proprietatea ModalResult a formei părinte este setată la aceeaşi valoare ca şi proprietatea ModalResult a butonului.

Metode

M l. Click

procedure Click;

Simulează execuţia unui click pe care utilizatorul l-ar fi executat. Han- dlerele asociate cu evenimentul OnClick sunt de asemenea executate.

Exemplu:

Următoarea aplicaţie foloseşte un buton TButton şi o cutie TColorDialog. La apăsarea butonului, cutia va fi deschisa. Se va putea alege o culoare care va deveni culoarea formei.

79

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

procedure TForml.ButtonlClick(Sender: TObject); begin

if ColorDialogl.Execute then Forml.Color:=ColorDialogl.Color;

end;

7.2. TBitBtn

Este un buton pe suprafaţa căruia se poate desena o imagine.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TButtonControl -> TButton -> TBitBtn.

Definit în_____________________________________________________

buttons.pas

Pagina______________________________________________________

Additional.

Proprietăţi___________________________________________________

PI. Glyph

property Glyph: TBitmap;

Specifică imaginea de pe suprafaţa unui buton. Glypli poate conţine un bitmap care, la rândul lui, poate conţine maxim patru imagini care vor fi puse pe buton în cele patru situaţii în care acesta se poate găsi:

• prima imagine din listă se va pune pe buton atunci când acesta este neselectat;

• a doua imagine va li pusă pe bulon atunci când acesta nu este accesibil utilizatorului;

• a treia imagine va li pusă atunci când butonul este apăsat;• a patra imagine este pusă când butonul se allă în starea apăsat,

indicând că respectiva opţiune esle încă selectată.

Cele maxim patru imagini pe care le poale conţine bitmap-ul ataşat lui Glyph sunt de aceeaşi dimensiune şi sunt dispuse pe orizontală în cadrul bitmap-ului respectiv.

80

P2. NumGlyphs

property NumGlyphs: TNumGlyphs;

Indică numărul de imagini care se găsesc în bitmap-ul proprietăţii Glyph.

P3. Kind

property Kind: TBitBtnKind;

Indică tipul butonului. Valorile pe care le poate lua Kind împreună cu descrierea, eticheta, ModalResult şi descriere imagine sunt următoarele:

Valoare bkA bort

Semnificaţie Buton de tip Cancel.

Etichetă A bort

ModalResult m rA bort

Descriere imagine Un X roşu apare lângă titlu.

Valoare bkAll

SemnificaţieB uton OK. cu e ticheta AII. Toate schim bările apărute pe form a care conţine acest buton sunt acceptate, iar apoi fo rm a este închisă.

Etichetă AII

ModalResult m rA ll

Descriere imagine Un sem n dublu de bifare apare lângă titlu.

Valoare bkC ancel

Semnificaţie B uton de tip Cancel.

Etichetă C ancel

ModalResult m rC ancel

Descriere imagine Un X roşu apare lângă etichetă.

Valoare bkC lose

Semnificaţie B uton de tip Default.

Etichetă Close

ModalResult m rC lose

Descriere imagine O uşă de culoarea levănţicii cu un sem n verde de ieşire deasupra.

Valoare bklgnore

81

SemnificaţieC rează un buton fo losit pentru a ignora schim bările şi pentru a con tinua cu o acţiune specificată.

Etichetă Ignore

ModalResult m rlgnore

Descriere imagine U n om co lo ra t în verde p lecând.

Valoare bkH elp

Semnificaţie

Buton cu e tichcta Help. C ând u tilizatorul apasă acest buton fişierul help ataşat acestei aplicaţii devine activ. F işierul de H elp este specificat în p roprietatea HelpFile a lui TAplication.

Etichetă Help

ModalResult m rH elp

Descriere imagineUn sem n de întrebare albastru apare lângă titlu. Folosiţi handlerul de evenim ente al acestui buton pen tru a apela un fişier Help.

Valoare bkC ustom

Semnificaţie0 puteţi folosi pentru a vă crea propriul dum neavoastră buton, pe care să specificaţi o im agine.

Etichetă

ModalResult

Descriere imagine

Valoare bkR etry

SemnificaţieForm a nu este închisă, datele introduse de utilizator fiind incorecte.

Etichetă Retry

ModalResult m rR etry

Dcscricre imagine O săgeată circu lară verde.

Valoare bkOK

Semnificaţie Bulon dc lip Default.

Etichetă OK

ModalResult mrOK

Descriere imagine Un sem n verde dc hilare.

82

Valoare bkN o

SemnificaţieButon de tip Cancel. N ici una d in sch im bările care au in tervenit pe form a care conţine acest buton nu sunt acceptate, iar form a este închisă.

Etichetă No

ModalResult m rN o

Descriere imagine Un cerc roşu tăiat.

Valoare bkY es

Semnificaţie B uton de tip Default.

Etichetă Yes

ModalResult m rY es

Descriere imagine Un sim plu sem n de bifare.

Exemplul 1:

Să creăm o aplicaţie cu două forme. Pe prima formă se află un singur buton (B utton l) la a cărui apăsare forma Form2 este afişată modală. Dorim să determinăm cum a fost închisă forma Form2.

Handlerul de evenimente pentru evenimentul OnClick al butonului Buttonl de pe forma F orm l este următorul:

procedure TForml.ButtonlClick(Sender: TObject);var a:integer;

begina;=Form2.ShowModal; case a ofmrOk : ShowMessage('Form2 a fost inchisa prin Ok.1); mrCancel : ShowMessage(1Form2 a fost inchisa

prin Cancel.');end;

end;Pe forma Form2 am aşezat două butoane de tip TButton. La apăsarea primului buton (B utton l) forma Form2 va primi valoarea modală mrOk, iar la apăsarea lui Button2 va primi valoarea modală mrCancel. După atribuirea uneia dintre cele două valori forma Form2 se va închide.

Handlerele de evenimente pentru forma Form l sunt:

procedure TForm2.ButtonlClick(Sender; TObject); beginModalResult:=mrOk;

end;

83

procedure TForm2.Button2Click(Sender: TObject); begin

ModalResult:=mrCancel ; end;

Exemplul 2:

Dacă foloseam butoane de tip TBitBtn pentru forma Form2 din Exemplul 1, nu mai trebuia să scriem nici un rând de cod sursă pentru forma Form2. în locul butoanelor Buttonl şi Button2 folosim două butoane de clasă TBitBtn la care setăm proprietatea Kind astfel:

object BitBtnl: TBitBtn Kind = bkOK

endobject BitBtn2: TBitBtn Kind = bkCancel

end

P4. Layout

property Layout: TButtonLayout;

Indică amplasamentul imaginii faţă de textul afişat pe buton. Valori posibile pentru Layout sunt:

Valoare Semnificaţie

BIGlyphLef Im aginea apare la stânga textului.

BIGlyphRight Im aginea apare la d reapta textului.

BlGlypliTop Im aginea apare deasupra textului.

BtGlyphBollimi Im aginea apare sub text.

P5. Spacing

property Spacing: Integer;

Indică numărului de pixeli dintre textul şi imaginea de pe buton. Dacă este selectat 0 atunci imaginea începe chiar lângă text. Dacă va fi selectat -1 sau numere mai mici decât -1 atunci imaginea şi textul vor fi centrate.

P6. Margin

property Margin: Integer;

Indică numărului de pixeli dintre margine şi imaginea de pe buton. Dacă este selectat 0 atunci imaginea începe chiar din margine. Dacă va fi selectat -1 sau numere mai mici decât I atunci imaginea va li centrată.

Este un buton care introduce proprietăţi ce permit lucrul în comun a mai multor componente de acest tip.

Ierarhie _____________ ____________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TSpeedButton.

Definit în __________ ____________________________________

buttons.pas

Pagina __________________________________________

Additional.

Proprietăţi___________________________________________________

PI. Glyph

property Glyph: TBitmap;

Specifică imaginea de pe suprafaţa unui buton. Glyph poate conţine un bitmap care, la rândul lui, poate conţine maxim patru imagini, care vor fi puse pe buton în cele patru situaţii în care acesta se poate găsi:

• prima imagine din listă se va pune pe buton atunci când acesta este neselectat;

• a doua imagine va fi pusă pe buton atunci când acesta nu este accesibil utilizatorului;

• a treia imagine va fi pusă atunci când butonul este apăsat;• a patra imagine este pusă când butonul se află în starea apăsat,

indicând că respectiva opţiune este încă selectată.

Cele maxim patru imagini pe care le poate conţine bitmap-ul ataşat lui Glyph sunt de aceeaşi dimensiune şi sunt dispuse pe orizontală în cadrul bitmap-ului respectiv.

P2. NumGlyphs

property NumGlyphs:

Indică numărul de imagini care se găsesc în bitmap-ul proprietăţiiGlyph.

85

P3. Layout

property Layout: TButtonLayout;

Indică poziţia imaginii faţă de textul afişat pe buton. Valori posibile pentru Layout sunt:

Valoare Semnificaţie

BIGlyphLeft Im aginea apare la stânga textului.

BIGlyphRight Im aginea apare la d reap ta textului.

BIGlyphTop Im aginea apare deasupra textului.

BIGlyphBottom Im aginea apare sub text.

P4. Margin

property Margin: Integer;

Indică numărului de pixeli dintre margine şi imaginea de pe buton. Dacă este selectat 0, atunci imaginea începe chiar din margine. Dacă va fi selectat -1 sau numere mai mici decât -1 atunci imaginea va fi centrată.

P5. Spacing

property Spacing: Integer;

Indică numărului de pixeli dintre textul şi imaginea de pe buton. Dacă este selectat 0 atunci imaginea începe chiar lângă text. Dacă va fi selectat -1 sau numere mai mici decât -1 atunci imaginea şi textul vor fi centrate.

P6. Grouplndex

property Grouplndex: Integer;

Permite butoanelor să lucreze împreună ca un grup. Dacă Grouplndex este 0, atunci butonul se comportă independent de celelalte butoane. Dacă Grouplndex este mai mare decât zero, atunci butoanele vor fi grupate. Apăsarea unuia dintre acestea va duce automat la deselectarea (ridicarea) celorlalte din acelaşi grup. Mai multe informaţii găsiţi la proprietatea AllowAllUp.

P7. AllowAllUp

property AllowAllUp: Boolean;

Indică dacă toate butoanele din acelaşi grup pot fi neselectate în acelaşi timp. Dacă AllowAllUp este false, atunci, în fiecare moment, cel puţin

86

un buton din grup este apăsat (jos). Setarea valorii lui AllowAllUp pentru un buton din grup va duce la setarea, cu aceeaşi valoare, a proprietăţii AllowAllUp, pentru toate butoanele din grup.

P8. Down

property Down: Boolean;

Indică dacă un buton este jos.

7.4. TUpDown

Este un control ce conţine două săgeţi folosite pentru a incrementa sau decrementa o valoare numerică. Acest control se poate asocia cu alt control, de exemplu cu o cutie de editare, pentru ca valoarea numerică (care poate fi incrementată sau decrementată) să poată fi vizualizată.

I e r a r h i e __________________________________________

TObject -> TPersistent ->TComponent->TControl-> TWinControl ->-> TCustomUpDown -> TUpDown.

Definit în_____________________________________________________

comctrls.pas

Pagina_______________________________________________________

Win32

Proprietăţi___________________________________________________

PI. AlignButton

property AlignButton: TUDAlignButton;

Determină poziţia controlului UpDown faţă de controlul cu care este asociat. Valori posibile pentru AlignButton sunt:

udLeft - controlul UpDown se aliniază la partea din stânga a contro­lului asociat lui;

udRight - 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 afişa valoarea numerică pe care controlul UpDown o poate modifica (incrementa sau decrementa). De exemplu, pentru a asocia un control UpDown (U pD ow nl) cu o cutie de editare (E d itl) scriem linia (sau lucrăm de la Object Inspector):

U pD ow n->A ssociate=E ditl;

Astfel, la lansarea în execuţie a aplicaţiei, în partea dreaptă (implicit) a cutiei de editare (E ditl) ne va apare un control de tip UpDown, iar în interiorul cutiei Editl va apare cifra 0 (implicit) care poate fi mărită sau micşorată la fiecare apăsare a săgeţilor controlului UpDown.

P3. Position

property Position: Smalllnt;

Indică valoare curentă care este reglată de controlul TUpDown. Dacă controlul are asociată o cutie de editare, atunci valoarea lui Position este cea afişată în respectiva cutie de editare, deci din interiorul cutiei poate fi prelucrată prin intermediul proprietăţii Text a Jui TEdit.

P4. Increment

property Increment: Integer;

Indică numărul de unităţi adăugate sau scăzute la valoarea lui Position , în urma unei apăsări a săgeţilor controlului TUpDown. Valoarea implicită este 1.

P5. Max

property Max: Smalllnt;

Indică valoarea maximă pe care o poate lua Position.

P6. Min

property Min: Smalllnt;

Indică valoarea minimă pe care o poate lua Position.

88

P7. Orientation

property Orientation: TUDOrientation;

Specifică orientarea controlului. Valori posibile pentru Orientation sunt:

V a lo a re S em n ifica ţie

UdHorizontal C ontro lu l este a lin ia t orizontal.

UdVertical C ontro lu l este am plasat vertical.

Exemplu:

Următorul exemplu foloseşte o cutie TfileListBox (care listează fişierele din directorul curent), o cutie de editare (Edit2) care conţine numele fişierului selectat, un control TUpDown şi o cutie de editare E ditl (care este ataşată controlului TUpDown). Fişierul curent selectat este cel cu numărul de ordine egal cu valoarea proprietăţii Position, deci la apăsarea butoanelor controlului TUpDown se modifică fişierul selectat. Totodată utilizatorul poate selecta el însuşi un fişier (cu ajutorul mouse-ului) modificând astfel valoarea lui Position.

Valorile proprietăţilor obiectului U pDownl sunt:

object UpDownl: TUpDown Associate = Editl Min = 0 Position = 0

end

Handlerele de evenimente pentru Form l sunt:

procedure TForml .UpDownlClick(Sender: TObject;Button: TUDBtnType);

beginFileListBoxl.Itemlndex:=StrToInt(Editl.Text);Edit2.Text:=

FileListBoxl.Items.Strings[FilelistBoxl.Itemlndex];end;

procedure TForml.FormCreate(Sender: TObject); beginUpDownl.Max:=FileListBoxl.Items.Count-1;Edit2.Text:=FileListBoxl.Items.Strings[ 0 ] ;FileListBoxl.Itemlndex:= 0;

end;

procedure TForml.FileListBoxlClick(Sender: TObject); beginUpDownl.Position:=FileListBoxl.Itemlndex;Edit2.Text:=

FileListBoxl.Items.Strings [FileListBoxl .Itemlndex]

89

end;

P8. Wrap

property Wrap: Boolean;

Specifică ce se întâmplă cu valoarea lui Position dacă aceasta este incrementată peste valoarea lui Max, sau decrementată sub valoarea lui Min. Dacă Wrap este true, atunci Position - dacă este incrementat peste valoarea lui Max - ia valoarea lui Min, - iar dacă este decrementat sub valoarea lui Min - ia valoarea lui Max. Dacă Wrap este false, atunci incrementarea/decrementarea valorii lui Position peste/sub Max/Min nu va duce la modificarea acesteia.

P9. ArrowKeys

property ArrowKeys: Boolean;

Specifică dacă controlul reacţionează la comenzile lansate de la săgeţile tastaturii. Dacă este selectat true, atunci - în cazul în care este asociat cu un alt control (de exemplu cu TEdit) - controlul răspunde la comenzile săgeţilor sus-jos ale tastaturii. Dacă este selectat false, atunci asupra controlului se poate acţiona doar cu mouse-ul.

90

8. ETICHETE

Sunt componente folosite pentru afişarea unui text pe formă. Şirul afişat este stocat de proprietatea Caption.

Etichetele sunt folosite şi pentru a indica utilitatea altor componente. Spre exemplu, etichetele se pot amplasa lângă (deasupra sau la stânga) 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 TGrapliicControl deci programatorul are acces la

suprafaţa de desenare a acesteia.TStaticText derivă din TWinControl şi deci are un handle de fereastră.

8.1. TLabel A

Este un control fără fereastră folosit pentru a afişa text pe o formă. Acest text poate fi folosit pentru a eticheta alte componente.

Atribuirea unei valori proprietăţii Caption este echivalentul desenării unui text pe componenta părinte.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TCustomLabel -> TLabel.

Definit în_____________________________________________________

stdctrls.pas

Pagina_______________________________________________________

Standard

Proprietăţi___________________________________________________

PI. Alignment

property Alignment: TAlignment;

91

Controlează aliniamentul textului faţă de marginile din stânga respectiv dreapta ale etichetei. Valori posibile pentru Alignment sunt:

V a lo a re S em n ifica ţie

taLeftJustify T extu l apare a lin ia t de-a lungul m arginii stângi a etichetei.

taRiglitJustify T extul apare alin iat de-a lungul m arginii d rep te a etichetei.

taCenter T extul apare centra t faţă de etichetă.

P2. AutoSize

property AutoSize: Boolean;

Indică dacă dimensiunile etichetei se modifică automat, în funcţie de dimensiunea textului. Dacă AutoSize este false, atunci eticheta are dimensiuni fixe, în caz contrar aceasta se poate acomoda în funcţie de înălţimea şi lăţimea textului.

P3. FocusControl

property FocusControl: TWinControl;

Indică componenta asociată cu această etichetă. Dacă este specificat un accelerator pentru etichetă, atunci, la apăsarea lui, controlul FocusControl va primi focus. Un accelerator se specifică prin amplasa­rea unui ampersand (&) înainte de un caracter din textul ataşat etichetei. Acest caracter va fi subliniat.

P4. ShowAccelChar

property ShowAccelChar: Boolean;

Indică cum este interpretat un ampersand. Dacă ShowAccelChar este true, atunci orice caracter precedat de un ampersand va fi afişat subliniat, iar ampersandul respectiv nu va fi afişat. Pentru a afişa un ampersand când ShowAccelChar este true, scrieţi doi ampersanzi unul lângă altul (&&). Dacă FocusControl are atribuită o valoare, atunci, la apăsarea literei subliniate, controlul va fi trecut la FocusControl.

Exemplu:

Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate un buton (Buttonl), o cutie de editare (Edit l ) şi două etichete (L abel!, Label2) folosite pentru a trece focus-ul de la E ditl la Buttonl (cu ajutorul acceleratorului lui Labei!) şi invers (cu ajutorul acceleratorului lui Label2). Titlurile etichetelor vor fi Label1 şi Label2; la prima etichetă vom avea subliniată litera 'L', iar la cea de-a doua litera 'a'.

92

D acă focus-ul se află la cutia de editare şi utilizatorul doreşte să treacă controlul la buton, atunci o simplă apăsare a literei subliniate (în cazul nostru este litera 'L') nu este suficientă, deoarece acest lucru va fi interpretat ca introducerea unui text în cutia de editare. Pentru ca totuşi controlul să fie transferat la buton este necesară apăsarea combinaţiei de taste Alt+LiteraSubliniată. Dacă controlul se află la buton şi se doreşte trecerea la cutia de editare, atunci simpla apăsare a literei subliniate va produce schimbarea focus-ului.

Valorile proprietăţilor componentelor Labell şi Label2 sunt:object Labell: TLabel

Caption = 'iLabell'FocusControl = Buttonl

endobject Label2: TLabel Caption = 'L&abel2'FocusControl = Editl

end

Observaţie:

De obicei, un buton nu are nevoie de o etichetă separată, proprietatea Caption fiind propria lui etichetă. Dacă dorim să executăm codul ataşat evenimentului unui buton, atunci setăm unul dintre caracterele din şirul proprietăţii Caption ca tastă de accelerare. La apăsarea acelei taste (sau a combinaţiei Alt+Tastă dacă focusul se află curent într-o cutie de editare) se va executa handlerul de evenimente al butonului respectiv. Spre exemplu, considerând valorile proprietăţilor obiectelor de pe formă setate astfel:

object Label2: TLabel Caption = '&Label2'FocusControl = Editl

endobject Buttonl: TButton Caption = '&Buttonl'OnClick = ButtonlClick

endiar handlerul evenimentului OnClick al butonului B u tton l:

procedure TForml.ButtonlClick(Sender: TObject); begin

ShowMessage('Am fost apasat'); end;

atunci la apăsarea tastei <b>, respectiv <Alt>+<b>, se va executa hand­lerul pentru evenimentul OnClick.

93

P5. Transparent

property Transparent: Boolean;

Specifică dacă ceea ce se află în spatele etichetei poate fi văzut 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 aşeza o etichetă care are proprietatea Transparent setată la valoa­rea false.

Exemplu:

Deoarece TLabel derivă din TGraphicControl, înseamnă că avem acces la suprafaţa ei de desenare (Canvas). Următoarea aplicaţie desenează - la apăsarea unui buton - o elipsă delimitată de marginile etichetei.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Label1: TLabel Width = 134

endobject Buttonl: TButton

Caption = 'Deseneaza!' end

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

procedure TForml.ButtonlClick(Sender: TObject); begin

with Label1.Canvas do begin

Pen.Color := clRed;Ellipse(0,0,Label1.Width,Label1.Height);Canvas.Pen.Color := clBlack;

Este un control care afişează un text pe o formă. Spre deosebire de TLabel, componenta TStaticText are propria ei fereastră (adică derivă din TWinControl).

end;end;

8.2. TStaticText

Ierarhie

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomStaticText -> TStaticText.

94

Definit în

stdctrls.pas

Pagina

Additional

Proprietăţi___________________________________________________

PI. Alignment

property Alignment: TAlignment;

Controlează aliniamentul textului faţă de marginile din stânga respectiv dreapta ale etichetei. Valori posibile pentru Alignment sunt:

V a lo a re S em nifica ţie

taLeftJustify Textul apare a lin iat de-a lungul m arginii stângi a etichetei.

taRightJustify T extul apare aliniat de-a lungul m arginii drepte a etichetei.

taCenter Textul apare centrat faţă de etichetă.

P2. AutoSize

property AutoSize: Boolean;

Indică dacă dimensiunile etichetei se modifică automat, în funcţie de dimensiunea textului. Dacă AutoSize este false, atunci eticheta are dimensiune fixe, în caz contrar aceasta se poate acomoda în funcţie de înălţimea şi lăţimea textului.

P3. BorderStyle

property BorderStyle: TStaticBorderStyle;

Indică felul în care apar marginile controlului. Valori posibile pentru BorderStyle sunt:

V a lo a re S em n ifica ţie

sbsNone Nu apare nici o m argine.

sbsSingle M argine form ată d intr-o singură linie.

sbsSunken M argine scufundată.

P4. FocusControl

property FocusControl: TWinControl;

95

Este controlul asociat cu această etichetă. Dacă este specificat un accelerator pentru etichetă, atunci, la apăsarea lui, controlul FocusControl va primi focus. Un accelerator (sau tastă de accelerare) se specifică prin amplasarea unui ampersand înainte de un caracter din textul ataşat etichetei. Acest caracter va fi subliniat.

ShowAccelChar

property ShowAccelChar: Boolean;

Indică cum este interpretat un ampersand. Dacă ShowAccelChar este true, atunci orice caracter precedat de un ampersand (&) va fi afişat subliniat, iar ampersandul respectiv nu va fi afişat. Pentru a afişa un ampersand când ShowAccelChar este true, scrieţi doi ampersanzi unul lângă altul (&&). Dacă şi FocusControl are atribuită o valoare, atunci, dacă utilizatorul apasă litera subliniată, controlul va fi trecut la FocusControl.

9. CUTII DE EDITARE

Cutiile de editare sunt componente folosite pentru preluarea unui text introdus de către utilizator. Uneori sunt folosite pentru afişarea unui text ce poate fi apoi editat.

Cutiile de editare pot fi împărţite după mai multe criterii:

a. După numărul de linii în care se introduce textul:

- cu o singură linie (TEdit, TMaskEdit)

Utilizatorul poate introduce un text pe o singură linie. Se poate accesa textul afişat în cutia de editare folosind 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 porţiuni din textul introdus.

9.1. TStrings

Este o clasă abstractă reprezentând o listă de şiruri de caractere.Metodele şi proprietăţile abstracte introduse de TStrings sunt implemen­

tate în clasa TStringList.

Ierarhie______________________________________________________

TObject -> TPersistent -> TStrings.

Definit în____________________________________________________

classes.pas

97

Proprietăţi___________________________________________________

P I. Count

property Count: Integer;

Indică numărul de şiruri din listă. Este o proprietate abstractă care trebuie implementată de către clasele derivate.

P2. Strings

property Strings[/ndex: Integer]: string;

Strings referă şirul cu numărul de ordine Index din listă. Primul şir are indexul 0.

P3. Text

property Text: string;

Text este un şir obţinut prin concatenarea tuturor şirurilor din listă. Şirurile componente sunt delimitate între ele prin CR (Carriage Return) şi LF (Line Feed).

P4. CommaText

property CommaText: string;

CommaText concatenează toate şirurile în unul singur în format SDF (System Data Format). în formatul SDF, şirurile sunt despărţite prin virgulă.

Exemplu:

Pentru a evidenţia diferenţa dintre proprietăţile Text şi CommaText, vom considera următorul exemplu: la apăsarea unui buton, vom afişa într-o cutie de editare conţinutul unei componente TMemo folosind, la alegere dintr-un TRadioGroup, aceste două proprietăţi.

Valorile proprietăţilor obiectelor de pe formă sunt:

object Memol: TMemo Lines.Strings = (

'Istorie''Geografie''Limba Romana''Informatica 1 'Educaţie Fizica')

end

98

object Editl: TEdit Text = 'Editl'

endobject BitBtnl: TBitBtn OnClick = BitBtnlClick

endobject RadioGroupl: TRadioGroup Caption = 'Proprietatea folosita'Items.Strings = (

'Text''CommaText')

TabOrder = 3 end

Când folosim proprietatea Text în cutia de editare ne va apare:

Istorie||Geografie||Limba Romana||Informatica||Educatie Fizica,

unde '||' semnifică caracterele CR şi LF.Dacă folosim proprietatea CommaText, în cutia de editare ne va apare:

Istorie,Geografie,"Limba Romana",Informatica,"Educaţie Fizica".

O bservaţie:

Spre deosebire de proprietatea Text, proprietatea CommaText separă prin virgula şirurile existente, iar dacă unul dintre şiruri este format din mai mult de un cuvânt (chiar şi un cuvânt urmat de caracterul spaţiu) îl încadrează între ghilimele. De asemenea, dacă în şir sunt conţinute ghilimele, acestea se vor dubla. Dacă două virgule apar una după alta, înseamnă că acolo se afla un şir vid, iar dacă după virgulă apare un spaţiu, acesta este ignorat.

Metode

M l. Add

function Add(const 5: string): Integer; virtual;

Adaugă un şir la sfârşitul listei şi întoarce numărul lui de ordine în această listă.

M2. AddStrings

procedure AddStrings(5îwigj: TStrings); virtual;

Adaugă o mulţime de şiruri (un alt obiect de tip TStrings) la sfârşitul listei curente.

99

M3. Append

procedure Append(const S: string);

Adaugă un şir la sfârşitul listei. Această metodă este asemănătoare cu Add, singura diferenţă este că Append nu returnează numărul de ordine al şirului adăugat.

M4. Clear

procedure Clear; virtual; abstract;

Goleşte o listă cu stringuri. Descendenţii lui TStrings trebuie să imple­menteze această metodă pentru a şterge şirurile din listă.

M5. Delete

procedure Delete(Index: Integer); virtual; abstract;

Şterge şirul cu numărul de ordine Index din listă.

M6. Equals

function Equals(S'm/ig.v: TStrings): Boolean;

Determină dacă două liste de şiruri sunt egale. întoarce true dacă cele două sunt identice. întoarce false în următoarele cazuri:

- numărul de şiruri din liste diferă,- două şiruri de pe aceeaşi poziţie diferă.

M7. Exchange

procedure Exchange(Indexl, Index2: Integer); virtual;

Schimbă între ele două şiruri din listă. Acestea sunt identificate prin poziţiile lor (Indexl şi Index2) în cadrul listei de şiruri.

M8. IndexOf

function IndexOf(const S: string): Integer; virtual;

Returnează numărul de ordine al unui şir în cadrul listei. Primul şir din cadrul listei are numărul de ordine 0. Dacă şirul nu se găseşte în listă se returnează valoarea -1.

100

M9. Insert

procedure Insert {Index: Integer; const S: string); virtual; abstract;

Inserează şirul S pe poziţia Index în cadrul listei.

M10. Move

procedure Move.(CurIndex, Newlndex: Integer); virtual;

Mută stringul de pe poziţia Curlndex pe poziţia Newlndex.

M II . LoadFromFile

procedure LoadFromFile(const FileName: string); virtual;

încarcă o listă de şiruri cu liniile unui fişier având numele FileName. Fiecare linie din fişier va fi un şir din listă.

M 12. SaveToFile

procedure SaveToFile(const FileName: string); virtual;

Salvează şirurile dintr-o listă într-un fişier cu numele FileName. Fiecare string din listă va fi pus pe o linie nouă în fişier.

9.2. TStringList

Implementează metodele şi proprietăţile abstracte ale lui TStrings. Totodată introduce metode şi proprietăţi noi.

Ierarhie

TObject -> TPersistent -> TStrings -> TStringList.

Definit în_____________________________________________________

classes.pas

Proprietăţi___________________________________________________

P I. Sorted

property Sorted: Boolean;

Indică dacă lista de şiruri este sortată automat. Dacă Sorted este false, atunci şirurile pot fi sortate crescător folosind metoda Sort. Dacă Sorted

101

este tru e atunci metoda Insert îşi pierde valabilitatea, în acest caz însă putând fi folosită metoda A dd care adăugă şirul pe poziţia corectă astfel încât listă să rămână tot ordonată.

P2. Duplicates

property Duplicates: TDuplicates;

Specifică dacă şiruri dubluri pot fi adăugate la o listă sortată. Valori posibile pentru această proprietate sunt:

V a lo a re S em n ifica ţie

duplgnore N u este perm isă adăugarea de duplicate în listă.

dupErrorA dăugarea în listă a unui şir de ja ex isten t generează o excepţie de clasă ElÂslError.

dupAccept Sunt acceptate dubluri de şiruri ale listei.

Metode______________________________________________________

M l. Sort

procedure Sort; virtual;

Sortează şirurile dintr-o listă care are proprietatea Sorted setată la valoarea false.

9.3. TEdit

Este un control care permite afişarea de text către utilizator sau permite preluarea textului pe care utilizatorul îl tastează.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomEdit -> TEdit.

Definit în_______________________________________________ _

stdctrls.pas

Pagina______________________________________________________

Standard

102

Proprietăţi

P I. Auto Select

property AutoSelect: Boolean;

Dacă AutoSelect este true, atunci în momentul în care cutia de editare devine activă, tot textul conţinut în ea va fi marcat (selectat), în caz contrar textul nu va fi marcat.

P2. AutoSize

property AutoSize: Boolean;

Determină dacă înălţimea cutiei de editare se acomodează cu textul din ea. Dacă AutoSize este true, dimensiunea cutiei se modifică dacă apare un eveniment care ar determina-o să facă acest lucru (de exemplu schim­barea mărimii fontului). Dacă AutoSize este false, atunci înălţimea cutiei este fixă.De exemplu, dacă AutoSize este false, schimbând mărimea fontului cu care este scris textul din interiorul cutiei (de exemplu la 20), aceasta va arăta în felul următor:

iar dacă AutoSize este true, la mărirea fontului cutia s-ar acomoda şi ea:

EditlP3. CharCase

property AutoSize: Boolean;

Determină tipul textului dintr-o cutie de editare. Valori permise pentru CharCase sunt:

Valoare Semnificaţie

ecLowerCa.se T extul este convertit au tom at la caractere mici.

ecUpperCase T extul este convertit la caractere mari.

ecNormal T extul este m ixt (caractere m ari şi mici).

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

103

P4. HideSelection

property HideSelection: Boolean;

Indică dacă marcajul unui text mai este vizibil, după ce controlul este trecut la altă componentă. Dacă HideSelection este false, atunci chiar dacă controlul este la altă componentă, marcajul unui text din cutia de editare este în continuare vizibil.

P5. MaxLength

property MaxLength: Integer;

Specifică lungimea maximă pe care o poate avea un text dintr-o cutie de editare. Dacă această valoare este 0, atunci nu există limită privitoare la lungimea textului. în cazul în care lungimea textului introdus înainte de lansarea în execuţie a aplicaţiei care conţine cutia de editare cu pricina este mai mare decât MaxLength, textul nu va fi trunchiat. Dacă încercaţi să introduceţi un text de lungime mai mare decât MaxLength nu veţi fi lăsat. Folosiţi această facilitate pentru a copia text într-un şir de lungime fixă.

P6. M odified

property Modified: Boolean;

Indică dacă textul dintr-o cutie de editare a fost modificat.

P7. PasswordChar

property PasswordChar: Char;

Indică caracterul care va fi folosit pentru a fi afişat în locul altor carac­tere. Dacă PasswordChar conţine caracterul vid, atunci va fi afişat textul normal, în caz contrar fiecare caracter va fi înlocuit cu caracterul din PassswordChar. Această facilitate este folosită pentru ca un anumit text (parola) să nu fie văzut şi de alte persoane. Textul tastat poate fi mani­pulat, bineînţeles, cu proprietatea Text.

Exem plu:

Următoarea aplicaţie constă dintr-o cutie de editare (E ditl) în care utilizatorul trebuie să introducă o parolă. Pentru ca textul introdus să nu fie descifrabil setăm proprietatea PasswordChar a lui E ditl la valoarea

La apăsarea lui Buttonl se face validarea parolei.

104

Obiectele de pe forma Form l au setate următoarele proprietăţi:

object Editl: TEdit PasswordChar = ' * '

endobject Buttonl: TButton Default = True OnClick = ButtonlClick

endHandlerele de evenimente pentru Form l sunt:

procedure TForml.FormActivate(Sender: TObject) begin

Editl.Clear;Editl.SetFocus;

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

if Editl.Text=112345' then ShowMessage('Parola corecta') else ShowMessage('Parola incorecta');

end;După lansarea în execuţie a aplicaţiei controlul este trecut la cutia de editare E ditl în care trebuie introdusă parola.

P8. ReadOnly

property ReadOnly: Boolean;

Specifică dacă utilizatorul poate modifica textul dintr-o cutie de editare. Dacă ReadOnly este true, atunci utilizatorul poate doar citi acel text, fară a-1 putea modifica.

P9. SelLength

property SelLength: Integer;

Indică numărul de caractere care vor fi marcate (selectate), începând cu poziţia SelStart. Dacă SelLength + SelStart depăşeşte numărul de caractere existente, atunci vor fi marcate toate până la sfârşitul textului.

P10. SelStart

property SelStart: Integer;

Indică poziţia primului caracter ce va fi marcat. Primul caracter din text are poziţia 0. Dacă nu se atribuie lui SelLength o valoare, atunci SelStart va conţine poziţia cursorului.

105

P i l . SelText

property SelText: string;

SelText indică textul marcat. Citiţi această valoare pentru a afla textul marcat sau setaţi această valoare pentru ca textul marcat să fie înlocuit cu noul text.

Exemplu:

Următorul program foloseşte două cutii de editare (E ditl şi Edit2) şi un buton (Buttonl). La apăsarea acestuia, se selectează a doua jumătate a textului din cutia de editare E ditl şi se copiază în Edit2. La crearea formei se videază textele celor două cutii de editare.

Valorile proprietăţilor obiectelor de pe Form l sunt următoarele:

object Editl: TEdit Text = 'Editl'

endobject Edit2: TEdit Text = 'Edit2'

endobject Buttonl: TButton

Caption = 'Muta text selectat'OnClick = ButtonlClick

endHandlerele de evenimente pentru obiectele de pe forma Form l sunt:

procedure TForml.FormActivate(Sender: TObject); begin

Edi tl. Clear; II se videază prima cutie de editare ■Edit2 . Clear; // se videază a doua cutie de editareEditl. SetFocus; IIprim a cutie devine activa

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

Editl.SelStart:=(Length(Editl.Text)) div 2;/ / se poziţionează cursorul Ia jumatatea

II textului din prima cutie de editare Editl.Se1Length:=Length(Editl.Text);/ / se selectează a doua jum atate a textului Edit2 .Text: =edi tl . se.l text ;II se copiază textul selectat in a doua cutie de editare Editl.SelText:='';II din prima cutie de editare se şterge a II doua jum atate a textului

end;

106

Metode

M l. Clear

procedure Clear; virtual;

Şterge tot textul din cutia de editare.

M2. ClearSelection

procedure ClearSelection;

Şterge tot textul marcat din cutia de editare.

M3. CopyToClipboard

procedure CopyToClipboard;

Copiază textul marcat în ClipBoard.

M4. CutToClipboard

procedure CutToClipboard;

Copiază textul marcat în ClipBoard, iar apoi îl şterge din cutia de editare.

M5. PasteFrom Clipboard

procedure PasteFromClipboard;

înlocuieşte textul marcat cu textul din ClipBoard. Dacă nu există text marcat, atunci textul din ClipBoard este inserat la poziţia actuală a cursorului. Dacă în ClipBoard nu există nimic, atunci PasteFrom Clipboard nu face nimic.

Exem plu:

Următorul exemplu execută aceeaşi operaţie ca şi precedentul, dar de data aceasta transferul textului de la o cutie de editare la alta se face prin intermediul Clipboard-ului:

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g i n

Editl.SelStart:=Length(Editl.Text) d i v 2; IIselecţia incepe de laII juniatatea şirului

Editl. SelLength: =Length (Editl. Text) ; // se selectează textul pana la sfarsit Editl .CutToClipboard; IIse muta textul selectat in ClipBoardEdit2.Clear;Edit2 . PasteFromClipboard; // se muta textul din ClipBoard in Edit2

107

end;jTTll

procedure TFc? '''ormActivate (Sender: TObject); begin

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

e n d ;

M 8. S e le c t^

p ro c e d ă H c tA ll ;

S e le c te d Marchează) tot textul dintr-o cutie de editare.

Exem plu:

Să con^c-Jî1' o aplicaţie care conţine un buton (B utton l) şi o cutie de editare^ fiecare având un Help Hint. Dacă dorim să atribuim câte un Helf componentelor E ditl şi Buttonl atunci trebuie să setăm valorile ^oarelor proprietăţi:

obiect i TEditHint # introduceţi un text’Text ^itl'

end 0u kobject , °nl: TButton Hint, 0n pasaţi 'Capt^ " 'Buttonl'

end

M 9. Undo

proced(,r ^ndo;

Reface ^ O cările stocate în buferul Undo.

M 10. C le a r l f l<l

proced1* ^-learUndo;

Şterge ^ 6fl)l Undo. Apelarea metodei Undo nu mai are nici un efect.

Exem plu:

U r m ă t / ^ aplicaţie implementează lucrul cu metodele Undo şi Clearl}1 forma aplicaţiei există o cutie de editare (E d itl) şi două butoan^ şi Buttonl). La apăsarea butonului Buttonl sunt refă­cute *c£rile asupra textului din cutia de editare E ditl. La apăsarea

108

butonului Button2 este şters buferul Undo. în componenta StatusBarl sunt afişate stările buferului Undo.

object Editl: TEdit Text = 'Editl'

OnChange = EditlChangeendobject Buttonl: TButton Caption = 'Undo'Enabled = False OnClick = ButtonlClick

endobject StatusBarl: TStatusBar

Panels = o SimplePanel = True

endobject Button2: TButtonCaption = 'Clear Undo Buffer'Enabled = False OnClick = Button2Click

end

Handlerele de evenimente pentru obiectele de pe forma Form l sunt:var

NrSchimbari : integer;

procedure TForml.EditlChange(Sender: TObject); begin

inc (NrSchimbari ) ; //incrementez numărul schimbărilor din Editl / / si care sunt retinute in buferul Undo

StatusBarl.SimpleText := IntToStr(NrSchimbari) + ' Schimbări1;/ / afişez acest numărButtonl.Enabled := Editl.CanUndo;

/ / butonul de Undo devine disponibil pentru apasare Button2.Enabled := Editl.CanUndo;// cel puţin o modificare a avut loc, deci se poate şterge buferul Undo

end;

procedure TForml.ButtonlClick(Sender: TObject); begin

Edi 11. Undo; // anuleaza toate modificările din buferul UndoEdi 11. C1 earUndo; // si şterg continutul buferului UndoNrSchimbari := 0;StatusBarl.SimpleText := IntToStr(NrSchimbari)+ ' Schimbări'; Buttonl.Enabled := Editl.CanUndo;

//butonul de Undo nu mai este disponibil pentru apasare Button2.Enabled := Editl.CanUndo;// butonul pentru ClearlJndo nu mai este disponibil

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

Editl .ClearUndo; //golesc bufferul Undo

109

NrSchimbari := O;StatusBarl.SimpleText := IntToStr(NrSchimbari)+ ' Schimbări'; Buttonl.Enabled := Editl.CanUndo;

/ / butonul de Undo nu mai este disponibil pentru apasare Button2.Enabled ;= Editl.CanUndo;/ / butonul de ştergere a buferului Undo nu mai este disponibil

end;

Evenimente

E l. OnChange

property OnChange: TNotifyEvent;

Apare când textul din cutia de editare se schimbă.

Labei

9.4. TLabeledEdit ^

Reprezintă o cutie de editare care are asociată o etichetă.

Ierarhie_________________________________________________ ____

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomLabeledEdit->TLabeledEdit.

Definit în________________________________________________ _

ExtCtrls.pas

Pagina______________________________________________________

Additional.

Marea majoritate a proprietăţilor sunt comune cu ale componentelor TEdit şi TLabel. Câteva proprietăţi specifice doar componentei TLabeledEdit sunt descrise în continuare.

Proprietăţi_________________________________________________

PI. EditLabel

property EditLabel: TBoundLabel;

Este folosită pentru a specifica proprietăţile etichetei care este asociată

110

unei cutii de editare etichetate. Proprietăţi referitoare Ia titlul care apare în etichetă, la poziţia titlului în etichetă, la fontul utilizat, etc., pot fi setate din O bject Inspector.

P2. LabelPosition

property LabelPosition: TLabelPosition;

Specifică poziţia etichetei relativă la cutia de editare pentru o cutie de editare etichetată.Sunt posibile următoarele valori:

V a lo a re S em n ifica ţie

IpAbove E ticheta va fi poziţionată deasupra cutiei de editare.

IpBelow Eticheta va fi poziţionată sub cutia de editare.

IpLeft E ticheta va fi poziţionată în s tânga cutiei de editare.

IpRight E ticheta va fi poziţionată în d reapta cutiei de editare.

P3. LabelSpacing

p roperty LabelSpacing: Integer;

Indică distanţa în pixeli între etichetă şi cutia de editare.

Exemplu:

Să se scrie un program pentru rezolvarea ecuaţiei de gradul doi.

Pentru aceasta vom folosi trei cutii de editare: L abeledE ditl, LabeledEdit2, LabeledEdit3 în care vom introduce coeficientul lui x2, coeficientul lui x şi coeficientul termenului liber. Pentru afişarea soluţiilor ecuaţiei folosim o componentă ListBoxl. Mai folosim un buton Button1 la apăsarea căruia se va afişa rezultatul. Dacă ecuaţia nu are soluţii reale se va afişa un mesaj corespunzător. Vom folosi o etichetă “Soluţia” deasupra componentei ListBoxl pentru a indica faptul că în acea cutie va fi afişată soluţia.

Proprietăţile obiectelor de pe forma Form l sunt:

object Label1: TLabel Caption = 'SOLUŢIA'

endobject LabeledEditl: TLabeledEdit

EditLabel.Caption = 'Coeficientul lui x patrat'endobject LabeledEdit2: TLabeledEdit

EditLabel.Caption = 'Coeficientul lui x'end

U I

object LabeledEdit3: TLabeledEditEditLabel.Caption = 'Coeficientul termenului liber'

endobject ListBoxl: TListBox endobject Buttonl: TButton

Caption = 'Afiseaza1 OnClick = ButtonlClick

endHandlerele de evenimente ale obiectelor de forma Form l sunt:

procedure citire_parametri; begin

a := StrToFloat(Forml.LabeledEditl.Text); b := StrToFloat(Forml.LabeledEdit2.Text); c := StrToFloat(Forml.LabeledEdit3.Text);

end;In procedura citire_param etri sunt citiţi:

a - coeficientul lui x2,

b - coeficientul lui x şi

c - coeficientul termenului liber.

procedure TForml.ButtonlClick(Sender: TObject); begin

citire_parametri;delta : = b * b - ( 4 * a * c ) ;if' delta < 0then ShowMessage('Ecuaţia nu are rădăcini reale!1) else begin

ListBoxl.Items.Add(FloatToStr((-b+sqrt(delta))/(2*a))) ; ListBoxl.Items.Add(FloatToStr((-b-sqrt(delta))/(2 *a)));

end;end

9.5. TMaskEdit ^

Specifică o mască pentru o cutie de editare. Acest tip de control vali­dează textul introdus de către utilizator.

Ierarhie_____________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCtistomMaskEdit -> TMaskEdit.

Definit în

mask.pas

112

Pagina

Additional

Proprietăţi ______________________________

PI. Edit Mask

property EditMask: string;

Reprezintă forma textului valid pentru o cutie de editare cu mască. Acest text va fi validat în momentul introducerii lui. Proprietatea EditMask este folosită pentru a restricţiona textul introdus de utilizator. Dacă acesta va introduce un caracter invalid, cutia de editare nu va accepta acel caracter.O mască reprezintă trei şiruri de caractere (câmpuri) separate prin "(;)". Prima parte reprezintă masca însăşi. A doua parte este un caracter care specifică dacă literalii unei măşti sunt salvaţi împreună cu aceasta. A treia parte reprezintă un caracter care este folosit pentru a specifica caracterele neintroduse (încă) din mască.Caracterele folosite în prima parte a EditMask-u\u\ sunt:

Caractcr Semnificaţie

t

D acă acest caracter apare în m ască atunci caracterele opţionale sunt representate în proprietatea EditText ca şi spaţii la începutu l secvenţei caracterelor opţionale. D acă acest caracter nu apare în m ască atunci caracterele opţionale sun t reprezentate ca şi spaţii la sfârşitul secvenţei caracterelor opţionale.

>D acă acest caracter apare intr-o m ască, atunci toate caracterele care urm ează (până în m om entul în care apare caracterul <) trebuie să iîe litere m ari.

<D acă acest caracter apare în tr-o m ască, atunci toate caracterele care urm ează (până în m om entul în care apare caracterul <) trebu ie să fie litere mici.

o D acă aceste două caractere apar îm preună, atunci textul va fî reprezentat aşa cum îl introduce utilizatorul (cu litere m ari şi m ici)

\C aracteru l care urm ează acestui caracter este un literal. A cest caracter este fo losit pentru a se putea utiliza oricare din caracterele speciale ale m ăştii.

L D acă acest caracter apare într-o m ască, atunci utilizatorul trebuie să in troducă (pe poziţia respectivă) o literă:A -Z , a-z.

1D acă acest caracter apare într-o m ască, a tunci u tilizatorul poate să in troducă (pe poz iţia respectivă) o literă:A -Z , a-z. N u este necesară in troducerea literei.

A D acă acest caracter apare în tr-o m ască, atunci utilizatorul trebu ie să in troducă (pe poziţia respectivă) un caracter a lpha-num eric adică o literă:

113

C a r a c te r S em n ifica ţie

A-Z, a-z, sau o c ifră 0-9.

aD acă acest caracter apare în tr-o m ască, atunci utilizatorul poate să in troducă (pe poziţia respectivă) un caracter a lpha-num eric adică o literă: A-Z, a-z, sau o c ifră 0-9. N u este necesară in troducerea caracterului.

C U tilizatorul trebuie să introducă un caracter arb itrar pe această poziţie.

cU tilizatorul poate să introducă un caracter a rb itrar pe această poziţie. N u este necesară in troducerea caracterului.

0 U tilizatorul trebu ie să in troducă o cifră pe poziţia respectivă.

9U tilizatorul poate să in troducă o c ifră pe poz iţia respectivă. N u este neapăra t necesară in troducerea cifrei.

#U tilizatorul poate să in troducă pe poziţia respectivă o cifră sau sem nele + sau -. N u este neapărat necesară introducerea lor.

/ Este fo losit pentru a separa zilele lunile şi anii.

Este folosit pentru a separa orele, m inutele şi secundele.

Este fo losit pentru a separa cele trei câm puri ale unei măşti.

-A cest caracter inserează autom at spaţii în tr-un text. C ând u tilizatorul in troduce caractere, cursorul trece autom at peste caracteru l _.

Caracterele care nu apar mai sus sunt literale şi ele sunt inserate auto­mat, cursorul trecând peste ele în momentul editării. Caracterele care sunt folosite de o mască pot să apară şi ele ca şi literali, dar cu condiţia să fie precedate de caracterul

Exemple:

M asc a E x em p lu

!\00009 0000099; 1;_ 04543 5345542

190/90/00; 1;_ 27/01/97

!90:00:00>L L ;1;_ 09:34:23PM

> A A A a ;l;_ 1 P2a

10000-190-90; 1;_ 1997-11-06

!99 > L < L L \1 \9 0 0 ;1 ;_ 13 lan 1997

P2. EditText

property EditText: string;

Indică textul care apare în fereastra cutiei de editare cu mască.

114

P3. IsMasked

property IsMasked: Boolean;

Indică dacă există o mască pentru cutia de editare cu mască. Dacă nu există nici o mască, atunci cutia respectivă se va comporta ca o cutie de editare normală.

Metode______________________________________________________

M l. ValidateEdit

procedure ValidateEdit; virtual;

Determină dacă textul curent introdus este în conformitate cu regulile din EditMask.

Evenimente__________________________________________________

E l. OnChange

property OnChange: TNotifyEvent;

Apare când conţinutul cutiei se schimbă.

9.6. TMemo ^

Este un editor multilinie, deci care dă utilizatorului posibilitatea să introducă mai multe linii de text.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomMemo -> TMemo.

Definit în

stdctrls.pas

Pagina

Standard

115

P ro p rie tă ţi____________________________________________________________

P I. Alignment

property Alignment: TAlignment;

Specifică aliniamentul textului în cadrul cutiei. Valori posibile pentru Alignment sunt:

V a lo a re S em n ifica ţie

taLeftJustify Textili este alin iat în partea stângă a cutiei

taCenterTextul este a lin ia t centra t faţă de m argin ile din stânga şi d reap ta ale cutiei.

laRightJuslify T extul este alin iat în partea d reap tă a cutiei.

P2. Lines

property Lines: TStrings;

Lines conţine textul din cutie, sub forma unei liste de stringuri.

P3. Scollbars

property ScroIIBars: TScroIIStyle;

Indică dacă controlul are scrollbar-uri. Valori posibile pentru Scrollbars sunt:

V a lo a re S em n ifica ţie

s.sNone C ontro lu l nu are nici un scrollbar

ssHorizontalC ontrolul are un singur scro llbar la m arginea inferioară a cutiei. A cesta va perm ite defilarea o rizon tală a textului (în cazul în care lă lim ca sa este mai m are decât a cutiei).

ss VerticalC ontrolul are un singur scro llbar la partea d reap tă a cutiei. A cesta va perm ite defilarea pe verticală a textului din cutie (în cazul în care ex istă mai m ulte linii decât pot li afişate odată în cutie).

ssBoth C ontro lu l arc două scrollbar-uri (orizontal şi vertical).

Exemplu:

Următorul exemplu foloseşte o cutie de editare mulţi linie (M emo!) şi o componentă TListBox în care, pentru fiecare linie în parte, se va afişa numărul de caractere din ea la apăsarea butonului Buttonl:

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

116

for i:=0 to Memol.Lines.Count-1 do ListBoxl.Items.Add(

inttostr(Length((Memol.lines.Strings[i])) ) ) ;

procedure TForml.FormActivate(Sender: TObject); begin

Memol.Clear;ListBoxl.Clear;Memol.ScrollBars:=ssBoth;

end;

P4. WantReturns

property WantReturns: Boolean;

Indică dacă utilizatorul mai poate introduce caracterul sfârşit de linie prin apăsarea tastei <Enter>. Dacă WantReturns este false, atunci utilizatorul nu mai poate introduce sfârşit de linie tastând <Enter>,. ci tastând Ctrl+Enter, iar apăsarea tastei <Enter> este tratată ca un eveniment pentru formă.

Exemplu:

Următoarea aplicaţie constă dintr-o formă pe care se află o cutie de editare simplă {E ditl), o cutie de editare multi-linie (M em ol) şi un buton (Buttonl) de tip Default. Utilizatorul introduce text în cutia M em ol, iar la apăsarea tastei <Enter> prima linie a acestui text va fi copiată în E d itl.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Buttonl: TButton Default = True

endobject Memol: TMemo WantReturns = False ScrollBars = ssBoth

endobject Editl: TEdit

Text = 'Editl' end

I Iandlerele de evenimente pentru forma Forml sunt:

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

beginEditl.Text:=Memol.Lines.Strings[0];

end;

end;

117

procedure TForml.FormActivate(Sender: TObject); begin

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

end;

P5. WantTabs

property WantTabs: Boolean;

Indică dacă utilizatorul poate insera tab-uri în text. Dacă WantTabs este false, atunci la apăsarea tastei Tab, controlul este trecut la altă compo­nentă de pe formă.

P6. WordWrap

property WordWrap: Boolean;

Specifică dacă textul care atinge marginea din dreapta a cutiei este rupt pentru a fi trecut la linia următoare. Procedeul de rupere a rândurilor constă în introducerea unor “soft carriage returns", care nu modifică numărul de caractere de sfârşit de linie reale (introduse de utilizator). Dacă WordWrap este true, atunci şirurile de caractere mai lungi decât lăţimea cutiei vor fi rupte la partea dreaptă şi trecute pe rândul următor. Dacă cutia are scrollbar orizontal, această rupere nu se va mai produce.

Evenimente

E l. OnChange

property OnChange: TNotifyEvent;

Apare când textul din cutia de editare multilinie se schimbă.

9.7. TRichEdit H

Este un control care afişează un text, în format rich text, pe o formă.

Ierarhie ____________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomEdit -> TCustomMemo -> TCustomRichEdit ->-> TRichEdit.

118

Definit în

com ctrls.pas

Pagina _____________________________________________

Win32

Proprietăţi___________________________________________

P I. HideScrollBars

property HideScrollBars;

Nu mai afişează scrollbar-ul atunci când nu este nevoie de el (deci textul încape într-o pagină).

P2. Lines

property Lines: TStrings;

Conţine liniile unei cutii cu text rtf.

P3. Paragraph

property Paragraph: TParaAttributes;

Specifică atributele pentru paragraful curent. Paragraful curent este acela care conţine textul selectat. Dacă nu există text selectat, atunci para­graful curent este acela care conţine cursorul.

P4. SelAttributes

property SelAttributes: TTextAttributes;

Specifică atributele textului selectat. Tipul TText Attributes este definit mai jos.

Metode______________________________________________________

M 1. FindText

function FindText(const SearchStr: string; StartPos, Length'. Integer; Options: TSearchTypes): Integer;

Caută textul SearchStr în subsecvenţa de lungime Length şi care începe cu litera StartPos.

119

Se poate face o căutare mai specială folosind Options, care este o varia­bilă de tip mulţime, deci poate conţine o submulţime de valori din urmă­toarele posibile: stWholeWord, stMatchCase.

M 2. Print

procedure Print(const Caption: string); virtual;

Formatează şi tipăreşte conţinutul unei cutii RichEdit.

Evenimente

E l. OnSelectionChange

property OnSelectionChange: TNotifyEvent;

Apare când o altă porţiune de text este selectată.

E2. OnProtectChange

property OnProtectChange: TRichEditProtectChange;

Apare când utilizatorul încearcă să modifice un text protejat.Tipul TRichEditProtectChange este definit astfel:

type TRichEditProtectChange =procedure(Sen</er: TObject; StartPos, EndPos: Integer;

var AllowChange: Boolean) of object;

StartPos şi EndPos indică porţiunea de text care va fi supusă modifi­cării. AllowChange indică dacă este permisă sau nu efectuarea de modi­ficări asupra textului.

9.8. TTextAttributes

Reprezintă caracteristicilc fontului textului marcat dintr-o cutie TRichEdit. Aceast obiect poate fi folosit doar în componente care derivă din TCustomRichEdit.

Ierarhie

TObject -> TPersistent -> 77'ext Attributes.

Definit în

com ctrls.pas

Proprietăţi _________________________________________________

PI. Color

property Color: TColor;

Specifică culoarea textului.

P2. Protected

property Protected: Boolean;

Indică dacă textul reprezentat de TTextAttributes este sau nu protejat împotriva modificărilor. în caz afirmativ, dacă utilizatorul încearcă să îl modifice va fi apelat evenimentul OnProtectChange care poate dezafec­ta protecţia. Dacă acest handler de eveniment nu există, textul respectiv este de tip read-only.

P3. Size

property Size: Integer;

Specifică înălţimea fontului în număr de puncte.

P4. Height

property Height: Integer;

Specifică înălţimea fontului în număr de pixeli. Relaţia dintre Size şi Height este următoarea:

Height := Size * ScreenPixelsPerlnch / 72.

P5. Style

property Style: TFontStyles;

Specifică modul în care sunt desenate caracterele fontului. Style este o variabilă de tip mulţime, deci are ca valoare o submulţime din următoa­rele elemente:

Valoare Semnificaţie

fslio ld T ext îngroşat.

J'sHaUc T ext înclinat.

121

V a lo a re S em n ifica ţie

fsU nderline T exl subliniat.

fsStrikeout T ext tă ia t cu o linie orizontală pe la jum ăta te .

P6. Pitch

property Pitch: TFontPitch;

Indică dacă toate caracterele fontului au aceeaşi lăţime. Valorile permise pentru Pitch sunt:

V a lo a re S em n ifica ţie

fp FixedToate caracterele au aceeaşi lăţim e. A cest lucru este folosit la coduri sursă.

fp Variable C aracterele au lăţim e variabilă. A cest lucru este util la editare de texte.

fpD efault L ăţim ea caracterelor depinde de font.

P7. ConsistentAttributes

property ConsistentAttributes: TConsistentAttributes;

Indică care dintre proprietăţile obiectului TTextAttributes sunt valabile pentru textul curent selectat. Tipul TConsistentAttributes este definit astfel:

typeTConsistentAttribute = (caBold, caColor, caFace, caltalic, caSize,

caStrikeout, caUnderline, caProtected); TConsistentAttributes = set of TConsistentAttribute;

ConsistentAtributes poate avea ca valori o submulţime din mulţimea celor enumerate mai jos:

V a lo a re S em n ifica ţie

caBold Toate caracterele sun t fie îngroşate fie neîngroşate.

caColor Toate caracterele au aceeaşi culoare.

caFace Tipul caracterelor este acelaşi pentru în treg textul.

caltalic Toate caracterele sunt fie italice fie neitalice.

caSize Toate caracterele au aceeaşi m ărim e.

caStrikeout 'Toate caracterele sunt fie tăiate fie netăiate.

caUnderline C aractere le suni fie loale subliniate, fie toate nesubliniate.

caProtected T extul este pro tejat sau neprotejet.

122

Exem plul 1:

Următorul exemplu preia un fişier pas, care conţine un program Turbo Pascal, şi boldează toate cuvintele rezervate. Pe formă se află o cutie RichEdit, două cutii de dialog (OpenDialogI şi SaveD ialogl), trei butoane: Buttonl pentru deschis un fişier cu extensia pas de pe disc, Button2 pentru salvarea fişierului cu extensia r t f curent pe disc, şi Button3 la a cărui apăsare se vor bolda toate cuvintele rezervate.

Valorile proprietăţilor obiectelor de pe forma F orm l sunt:

object Buttonl: TButton Caption = 'Open'OnClick = ButtonlClick

endobject Button2: TButton

Caption = 'Save'OnClick = Button2Click

endobject Button3: TButton

Caption = ’Boldeaza'OnClick = Button3Click

endobject RichEditl: TRichEdit

Lines.Strings = ('RichEditl')

ScrollBars = ssBoth endobject OpenDialogI: TOpenDialog

Filter = 'Programe Pascal|*.pas' endobject SaveDialogl: TSaveDialog

Filter = 'RichTextFormat|*.rtf' end

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

constrezervate : array[1..49] of string =

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

procedure TForml.ButtonlClick(Sender: TObject); beginif OpenDialogI.Execute

123

then RichEditl.Lines.LoadFromFile(OpenDialogl.FileName); end;procedure TForml.Button2Click(Sender: TObject); begin

if SaveDialogl.Executethen RichEditl.Lines.SaveToFile(SaveDialogl.FileName);

end;procedure TForml.Button3Click(Sender: TObject); var

poz, LungText : integer;i : byte;

begin//lungimea textului in care fa c cautarea

LungText:=length(RichEditl.Lines.Text); for i := 1 to 49 do

/ / pentru fiecare cuvânt rezervat / / il caut in tot textul

beginpoz : =

RichEditl.FindText(rezervate[i],0,LungText,[stWholeWord]); while (poz o -1) do begin

RichEditl.SelStart := poz;RichEditl.SelLength := length(rezervate[i]);RichEditl.SetFocus;RichEditl.SelAttributes.Style := [fsBold];

II si il fac bold// apoi continui cautarea mai departe in text

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

end;end;

end;

Exem plul 2:

Următoarea aplicaţie afişează proprietăţile selecţiei curente de text dintr-o cutie de editare TRichEdit. Sunt folosite trei butoane de tip TSpeedButton pentru a afişa care sunt caracteristicile textului selectat. Sunt căutate proprietăţile Bold, Italic şi Underline. Butoanele corespun­zătoare proprietăţilor textului selectat vor fi în starea apăsat.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object SpeedButtonl: TSpeedButton AllowAllUp = True Grouplndex = 1 Caption = 'B'Font.Style = [fsBold]

end

124

object SpeedButton2: TSpeedButton AllowAllUp = True Grouplndex = 2 Caption = 'I'Font.Style = [fsltalic]

endobject SpeedButton3: TSpeedButton AllowAllUp = True Grouplndex = 3 Caption = 'U'Font.Style = [fsUnderline]

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

procedure TForml.RichEditlSelectionChange(Sender: TObject); beginwith RichEditl.SelAttributes do beginif fsBold in Stylethen if caBold in ConsistentAttributes

then SpeedButtonl.Down := true else SpeedButtonl.Down := false

else SpeedButtonl.Down := false;

if fsltalic in Stylethen if caltalic in ConsistentAttributes

then SpeedButton2.Down := true else SpeedButton2.Down := false

else SpeedButton2.Down := false;if fsUnderline in Stylethen if caUnderline in ConsistentAttributes

then SpeedButton3.Down := true else SpeedButton3.Down := false

else SpeedButton3.Down := false; end;

end;

9.9. TParaAttributes

Este o dată care verifică atributele textului dintr-o cutie TRichEdit.

Proprietăţi______________________________________________

1*1. Alignment

property Alignment: TAlignment;

Indică felul în care se aliniază textul în cadrul paginii.

125

Valoare Semnificaţie

taLeftJustify T extu l este a lin ia t la stânga paragrafului.

taCenter T extul este centrat.

taRightJustify T extul este a lin ia t la dreapta paragrafului.

P3. Leftlndent

property Leftlndent: Longint;

Indică distanţa în pixeli a paragrafului faţă de marginea din stânga a paginii.

P4. Rightlndent

property Rightlndent: Longint;

Indică distanţa în pixeli a paragrafului faţă de marginea din dreapta a paginii.

Exemplu:

Următoarea aplicaţie formatează paragraful curent dintr-o componentă TRichEdit. Este folosită o a doua formă (Form2) pe care sunt amplasate două cutii de editare în care utilizatorul este solicitat să introducă valo­rile pentru marginile din stânga, respectiv dreapta ale paragrafului cu­rent.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Buttonl: TButtonCaption = 1Seteaza Paragraf'

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

uses unit2;procedure TForml.ButtonlClick(Sender: TObject); begin

/ / setez valorile cu tiilo r de editare E d itl si E dit2 la ti valorile cu ren te ale proprietăţilo r L eftlndent si R ightlndentForm2.Editl.Text := IntToStr(RichEditl.Paragraph.Leftlndent); Form2.Edit2.Text := IntToStr(RichEditl.Paragraph.Rightlndent);

/ / afişez form a Form 2 m odala if Form2.ShowModal = mrOk then begin

/ / daca s-a apasat bu tonul O k form atez paragraful corespunzătorRichEditl.Paragraph.Leftlndent := StrToInt(Form2.Editl.Text); RichEditl.Paragraph.Rightlndent :=

126

end;

Valorile proprietăţilor obiectelor de pe forma Form2 sunt:

object Labell: TLabelCaption = 'Marginea stanga'

endobject Label2: TLabel

Caption = 'Marginea dreapta' endobject Editl: TEdit Text = '0'

endobject Edit2: TEdit

Text = '0' endobject BitBtnl: TBitBtn

Kind = bkOK endobject BitBtn2: TBitBtn

Kind = bkCancel end

1*5. Firstlndent

property Firstlndent: Longint;

Specifică distanţa în pixeli a primei linii a paragrafului faţă de marginea din stânga a paginii. Această distanţă este relativă la valoarea proprietăţii Left Indent.

1*6. Numbering

property Numbering: TNumberingStyle;

StrToInt(Form2.Edit2.Text);end;

Valori posibile pentru Numbering sunt:

V a lo a re S em n ifica ţie

nsNone Nici o num erotare nu există la stânga.

nsBullct in faţa fiecărui p a rag ra f este desenată o bilă de culoare neagră.

Kxcmplu:

Următoarea aplicaţie setează şi afişează numerotarea paragrafului curent din cutia de editare R ichE ditl. Este folosită o componentă TCheckBox care va fi în starea bifat dacă paragraful curent este numerotat şi nebifat în caz contrar. Tot cu ajutorul aceste componente se poate schimba starea unui paragraf (din numerotat în ne-numerotat şi invers).

127

Handlerele de evenimente ale obiectelor de pe forma Form l sunt:procedure TForml.RichEditlSelectionChange(Sender: TObject); begin

// afişez starea paragrafuluiCheckBoxl.Checked := RichEditl.Paragraph.Numbering = nsBullet

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

II setez starea paragrafului if CheckBoxl.Checked

then RichEditl.Paragraph.Numbering := nsBullet else RichEditl.paragraph.Numbering := nsNone;

end;

128

10. BUTOANE RADIO

Butoanele radio oferă posibilitatea utilizatorului de a alege dintr-un grup de opţiuni care se exclud reciproc. Butoanele radio pot fi grupate în mai multe moduri. Cele mai utilizate posibilităţi de grupare sunt:

- gruparea pe o formă;- gruparea într-un TRadioGroup.

Dintr-un grup de butoane radio la un moment dat doar unul poate fi în starea bifat.

In cazul grupării folosind componenta TRadioGroup itemurile sunt doar grafic desenate ca butoane radio, în realitate ele fiind şiruri de caractere. Acce­sarea unui item particular dintr-o componentă TRadioGroup se face folosind proprietatea Items.

10.1. TRadioButton — J

I e r a r h i e ____________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TButtonControl -> TRadioControl.

Definit în

stdctrls.pas

Pagina______________________________________________________

Standard

Proprietăţi___________________________________________________

P I. Alignment

property Alignment: TLeftRight;

Determină poziţia textului ataşat butonului faţă de acesta. Posibile valori pentru Alignment sunt:

129

V a lo a re S em n ifica ţie

laLefJtustify Textul apare în partea stângă a butonului.

taRightJustify T extul apare în partea dreaptă a butonului.

P2. Checked

property Checked: Boolean;

Determină dacă un buton este selectat. Valori posibile pentru proprietatea Checked sunt:

V a lo a re S em n ifica ţie

t ru eU n disc negru apare în interiorul butonului, indicând faptul că acesta a fost selectat.

fa lseNici un disc negru nu apare în interiorul butonului, deci acesta nu este selectat.

Un singur buton de radio neselectat (Checked este false) poate fi selectat (Checked să devină true) la executarea unui click pe el. Un buton de radio selectat (Checked este true) nu poate fi deselectat (Checked să fie false) la executarea unui click pe el.

10.2. TRadioGroup iiz ii

Reprezintă un grup de butoane care funcţionează împreună. Pentru a adăuga butoane la TRadioGroup folosiţi proprietatea Items. Prin intermediul acesteia se specifică textul ataşat fiecărui buton de radio.

Contrar unei impresii de moment, proprietatea Items nu pointează spre elemente de tip TRadioButton. Elementele ei nu sunt decât nişte simple şiruri de caractere ce identifică eticheta ataşată fiecărui buton radio. Cu ajutorul proprietăţii Itemlndex se poate determina care buton este activ la un moment dat.

Butoanele de radio, de obicei, sunt grupate. Ele pot fi grupate în cinci moduri:

- pe o formă;- într-un TRadioGroup;- într-un TGroupBox\- într-un TScrollBox;- într-un TPanel.

Mai multe butoane aflate în acelaşi grup nu pot avea statutul de activ (un punct negru apare în mijlocul butonului respectiv) în acelaşi timp. Doar unul

130

, t i ft?f H if»H*»*♦»**•******» TTi*i j î •> t ? i ; • •

dintre ele se poate afla în starea de setat, celelalte fiind în starea nesetat. Două butoane de pe o formă se pot afla în acelaşi timp în starea setat, dacă fac parte din grupuri diferite.

Ierarhie_________ ________________ ___________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGroupBox ->-> TCustomRadioGroup -> TRadioGroup.

Definit în_____________________________________________________

stdctrls.pas

Pagina

Standard

Proprietăti

1*1. Columns

property Columns: Integer

Specifică numărul de coloane pe care sunt aşezate butoanele de radio. Columns poate avea valori de la 1 la 16. Dacă Columns este 1, atunci toate butoanele sunt aranjate pe o singură linie verticală.

P2. Itemlndex

property Itemlndex: Integer

Specifică numărul de ordine al itemului (butonului radio) selectat. Primul buton are numărul de ordine 0. Dacă nici un buton nu este selectat, atunci Itemlndex are valoarea -1.

P3. Items

property Items: TStrings

în Items este reţinută lista butoanelor de radio din TRadioGroup. Prelu­crarea butoanelor înseamnă de fapt prelucrarea unei componente TStrings.

Exemplul 1:

Următoarea aplicaţie conţine un TRadioGroup cu trei butoane radio care au fost inserate cu ajutorul proprietăţii Items la momentul proiectării aplicaţiei. Pe formă mai există o cutie de editare E ditl care va afişa care buton de radio este selectat.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object RadioGroupl: TRadioGroup Caption = 'RadioGroupl'Items.Strings = (

'primul''al doilea1 'al treilea’)

OnClick = RadioGrouplClick endobject Editl: TEdit

Text = 'Editl1 end

Handlerele de evnimente pentru obiectele de formă sunt:procedure TForml.FormCreate(Sender: TObject); begin

RadioGroupl. Itemlndex: = -1 Editl.Text:='Nici un buton selectat';

end;procedure TForml.RadioGrouplClick(Sender: TObject); begincase RadioGroupl.Itemlndex of

0 : Editl.text:='S-a selectat primul buton';1 : Editl.Text:='S-a selectat al doilea buton';2 : Editl.Text:='S-a selectat al treilea buton'

end;end;

Exemplul 2:

Următoarea aplicaţie adaugă unei componente numărul de itemuri înscris în cutia de editare Edit2. în cutia de editare E ditl se află numărul de coloane pe care vor fi dispuse itemurile din componenta TRadioGroup. Etichetele itcmurilor sunt numere în intervalul 0. .strToint (Editl.Text) . La apăsarea unui item se va afişa eticheta lui.

Valorile proprietăţilor componentelor de pe formă sunt:

object Editl: TEdit Text = '4'

endobject Edit2: TEdit

132

Text = '12' endobject RadioGroupl: TRadioGroup

Caption = 'Butoane radio' endobject Buttonl: TButton

Caption = 'Creeaza butoane1 OnClick = ButtonlClick

end

llandlerele de evenimente ale componentelor de pe forma Forml sunt:

procedure TForml.ButtonlClick(Sender: TObject);var i:in teger; begin

RadioGroupl.Items.Clear;RadioGroupl.Columns := StrToInt(Editl.Text); for i:=l to StrToInt(Edit2.Text) do RadioGroupl.Items.Add(IntToStr(i));

end;

133

11. COMPONENTE PENTRU OPŢIUNI»

Componente de opţiuni oferă posibilitatea utilizatorului de a alege dintr- un grup de opţiuni. Spre deosebire de butoanele radio, opţiunile pot să nu se excludă reciproc, la un moment fiind posibilă selectarea mai multor opţiuni.

Componentele de opţiune pot apărea singure pe o formă (TCheckBox) sau grupate (TCheckListBox). Proprietăţile Checked şi State reflectă starea unui item. Checked poate avea două valori: bifat (valoarea true) şi nebifat (valoarea false). State poate avea trei valori: bifat (valoarea cbCheked), nebifat (valoarea cbUnchecked) şi nedecis sau gri (valoarea cbGrayed).

11.1. TCheckBox — -

Este o componentă ce constă dintr-o cutie de bifare etichetată care oferă utilizatorului posibilitatea de a alege sau nu o opţiune a aplicaţiei.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TButtonControl -> TCustomCheckBox -> TCheckBox.

Definit în_____________________________________________________

stdctrls.pas

Pagina______________________________________________________

Standard

Proprietăţi_______ ____________________________________________

PI. Alignment

property Alignment: TLeftRight;

Specifică poziţia textului ataşat cutiei faţă de cutie. Valori posibile pentru Alignment sunt:

134

V a lo a re S em n ifica ţie

talxftJusUfy Textul apare în partea stângă a butonului.

taRightJustijy Textul apare în partea d reap tă a butonului.

P2. AllowG rayed

property AllowGrayed: Boolean;

Indică dacă cutia de control permite şi starea “gri”. Dacă AllowG rayed este true, atunci cutia de control poate avea trei valori: check (bifat), uncheck (nebifat), grayed (bifat, dar pe fundal gri). Dacă AllowGrayed este false, atunci cutia de control poate avea doar două stări: check şi uncheck.

1*3. Checked

property Checked: Boolean;

Indică dacă cutia de control a fost selectată. Dacă Checked este true, atunci semnul de marcare apare în cutie, în caz contrar cutia se poate găsi în starea nebifat sau în starea gri (dacă AllowGrayed este true).

1*4. State

property State: TCheckBoxState;

Indică starea cutiei de opţiuni. Valori posibile pentru State sunt:

V a lo a re S em n ifica ţie

cbChecked Specifică dacă cutia de control este b ifa tă (u tilizatorul a se lecta t o opţiune). în ea v a apare un sem n de bifare.

cbUnchecked C utia de control nu este bifată.

cbCrayedCutia de control nu se a flă nici în starea bifată, nici în s tarea nebifată, în cu tie apare un sem n de bifare având culoare d iferită (gri) de culoarea sem nului fo losit penlru stare bifat.

Kxcmplu:

Următoare aplicaţie foloseşte componentele:

• cutie de control (CheckBoxl)-,• cutie de editare (E ditl) care va afişa starea lui CheckBoxl;• un grup de butoane radio (RadioG roupl) care conţine butoanele

"Permite stare gri" şi "Nu perm ite stare gri" folosite pentru a speci­fica dacă este permisă sau nu starea "gri" pentru CheckBoxl.

135

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

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

endobject RadioGroupl: TRadioGroup Caption = 'Starea gri'Items.Strings = (

'Permite stare gri''Nu permite stare gri')

OnClick = RadioGrouplClick endobject Editl: TEdit Text = 'Editl'

endHandlerele de evenimente pentru forma Form l sunt:

procedure TForml.CheckBoxlClick(Sender: TObject); begin

case CheckBoxl.State ofcbChecked: Editl.Text := 'Checked'; cbUnchecked: Editl.Text := 'Unchecked'; cbGrayed: Editl.Text := 'Grayed'

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

if RadioGroupl.Itemlndex = 0 then CheckBoxl.AllowGrayed := true else begin

CheckBoxl.AllowGrayed := false; if CheckBoxl.State = cbGrayed then begin

CheckBoxl.State := cbChecked;Editl.Text := 'Checked';

end;end;

end;

11.2. TCheckListBox

Afişează o listă cu itemuri care au câte un semn de bifare la stânga lor. Un item este un şir de caractere. Accesarea acestora se face prin intermediul proprietăţii Items.

136

Ierarhie

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomListBox -> TListBox.

Definit în___________________________________________________

stdctrls.pas

Pagina_____________________________________________________

Standard

Proprietăţi__________________________________________________

P I. Items

property Items: TStrings;

Items conţine lista cu itemurile dintr-un TCheckListBox.

P2. State

property State[Index: Integer]: TCheckBoxState;

Tipul TCheckBoxState este dat de:

TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed);

Pentru fiecare item din vectorul Items, State indică starea acestuia. Valori posibile pentru State sunt (cbChecked, cbUnchecked, cbGrayed). Când Checked este true, State este cbChecked. Când Checked este False, State poate fi fie cbUnchecked, fie cbGrayed.Când State este cbGrayed, ItemEnabled este False. Mai mult, ItemEnabled poate fi, de asemenea, false când State este cbUnchecked sau cbChecked.

P3. Checked

property Checked [Index: Integer]: Boolean;

Pentru fiecare item din vectorul Items, Checked indică starea acestuia. Valori posibile pentru Checked sunt: cbChecked, cbUnchecked. Pentru valoarea cbGrayed a lui State, valoarea lui Checked va fi false.

137

Exemplu:

Următoarea aplicaţie afişează numărul itemurilor bifate componentă TCheckListBox.procedure TForml .ButtonlClick (Sender ■. TObject); var

nr, i : integer; begin

nr := 0;for i := 0 to checkListBoxl.Items.Count - 1 do if CheckListBoxl.Checked[i] then nr := nr + 1;

ShowMessage(IntToStr(nr)); end;

P4. AllowGrayed

property AllowGrayed: Boolean;

Indică dacă este permisă starea gri.

Evenimente _______________ _________________

E l. OnClickCheck

property OnClickCheck: TNotifyEvent;

Apare cânt utilizatorul bifează sau debifează un item.

dintr-o

138

12. PROGRESUL EXECUŢIEI - COMPONENTA TProgressBar

în acest capitol este prezentată componenta TProgressBar care permite vizualizarea grafică a evoluţiei unui proces în execuţie.

im i112.1. TProgressBar -__I

O componentă TProgressBar indică în mod vizual progresul unei aplicaţii în execuţie. Pe măsură ce aplicaţia se execută, componenta TProgressBar se colorează, de la stânga la dreapta, cu culoarea standard exprimată de constanta clHighLight.

Ierarhie

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TProgressBar.

Definit în _______________________

com ctrls.pas

Pagina______________________

Win32

Proprietăţi ________________________

PI. Position

property Position: Integer;

Reprezintă poziţia curentă a componentei de progres.

P2. Max

property Max: Integer;

Reprezintă valoarea maximă pe care o poate lua proprietatea Position.

139

im .M uahwM M i^H a.------- m i l l ii ii n mi 11) i . iiii.

P3. Min

property Min: Integer;

Reprezintă valoarea minimă pe care o poate lua proprietatea Position.

Exemplul 1:

Vom face o aplicaţie care generează combinările mulţimii Aceste combinări vor fi afişate ca şi item-uri ale lui ListBoxl. Numărul n va fi citit dintr-o cutie de editare {E ditl). Numărul de poziţii pe care le are componenta ProgressBarl este egal cu:

4 _ n - ( n - l ) - ( ; i - 2 ) - ( / t - 3 )24

Procesul de generare al combinărilor începe la apăsarea butonul Buttonl.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Buttonl: TButton Caption = 'Genereaza'

endobject Editl: TEdit Text = '6'

endHandlerele de evenimente pentru obiectele de pe forma Form l sunt:

procedure TForml.ButtonlClick(Sender: TObject); var

n, i, j, k, g : byte; s : string;

beginListBoxl.Clear;

n := StrToInt(Editl.Text);ProgressBarl.Max := n*(n~l)*(n-2)*(n-3) div 24 - 1;ProgressBarl.Position := 0;

for i := 1 to n - 3 dofor j := i + 1 to n - 2 dofor k := j + 1 to n - 1 dofor g := k + 1 to n do begin

s := inttostr (i) + ’ ' ■* inttostt (j ) -i-' ' + inttostr (k) + 1 ’ t i nt I osl. r (y ) i-■' ';

ListBoxl . 1 . Add (:;) ;I., i Kt lîoxl . Ro I: r o.".h ;

I« « « * » m i i . a m M W W r t H H i i i ) i »«?»i»1111 i <»*• H i*t i n I

I

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

end;end;

Exemplul 2:

Următoarea aplicaţie încarcă sau salvează un fişier în/din cutia de editare multilinie M em ol. Numele fişierului este obţinut cu ajutorul unei componente TOpenDialog sau TSaveDialog. Pentru a se pune în eviden­ţă utilitatea TProgressBar-ul, fişierul este citit octet cu octet. Compo­nenta TProgressBar va avea atâtea poziţii câţi octeţi are fişierul. Pe formă se află şi o componentă TMainMenu care are în bara principală un singur item - File - şi două subitemuri: Open, respectiv Save.

Valorile proprietăţilor obiectelor de pe forma F orm l sunt:

object MainMerml: TMainMenu object Filei: TMenuItem

Caption = 'File' object Openl: TMenuItem

Caption = 'Open'•ndobjact Savel: TMenuItem

Caption = 'Save'•nd

•nd•ndobj«ot OpenDialogl: TOpenDialog

K liter = 'Fişiere Text|*.txt'•ndobjact SaveDialogl: TSaveDialog

Kiltor - 'Fişiere Text | * . txt' and

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

varI ih : T F i l e S t r e a m ;< li momii u nc : i n t e g e r ; m m : string;P : I ’C h a r ;

procedura Tl-'orml . O p r n l C l i c k {S e n d e r : T O b j e c t ) ; v«r

l I 111 i m |- > l ;h au l n

If ' || U Ml I) I , I I < " I 1 . V.y.i'i 'Ut f-i t h an b n g i n

Ml Mill >1 . (' I «*< i r ;I i : i ; TK i I «?NI r t ■> i m . ('. r cu \t <* (OponI) i îi 1 o q l . K i 1 < ‘N n m o ,

1 tnOponH<‘ml) ;

I A I

dimensiune := f is. Size; //dimensiunea fişierului ProgressBarl.Max := dimensiune; sir := ''; getmem(p,1);ProgressBarl.Position : = 0; for i : = 1 to dimensiune do begin

f is .Read (p~, 1) ;sir := sir + string(p"); //pun fişierul intr-un sir ProgressBarl.Position := ProgressBarl.Position + 1;

end;Memol.Lines.Text := sir; fis.Free;

end; end;procedure TForml.SavelClick(Sender: TObject); var

i : integer begin

if SaveDialogl.Execute then begin

fis := TFileStream.Create(SaveDialogl.FileName,fmCreate); dimensiune := length(Memol.Lines.Text);ProgressBarl.Max ;= dimensiune;// setez numărul poziţiilor progressbar-ului ProgressBarl.Position := 0; getmem(p,1);for i := 1 to dimensiune do beginp[0] := Memol.Lines.Text[i];fis .Write (p~, 1) ; // scriu in fişier un octetProgressBarl.Position := ProgressBarl.Position + 1;

end;fis.Free;

end;end;

Exem plul 3:

Se cere să se scrie într-un fişier toate numerele de ia 1 la 1.000.000. Pro­gresul procesului de scriere în fişier va fi afişat folosindu-se o compo­nentă ProgressBar.

Pentru a realiza această aplicaţie vom folosi o componentă ProgressBar cu ajutorul căreia vom afişa progresul execuţiei operaţiei de scriere în fişier şi un buton la apăsarea căruia aplicaţia va fi lansată în execuţie. Dacă proprietatea Smooth a componentei ProgressBar este setată true, atunci progresul execuţiei va fi marcat printr-o linie continuă, altfel printr-o linie discontinuă.

142

în momentul în care toate numerele au fost scrise în fişier se va afişa mesajul „S-a terminat de scris în fişier” De asemenea, procesul poate fi oprit (scrierea în fişier poate fi întreruptă) prin apăsarea tastei Escape.

Proprietăţile obiectelor de pe forma Form l sunt:

object Buttonl: TButton Caption = 'Start'OnClick = ButtonlClick

endobject ProgressBarl: TProgressBar

Max = 1000000 Smooth = True

endHandlerele de evenimente ale obiectelor de forma Formlsunt:

varapasat_escape : boolean;

procedure TForml.ButtonlClick(Sender: TObject); var

i : integer;beginapasat_escape := false; assignfilelf, 'fişier.txt'); rewrite(f);Progressbarl.Position := 0; for i := 1 to 100000 do

beginApplication.ProcessMessages; if apasat_escape then begin

closefile(f); exit;

end; writeln(f,i );Progressbarl.Position := ProgressBarl.Position + 1; if i = 100000then ShowMessage('S-a terminat de scris in fişier');

end;closef ile (f) ,-

end;

procedure TForml.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);

beginif key = VK_Escape then apasat_escape := true;

end;

143

j p M H M t t ****»»** •

Exem plul 4:

Programul următor afişează într-un ListBox toate permutările primelor n numere naturale. Valoarea lui n este selectată dintre cele 20 de valori posibile (1 până la 20) prezente într-un ComboBox. Este folosit şi un ProgressBar care afişează evoluţia procesului de determinare a soluţiei.

Proprietatea Smooth a componentei ProgressBar poate fi true sau false; atunci când este setată true, bara de progres este continuă, iar când este setată false, bara de progres este segmentată.

Proprietăţile obiectelor de pe forma Form l sunt:

object ComboBoxl -. TComboBoxItems.Strings = ('2' '3' ‘4 ’ '5' ' 6' ' 7 ' '8' '9' '10' '11'

'12' '13' '14' '15' '16' ’17' '18' ’19’ '20')endobject ListBoxl: TListBox endobject ProgressBarl: TProgressBar

Min = 0 Max = 100 Step = 1

endobject BitBtnl: TBitBtn

Caption = 'afiseaza'OnClick = BitBtnlClick

end

Pentru a determina toate permutările numerelor naturale mai mici sau egale decât un număr n dat vom folosi metoda backtracking.

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

varsoluţie, n : integer; a : array[1..100] of integer,-

function continuare(poz,v : integer) : boolean; var

i : integer; begin

continuare true; for i := 1 to poz - 1 do

if a[i] = vthen continuare := false;

end;procedure tipar; var

i : integer; s : string;

144

begins : = 1 1 ;for i := 1 to n do

s := s + IntToStr (a [i] ) + ' ';Forml.ListBoxl.Items.Add(s);

end;

procedure back Ik : integer); var

i : integer; s : string;

beginif k > n then begin

inc(soluţie); tipar;Forml .ListBoxl.Refresh;Forml.ProgressBarl.Position := soluţie;

endelse for i := 1 to n do

if continuare(k,i) then begin

a[k] := i; back(k+1);

end;end;

function factorial(x: integer) : integer; var

f : integer; i : integer;

begin f := 1;for i := 2 to x do

f := f * i; factorial := f;

end;

procedure TForml.BitBtnlClick(Sender: TObject); begin

ListBoxl.Clear;n := StrToInt(ComboBoxl.Items.Strings[ComboBoxl.Itemlndex]); ProgressBarl.Min := 0;ProgressBarl.Max:=Factorial(StrToInt(ComboBoxl.Items.Strings [ComboBoxl.Itemlndex]));ProgressBarl.Step := 1; soluţie := 0; back(l);

end;

13. BARĂ DE STATUT

în acest capitol sunt prezentate obiectele care definesc funcţionalitatea unei bare de statut. Acestea sunt: TStatusBar, TStatusPanels, TStatusPanel.

TStatusBar este componenta care reprezintă bara de statut. O bară de statut poate avea mai multe panouri. Pe fiecare dintre ele se poate afişa text sau imagine. Colecţia de panouri ale unei bare de statut este reprezentată de clasa TStatusPanels. Un panou din colecţie este obiect de clasă TStatusPanel.

13.1. TStatusBar

Reprezintă o bară - amplasată de obicei în partea de jos a ferestrei - şi care afişează informaţii despre aplicaţia în curs de execuţie. Spre exemplu, în bara de acest tip, aplicaţia M icrosoft W ord afişează: numărul paginii curente, numărul de pagini din documentul curent, poziţia cursorului etc.

Ierarhie________________________________________

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

Definit în_______________________________________

comctrls.pas

Pagina_______________________________________ _

Win32

Proprietăţi_____________________________________

P I. Panels

property Panels: TStatusPanels;

Informaţia pe un TStatusBar este afişată în panouri (engl. panels) ali­niate de obicei la stânga. Proprietatea Panels este o colecţie de astfel de panouri. La momentul proiectării aplicaţiei se poate seta numărul panourilor şi caracteristicile lor, folosind proprietatea Panels din Object

146

Inspector. Pe ecran va apare un editor de panouri cu ajutorul căruia se pot manipula panourile deja existente. Tot cu ajutorul acestui panou se pot adăuga noi panouri sau se pot şterge unele dintre panourile deja existente.

P2. Canvas

property Canvas: TCanvas;

Furnizează acces la suprafaţa de desenare a unei componente de tip TStatusBar.

Exem plu:

Următoarea aplicaţie exemplifică modul de lucru cu proprietatea Canvas a TStatusBar-\i\u\: suprafaţa de desenare va fi colorată la apariţia eveni­mentului OnTimer - al unei componente TTimer - cu o culoare aleatoare.

procedure TForml. TirnerlTimer (Sender: TObject); var

r : TRect; begin

StatusBarl.Canvas.Brush.Color := random($FFFFFF + 1);// include-ti stdlib.hr := Rect(0,3,100,StatusBarl.Height-1) ;StatusBarl.Canvas.FillRect(r);

end;

P3. SimplePanel

property SimplePanel: Boolean;

Indică dacă componenta de tip TStatusBar are unul sau mai multe panouri.

P4. SimpleText

property SimpleText: string;

Reprezintă textul care va afişat în panoul componentei de tip TStatusBar, când aceasta are proprietatea SinglePanel setată la true.

Evenimente

E l. On Resize

property OnResize: TNotifyEvent;

Apare când componentă de tip TStatusBar este redimensionată la momentul execuţiei aplicaţiei.

E2. OnDrawPanel

property OnDrawPanel: TDrawPanelEvent;

Apare când un o componentă de tip TStatusPanel trebuie redesenată. Tipul TDrawPanelEvent este definit astfel:

TDrawPanelEvent = procedure(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect) of object;

Rect reprezintă noua dimensiune a componentei de Panel de tip TStatusPanel.Acest eveniment apare doar dacă proprietatea Style a componentei Panels este setată la psOwnerDraw.

13.2. TStatusPanels

Este o colecţie de obiecte de tip TStatusPanel.

Ierarhie ______________________________________ _____________

TObject -> TPersistent -> TCollection -> TStatusPanels.

Definit în_____________________________________________________comctrls

Proprietăţi___________________________________________________

P I. Items

property \{ems[Index\ Integer]: TStatusPanel; default;

Este o listă indexată cu panourile din colecţie. Pentru a afla numărul acestora se poate folosi proprietatea Count a lui TCollection.

148

Metode__________________

M l. TStatusPanels

Este constructorul clasei.

M2. Add

function Add: TStatusPanel;

Adaugă o componentă de tip TStatusPanels la o componentă de tip TStatusBar. Sunt atribuite valori implicite pentru noul panou. Proprie­tăţile lui pot fi setate mai târziu, accesându-1 prin intermediul vectorului Items.

13.3. TStatusPanel

Reprezintă un singur panou dintr-o componentă de tip TStatusBar.

IerarhieTObject -> TPersistent -> TCollectionltem -> TStatusPanel.

Definit în_____________________________

com ctrls.pas

Proprietăţi

PI. Alignment

p roperty Alignment: TAlignment;

Specifică cum este afişat textul în interiorul unui panou. Valori posibile pentru această proprietate sunt: taLeftJustify, taRightJustify, taCenter.

N um e S c in n ilic a ţie

taLeftJustify A liniază textul în partea stângă a panoului.

TaRiţ’luJtixtify A liniază textul în partea dreaptă a panoului.

TaCenter C entrează textul în panou.

P2. Bevcl

property Bevel: TStatusPanelBevel;

Indică tipul marginii panoului. Valori posibile pentru Bevel sunt:

149

N u m e S em n ifica ţie

PbNone Panou! nu are nici o m argine şi pare plat.

phLowered Panoul are o m argine care crează im presia că panoul este scobit.

pbRaised Panoul are o m argine care crează im presia că panoul este ridicat.

P3. Text

property Text: string;

Indică textul afişat în panou, dacă valoarea proprietăţii Style este psText.

P4. Style

property Style: TStatusPanelStyle;

Indică felul în care este afişat textul din panou. Valori posibile pentru Style sunt:

N u m e S em n ifica ţie

PsText în panou este afişat şirul ataşat proprietăţii Text.

PsOwnerDrawC onţinutu l panoului va fi desenat la m om entul execuţie aplicaţiei prin interm ediul liandlerului de even im ent TSlatusBar.OnDrawPanel.

P5. Width

property Width: Integer;

Indică dimensiunea, în număr de pixeli, (pe orizontală) a panoului.

Exem plul 1:

Următoarea aplicaţie constă dintr-o formă pe care sunt plasate 3 controale: o cutie de editare de tip TEdit, un buton de tip TButton şi o componentă de tip TStatusBar. în momentul creării formei, barei de statut îi sunt create două panouri în care se va afişa poziţia cursorului de mouse. Dacă mouse-ul trece pe deasupra celor două componente (TButton şi TEdit), atunci bara de statut va deveni simplă şi va afişa un text sugestiv.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object StatusBarl: TStatusBar Panels = <

itemText = 'X = 'Width = 50

itemText = 'Y='Width = 50

end>SimplePanel = False

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

procedure TForml.ButtonlMouseMove(Sender: TObject;Shift: TShiftState; X,Y: Integer);

beginStatusBarl.SimplePanel := true;StatusBarl.SimpleText := 'Trec pe deasupra unui buton';

end ;

procedure TForml.EditlMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);

beginStatusBarl.SimplePanel := true;StatusBarl.SimpleText :=

'Trec pe deasupra unei cutii de editare';end;

procedure TForml.FormMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);

beginStatusBarl.SimplePanel := false;StatusBarl.Panels.Items[0].Text := 'X = '+IntToStr(X);StatusBarl.Panels.Items[l].Text ;= ' Y= '+IntToStr(Y);

end;

Exem plul 2:

Următoarea aplicaţie creează unei componente TStatusBar două pa­nouri. Pe cel de al doilea se vor afişa - cu ajutorul unui tim er - numerele de la 1 la 10. Pe primul panou se va afişa un text sugestiv când s-a ajuns la 10.

vari : integer;

procedure TForml.FormCreate(Sender: TObject); beginTimerl .Enabled -. = true;i := 0; / / d e cate ori s-a apelat evenim entul O nT im er

end;

procedure TForml.TimerlTimer(Sender: TObject); begin

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

151

p ţ < j i M ) ii i)iw t i i> ii i |W II» l l T i i i r w i i i i i i i w i W i l l l i iiiii ...............

if i = 10 then begin

StatusBarl.Panels.Items[0].Text := 'Am ajuns la 10! Timerl .Enabled := false; //opresc tim er-ul

end; inc(i);

end;

152

14. MANIPULATOR DE PANOURI

în acest capitol sunt prezentate două componente: TPageControl şi TTabSheet.

TPageControl este o componentă ca permite utilizatorului să afişeze multiple panouri (pagini) într-o aceeaşi fereastră. Fiecare pagină este o compo­nentă de tip TTabSheet. Paginile sunt total suprapuse, iar la un moment dat una singură este vizibilă. Pe suprafaţa ei se pot amplasa componente. Fiecare pagină are ataşat un buton amplasat pe marginea componentei TPageControl. Trecerea de la o pagină la alta se face cu ajutorul butoanelor ataşate.

14.1. TPageControl

Este un control care permite utilizatorului să folosească multiple pagini (ferestre) într-o aceeaşi suprafaţă. în fiecare moment o singură pagină este visibilă. Fiecare pagină se comportă ca o formă, adică pe suprafaţa ei se pot amplasa componente. Pentru fiecare pagină apare în partea de sus (de obicei) a lui TPageControl câte un buton prin a cărui apăsare pagina ataşată lui va deveni vizibilă. O pagină este un obiect de tipul TTabSheet.

La momentul proiectării aplicaţiei crearea unei noi pagini se realizează prin click dreapta pe componenta TPageControl iar apoi prin selectarea comenzii NewPage.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomTabControl -> TPageControl.

Definit în_____________________________________________________

comctrls.pas

Pagina_______________________________________________________

Win32

153

Proprietăţi__________________________________________ _________

PI. ActivePage

property ActivePage: TTabSheet;

Indică pagina activă. Prin setarea acestei proprietăţi ActivePage va deveni pagina vizibilă.

P2. PageCount

property PageCount: Integer;

Indică numărul de pagini din TPageControl.

P3. Pages

property Pages[Index: Integer]: TTabSheet;

în Pages se află toate paginile lui PageControl. Prin intermediul lui Index se poate accesa fiecare pagină în parte.

P4. HotTrack

property HotTrack: boolean;

Indică dacă textul înscris pe un tab se luminează când cursorul de mouse trece pe deasupra lui.

P5. MultiLine

property MultiLine: Boolean;

Indică dacă este permisă afişarea tab-urilor pe mai multe linii. în caz contrar şi dacă lungimea totală a tab-urilor este mai mare decât cea a TPageControl-u\u\, două săgeţi îi vor permite utilizatorului să navigheze printre tab-uri.

P6. TabPosition

property TabPosition: TTabPosition;

Indică poziţia în care să apară tab-urile unui TPageControl. Valori posibile pentru TabPosition sunt tpTop şi tpBottom.

154

Exemplu:

Următoarea aplicaţie setează dimensiunea şi stilul textului din cutia de editare E ditl. Pentru aceasta este folosită o componentă TPageControl cu două pagini (create la momentul proiectării programului).Pe prima pagină se află o cutie de editare Edit2, în care utilizatorul introduce dimensiunea textului cutiei de editare E ditl şi un buton de tip Default (Default := true), la a cărui apăsare se setează dimensiunea textului din cutia E ditl la valoarea conţinută în Edit2.Pe a doua pagină se află 4 cutii de control (componente de tip TCheckBox) corespunzând celor patru stiluri de font: bold (îngroşat), italic (înclinat), underline (subliniat), strikeout (tăiat).

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object PageControll: TPageControl object TabSheetl: TTabSheet

Caption = 'Dimensiune' object Edit2: TEdit

Text = '12' endobject Buttonl: TButton

Caption = 'executa'Default = True

end endobject TabSheet2: TTabSheet

Caption = 'Font' object CheckBoxl: TCheckBox

Caption = 'bold' object CheckBox2: TCheckBox

Caption = 'italic' endobject CheckBox3: TCheckBox

Caption = 'underline' endobject CheckBox4: TCheckBox

Caption = 'strikeout' end

end endobject Editl: TEdit

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

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

varstil,bold,italic,underline,strikeout:TFontStyles;

155

procedure TForml .FormActivate (Sender TObject); begin

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

end;

procedure TForml.ButtonlClick(Sender: TObject); begin

Editl.Font.Size := StrToInt(Edit2.Text); end;

procedure TForml.CheckBoxlClick(Sender: TObject) begin

if CheckBoxl.Checkedthen stil := stil + [fsbold] else stil := stil - [fsbold];

Editl.Font.Style := stil; end;procedure TForml.CheckBox2Click(Sender: TObject) begin

if CheckBox2.Checkedthen stil := stil + [fsitalic] else stil := stil - [fsitalic];

Editl.Font.Style := stip­end;procedure TForml,CheckBox3Click(Sender: TObject) beginif CheckBox3.Checked

then stil := stil + [fsunderline] else stil := stil - [fsunderline];

Editl.Font.Style := stil; end;

procedure TForml.CheckBox4Click(Sender: TObject) beginif CheckBox4.Checked

then stil := stil + [fsstrikeout] else stil := stil - [fsstrikeout];

Editl.Font.Style := stil; end;procedure TForml.TabSheetlEnter(Sender: TObject) begin

Edit2.SetFocus; end;

156

Metode

M l. FindNextPage

function FindNextPage^CMrPage: TTabSheet;GoForward, CheckTabVisible: Boolean):

TTabSheet;

Returnează următoarea (precedenta) pagină din cadrul lui TPageControl. Dacă GoForward este true, se va returna o pagină aflată după pagina curentă, în caz contrar una aflată înaintea celei curente. Dacă CheckTabVisible este true se va căuta printre paginile care au proprietatea TabVisible true , în caz contrar luându-se în calcul toate paginile existente.

M2. Select Next Page

procedure SelectNextPage(Go/wiwi/Yi: Boolean);

Permite utilizatorului să selecteze următoarea pagină. GoForward are aceeaşi însemnătate ca la proprietatea precedentă.

Evenimente__________________________________________________

E l. OnChange

property OnChange: TNotifyEvent;

Apare când un nou tab (componentă de tip TTabSheet) este selectat.

E2. OnChanging

property OnChanging: TTabChangingEvent;

Apare exact înainte de a se selecta o nouă pagină. Tipul TTabChangingEvent este definit astfel:

type TTabChangingEvent = procedure (Sender: TObject;var AllowChange: Boolean) of object;

AllowChange indică dacă este permisă sau nu selectarea acelei pagini.

14.2. TTabSheet

Este o pagină dintr-o componentă TPageControl.

157

Ierarhie

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TTabSheet.

Definit în_____________________________________________________

com ctrls.pas

Proprietăţi___________________________________________________

P I. Pagelndex

property Pagelndex: Integer;

Furnizează acces la numărul de ordine al unei pagini din cadrul lui PageControl.

P2. PageControl

property PageControl: TPageControl;

Indică componenta de tip TPageControl care conţine TTabSheet-u\.

P3. Tablndex

property Tablndex: Integer;

Indică numărul de ordine al tabului paginii curente din cadrul unui vector de tab-uri vizibile.

P4. TabVisible

property TabVisible Boolean;

Indică dacă tab-ul obiectului TTabSheet este vizibil în TPageControl.

Metode__________________________________ ___________________

M l. Create

constructor Cred.tc(A Owner: TComponent);

Este constructorul clasei.

158

Evenimente

E l. OnHide

property OnHide: TNotifyEvent;

Apare când proprietatea Visible a paginii este setată la false.

E2. OnShow

property OnShow: TNotifyEvent;

Apare când proprietatea Visible a paginii este setată la true.

Exemplu:

Următoarea aplicaţie creează la momentul execuţiei 10 pagini de tip TTabSheet. Apoi, cu ajutorul unei componente TUpDown, navighează printre ele.

Handlerele de evenimente pentru forma Form l sunt:

procedure TForml.FormCreate(Sender: TObject); var i: integer;

pPage; TTabSheet; begin for i .-= 0 to 9 do begin

pPage := TTabSheet.Create(Forml) ; pPage.PageControl := PageControll; pPage.Caption := 'Pagina'+IntToStr(i);

end; end;

procedure TForml.UpDownlClick(Sender: TObject;Button: TUDBtnType);

beginPageControll.SelectNextPage(Button = btNext);

end;

159

15. RIGLE

în acest capitol este prezentată componenta TTrackBar care constă dintr- un cursor ce se poate deplasa de-a lungul unei rigle marcate.

15.1. TTrackBar _i_i

Este o componentă ce conţine un cursor care se poate deplasa de-a lungul unei rigle marcate. La momentul execuţiei, mişcarea (deplasarea) curso­rului se poate face cu ajutorul mouse-ului, cu ajutorul tastelor <Up>, <Down>, <PgUp>, <PgDown> sau prin atribuirea unei valori proprietăţii Position.

ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TTrackBar.

Definit în___________________________________________ ______ __

comctrls.pas

Pagina __________ _______ _

Win32

Proprietăţi___________________________________________

P I. Position

property Position: Integer;

Indică poziţia curentă a cursorului pe riglă. Poziţia cursorului poate lua valori în intervalul [Min..Max].

P2. Max

property Max: Integer;

Indică valoarea poziţiei maxime pe care o poate avea cursorul.

160

property Min: Integer;

Indică valoarea poziţiei minime pe care o poate avea cursorul.

P4. Frequency

property Frequency: Integer;

Specifică din câte în câte unităţi apar marcajele pe riglă. O riglă este împărţită în Max - Min + 1 unităţi. Dacă Frequency este 1, atunci pentru fiecare unitate este desenat câte un marcaj. Dacă Frequency este 2, atunci câte un marcaj este desenat la fiecare două unităţi.

P5. LineSize

property LineSize: Integer;

Specifică numărul de poziţii cu care se va mişca cursorul când sunt apăsate tastele săgeată în sus (<Up>) sau săgeată jos (<Down>).

P6. PageSize

property PageSize: Integer;

Specifică numărul de poziţii cu care se va mişca cursorul când sunt apăsate tastele <PageUp>, sau <PageDown>.

P7. Orientation

property Orientation: TTrackBarOrientation;

Specifică aşezarea componentei TTrackBar. Valori posibile pentru Orientation sunt:

P3. Min

V a lo a re S em n ifica ţie

IrHorizotilal C om ponenta TTrackBar este orientată orizontal. Poziţia Min se a flă la s tânga poziţiei Max.

trVerticalC om ponenta TTrackBar este orientată vertical. Poziţia Min se află deasupra poziţiei Max.

P8. TickStyle

property TickStyle: TTickStyle;

Indică tipul marcajelor riglei. Valori posibile pentru TickStyle sunt:

161

V a lo a re S em n ifica ţie

tsAuto M arcajele sun t autom at afişate pe riglă. Pasul cu care sun t afişate este da t de p roprietatea Frequency.

tsManualIm plicit nu este afişat nici un m arcaj, dar acestea pot fi am plasate cu a ju to ru l m etodei SetTick.

tsNone N ici un m arcaj nu este afişat pe riglă.

P9. TickMarks

property TickMarks: TTickMark;

Un cursor poate fi însoţit opţional de o riglă marcată. TickMarks specifică poziţia riglei faţă de cursor. Valori posibile pentru TickMarks sunt:

V a lo a re S em n ifica ţie

tmBottoniRiglUM arcajele se află sub cursor sau la dreapta cursorulu i, acest lucru depinzând de p roprietatea Orientation.

tniTopLeftM arcajele se află deasupra sau la stânga cursorulu i, acest lucru depinzând de p roprietatea Orientation.

tiuBolh M arcajele se a flă de am bele părţi ale cursorului.

Metode

M l. SetTick

procedure SetTick(Va/Me: Integer);

Amplasează un semn de marcare pe riglă la poziţia Value e [Min .. Max]. Această metodă se apelează doar când valoarea proprietăţii TickStyle este tsManual.

Exemplu:

Următoarea aplicaţie generează la apăsarea butonului Buttonl 10 marcaje pe rigla componentei TrackB arl. Marcajele sunt amplasate în poziţii aleatoare.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object TrackBarl: TTrackBar Max = 20Orientation = trHorizontal Frequency = 1 Position = 0TickMarks = tmBottomRight

162

TickStyle = tsManual endobject Buttonl: TButton Caption = 'Marcaje'

end1 landlerele de evenimente ale obiectelor de pe forma Form l sunt:

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

beginfor i := 1 to 10 do beginpoz := TrackBarl.Min +

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

end; end;

Evenimente

E l. OnCliange

property OnChange: TNotifyEvent;

Apare când poziţia cursorului se schimbă.

Exem plul 1:

Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate o componentă TTrackBar şi o componentă TlmageList. Aceasta din urmă conţine imagini introduse de către programator la momentul proiectării aplicaţiei. După lansarea aplicaţiei în execuţie, numărul poziţiilor TrackBar-ului va fi setat la numărul imaginilor din listă. în acest fel, fiecărei poziţii a cursorului îi va corespunde o imagine din listă. Prin mişcarea cursorului se va desena pe ecran imaginea corespunzătoare din listă.

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

procedure TForml.FormCreate(Sender: TObject);begin

TrackBarl.Max := ImageListl.Count;TrackBarl.Min := 0;TrackBarl.Position := 0;

end;

163

procedure TForml.TrackBarlChange(Sender: TObject); begin

ImageListl.Draw(Canvas,0,0,TrackBarl.Position); end;

Exemplul 2:

Următoarea aplicaţie afişează în cutia de editare E ditl numere aleatoare din intervalul 1..100. Numerele sunt afişate la evenimentul OnTimer al obiectului TimerI. Viteza de afişare (valoarea proprietăţii Interval a lui TTimer) este modificată cu ajutorul unei componente TTrackBar. Valori mici ale proprietăţii Position înseamnă viteză mare de generare. Valori mari ale proprietăţii Position înseamnă viteză mică de generare.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Editl; TEdit Text = 'Editl'

endobject TrackBarl: TTrackBar

Orientation = trHorizontal Frequency = 1 Position = 1

endobject Timerl: TTimer

Interval = 200 end

Handlerele de evenimente ale obiectelor de pe formă sunt:

procedure TForml.TimerlTimer(Sender: TObject); begin

Editl.Text:=IntToStr(1 + random(100)); end;

procedure TForml.TrackBarlChange(Sender: TObject); begin

Timerl.Interval:=TrackBarl.Position*200;/ / o gradaţie pe scala lui TTrackBar valorează 200 de milisecunde //pen tru intervalul lui Timerl

end;

Exemplul 3:

Următoarea aplicaţie setează cu ajutorul unei componentei TrackBarl dimensiunea fontului etichetei L a b ell.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Labell: TLabel Caption = ’Labell'Font.Height = -13 Font.Name = 'Courier New'

164

endobject TrackBarl: TTrackBar Max = 2 0Orientation = trVertical Frequency = 1 Position = 0TickMarks = tmBottorciRight TickStyle = tsAuto

endI l;mdlerele de evenimente ale obiectelor de pe forma Form l sunt:

procedure TForml.TrackBarlChange(Sender: TOfcnect); begin

I,.ibel 1. Font. Size := TrackBarl. Position + 10; and;

16. MENIURI

Componentele de meniu permit ataşarea unui meniu unei forme (componenta TMainMenu) sau unei componente (TPopUpMenu).

Componenta TMainMenu încapsulează bara principală de meniu împreună cu meniurile drop-down ataşate ei.

Componenta TPopUpMenu încapsulează un meniu popup (care apare la click dreapta pe o componentă).

Un meniu este alcătuit din itemuri de meniu care sunt obiecte de clasă TMenuItem. Accesarea unui item de meniu se face cu ajutorul proprietăţii Items a lui TMainMenu şi TPopUpMenu.

La sfârşitul acestui capitol sunt prezentate câteva funcţii utile în manipularea şi prelucrarea meniurilor la momentul execuţiei aplicaţiei.

16.1. TMenu

Este clasa de bază pentru meniuri Windows. Din ea derivă TMainMenu şi TPopupMenu.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TMenu.

Definit în

menus.pas

Proprietăţi___________________________________________________

P I. Items

property Items: TMenuItem;

Specifică item-urile unui meniu. Această proprietate este utilă dacă do­rim să prelucrăm meniul la timpul execuţiei programului. La momentul proiectării aplicaţiei proprietatea poate fi editată din O bject Inspector.

166

1*2. Handle

property Handle: HMENU;

Este handle-ul la meniu.

1*3. WindowHandle

property WindowHandle: HWnd;

Este handle-ul la fereastra care foloseşte acest meniu.

Metode

M l. Findltem

function Findltem(l/fl/«e: Word; Kind: TFindltemKind): TMenuItem;

Găseşte un item şi îl returnează. Această metodă este utilă pentru a căuta un anumit item într-un meniu (inclusiv în submeniuri). Meniul poate fi identificat prin unul dintre următoarele trei lucruri: scurtătură (shortcut), identificatorul mesajului WM COMMAND şi handle. Valori posibile pentru Kind sunt:

V a lo a re S e m n ifica ţie

fkCommand M eniul este căutat după m esajul W M _C O M M A N D .

JkHandle M eniul este căutat după identificatorul W indows.

jkShortC ut M eniul este cău tat după scurtătură.

Exemplu:

Următoarea aplicaţie realizează căutarea unui item de meniu după scurtătura ataşată lui. Este folosită o componentă de tip THotKey în care utilizatorul este solicitat să introducă combinaţia de taste după care se va realiza căutarea.

procedure TForml.ButtonlClick(Sender: TObject);var meniu : TMenuItem;

beginmeniu := MainMenul.FindItem(HotKeyl.HotKey, fkShortCut); if meniu = nil

then ShowMessage('Meniul nu exista!')©Îs© ShowMessage('Meniul are eticheta ' + meniu.Caption);

end;

167

16.2. TMainMenu r

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

Pentru a ataşa un meniu unei forme, Ia timpul proiectării aplicaţiei, amplasaţi pe formă o componentă de tip TMainMenu, iar apoi executaţi dublu click pe ea. Pe ecran va apărea un utilitar care vă va ajuta la crearea unui meniu:

f ţ j Forml.MainMenul

Precum vedeţi, există un câmp marcat, unde puteţi introduce un nume de item (meniu) principal. Să-l denumim File (în O bject Inspector setaţi proprie­tatea Caption la valoarea 'File'). Pe ecran va apărea:

•g" Forml.M ainM enul H0E3File j..........j

Există un câmp marcat pentru adăugare de item-uri (submeniuri) la meniul File, şi un câmp pentru adăugarea unui nou item în bara de meniu, deci pe acelaşi nivel cu File. Lucrurile evoluează de aici încolo tot aşa, la fiecare pas aveţi posibilitatea fie să adăugaţi un nou item la bara principală, fie să adăugaţi un item (submeniu) la unul din meniurile existente. Pentru a adăuga un subitem la un item existent executaţi click dreapta pe respectivul submeniu şi alegeţi Create Submenu. Pentru a insera un item se execută click dreapta pe itemul

168

înaintea căruia se doreşte inserarea şi apoi se alege Insert. Pentru a şterge un item poziţionaţi-vă pe el şi apoi apăsaţi tasta Delete.

Item-urile din bara principală de meniu se accesează cu ajutorul proprietăţii Menu (care este de tip TMainMenu) a lui TForm. Item-urile (sub- meniurile) se accesează cu ajutorul proprietăţii Items a lui TMainMenu.

Fiecare item este o componentă Delphi, deci acesta îi va da automat un nume. Acest nume se formează adăugând la titlu un număr. De exemplu, dacă pe l'ormă nu mai există altă componentă cu numele File, atunci item-ul care se vede mai sus va primi numele de F ilei. Dacă există mai multe item-uri (com­ponente) cu acelaşi titlu, ele vor primi în ordinea creării numele F ile i, F ile i,...

Ierarhie

TObject -> TPersistent t> TComponent -> TMenu -> TMainMenu.

Definit în

menus

Pagina______

Standard.

Proprietăţi

1*1. AutoMerge

property AutoMerge: Boolean;

Indică dacă meniurile de pe alte forme pot fuziona cu meniul de pe forma principală. Dacă doriţi ca un meniu de pe o altă formă să fuzioneze, în momentul în care această formă devine activă, cu meniul de pe forma principală, atunci setaţi proprietatea acestuia (de pe forma secundară) la true. In toate cazurile aveţi grijă ca proprietatea AutoM erge pentru meniul formei principale să rămână false.Modul în care fuzionează meniurile este controlat cu ajutorul proprietăţii Grouplndex a lui TMenuItem.

Kxeinplul 1:Să presupunem că pe forma principală (F orm l) avem o bară de meniu cu item-urile File, Run, Edit, View şi Help, iar pe forma secundară (F orm l) avem o bară de meniu cu item-urile Run, Compile, Tools şi Window. Aceste meniuri le-am creat la momentul proiectării aplicaţiei. Pe forma Form l mai avem un buton Buttonl care va face forma Form l

169

activă. în urma execuţiei programului de mai jos, meniul formei Form l după apăsarea butonului Buttonl va avea următoarele item-uri astfel: File, Run, Compile, Tools, Window.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Buttonl: TButton Caption = 'Buttonl'

endobject MainMenul: TMainMenu object Filei: TMenuItem

Caption = 'File'Grouplndex = 1

endobject editl: TMenuItem

Caption = 'Edit'Grouplndex = 2

endobject Viewl: TMenuItem Caption = 'View'Grouplndex = 2

endobject Helpl: TMenuItem

Caption = 'Help'Grouplndex = 4

end end

iar pentru forma Form2:

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

endobject Compilai: TMenuItem

Caption = 'Compile'Grouplndex = 2

endobject Toolsi: TMenuItem

Caption = 'Tools'Grouplndex = 3

endobject Windowl: TMenuItem

Caption = 'Window'Grouplndex = 3

end end

Handlerele de evenimente ale componentelor formei Form l sunt:

procedure TForml.ButtonlClick(Sender: TObject);begin

Form2.SUow;end;

170

Exemplul 2:

Următorul exemplu permite editarea unui text. Este permisă modificarea culorii textului şi a fundalului, boldarea, italicizarea şi sublinierea textului, aplicarea de bullets and numbering prin selectarea opţiunii corespunzătoare care va apare la execuţia unui click dreapta. Vom folosi mai întâi o componetă TRichEditl în care vom putea edita text. O altă componentă folosită este TMainMenuJ care conţine trei meniuri:

• meniul File cu submeniurile:

- Open - care permite deschiderea unui fişier existent pentru care vom folosi o componentă O penD ialogI;

- Save - care permite salvarea documentului curent realizată cu ajutorul unei componente SaveD ia log l;

- Close - care permite închiderea aplicaţiei;

• meniul Format care cuprinde submeniurile:

- B old ;- Italic',- Bullets and numbering;- Size.

• meniul Help.

Submeniurile Bold şi Italic permit boldarea şi italicizarea textului selec­tat, submeniul Bullets and numbering permite numerotarea unor sec­venţe de text, iar submeniul Size permite setarea dimensiunii textului. Meniul Help determină apariţia unei a doua forme, F orm l, în care poate fi scris un text privitor la utilizarea aplicaţiei. Vom mai folosi o componentă PopUpM enul care să ne permită selectarea uneia dintre opţiunile ce vor fi afişate la realizarea unui click dreapta. Vom mai folosi şi o componentă ColorD ialogl care va fi disponibilă în momentul în care dorim setarea unei culori pentru fundal sau text.

Proprietăţile obiectelor de pe forma F orm l sunt:

object RichEditl: TRichEdit PopupMenu = PopupMenul

endobject MainMenul: TMainMenu object Filei: TMenuItem

Capfion = 'File' object Closel: TMenuItem

Caption = 'Close'Shortcut = 16451

171

endobject Savel: TMenuItem

Caption = ’Save'Shortcut = 16467 OnClick = SavelClick

endobject openl: TMenuItem

Caption = 'Open 1 Shortcut = 16463

end endobject Optionsl: TMenuItem

Caption = 'Format' object Boldl: TMenuItem

Caption = 'Bold'Shortcut = 16450

endobject Italici: TMenuItem Caption = 'Italic'Shortcut = 16457

endobject Bulletsandnumberingl: TMenuItem

Caption = 'Bullets and numbering' endobject Sizel: TMenuItem

Caption = 'Size'OnClick = SizelClick

end endobject helpl: TMenuItem

Caption = 'help'Shortcut = 112 OnClick = helplClick

end endobject PopupMenul: TPopupMenu

MenuAnimation = [maTopToBottom] object Colori: TMenuItem

Caption = 'Color' object Backgroungl: TMenuItem

Caption = 'Backgroung'OnClick = BackgrounglClick

endobject extl: TMenuItem

Caption = 'Text'OnClick = extlClick

end endobject Fontl: TMenuItem

Caption = 'Font' object Bold2: TMenuItem

Caption = 'Bold'OnClick = Bold2Click

end

172

object Italic2: TMenuItem Caption = 'Italic'OnClick = Italic2Click

endobject Underlinel: TMenuItem

Caption = 'Underline'OnClick = UnderlinelClick

endobject Strickeoutl: TMenuItem Caption = 'Strickeout’OnClick = StrickeoutlClick

end end

endobject ColorDialogl: TColorDialog endobject OpenDialogI: TOpenDialog •ndobject SaveDialogl: TSaveDialog and

I Iandlerele de evenimente ale obiectelor de pe forma Form l sunt:

procedure TForml.BackgrounglClick(Sender: TObject); begin

if ColorDialogl.Executethen RichEditl.Color: ColorDialogl.Color;

•nd;procedure TForml.extlClick(Sender: TObject); beginif ColorDialogl.Executethen RichEditl.SelAttributes.Color := ColorDialogl.Color;

end;

procedure TForml.SizelClick(Sender: TObject);var s : string;

begins : = 11 ;if InputQuery('Input Box', ’size', s) then RichEditl.SelAttributes.Size := StrToInt(s);

end;

procedure TForml.SavelClick(Sender: TObject); begin

If SaveDialogl.Executethen RichEditl.Lines.SaveToFile(SaveDialogl.FileName);

end;

procedure TForml.Bold2Click(Sender: TObject); beginif RichEditl.SelAttributes.Style * [fsbold]<>[] then RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style-[fsBold] else RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style+[fsBold];end;

procedure TForml.Italic2Click(Sender: TObject);beginif RichEditl.SelAttributes.Style * [fsitalic]o [] then RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style-[fsitalic) else RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style+[fsitalic];end;procedure TForml.UnderlinelClick(Sender: TObject);beginif RichEditl.SelAttributes.Style * [fsunderline]<>[] then RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style-[fsUnderline] else RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style+[fsUnderlin e];end;procedure TForml.StrickeoutlClick(Sender: TObject);begin

if RichEditl.SelAttributes.Style * [fsStrikeOut]o [] then RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style - [fsStrikeOut] else RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style + [fsStrikeOut];end;procedure TForml.helplClick(Sender: TObject);begin

f orm2 . ShowModal ;end;

Metode

M l. Merge

procedure Merge(A/e/iw: TMainMenu);

Combină meniul principal al unei forme cu meniul principal al altei forme. Menu este meniul celei de-a doua forme.

M2. Unmerge

procedure Unmerge(Menu: TMainMenu);

Este inversa operaţiei Merge.

174

16.3. TPopUpMenu

Un meniu TPopUp este asemănător cu un TMainMenu. Apar însă unele

diferenţe:

• când utilizatorul execută click dreapta pe o formă sau pe un control;

• item-urile din “bara principală” de meniu sunt dispuse nu orizontal

ci vertical.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TMenu -> TPopupMenu.

Definit în_____________________________________________________

menus

Pagina_______________________________________________________

Standard

Proprietăţi___________________________________________________

IM. Alignment

property Alignment: TPopupAlignment;

Specifică poziţia unde apare meniul când utilizatorul execută click

dreapta pe un control. Valori posibile pentru Alignment sunt:

Valoare Semnificaţie

paLeft Colţul din stânga sus al meniului apare pe poziţia cursorului de mouse.

paCenter Centrul marginii de sus a meniului apare pe poziţia cursorului de

mouse.

paRight Colţul din dreapta sus al meniului apare pe poziţia cursorului de mouse.

Implicit este paLeft.

P2. AutoPopup

property AutoPopup: Boolean;

Specifică dacă meniul popup apare când se execută click dreapta pe o

componentă.

Exemplu:

Următorul exemplu conţine un meniu TPopUp care se activează la

executarea unui click dreapta pe butonul Buttonl. Item-urile acestui

meniu sunt Înălţime, Latime şi FontMare şi au fost create în momentul

proiectării aplicaţiei. La selectarea itemului Înălţime, cutia de editare

Editl devine activă şi utilizatorul este solicitat să introducă înălţimea

butonului Buttonl. La selectarea itemului Latime, cutia de editare Edit2

devine activă şi utilizatorul este solicitat să introducă lăţimea butonului

Buttonl. La apăsarea itemului FontMare, fontul titlului butonului

Buttonl este mărit la 15, iar apoi, la o nouă apăsare, este readus la

mărimea iniţială (8). Pe formă mai există două butoane - Button2 şi

Button3 - care sunt de tip Default pentru cele două cutii de editare.

Valorile proprietăţilor obiectelor de forma Forml sunt:

object Buttonl: TButton PopupMenu = popupMenul

endobject Button2: TButton

Caption = 'Schimba latime'Default = True Enable = False

endobject Button3: TButton

Caption = 'Schimba inaltime'Default = True Enabled = False

endobject Editl: TEdit

Visible = False endobject Edit2: TEdit

Visible = False endobject PopupMenul: TPopupMenu

object Inaltimel: TMenuItem Caption = 'Inaltime'OnClick = InaltimelClick

endobject Latimel: TMenuItem

Caption = 'Latime'OnClick = LatimelClick

endobject FontMarel: TMenuItem

Caption = 'FontMare'OnClick = FontMarelClick

end end

176

I Imullcrelc de evenimente ale obiectelor de forma Forml sunt:

limuadure TForml. LatimelClick (Sender: TObject); liauin

Kc 11 I 1 . Show;

hi 11 I ori2 . Enabled: =true ;Mut I on î.Enabled;=false;I :. I i l 1 . SetFocus;

and;

inocodure TForml.InaltimelClick(Sender: TObject); liagln

l '.i III A . Show;

Mul l.on3 .Enabled: =true; luii t on2 .Enabled: =false; l-'.i Iii 2 . SetFocus ;

aud;

procedure TForml.Button2Click(Sender: TObject); var

Uit. : integer; bagin

1 ,i\ : strtoint (Editl .Text) ;Itui tor,] .Width:=lat;

and ;procedure TForml.Button3Click(Sender: TObject);

varinalL : integer;

bagini ii,i 1 r : =strtoint (Edit2 .Text) ; lint Lonl. Height: =inalt ;

and ;procedure TForml.FontMarelClick(Sender: TObject); begin

KontMarel.Checked:=not(FontMarel.Checked);Hui: toni. Font .Size: =15- (Buttonl .Font. Size-8) ;

and,

1*3. PopupComponent

property PopupComponent: TComponent;

Indică ultima componentă care a afişat meniul popup. Un meniu popup

poate fi ataşat la mai multe controale, cu ajutorul proprietăţii

PopupMenu a lui TControl.

177

Metode

M l. Popup

procedure Pop up (A-, Y: Integer);

Afişează un meniu de tip PopUp în locul specificat de coordonatele X şi

Y.

Evenimente______________________________________________

E l. OnPopup

property OnPopup: TNotifyEvent:

Apare înainte ca meniul PopUp să fie afişat.

16. 4. TMenuItem

Conţine proprietăţile metodelor necesare pentru a prelucra un item de

meniu.

Ierarhie________________________________________________ _____

TObject -> TPersistent -> TComponent -> TMenuItem.

Definit în________________________________________________ __

menus

PI. Caption

property Caption: string;

Indică textul ataşat unui item de meniu.

P2. Items

property Itemsl/ne/ex: Integer]: TMenuItem; default;

Furnizează acces la subitem-urile (submeniurile) unui meniu.

property Count: Integer;

Indică numărul de subitem-uri ale unui meniu.

Exemplu 1:

Următoarea aplicaţie tipăreşte etichetele ataşate tuturor itemurilor de

meniu din meniul principal al formei.

Procedurile şi handlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure TForml.TiparesteMeniuri(meniu : TMenuItem);//tipăresc in ListBox submeniurile itemului meniu

vari : integer;

beginListBoxl.Items.Add(meniu.Caption); i := 0;while i < meniu.Count do begin

TiparesteMeniuri(meniu.Items[i]); i : = i + 1 ;

end; end;

procedure TForml.ButtonlClick(Sender: TObject); var

i : integer; begin

i := 0;while i < MainMenul.Items.Count do begin

TiparesteMeniuri(MainMenul.Items[i]); i : = i + 1 ;

end; end;

Exemplu 2:

Următoarea aplicaţie construieşte - într-o componentă TTreeView - un

arbore care reflectă structura arborescentă dintr-un meniu.

Procedurile şi handlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure TForml.AfiseazaMeniuri(meniu : TMenuItem;nod : TTreeNode);

//afiseaza submeniurile itemului meniu in subarborele de rădăcină nod

vari : integer; fiu : TTreeNode;

begin

P3. Count

179

i := 0;// pentru fiecare submcniu

while i < meniu.Count dobegin

// creez un fiu in arbore

fiu := TreeViewl. Items . AddChild (nod, meniu.Items[i].Caption);// apelez recurşi v

AfiseazaMeniuri(meniu.Items[i], fiu); i := i + 1;

end; end;

procedure TForml.ButtonlClick(Sender: TObject); var

i : integer; nod : TTreeNode;

begini := 0;while i < MainMenul.Items.Count do begin

// pentru fiecare meniu din bara principala de meniu

// creez cate un nod in arbore

nod := TreeViewl.Items.Add(nil,MainMenul.Items[i].Caption);// si apelez recursiv pentru submcniuri

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

end; end;

P4. Hint

property Hint: string;

Specifică textul care apare când cursorul mouse-ului trece pe deasupra

item-ul de meniu.

P5. Checked

property Checked: Boolean;

Indică dacă un meniu este selectat sau nu. Dacă Checked este true,

atunci lângă numele meniului apare un semn de bifare.

P6. Enabled

property Enabled: Boolean;

Indică dacă un meniu este sau nu disponibil la un moment dat.

180

VI. Break

property Break: TMenuBreak;

Indică dacă itemul de meniu generează o nouă coloană în meniu. Valori

posibile pentru Break sunt:

Valoare Semnificaţie

mbNone Nu apare nici o ruptură în meniu. Această situaţie este implicită.

mbBarBreak

Meniul părinte este rupt încă într-o coloană. Itemul curent va fi pus

în capul noii coloane. 0 bară separă noua coloană de cele deja

existente.

mbBreakMeniul părinte este rupt încă într-o coloană. Itemul curent va fi pus

în capul noii coloane.

P8. Menulndex

property Menulndex: Integer;

Indică numărul de ordine al unui item (meniu) în cadrul meniului

părinte. Numărul de ordine al primului item (meniu) este 0.

P9. Parent

property Parent: TMenuItem;

Specifică itemul părinte al unui meniu.

P10. ShortCut

property ShortCut: TShortCut

Determină combinaţia de taste pe care utilizatorul trebuie să o tasteze

pentru a accesa un meniu mai rapid. De obicei, această combinaţie apare

scrisă la dreapta item-ului de meniu.

P il. Visible

property Visible: Boolean;

Determină dacă un item (meniu) este vizibil sau nu. Dacă nu este vizibil

utilizatorul nu îl poate selecta.

PI 2. Grouplndex

property Grouplndex: Byte;

Specifică modul în care meniurile diferitelor forme ale unei aplicaţii

fuzionează.

181

Această proprietate este utilă atunci când aplicaţia are mai multe forme

fiecare dintre acestea având un meniu propriu. Dacă proprietatea

AutoMerge pentru meniul unei forme diferită de forma principală este

true atunci la activarea acestei forme (formă secundară) meniul acesteia

va dispărea de pe ea şi va fuziona cu meniul de pe forma principală.

Dacă AutoMerge pentru meniul de pe o formă secundară este false,

atunci la activarea acesteia meniul de pe ea nu va dispărea şi nu va

fuziona cu meniul de pe forma principală.

Fiecare item al meniului are propriul lui Grouplndex. Pentru fuzionarea

a două meniuri nu sunt luate în considerare decât item-urile din bara

principală a meniurilor, celelalte item-uri secundare ne-intrând în calcul,

deci fuzionarea se face doar la nivel de meniuri principale.

Implicit, fiecare item din bara principală de meniu are Grouplndex egală

cu 0. Dacă doriţi să le schimbaţi trebuie să ştiţi că un item din bara

principală de meniu are valoarea lui Grouplndex mai mare sau egală

decât valoarea Grouplndex a precedentului item. De aici rezultă şi

modul în care două meniuri fuzionează:

• toate itemurile din bara principală a meniului formei secundare sunt

inserate în bara principală de meniu a formei principale, respectân-

du-se ordinea crescătoarea a valorilor Grouplndex;

• dacă unele item-uri din bara de meniu a formei secundare au acelaşi

Grouplndex cu unele item-uri din bara de meniu a formei princi­

pale, atunci toate aceste item-uri (din meniul formei principale) vor

dispărea şi vor fi înlocuite cu item-urile din forma secundară.

P13. Radioltem

property Radioltem: Boolean;

Indică dacă item-ul de meniu se exclude reciproc cu celelalte itemuri de

meniu din acelaşi grup. în caz afirmativ, doar un item din grup poate fi

selectat la un moment dat. în faţa lui va apărea un cerculeţ.

Metode

M l. Add

procedure Add (Item: TMenuItem);

Adaugă un item de meniu la sfârşitul vectorului Items.

procedure Add(constÂfems: array of TMenuItem);

Adaugă mai multe itemuri la sfârşitul vectorului Items.

182

M2. Delete

procedure Delett(Index: Integer);

Şterge item-ul cu numărul de ordine Index, din cadrul meniului curent.

M 3. Remove

procedure Remove(ltem: TMenuItem);

Şterge itemul Item din meniu.

M4. Insert

procedure Insert {Index: Integer; Item: TMenuItem);

Inserează Item pe poziţia Index.

M5. IndexOf

function IndexOf(/?em: TMenuItem): Integer;

Returnează numărul de ordine al unui item în cadrul listei de itemuri a

părintelui său.

M6. Click

procedure Click;

Simulează execuţia unui click de mouse ca şi cum utilizatorul l-ar fi

executat. Handlerele de evenimente corespunzătoare acestui eveniment

sunt executate şi ele.

Evenimente__________________________________________________

E l. OnClick

property OnClick: TNotifyEvent;

Apare când se execută click pe un item de meniu.

Exemplu:

Următorul program construieşte o bară principală de meniu. Pentru

aceasta el foloseşte o componentă TMainMenu (care reprezintă meniul

în sine), o cutie de editare (în care utilizatorul introduce numele Hem­

urilor din meniu) şi un buton (denumit Add, la a cărui apăsare se adaugă

183

la meniul existent un nou item având ca nume textul din cutia de

editare).

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Editl: TEdit TabOrder = 0 Text = 'Editl'

endobject Buttonl: TButton

Caption = 'Add'Default = True TabOrder = 1 OnClick = ButtonlClick

endobject MainMenul: TMainMenu end

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin

nou := TMenuItem.Create(MainMenul) ;nou.Caption:=Editl.Text;Menu.11 ems.Add(nou);Editl.Clear;Editl.SetFocus;

end;Să presupunem că avem construită bara principală a meniului:

File Edit Tools Help

; [Edit?

Acum dorim să adăugăm submeniuri la unul dintre meniurile deja cre­

ate. Dorim să adăugăm itemuri la meniul File. Vom folosi aceleaşi componente

ca şi la exemplul anterior, doar atât că aici vom adăuga la meniul File:

procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin

nou := TMenuItem.Create(Filei); nou.Caption:=Editl.Text;Filei.Add(nou);

184

Editl.Clear;Editl.SetFocus;

end;

De schimbat, s-a schimbat doar părintele, noului meniu adăugat, care nu

mai este MainMenul, ci este File i, şi linia în care se adaugă meniul.

Adăugarea în continuare de subitemuri la (sub)itemurile curente se face

la fel şi va genera meniuri cu mai multe nivele ca în imaginea următoare:

View ►

Customize (his Folder...

Arrange icons ►

Line Up Icons

Refresh

Paste

Un item din bara principală a meniului poate fi şters (la momentul

execuţiei) în două moduri:

1. Folosind metoda Delete:

Forml.Menu.Items.Delete(1);

care va şterge itemul cu numărul de ordine 1, adică, de exemplu, pentru

meniul din forma de mai sus va şterge Editl.

2. Folosind metoda Remove:

Forml.Menu.Items.Remove(Edit2);

este Edit2 deoarece Editl este cutia de editare.

Un subitem al unui meniu poate fi şters (la momentul execuţiei) tot în

două moduri. Presupunem că meniul File are item-urile: Open, Save, New,

Close.

Properties

3 _ l i Folder

Shortcut

W irZ ip File

J j] Text Document

r /1 Bitmap Image

' i j W ave Sound

y | Microsoft Word Document

j? ] Other Office Documents...

185

■ o w n i i i H u i i i i u i u i »« « w w n t K tw im n n m n t ! « » » » * « *

1. Folosind metoda Delete:

Filei.Delete(1);

care va şterge itemul cu numărul de ordine 1, adică în cazul nostru Save.

2. Folosind metoda Remove:

Filei.Remove(Savel);

Inserarea unui item la bara principală a meniului se face astfel:

procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin

nou := TMenuItem.Create(Forml) ; nou.Caption:=Editl.Text;Menu.Items.Insert(2,nou);

end;

Inserarea unui item la meniul File se face în felul următor:

procedure TForml.ButtonlClick(Sender: TObject);var nou:TMenuItem;begin

nou := TMenuItem.Create(Filei) ; nou.Caption:=Editl.Text;Filei.Insert(0,nou);Editl.Clear;Editl.SetFocus;

end;

Exemplu:

Următoarea aplicaţie simulează un editor de text rudimentar. Acest

editor constă dintr-o cutie de editare multilinie (Memol). Pe lângă

aceasta, pe formă mai există şi un meniu cu două item-uri principale

(File, Edit) şi 4 item-uri secundare (New, Open, Save-pentru File res­

pectiv Find-pentru Edit). New este folosit pentru a crea un nou fişier gol,

Open este folosit pentru a deschide un fişier pentru editare, Save este

folosit pentru a salva în fişier textul aflat la momentul actual în cutie, iar

Find este folosit pentru a ne indica dacă un şir de caractere este sau nu

subşir pentru textul din cutie.

Dacă a fost creat un nou fişier cu comanda New, atunci comenzile Save

şi New devin inoperante până în momentul în care o schimbare intervine

în cutia Memol (evenimentul OnChange).

Pe formă vom avea următoarele componente:

• un meniu construit cu itemurile specificate anterior, în care utiliza­

torul poate introduce text;

• o cutie de editare multilinie (Memo]);

186

• o componentă TOpenDialog în care utilizatorul introduce numele

fişierului încărcat;

• o componentă TSaveDialog în care utilizatorul introduce numele

fişierului salvat;

• o componentă TFindDialog în care utilizatorul introduce şirul pe

care acesta să-l caute.

Handlerele de evenimente ale obiectelor de pe formă sunt:

procedure TForml.OpenlClick(Sender: TObject); begin

if OpenDialogI.Executethen Memol.Lines.LoadFromFile(OpenDialogI.FileName);

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

if SaveDialogl.Executethen Memol.Lines.SaveToFile(SaveDialogl.FileName);

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

Memol.Clear;Memol.SetFocus;Savel.Enabled:=false;Newl.Enabled:=false;

end;

procedure TForml.FindlClick(Sender: TObject); begin

if FindDialogl.Execute then; end;

procedure TForml.MemolChange(Sender: TObject); begin

Newl.Enabled:=true ;Savel.Enabled:=true;

end;

procedure TForml.FindDialoglFind(Sender: TObject); var i:integer;

ok:boolean;begin

for i:=0 to Memol.Lines.Count doif Pos(FindDialogl.FindText, Memol.Lines.Strings[i]) <>0 then ok:=true;

if not okthen ShowMessage('Nu exista1i else ShowMessage(1 Exista');

end;

187

16.5. Funcţii care prelucrează meniuri

F I. NewMenu

function Ne\vMenu(0uwr: TComponent; const AName: string;

Items: array of TMenuItem): TMainMenu;

Creează un meniu principal. Owner este componenta proprietară care va

fi responsabilă de eliberarea memoriei, AName este numele meniului, iar

Items este un vector cu itemurile din bara principală.

F2. NewPopupMenu

function NewPopupMenu(Ovv/(er TComponent; const AName: string;

Alignment: TPopupAlignment; AutoPopup: Boolean;

Items’, array of TMenuItem): TPopupMenu;

Creează un meniu popup.

Owner este componenta proprietară responsabilă cu eliberarea memoriei

ataşată meniului.

AName este numele meniului aşa cum va fi el referit în cod.

Alignment specifică unde trebuie să apară meniul relativ la poziţia

mouse-ului.

AutoPopup este true dacă meniul apare la click - dreapta pe componenta

ataşată lui.

Items este vectorul cu itemurile principale ale meniului.

F3. Newltem

function NewItem(const ACaption: string; AShortCut: TShortCut;

AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent;

hCtx: Word; const AName\ string): TMenuItem;

Creează un nou item de meniu.

ACaption este eticheta ataşată lui.

AShorCut este combinaţia de taste folosită pe post de scurtătură.

AChecked indică dacă itemul de meniu este sau nu bifat.

AEnabled indică dacă itemul de meniu este sau nu disponibil pentru a fi

apăsat.

AOnClick este handlerul evenimentului OnClick ataşat itemului.

AName este numele meniului aşa cum apare el în cod.

I

188

F4. NewSubMenu

function Ne wSubMenufconst A Caption: string; hCtx: Word;

const AName: string; Items: array of TMenuItem;

AEnabled: Boolean): TMenuItem;

Creează un item de meniu împreună cu subitemurile ataşate.

ACaption este eticheta ataşată lui.

AEnabled indică dacă itemul de meniu este sau nu disponibil pentru a fi

apăsat.

AName este numele meniului aşa cum apare el în cod.

Items este vectorul cu itemurile de pe primul nivel al submeniului.

Exemplu:

Următoarea aplicaţie construieşte la momentul execuţiei aplicaţiei un

meniu principal având trei itemuri de meniu. Metoda Eveniment repre­

zintă handlerul de evenimente al itemurilor de meniu şi trebuie declarată

în secţiunea public a clasei TForml.

usesmenus ,-

varMeniul_Principal : TMainMenu; bara_principala : array of TMenuItem;

procedure TForml.Eveniment(Sender : TObject); begin// acest eveniment se executa la apasarea unui item de meniu

ShowMessage('A fost apasat meniul cu titlul ' +(Sender as TMenuItem).Caption +' si numele ' + (Sender as TComponent).Name);

end;

procedure TForml.ButtonlClick(Sender: TObject); var

i : integer; begin

SetLength (bara_principala, 3) ; //bara principala de meniu are 3 itemuri for i ;= 0 to 2 do

bara_principala[i] := Newltem('File’+IntToStr(i), 0,false, true, Eveniment, 0, 'Meniu'+IntToStr(i));

Meniul_Principal := NewMenu(Forml,'Meniu',barajprincipala);end;

procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);

vari : integer;

begin

' 189

// eliberez memoria alocata for i := 0 to 2 do

bara_principala[i].Free;Finalize(bara_principala);Meniul_Principal.Free;

end;

Exemplul 2:

Următoarea aplicaţie construieşte o bară principală de meniu împreună

cu submeniurile drop-down ataşate. Ataşarea unui subitem la un item de

meniu s-a făcut cu ajutorul metodei Add a itemului părinte.

usesmenus;

varMeniul_Principal : TMainMenu; bara_principala : array of TMenuItem; bara_secundara : array of array of TMenuItem;

procedure TForml.Eveniment(Sender : TObject); begin// acest eveniment se executa la apasarea unui item de meniu

ShowMessage('A fost apasat meniul cu titlul ' +(Sender as TMenuItem).Caption +' si numele ' + (Sender as TComponent).Name);

end;procedure TForml.ButtonlClick(Sender: TObject);

vari, j : integer;

begin/ / bara principala de meniu are 3 itemuri SetLength(bara_principala, 3);//fiecărui item din bara principala

// ii corespunde un sir de subite muri

// acestea sunt stocate in vectorul bara_secundara

SetLength(bara_secundara, 3);for i := 0 to 2 dobegin

SetLength (bara_secundara [ i ] , 2) ; // fiecare subitem de meniu arc doua itemuri for j := 0 to 1 do

bara_secundara[i][j] := Newltem('SubM'+IntToStr(j), 0,false, true, Eveniment, 0, 'SubMeniu'+IntToStr(j));

bara_principala[i] := Newltem('File 1+IntToStr(i) , 0,false, true, nil, 0, 'Meniu1+IntToStr(i));;

/ / ataşam submeniul itemului părinte

bara_principala[i].Add(bara_secundara[i]); end;Meniul_Principal := NewMenu(Forml,'Meniu',bara_principala);

end;

190

procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);

vari,j : integer;

begin// eliberez memoria alocata for i := 0 to 2 do begin

for j := 0 to 1 dobara_secundara[i][j].Free;

bara_principala[i].Free;Finalize(bara_secundara[i]) ;

end;Finalize(bara_principala);Finalize(bara_secundara) ;Meniul_Principal.Free ;

end;

Exemplul 3:

Următoarea aplicaţie construieşte o bară principală de meniu împreună

cu submeniurile drop-down ataşate. Ataşarea unui subitem la un item de

meniu s-a făcut cu ajutorul funcţiei NewSubMenu.

usesmenus;

varMeniul_Principal : TMainMenu; bara_principala : array of TMenuItem; bara_secundara : array of array of TMenuItem;

procedure TForml.Eveniment(Sender : TObject); begin

// acest eveniment se executa la apasarea unui item de meniuShowMessage('A fost apasat meniul cu titlul 1 +

(Sender as TMenuItem).Caption +' si numele ' + (Sender as TComponent).Name);

end;

procedure TForml.ButtonlClick(Sender: TObject); var

i, j : integer; begin

SetLength (bara_principala, 3) ; //bara principala de meniu are 3 itemuri SetLength(bara_secundara, 3); for i := 0 to 2 do begin

SetLength (bara_secundara (i ] , 2) ; //fiecare subitem de meniu are doua itemuri for j := 0 to 1 do

bara_secundara[i][j] := Newltem('SubM'+IntToStr(j), 0,false, true, Eveniment, 0, ' SubMeniu ' +IntToStr (j ) )

// ataşarea submeniului la meniu s-a făcut cu ajutorul metodei SubMenu

191

bara_principala[i] := NewSubMenu('File'+IntToStr(i) , 0,'Meniu'+IntToStr(i), bara_secundara[i])

end;Meniul_Principal := NewMenu(FormlMeniu' , bara_principala);

end ;

procedure TForml.FormClose(Sender: TObject;var Action: TCloseAction);

vari,j : integer;

begin// eliberez memoria alocata for i := 0 to 2 do begin

for j := 0 to 1 dobara_secundara[i] [j] .Free;

bara_principala[i].Free;Finalize(bara_secundara(i]);

end;Finalize(bara_principala);Finalize(bara_secundara);Meniul_Principal.Free;

end ;

192

17. SCURTĂTURI

O scurtătură este o combinaţie de taste pe care utilizatorul o foloseşte

pentru a efectua rapid o acţiune (spre exemplu, apăsarea unui item de meniu). O

combinaţie de taste constă din una sau mai multe taste modificator (<Ctrl>,

<Shift>, <Alt>) şi o altă tastă oarecare (spre exemplu, <Ctrl> + A).

Hemurile de meniu (obiecte de tip TMenuItem) au proprietatea ShortCut

care indică combinaţia de taste la apăsarea căreia se va executa handlerul eveni­

mentului OnClick.

17.1. TShortCut

Tipul TShortCut oferă o modalitate de a reprezenta aceste combinaţii de

taste sub forma unui număr întreg.

Tipul TShortCut este definit în unit-ul classes astfel:

TShortCut = Low(Word) .. High(Word);

17.2. THotKey m

Este un control care permite utilizatorului să introducă şi să vizualizeze

o combinaţie de taste ce va fi folosită ulterior pe post de scurtătură.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->

-> TWinControl -> TCustomHotKey -> THotKey.

Definit în_____________________________________________________

comctrls.pas

Pagina______________________________________________________

Win32

193

Proprietăţi___________________________________________________

PI. Hot Key

property HotKey: TShortCut;

Conţine combinaţia curentă de taste.

P2. ln.valid.Keys

property InvalidKeys: THKInvalidKeys;

Permite specificarea anumitor combinaţii de taste care vor fi considerate

invalide. Valori posibile pentru InvalidKeys sunt din mulţimea:

Valoare Semnificaţie

kcNone Tastele simple, ftră modificatori, nu pot fi folosite pe post de hotkey.

hcShift Combinaţiile <Shift>+Tastă sunt invalide.

hcCtrl Combinaţiile <Ctrl>+Tastă sunt invalide.

hcAlt Combinaţiile <Alt>+Tastă sunt invalide.

hcShiftCtrl Combinaţiile <Shift>+<Ctrl>+Tastă sunt invalide.

hcShiftAlt Combinaţiile <Shift>+<Alt>+Tastă sunt invalide.

hc.CtrlAlt Combinaţiile <Ctrl>+<Alt>+Tastă sunt invalide.

licShiftCtrlAlt Combinaţiile <Shift>+<Ctrl>+<Alt>+Tastă sunt invalide.

P3. Modifiers

property Modifiers: THKModifiers;

Specifică tastele care vor fi folosite pe post de modificatori. Utilizatorul

nu va mai fi obligat să introducă întreaga combinaţie de taste, ci doar

tasta nemodificator. Valori posibile pentru Modifiers sunt una sau mai

multe din următoarea mulţime:

Valoare Semnificaţie

hkShift Tasta <Shift> va fi folosită drept modificator.

hkCtrl Tasta <Ctrl> va fi folosită drept modificator.

hkAlt Tasta <Alt> va fi folosită drept modificator.

194

17.3. Funcţii şi Proceduri

F I. ShortCut

function ShortCut(/ve>’: Word; Shift: TShiftState): TShortCut;

Creează şi returnează un shortcut (scurtătură) pe baza combinaţiei de

taste Key + Shift.

F2. ShortCutToKey

procedure ShortCutToKey(5AortCw/: TShortCut; var Key. Word;

var Shift: TShiftState);

Returnează combinaţia de taste (sub forma perechii Key, Shift) care alcă­

tuieşte scurtătura ShortCut.

F3. ShortCutToText

function ShortCutToText(5/îortC«f: TShortCut): string;

Converteşte o scurtătură într-un şir de caractere.

Exemplu:

Următoarea aplicaţie tipăreşte în componenta ListBoxl toate scurtăturile

itemurilor de meniu ale meniului principal al formei.

procedure TForml.TiparesteShortCut(meniu : TMenuItem); var

i : integer; begin

ListBoxl.Items.Add(meniu.Caption + ' ' +ShortCutToText(meniu.Shortcut));

i := 0;while i < meniu.Count do // pentru fiecare submeniu begin

TiparesteShortCut (meniu. Items [i] ) ; //apelam recursiv i := i + 1;

end; end;procedure TForml.ButtonlClick(Sender: TObject);

vari : integer;

begin i := 0;while i < MainMenul.Items.Count do begin

/ /pentru fiecare item din meniul principal TiparesteShortCut(MainMenul.Items[i]);

195

i := i + 1; end;

end;

F4. TextToShortCut

function TextToShortCut(7eA7: string): TShortCut;

Converteşte şirul Text (care conţine o combinaţie validă de taste) într-o

scurtătură.

196

18. LISTE, COZI Şl STIVE

în acest capitol sunt prezentate patru clase care implementează lucrul cu

liste. Elementele listei pot fi de orice tip. Această flexibilitate în manipulare se

datorează faptului că lista reţine doar pointeri la zonele de memorie în care sunt

alocate elementele.

TList este o clasă care implementează o listă generală. Se pot face adău­

gări, inserări, ştergeri de elemente în orice poziţie. Elementele listei pot fi acce­

sate în orice ordine folosind proprietatea Items.

TOrderedList este o clasă abstractă care implementează o listă în care

accesarea elementelor se face secvenţial. Din această clasă derivă TQueue şi

TStack care definesc liste de tip FIFO şi respectiv LIFO.

18.1. TList

Este o clasă care implementează o listă de obiecte de tip nespecificat. Se

pot face adăugări, inserări, ştergeri, căutări, sortări, etc. de elemente.

Ierarhie______________________________________________________

TObject -> TList.

Definit în_____________________________________________________

classes.pas.

Proprietăţi___________________________________________________

PI. Items

property ltems[lndex\ Integer]: Pointer;

Items este lista cu pointerii la obiecte.

P2. Count

property Count: Integer;

Returnează numărul de obiecte din listă.

197

Metode

M l . Add

function Add (Item: Pointer): Integer;

Adaugă un nou obiect la sfârşitul listei.

M2. Assign

procedure Assign(L«M: TList;

AOperator. TListAssignOp = laCopy; ListB: TList = nil);

Copiază elementele unei liste în altă listă.

Dacă parametrul ListB lipseşte, atunci procedura Assign combină lista

curentă (referită prin Seif) cu lista List A. Combinarea se face în funcţie

de valoarea parametrului AOperator.

Dacă parametrul ListB este prezent, atunci procedura Assign înlocuieşte

toate elementele listei curente (referită prin Seif) cu elementele listei

ListA, iar apoi combină lista curentă cu lista ListB. Combinarea se face

în funcţie de valoarea parametrului AOperator.

Modurile posibile de combinare a două liste (valorile parametrului

AOperator) sunt:

Valoare Explicaţie

laAnd Lista destinaţie conţine intersecţia cclor două liste.

laCopy Suprascrie lista destinaţie cu valorile listei sursă.

laDestUnique E lim ină elementele listei destinaţie care apar şi în lista sursă.

laOr Lista destinaţie conţine reuniunea celor două liste.

laSrcUniqueînlocuieşte elementele listei destinaţie cu elementele listei sursă care

nu apar în destinaţie.

laXor Lista destinaţie conţine diferenţa simetrică celor două liste.

M3. Insert

procedure Ins&rtdndex: Integer; Item: Pointer);

Inserează un obiect pe poziţia Index în listă. Primul element are numărul

de ordine 0.

M 4. Delete

procedure De\ete(Index: Integer);

Şterge din listă elementul de pe poziţia Index.

198

function Remove(Item: Pointer): Integer;

Şterge din listă prima apariţie a obiectului Item.

M6. Clear

procedure Clear; virtual;

Şterge toate obiectele din listă.

M7. IndexOf

function IndexOf(/rem: Pointer): Integer;

Returnează numărul de ordine al primei apariţii a obiectului Item în listă.

Dacă lista nu conţine un asemenea obiect, atunci se returnează-1.

M8. Move

procedure M o v e( Q< rind ex, Newltidex: Integer);

Schimbă poziţia itemului de pe poziţia Curlndex pe poziţia Newlndex.

M9. Exchange

procedure Exchange(/n<r/<?x/, Index2: Integer);

Schimbă între ele două elemente aflate pe poziţiile Indexl şi lndex2 în

listă.

Exemplu:

Următoarea aplicaţie generează, la apăsarea butonului Buttonl, o listă cu

10 elemente. La apăsarea butonului Button2, sunt interschimbate două

elemente alese aleator din listă.

procedure TForml.B u t to n lC lic k (Sender: TObject); var

i : in te g e r ; p : ''in teg e r;

beginL is ta := T L is t.C rea te ;// adaug 10 elemente aleatoare la lista for i := 1 to 10 do begin

new(p ) ;p~ := random (100);L is t a .Add(p ) ;

end;

M5. Remove

199

// afiseaza lista

ListBoxl.Clear;for i := 0 to lista.Count - 1 do

ListBoxl.Items.Add(IntToStr(integer(Lista.Items[i]~))); Buttonl.Enabled := false;Button2.Enabled := true;

i, il, i2 : integer; begin

// aleg doua elemente la intamplare si le interschimb

11 := random(Lista.Count);12 := random(Lista.Count);Lista.Exchange(il, 12);

// afiseaza lista

ListBoxl.Clear;for i := 0 to lista.Count - 1 do

ListBoxl.Items.Add(IntToStr(integer(Lista.Items[i]~)));

M10. Sort

procedure Sort (Compare: TListSortCompare);

Aplică algoritmul de sortare Quicksort asupra elementelor unei liste.

Funcţia care compară două obiecte din listă are tipul TListSortCompare

şi trebuie furnizată de către programator. Tipul ei este:

TListSortCompare =function (Iteml, Item2: Pointer): Integer;

Funcţia de comparare trebuie să întoarcă:

• valoare mai mică decât zero dacă Iteml este mai mic decât Item2,

• zero dacă Iteml este egal cu Item2,

• valoare mai mare decât zero, dacă Iteml este mai mare decât Item2.

Următoarea aplicaţie construieşte o listă care conţine numere. La

apăsarea butonului Buttonl lista va fi construită şi afişată în ListBoxl.

La apăsarea lui Button2 lista va fi sortată, afişată în ListBox2 şi apoi

distrusă.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Buttonl: TButton Caption = 'Adauga'

endobject Button2: TButton

Caption = 'Sorteaza'

end;

procedure TForml.Button2Click(Sender: TObject);var

end;

200

Enabled = False endI Iandlerele de evenimente ale obiectelor de pe forma Forml sunt:

varLista : TList;

function Compara(iteml, item2 : pointer) : Integer; begin

Result ;= integer (iteml'') - integer (item2~) ; end;

procedure TForml.Button2Click(Sender: TObject); var

i : integer; begin

Lista.Sort(Compara);ListBox2.Clear;// afiseaza lista sortatafor i := 0 to lista.Count - 1 do

L istBox2 . Items .Add( In tT o S tr (in te g e r (L is t a . Ite m s [ i]~) ) ) ;

L is ta . C lear; // goleşte lista

L i s ta . Free; //distruge lista end;

procedure TForml.ButtonlClick(Sender; TObject); var

i -• integer; p : ^integer;

beginLista := TList.Create; for i := 1 to 10 do begin

new(p );p^ ;= random(lOO);Lista.Add(p);

end;// afiseaza lista ListBoxl.Clear;for i := 0 to lista.Count - 1 do

ListBoxl.Items.Add(IntToStr(integer(Lista. Items[i]~))) ; Buttonl.Enabled := false;Button2.Enabled := true;

end;

18.2. TOrderedList

Este o clasă abstractă care implementează o listă în care elementele sunt

accesate secvenţial. Din această clasă sunt derivate clasele TQueue şi TStack

care implementează o listă FIFO respectiv LIFO.

201

Ierarhie

TObject -> TOrderedList.

Definit în__________________________________________________

contnrs.pas

Metode____________________________________________________

M l. Count

function Count: Integer;

Indică numărul de elemente ale listei.

18.3. TQueue

Este o clasă care implementează o coadă (listă FIFO).

Ierarhie____________________________________________________

TObject -> TOrderedList -> TQueue

Definit în__________________________________________________

contnrs.pas

Metode____________________________________________________

M l. Push

procedure Push(Â//e/;;: Pointer);

Adaugă un item la sfârşitul cozii.

M2. Peek

function Peek: Pointer;

Returnează un pointer la primul element din coadă.

M3. Pop

function Pop: Pointer;

Returnează un pointer la primul element din coadă după care îl şterge.

202

Exemplu:

Următoarea aplicaţie construieşte şi afişează conţinutul unei cozi.

usescontnrs;

procedure TForml.ButtonlClick(Sender: TObject); var

c : TQueue; p : ^integer; i : integer;

begin// constructia cozii

c := TQueue.Create; for i := 1 to 10 do begin

new(p);p~ := random(lO); c .Push(p);

end;// afişarea si ştergerea cozii

while c .Count > 0 do begin

p : = c . Pop;ShowMessage(IntToStr (p~ ) ) ; dispose(p);

end; c .Free;

end;

18.4. TStack

Este o clasă care implementează o stivă (listă LIFO).

Ierarhie

TObject -> TOrderedList -> TStack

Definit în

contnrs.pas

Metode

M l. Push

procedure Push (Altern.-. Pointer);

203

Adaugă un item în vârful stivei.

M2. Peek

function Peek: Pointer;

Returnează un pointer la elementul din vârful stivei.

M3. Pop

function Pop: Pointer;

Returnează un pointer la elementul din vârful stivei după care îl şterge.

Exemplu:

Următoarea aplicaţie construieşte şi afişează o stivă.

usesc o n tn r s ;

procedure T Form l. B u t t o n lC l ic k (S ender: T O b jec t);

vars : TStack;

p : ' ' in te g e r ;

i : in te g e r ; begin

// constructia stivei

s := T S ta c k .C re a te ; for i := 1 to 10 do begin

new( p ) ;

p~ := random (10 ); s .Push(p);

end;// afişarea si ştergerea stivei

while s .C ou n t > 0 do begin

p : = S . Pop;ShowMessage(In tT o S tr ( p A) ) ;

d is p o s e ( p ) ;

end; s .F ree ;

end;

204

19. FIŞIERE, DIRECTOARE Şl DISCURI

în pagina Win3.1 a Paletei de Componente, există un grup de compo­

nente destinate navigării printre discurile, directoarele şi fişierele existente în

sistem.

Componenta TDriveComboBox permite selectarea unui disc local. Dis­

cul curent selectat este stocat de proprietatea Drive.

Componenta TDirectoryComboBox permite selectarea unui (sub)

director al discului curent. (Sub)directorul curent selectat este proprietatea

Directory.

Componenta TFileListBox permite selectarea unui fişier din directorul

curent. Proprietatea FileName stochează numele şi calea fişierului curent selec­

tai.

Componenta TFilterListBox permite specificarea unui filtru pentru fişi­

erele afişate într-o componentă TFileListBox.

Aceste componente pot fi conectate între ele, astfel încât modificările

executate în una din ele să se reflecte în celelalte. Spre exemplu, componenta

TDriveComboBox are proprietatea DirList care va indica numele componentei

de tip TDirectoryListBox care va afişa structura de directoare din discul curent

selectat.

Observaţie:

Aceste componente permit doar navigarea prin structura de discuri,

directoare şi fişiere, dar nu permit manipulare acestora (spre exemplu nu

permit ştergerea, redenumirea, adăugarea de fişiere).

19.1. TFileListBox f i i

Este o cutie folosită pentru afişarea fişierelor dintr-un director.

Ierarhie

TObject -> TPersistent -> TComponent -> TControl ->

-> TWinControl -> TCustomListBox -> TFileListBox.

205

Definit în

filectrl.pas

Pagina______________________________________________________

Win3.1

Proprietăţi___________________________________________________

PI. Directory

property Directory: string;

Determină directorul curent pentru cutia cu lista de fişiere. Pentru a afişa

fişierele din directorul dorit, modificaţi proprietatea Directory.

P2. Drive

property Drive : char;

Specifică pentru care unitate de disc se afişează fişierele. Dacă se schim­

bă unitatea, se va schimba şi directorul curent ale cărui fişiere sunt

afişate.

P3. FileEdit

property FileEdit: TEdit;

Indică cutia de editare (componentă de tip TEdit) în care sunt afişate

numele fişierelor selectate.

Exemplu:

Următoarea aplicaţie foloseşte componentele:

• TFileListBox, pentru afişarea tuturor fişierelor dintr-un director;

• cutie de editare {Editl), care va fi valoarea proprietăţii FileEdit,

• cutie de editare (Edit2), în care utilizatorul va introduce directorul

pentru care se listează conţinutul);

• un buton (Buttonl) de tip Default, cu ajutorul căruia se schimbă

directorul curent.

Valorile proprietăţilor componentelor de pe forma Forml sunt:

object Forml: TFormlobject FileListBoxl: TFileListBox

FileEdit = Editl end

206

object Editl: TEdit Text = 1 *.*'

endobject Buttonl: TButton

Caption = 'Schimba Directorul'Default = True

endobject Edit2: TEdit

Text = 'c :\' end

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

procedure TForml.FormCreate(Sender: TObject); begin

FileListBoxl.Directory := 'C:\'; end;procedure TForml.ButtonlClick(Sender: TObject); begin

FileListBoxl.Directory := Edit2.Text; end;

P4. FileName

property FileName : string;

Indică numele şi calea fişierului selectat.

P5. FileType

property FileType: TFileType;

Specifică atributele fişierelor care vor fi afişate într-o cutie cu lista de

fişiere. Deoarece FileType este o mulţime, valorile ei vor fi submulţimi

ale următoarei mulţimi:

Valoare Semnificaţie

ftReadOnly Se afişează fişierele cu atributul read-only.

/[Hidden Se afişează fişierele cu atributul hidden.

ftSystem Se afişează doar acele fişiere cu atributul system.

ftVolumeID Se afişează doar numele de volum.

ftDirectory Se afişează directoare.

ft Archive Se afişează fişierele cu atributul archive.

/[Normal Se afişează fişiere fără nici un atribut special.

207

P6. Mask

property Mask : string;

Specifică fişierele care pot fi afişate. Mask este o mască pentru fişiere,

ce poate include şi caractere speciale (spre exemplu *.cpp). Se pot

specifica mai multe măşti, care trebuie să fie despărţite prin (spre

exemplu *.cpp;*.pas).

Observaţie:

Specificarea unei măşti pentru fişiere se poate realiza mai simplu,

folosind componenta TFilterComboBox.

P7. ShowGlyphs

property ShowGlyphs : boolean;

Indică dacă lângă numele fişierului poate apărea şi un bitmap care să

indice tipul fişierului.

Observaţie:

Pe lângă aceste proprietăţi TFileListBox moşteneşte o parte din proprie­

tăţile lui TCustomListBox, proprietăţi pe care le-am întâlnit şi la

TListBox.

Atenţie: Numele fişierelor dintr-un TFileListBox nu pot fi prelucrate (şterse,

create, sau modificate) cu ajutorul proprietăţii Items.

Metode______________________________________________________

M l. Update

procedure Update;

Redesenează lista cu fişiere afişate în componenta TFileListBox curentă.

Această operaţie este necesară atunci când un fişier este şters sau creat,

cu ajutorul unei alte aplicaţii (spre exemplu Windows Explorer).

Evenimente

E l. OnChange

property OnChange: TNotifyEvent;

208

Apare când conţinutul cutiei se schimbă. Spre exemplu, acest eveniment

este generat când se schimbă directorul pentru care componenta

TFileListBox afişează conţinutul.

Exemplu:

Următoarea aplicaţie setează tipul fişierelor afişate într-o componentă

TFileListBox.

Vom folosi o componentă TCheckListBox care are itemurile ReadOnly,

Hidden, System, VolumeID, Directory, Archive, Normal indicând care

dintre atribute sunt active pentru fişierele afişate de FileListBoxl.

V;ilori le proprietăţilor componentelor de pe forma Forml sunt:

object C heckL is tB o x l: TCheckListBox

I te m s . S tr in g s = (

' Read-Only'1 H id d e n '

' System ''VolumeID'1 D ir e c to r y '

1 A r c h iv e '

1 N orm a l1)end

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

procedure T Form l. Form Create (S ender: T O b je c t); begin

F i le L is tB o x l . F ileT ype := [ftN orm al] ;C h e ck L is tB o x l. Checked[6] := true;

end;procedure T Form l. C h eckL is tB o x lC lic kC he ck (S ender: T O b je c t);

vars ta re : T F ileType;

begins ta re := [];

if C h e ck L is tB o x l. Checked! 0] II daca itemul ReadOnly este bifat then s ta re := s ta re + tf tR e a d O n ly ] ;

if C heckL is tB ox l .C hecked[1] //daca itemul Hidden este bifat

then s ta re := s ta re + [ ftH id den ] ;

if C heckL is tB ox l .Checked[2] // daca itemul System este bifat

then s ta re := s ta re + [ ftSystem ];

if C h e c k L is tB o x l. Checked [3 ] // daca itemul VolumeID este bifat then s ta re := s ta re + [ftV o lum e lD ];

209

ii i i i i

if CheckListBoxl .Checked[4] //daca itemul Directory este bifat then stare := stare + [ftDirectory];

if CheckListBoxl .Checked[5] //daca itemul Archive este bifat then stare := stare + [ftArchive];

if CheckListBoxl .Checked[6] //daca itemul Normal este bifat then stare := stare + [ftNormal];

FileListBoxl-FileType := stare; end;

19.2. TDirectoryListBox

Afişează structura de directoare a discului curent şi permite navigarea

prin aceasta.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->

-> TCustomListBox -> TDirectoryListBox.

Definit în_____________________________________________________

filectrl.pcis

P a g i n a ____________________________________________ _____

Wild. 1

Proprietăţi

PI. Directory

property Directory : string;

Indică directorului a cărui structură este afişată.

P2. DirLabel

property DirLabel : TLabel;

Numele directorului curent este titlu pentru eticheta DirLabel.

210

P3. Drive

property Drive : char;

Determină unitatea de disc pentru care este afişată structura de

directoare.

P4. FileList

property F ileList: TFileListBox;

Leagă o cutie cu lista de directoare (TDirectoryListBox) cu o cutie cu

lista de fişiere (TFileListBox). După realizarea unei asemenea legături,

în TFileListBox vom avea fişierele din directorul curent selectat în

TDirectoryListBox.

Metode______________________________________________________

M l. GetltemPath

function GetItemPath(int Index) : string;

Returnează calea unui director care are, în lista cu directoare (a cutiei

TDirectoryListBox), numărul de ordine Index. Primul director din listă

are indicele 0.

M2. OpenCurrent

procedure OpenCurrent;

Deschide directorul curent. Metoda este echivalentă cu executarea unui

dublu click pe directorul respectiv.

M3. Update

procedure Update;

Reafişează lista cu directoare pentru a reflecta ultimele modificări.

Evenimente__________________________________________________

E l. OnChange

property OnChange : TNotifyEvent;

Apare când un nou director este selectat.

211

Exemplu:

Următoarea aplicaţie conţine o componentă TDirectoryListBox, o com­

ponentă TFileListBox ataşată componentei TDirectoryListBox, o etichetă

Labell care afişează numele şi calea directorului curent şi o cutie de

editare multilinie care afişează conţinutul fişierului selectat din cadrul

cutiei TFileListBox.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object DirectoryListBoxl: TDirectoryListBox DirLabel = Labell FileList = FileListBoxl

endobject Memol: TMemo

ScrollBars = ssBoth end

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure TForml.FileListBoxlClick(Sender: TObject); begin

if FileListBoxl.Itemlndex <> -1then Memol.Lines.LoadFromFile(FileListBoxl.FileName);

end;

19.3. TDriveComboBox

Afişează unităţile de disc disponibile în sistem şi permite selectarea

uneia dintre unităţi.

TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->

-> TCustomComboBox -> TDriveComboBox.

Ierarhie

Definit în

jilectrl.pcis

Pagina

Win 3.1

Proprietăţi___________________________________________________

P I. DirList

property DirList TDirectoryListBox;

Face legătura între o cutie cu lista de directoare şi o cutie de drivere

('TDriveComboBox). Când o nouă unitate este aleasă, este afişată struc­

tura de directoare a noului disc selectat.

P2. Drive

property Drive : char;

In Drive se află unitatea de disc curentă.

Evenimente__________________________________________________

E l. OnChange

property OnChange: TNotifyEvent;

Apare când utilizatorul alege o nouă unitate.

E2. OnDropDown

property OnDropDown : TNotifyEvent;

Apare când utilizatorul apasă săgeata din dreapta a componentei afişând

astfel o listă drop-down.

Exemplu:

Aplicaţiei prezentate mai sus îi ataşăm o componentă TDriveComboBox

pe care o vom lega de componenta DirectoryListBoxl. Pentru aceasta

vom seta (la momentul proiectării aplicaţiei) proprietatea DirList la

valoarea DirectoryListBoxl'.

object DriveComboBoxl: TDriveComboBox DirList = DirectoryListBoxl

endIn urma acestei operaţii navigarea se poate face prin toate discurile

disponibile în sistem.

213

19.4. TFilterComboBox

Oferă posibilitatea utilizatorului să afişeze şi să manipuleze filtre pentru

fişiere.

Ierarhie

TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->

-> TCustomComboBox -> TFilterComboBox.

Definit în

filectrl.pas

Pagina

Win3.1

Proprietăţi

P I. FileList

property FileList: TFileListBox;

Conectează o cutie filtru cu o cutie cu listă de fişiere (TFileListBox).

P2. Filter

property Filter : TFileListBox;

Specifică un filtru de fişiere. Pentru a crea un asemenea filtru sunt

necesari următorii paşi:

• introduceţi un text semnificativ pentru tipul de fişiere pe care îl

doriţi (de exemplu Fişiere PAS),

• introduceţi caracterul | . Nu lăsaţi nici un spaţiu între ceea ce este

înainte sau ceea ce este după acest caracter, tastaţi masca de fişiere

(de exemplu *.pas). De exemplu, pentru fişierele de tip cpp Filter

poate conţine următorul şir: “Fişiere PAS|*.pas”

Dacă doriţi mai multe măşti, separaţi-le prin intermediul caracterului ;

(De exemplu, în Delphi, la deschiderea unui fişier (meniul Open) avem

o TComboListBox care poate deschide mai multe tipuri de fişiere ce pot

avea extensiile *.pas,*.bpg,*.dpr,*.dpk. Pentru a realiza acest lucru

Filter trebuie să conţină textul “Delphi files|*.pas;*.bpg;*.dpr;*.dpk”.

214

Dacă doriţi mai multe filtre, atunci separaţi-le cu caracterul | (de exem­

plu, dacă dorim să avem două filtre, una pentru fişiere Delphi (cu

extensiile *.pas,*.bpg,*.dpr,*.dpk) şi una cu fişiere text (cu extensia

(.txt).), atunci Filter trebuie să conţină şirul “Delphi

files|*.pas;*.bpg;*.dpr;*.dpk]Text files|*.txt”

Exemplu:

Aplicaţiei de la exemplul precedent îi mai adăugăm pe formă o compo­

nentă TComboListBox la care setăm proprietatea FileList la valoarea

FileListBoxl.

object FilterComboBoxl: TFilterComboBox FileList = FileListBoxl

end

Observaţie:

Extensia implicită este *.*.

P3. Mask

property Mask : string;

Returnează şirul folosit drept filtru.

Evenimente

E l. OnChange

property OnChange : TNotifyEvent;

Apare când un nou filtru este ales.

Exemplul 1:

Următoarea aplicaţie constă dintr-un sistem de navigare prin structura de

fişiere, directoare şi discuri a calculatorului curent. Componenta

TFileListBox are ataşată o componentă de tip TPopUp care are un singur

item cu numele Delete1. La apăsarea acestuia fişierul selectat este şters.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object DirectoryListBoxl: TDirectoryListBox DirLabel = Labell FileList = FileListBoxl

end

215

object FileListBoxl: TFileListBox PopupMenu = PopupMenul

endobject FilterComboBoxl: TFilterComboBox

FileList = FileListBoxl endobject DriveComboBoxl: TDriveComboBox

DirList = DirectoryListBoxl endobject PopupMenul: TFopupMenu

object Deletel: TMenuItem Caption = 'Delete'

end endHandlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure TForml. DeletelClick (Sender TObject); begin

If FileListBoxl.Itemlndex = -1 then ShowMessage(1 Nici un fişier selectat') else if DeleteFile(FileListBoxl.FileName)

then beginFileListBoxl.Update;ShowMessage('Fişierul a fost sters cu succes');

endelse ShowMessage('Fişierul nu a putut fi sters');

end;

Exemplul 2:

Dacă dorim să ştergem mai multe fişiere selectate, atunci va trebui să

setăm proprietatea MultiSelect la valoarea true. în această situaţie nu

avem la dispoziţie o proprietate care să ne returneze itemurile selectate,

de aceea le parcurgem pe toate şi testăm care sunt selectate şi care nu

(proprietatea Selected):

Noul handler de evenimente pentru itemul Delete este:

procedure TForml.DeletelClick(Sender: TObject);var i : integer

beginif FileListBoxl.Itemlndex = -1then ShowMessage(1 Nici un fişier selectat')else begin

for i := 0 to FileListBoxl.Items.Count - 1 do if FileListBoxl.Selected[i]then if not DeleteFile(FileListBoxl.Items.Strings[i])

then ShowMessage(’Fişierul ' +FileLdstBoxl.Items.Strings[i] +' nu a putut fi sters!');

FileListBoxl.Update; end;

end;

216

19.5. TFileStream

Este o clasă care implementează metode pentru citirea şi scrierea datelor

într-un fişier pe disc.

Ierarhie______________________________________________________

TObject -> TStream -> THandleStrecim -> TFileStream.

Definit în____________________________________________________

classes.pas

Proprietăţi___________________________________________________

P I. Position

property Position : integer;

Specifică poziţia capului de citire/scriere în cadrul fişierului. Primul

octet din fişier are Position = 0 .

P2. Size

property Size : integer;

Indică lungimea fişierului în octeţi.

Metode______________________________________________________

M l. Read

function Read(var Bujfer; Count: Longint): Longint;

Citeşte Count octeţi din fişier în şirul Bujfer. Octeţii sunt citiţi începând

din poziţia indicată de proprietatea Position. După citire Position se va

mări cu Count (în cazul în care nu se ajunge la sfârşit de fişier).

M2. Write

function Write(const Bujfer; Count: Longint): Longint;

Scrie în fişier Count octeţi din şirul Buffer.

217

M3. Seek

procedure ScekiOffset: longint, Origin : Word);

Schimbă valoarea lui Position. Origin indică felul în care trebuie inter­

pretată valoarea din Offset. Valori posibile pentru Origin sunt:

Valoare Semnificaţie

SoFromBeginningOffset este mai mare sau egal cu 0 şi este luat de la începutul

fişierului. Position va avea valoarea lui Offset.

SoFromCurrent Position va deveni Position + Offset.

SoFromEndOffset este mai m ic sau egal decât 0 şi este luat faţă de sfârşitul

fişierului, deci Position va deveni Size-Offset.

M4. Create

constructor Create(const FileName: string; Mode: Word);

Este constructorul clasei. FileName este numele fişierului care urmează

să fie prelucrat. Mode este tipul prelucrării şi are ca valoare rezultatul

aplicării operatorului or între modul de deschidere şi modul de partajare.

Modul de deschidere poate lua una dintre valorile:

Valoare Semnificaţie

FmCreate Creează un fişier. Dacă acest fişier există, atunci este deschis la

scriere.

FmOpenRead Deschide un fişier la citire.

FmOpenWrite Deschide un fişier la scriere. Un fişier deschis la scriere este mai

întâi vidat.

fmOpenReadWrite Deschide un fişier şi pentru citire şi pentru scriere.

Modul de partajare poate lua una din valorile:

Valoare Semnificaţie

FinShare Exclusive Alte aplicaţii nu pot deschide fişierul.

fmSha re Deny WriteAlte aplicaţii pot deschide fişierul la citire dar nu şi pentru

scriere.

finShareDenyReadAlte aplicaţii pot deschide fişierul pentru scriere, dar nu şi

pentru citire.

finShareDenyNoneAlte aplicaţii pot citi sau scrie în acest fişier fără nici o

restricţie

Observaţie:

Manipularea fişierelor şi a conţinutului lor se mai poate face şi cu

ajutorul funcţiilor FileCreate, FileOpen, FileWrite, FileRead, FileClose.

218

Aceste funcţii sunt definite în unitul system.pas.

O altă categorie de funcţii specializate pentru manipularea datelor unui

fişier sunt cele clasice din Turbo Pascal: AssignFile, Reset, Rewrite, Read,

Write, CloseFile.

Exemplu:

Următoarea aplicaţie constă dintr-o formă pe care sunt amplasate două

butoane. La apăsarea lui Buttonl, în fişierul numere.txt sunt tipărite

numerele de la 0 la 10. La apăsarea lui Button2, sunt citite şi afişate

numerele din fişierul numere.txt.

procedure TForml.ButtonlClick(Sender: TObject); var

f : TFileStream; sir : string i : integer; p : Pointer;

beginf := TFileStream.Create('c :\numere.t x t fmCreate);for i := 0 to 9 dobegin

sir := IntToStr(random(10)) + ' '; p := PChar(sir); f.Write(p~, length(sir));

end; f.Free;

end;

procedure TForml.Button2Click(Sender: TObject); var

f : TFileStream; sir : string; i : integer p : PChar;

beginf := TFileStream.Create('c :\numere.txtfmOpenRead); getmem(p, 2);while f.Position < f.Size do begin

£ . Read (p'1, 2 ) ; sir := string(p^);sir := trim(sir); // elimin spatiile de la inceputul si sfarsitul şirului ListBoxl.Items-Add(sir);

end; f.Free;

end;

219

19.6. Structuri şi funcţii utile pentru lucrul cu fişiere, directoare şi discuri

în acest subcapitol sunt prezentate funcţii şi structuri de date utile pentru

manipularea fişierelor şi a numelor de fişiere.

19.6.1. Structuri

S I. TSearchRec

TSearchRec = record

Time: Integer;

Size: Integer;

Attr: Integer;

Name: string;

ExcludeAttr: Integer;

FindHandle: THandle;

FindData: TWin32FindData;

end;

unde:

Time - reprezintă ştampila de timp a fişierului.

Size - este lungimea, în octeţi, a fişierului.

Name - este numele fişierului în format 8.3.

Attr - sunt atributele fişierului; un fişier poate avea unul sau mai

multe atribute dintre următoarele (se combină cu ajutorul

operatorului AND):

ValoareValoare

num ericăSemnificaţie

FaReadOnly $00000001 Fişier Read-Only.

FaHidden $00000002 Fişier ascuns.

FaSysFiie $00000004 Fişier sistem.

faVotumeID $00000008 Identificator de volum.

FaDirectoiy $00000010 Director

FaArchive $00000020 Fişier arhivă.

FaAnyFile $0000003F Orice alt fişier.

FindData - include informaţii suplimentare la fişier.

19.6.2. Atributele fişierelor

F I. FileAge

function FileAge(const FileName: string): Integer;

Returnează data creării fişierului FileName. Valoarea întoarsă de această

funcţie poate fi convertită la tipul TDateTime cu ajutorul funcţiei

FileDateToDateTime.

F2. FileDateToDateTime

function FileDateToDateTime(F('/eDar<?: Integer): TDateTime;

Converteşte o valoare întreagă (timpul în format DOS) într-un obiect de

clasă TDateTime.

F3. FileGetAttr

function FileGetAttr(const FileName: string): Integer;

Returnează atributele fişierului FileName. Dacă a apărut o eroare se

returnează -1.

F4. FileSetAttr

function FileSetAttr(const FileName: string; At ir. Integer): Integer;

Setează atributele fişierului FileName la valoarea Attr.

19.6.3. Căutare de fişiere

F5. FileExists

function FileExists(const FileName: string): Boolean;

Returnează true dacă există fişierul FileName.

F6. FindFirst

function FindFirst(const Path: string; Attr: Integer;

var F: TSearchRec): Integer;

Returnează primul fişier din calea Path, care are atributele specificate de

Attr. Rezultatul este returnat în F. Dacă a fost găsit un fişier cu atributele

specificate atunci funcţia returnează valoarea 0. în caz contrar este

returnată o eroare Windows.

221

function FindNext(var F: TSearchRec): Integer;

Returnează următoarea apariţie a unui fişier care are atributele specifi­

cate de anteriorul apel al lui FindFirst.

F8. FindClose

procedure FindClose(var F: TSearchRec);

Termină o secvenţă de instrucţiuni FindFirst / FindNext. După

FindClose, apelul lui FindNext este invalid.

Exemplu:

Următoarea aplicaţie numără câte fişiere cu extensia pas se află în

directorul curent.

procedure TForml.ButtonlClick(Sender: TObject); var

NrFis : integer;F : TSearchRec; dir: string;

beginNrFis := 0;dir := GetCurrentDir;if FindFirst(dir+'\*.pas', faAnyFile, F) = 0 then begin

inc(NrFis);while FindNext(F) = 0 do

inc(NrFis);end;

FindClose(F);ShowMessage(IntToStr(NrFis));

end ;

F9. FileSearch

function FileSearch(const Name, DirList: string): string;

Caută fişierul cu numele Name în lista de directoare DirList. Direc­

toarele din această listă trebuie să fie separate între ele prin Dacă

este găsit un fişier, atunci este returnat împreună cu calea completă spre

el.

F7, FindNext

222

19.6.4. Manipulări de fişiere

FIO. DeleteFile

function DeleteFile(const FileName: string): Boolean;

Şterge fişierul cu numele specificat. Returnează true dacă operaţia

reuşeşte.

F I I . RenameFile

function RenameFile(const OldName, NewName: string): Boolean;

Redenumeşte numele fişierul OldName în NewName. Returnează true

dacă operaţia se încheie cu succes.

19.6.5. Manipulări de extensii

F12. ChangeFileExt

function ChangeFileExt(const FileName, Extension: string): string;

Schimbă extensia fişierului FileName la Extension.

F13. ExtractFileExt

function ExtractFileExt(const FileName: string): string;

Returnează extensia unui fişierului cu numele FileName.

Exemplu:

Următoarea aplicaţie afişează într-o componentă TListBox toate exten­

siile fişierelor aflate în directorul curent.

procedure TForml-ButtonlClick(Sender: TObject); var

F : TSearchRec; dir: string;

begindir := GetCurrentDir;if FindFirst(dir+'\*.*', faAnyFile, F) = 0 then begin

ListBoxl.Items .Add(ExtractFileExt(F.Name)); while FindNext(F) = 0 do

ListBoxl.Items.Add(ExtractFileExt(F.Name));end;

FinaClose (F) end;

223

19.6.6. Manipulări de căi

F14. ExtractFilePath

function ExtractRelativePath(const BaseName, DestName: string):

string;

Returnează calea fişierului FileName, inclusiv caracterele (:) şi (\).

F15. ExtractFileDir

function ExtractFileDir(const FileName: string): string;

Returnează calea fişierului FileName. Ultimele caractere vor fi diferite

de (:) şi (\).

F16. ExtractFileDrive

function ExtractFileDrive(const FileName: string): string;

Returnează driverul pe care se află fişierul FileName.

F17. ExtractFileName

function ExtractFileName(const FileName: string): string;

Returnează numele unui fişier dintr-un şir ce conţine şi calea şi drive-ul.

F18. ExpandFileName

function ExpandFileName(const FileName: string): string;

Returnează numele şi calea completă a fişierului FileName. Acest lucru

se face prin concatenarea directorului curent la numele fişierului dat ca

parametru.

F19. ExtractRelativePath

function ExtractRelativePath(const BaseName, DestName: string):

string;

Returnează calea relativă a fişierului DestName la calea BaseName.

Acest lucru se face prin eliminarea subşirului comun lui DestName şi

BaseName şi înlocuirea lui cu şirul '..V.

224

F20. ExtractShortPathName

function ExtractShortPathName(const FileName: string): string;

Converteşte calea şi numele fişierului la formatul 8.3, adică numele

fişierelor şi directoarelor au cel mult 8 caractere, iar extensiile au cel

mult 3 caractere.

19.6.7. Operaţii asupra directoarelor

F21. GetCurrentDir

function GetCurrentDir: string;

Returnează directorul curent.

F22. SetCurrentDir

function SetCurrentDir(const Dir. string): Boolean;

Setează directorul curent la Dir. Funcţia returnează valoarea true dacă

operaţia de schimbare a directorului a reuşit.

F23. CreateDir

function CreateDir(const Dir: string): Boolean;

Creează directorul Dir.

F24. ForceDirectory

function ForceDirectories(Dir: string): Boolean;

în mod normal, sistemele de operare DOS şi Windows nu permit crearea

decât a unui singur director la un moment dat. Funcţia ForceDirectories

creează întreaga cale de directoare specificată în şirul Dir.

F25. RemoveDir

function RemoveDir(const Dir: string): Boolean;

Şterge directorul Dir. Funcţia returnează true dacă operaţia de ştergere a

reuşit.

Atenţie!

Directorul trebuie să fie vid înainte de a fi şters!

225

i *•*♦?* \ i î ‘ ; -f H i i j

F26. Directory Exist

function DirectoryExists(/V«me: string): Boolean;

Determină dacă directorul cu numele Name există.

F27. ChDir

procedure ChDir(5': string);

Schimbă discul şi directorul curent la noua cale stocată în şirul S.

19.6.8. Manipulări de discuri

F28. DiskSize

function DiskSizs(Drive: Byte): Int64;

Returnează capacitatea, în octeţi, a discului Drive. Funcţia returnează -1

dacă discul nu există.

F29. DiskFree

function DiskFree(Drive: Byte): Int64;

Returnează numărul de octeţi liberi de pe discul Drive. Funcţia retur­

nează -1 dacă discul nu există.

226

20. ITEMURI

Cuvântul “item” etichetează o largă categorie de obiecte: şiruri de

caractere, imagini, etc. Mediul Delphi pune la dispoziţia programatorului

componente cu ajutorul cărora acesta poate prelucra şi afişa aceste item-uri.

Dintre acestea amintim: TListBox, TComboBox, TListView, TTreeView.

TListBox este o componentă care afişează itemuri dintr-o listă de şiruri

de caractere. Accesarea itemurilor se face cu ajutorul proprietăţii Items. Se

poate specifica numărul de coloane pe care acestea vor fi afişate cu ajutorul

proprietăţii Columns.

TComboBox combină o cutie de editare cu o listă drop down. Lista drop­

down se accesează prin apăsarea butonului - pe care este desenată o săgeată -

aflat la dreapta cutiei. Utilizatorul poate selecta un item din listă sau poate scrie

direct în cutia de editare.

TListView permite afişarea de itemuri în mai multe moduri. TListView

manipulează lista cu itemuri prin intermediul clasei TListltems. Fiecare element

al listei este un obiect de tip TListltem.

20.1. TListBox

Este un control care permite afişarea şi prelucrarea unei liste cu item-uri.

Aceste itemuri pot fi prelucrate atât la momentul proiectării aplicaţiei (cu

Objectlnspector care va afişa un String List Editor), prin intermediul pro­

prietăţii Items, cât şi la momentul execuţiei aplicaţiei, tot cu ajutorul acestei

proprietăţi.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl ->

-> TCustomListBox -> TListBox.

Definit în_______ _____________________________________________

stdctrls.pas

Pagina

Standard

227

Proprietăţi

PI. Columns

property Columns: Integer;

Specifică numărul de coloane vizibile fără a avea un scrollbar orizontal.

Implicit este 0, ceea ce înseamnă că nu este permisă afişarea pe mai

multe coloane. Dacă Columns este diferit de zero, atunci nu mai este

nevoie de scroller vertical, itemurile fiind grupate pe coloane. De

exemplu, pentru Columns=2, ListBox-ul va arăta în felul următor:

^na RaulCristina CosminMaria Timealoana CorinaMarcel DanBianca Marius

<1 1

P2. Items

property Items: TStrings;

Specifică itemurile sub forma unor şiruri de caractere. Această proprie­

tate este folosită pentru a adăuga, insera, şterge itemuri dintr-o listă de

itemuri. Folosiţi proprietăţile şi metodele lui TString pentru a manipula

aceste itemuri.

Exemplu:

Următoarea aplicaţie constă dintr-o formă pe care se află o cutie TEdit, o

cutie TListBox şi un buton de tip TButton. Butonul este de tip Default şi

are titlul Add. Utilizatorul poate introduce itemuri în ListBox prin

intermediul cutiei de editare. La apăsarea tastei <Enter>, textul aflat în

cutia de editare va deveni un item al ListBox-ului.

procedure TForml.ButtonlClick(Sender: TObject); begin

Buttonl.Default:=true;Buttonl.Caption:='Add';ListBoxl.Items.Add(Editl.Text);Editl.Clear;Editl.SetFocus;

end;

228

Exemplu:

Următoarea procedură inserează într-un TListBox zece item-uri repre­

zentând numerele de la 1 la 10:

procedure TForml.ButtonlClick(Sender: TObject); var

i : integer; begin

for i := 1 to 10 doListBoxl.Items.Add(IntToStr(i)) ;

end;

P3. Sorted

property Sorted: Boolean;

Specifică dacă item-urile din listă sunt sortate alfabetic. Folosiţi ^orted

pentru a sorta alfabetic item-urile din lista de item-uri. Dacă Sorte4 este

true, atunci adăugarea sau inserarea unui item se va face cu respectarea

ordonării alfabetice existente.

P4. IntegralHeight

property IntegralHeight: Boolean;

Specifică dacă se pot afişa şi itemuri parţiale. Dacă IntegralHeight este

false atunci se poate afişa doar o parte din Item', de exemplu, dacg un

item nu încape să fie afişat întreg în partea de jos a cutiei, atunci e| va fj

afişat doar parţial, putând fi făcut în întregime vizibil prin acţio^ ,.^

scrollbar-ului vertical.

P3. Itemlndex

property Itemlndex: Integer;

Indică numărul de ordine al itemului selectat (marcat) din lista <je

itemuri. Dacă nici un item nu este selectat, atunci Itemlndex retumeaz^ _

1. Primul item din listă are indexul 0. Dacă atribuiţi o valoare juj

Itemlndex (în timpul execuţiei programului), atunci itemul având numă­

rul de ordine specificat va fi selectat. Dacă sunt permise Multi-se|ectjj

atunci Itemlndex va întoarce numărul de ordine al itemului activ.

P4. Toplndex

property Toplndex: Integer;

Indică numărul de ordine al celui mai de sus item afişat.

229

P5. MultiSelect

property MultiSelect: Boolean;

Specifică dacă utilizatorul poate selecta la un moment dat mai multe

item-uri.

P6. ExtendedSelect

property ExtendedSelect: Boolean;

Specifică dacă utilizatorul poate selecta mai multe item-uri consecutive.

Dacă MultiSelect este false, atunci ExtendedSelect nu are nici un efect.

P7. SelCount

property SelCount: Integer;

Returnează numărul de item-uri selectate, dacă sunt permise multi-

selecţii. SelCount este ReadOnly.

P8. Selected

property Selected|7/it/ex: Integer]: Boolean;

Determină dacă itemul cu numărul de ordine Index este selectat. în caz

afirmativ se returnează true, iar în caz contrar se returnează false.

Exemplu:

Pentru a utiliza operaţiile de inserare respectiv ştergere de item-uri, vom

realiza următorul program care conţine două forme. Pe prima formă se

găsesc:

• o componentă ListBox 1 la care vom adăuga, insera şi şterge item­

uri;

• o cutie de editare Editl prin intermediul căreia vom introduce item­

urile;

• un buton Buttonl care are titlul Add şi la a cărui apăsare conţinutul

cutiei de editare va fi adăugat ca ultim item al lui ListBox;

• un buton Button2 care are titlul Delete şi la a cărui apăsare itemul

selectat va fi şters;

• un buton Button3 care are titlu Insert şi la a cărui apăsare va fi

afişată o nouă formă (Form2) care conţine o cutie de editare în care

utilizatorul introduce poziţia în care va fi inserat (în ListBox)

conţinutul cutiei de editare de pe forma Forml. Butonul Buttonl de

pe forma a doua va avea titlul Ok şi va fi un buton Default la a cărui

230

apăsare se va produce operaţia de inserare. Butonul Button2 de pe

forma a doua va fi un buton numit Cancel folosit în cazul în care nu

se mai doreşte inserarea.

La inserare se mai face un test: dacă poziţia pe care se inserează este

mai mare decât numărul total de item-uri din ListBox, atunci această

operaţie nu se mai execută.

Unitl.pas va conţine următoarele handlere de evenimente.

procedure TForml.FormCreate(Sender: TObject); var

ok : boolean; begin

if not ok then begin

Buttonl.Default:=true;Buttonl.Caption;='Add1;Button2 .Caption: = 1 Delete ' ;Button3 .Caption: = 'Insert' ;ListBoxl.Clear;Editl.Clear;Editl.setFocus; ok:=true;

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

Form2 .Show;Form2 .Editl.SetFocus;

end;

procedure TForml.Button2Click(Sender: TObject); begin

ListBoxl.Items.Delete(ListBoxl.Itemlndex);Editl.SetFocus;

end;

iar Unit2.pas va arăta astfel:

procedure TForm2 .ButtonlClick(Sender: TObject); var

nr ; integer; begin

nr := StrToInt(Editl.Text); if nr <= Forml.ListBoxl.Items.Count

then beginForml.ListBoxl.Items.Insert(nr,Forml.Editl.Text);Form2 .Hide;Forml.Edi tl.SetFocus;

endelse Form2 .Editl.SetFocus;

231

Editl.Clear; end;

procedure TForm2.Button2Click(Sender: TObject); begin

Form2.Hide;Forml.Editl.SetFocus;

end;

Exemplu:

Următoarea aplicaţie şterge item-urile selectate (în acest caz este permisă selectarea mai multor item-uri). Avem pe o formă două butoane, unul intitulat Add, iar celălalt intitulat Delete. Mai avem, de asemenea, şi o cutie de editare E ditl şi o cutie ListBoxl. La apăsarea primului buton, conţinutul cutiei E ditl va fi adăugat ca item al cutiei ListBoxl. Vom selecta mai multe itemuri; la apăsarea celui de-al doilea buton, itemurile selectate vor fi şterse.

procedure TForml.ButtonlClick(Sender: TObject); begin

ListBoxl.Items.Add(Editl.Text); end;

procedure TForml,Button2Click(Sender: TObject); var

i : integer; begin

ListBoxl.ExtendedSelect := true;ListBoxl.MultiSelect := true; i := 0;while i < ListBoxl.Items.Count do

if ListBoxl.Selected[i] then ListBoxl.Items.Delete(i) else i := i + 1;

end;

Metode

M l. Clear

procedure Clear;

Şterge toate item-urile dintr-o cutie de listare (ListBox).

M2. ItemRect

function ItemRect(/fem: Integer): TRect;

232

Returnează dreptunghiul ce înconjoară itemul cu numărul de ordine Index.

M 3. ItemAtPos

function ItemAtPoslTo.y: TPoint; Existing'. Boolean): Integer;

Specifică indexul itemului aflat la punctul Pos. Dacă punctul Pos este mai jos de ultimul item şi dacă Existing este true, atunci ItemAtPos returnează -1 , iar dacă Existing este false, atunci se returnează indexul ultimului item + 1.

Exem plu:

Următorul exemplu foloseşte o componentă TListBox. Itemurile din ea se pot adăuga la momentul proiectării aplicaţiei. La trecerea cursorului de mouse pe deasupra unui item, acesta devine selectat.

Folosind programul precedent, vom mai scrie acum doar următoarea procedură:

procedure TForml.ListBoxlMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);

varp : Tpoint; nr : integer;

beginListBoxl.MultiSelect := false; p.x := X; p.y := Y;nr := ListBoxl.ItemAtPos(p,true);ListBoxl.Itemlndex := nr;

end;

Evenimente

E l. OnDrawItem

property OnDrawItem: TDrawItemEvent;

Apare când un item trebuie afişat.

Tipul TDrawItemEvent este definit astfel:

TDrawItemEvent = procedure(Control: TWinControl;Index: Integer Rect: TRect;State: TOwnerDrawState) o f object;

233

TDrciwItemEvent include următorii parametri:

P a ra m e tru S em n ifica ţie

Control R eferire le controlul conţinând itemul

Index Indexul item ului

Rect C oordonatele dreptunghiulu i care include item ul

StateStarea item ului, care indică dacă item ul este selectat, b ifa t, focalizat, etc.

E2. OnMeasureltem

property OnMeasureltem: TMeasureltemEvent;

Apare când un item trebuie afişat. Tipul TMeasureltemEvent este definit astfel:

TMeasureltemEvent = p rocedur^(Control: TWinControl;Index: Integer; var Height: Integer) of object;

OnMeasureltem este de tipul TMeasureltemEvent care conţine următorii trei parametri:

P a r a m e tr u S em n ifica ţie

Control Specifică controlul conţinând itemul.

Index S pecifica indexul item ului

Height Specifică înă lţim ea item ului

Parametrul Index identifică poziţia itemului în ListBox.Parametrul Height specifică înălţimea în pixeli pe care itemul dat o ocupă în control.

20.2. TComboBox

Combină o cutie de editare cu o listă de item-uri care se poate defila. Utilizatorul poate alege un item din listă, sau poate scrie direct în cutia de editare.

Ierarhie

TObject -> TPersistent -> TComponent -> TControl ->-> TWinControl -> TCustomComboBox -> TComboBox.

234

stdctrls.pas

Pagina_____________________________________________________

Standard

Proprietăţi____________________________________________

PI. DropDownCount

property DropDownCount: Integer;

Indică numărul maxim de item-uri care pot fi afişate fără a fi nevoie de un scrollbar vertical.

P2. DroppedDown

property DroppedDown: Boolean;

Indică dacă lista drop-down este afişată. La momentul execuţiei ea poate fi afişată prin execuţia unui click pe săgeata din dreapta controlului.

P3. Itemlndex

property Itemlndex: Integer;

Indică numărul de ordine al itemului curent selectat (cel care este afişat în cutia de editare). Primul item din listă are indicele 0. Dacă nici un indice nu este selectat, atunci Itemlndex returnează -1.

P4. Items

property Items: TStrings;

Specifică itemurile din lista ce apare în ComboBox. Se pot adăuga sau şterge itemuri folosind proprietăţile lui TStrings.

Exemplu:

Următoarea aplicaţie adaugă zece item-uri (constând din primele 10 numere naturale) la o componentă TComboBox:

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

ComboBoxl.Clear; for i:=0 to 10 do

Definit în________________________________________ ___

235

P5. Style

ComboBoxl.Items.A d d (IntToStr(i)) ;end;

property Style: TComboBoxStyle;

Specifică modul de comportare a componentei ComboBox. Valorile pe care le poate lua Style sunt:

V a lo a re S em n ifica ţie

csDropDown C rează o listă drop-dow n cu o cutie de editare, utilizatorul având posib ilita tea introducerii de text în cu tia de editare.

csDropDownList C rează o listă drop-dow n având o cutie de editare în care utilizatoru l nu poate in troduce m anual un text.

csSimpleC rează o cutie de editare cu o com ponen tă TLislBox sub ea. D im ensiunea acesteia dep inde de proprietatea Height.

csOwnerDrawFixed

C rează o listă drop-dow n cu o cutie de editare, u tilizatorul având posib ilitatea introducerii de tex t în cu tia de editare. Item urile au d im ensiunea specificată de proprietatea hemHeight. Când trebuie să fie afişată lista drop-dow n cu item uri, apare even im entu l OnDrawItem.

csOwnerDrawVariăble

C rează o listă drop-dow n cu o cutie de editare, u tilizatorul având posib ilita tea in troducerii de tex t în cu tia de editare. Item urile au dim ensiune variabilă. C ând trebuie să fie afişată lista drop-dow n, cu item uri, apar evenim entele OnDrawItem şi OnMensureltem.

Exemplu:

Următoarea aplicaţie construieşte şi gestionează afişarea unei componente TComboBox. Pentru aceasta folosim o componentă TPopupMenu ataşată componentei TComboBox. Componenta TPopupMenu are item-urile:

• A dd - folosit pentru a adăuga un nou item la lista drop-down;• Delete - pentru a şterge item-ul curent selectat;• View care conţine două subitem-uri (DropDown şi DropDownList)

folosite pentru a seta modul de comportare a TComboBox-ului.

La adăugarea unui item se va afişa o nouă formă, Fonn2, pe care se află o cutie de editare în care utilizatorul va introduce numele noului item şi un buton de tip TBitBtn la a cărui apăsare se va închide forma Form2.

236

I landlerele de evenimente de pe forma Form l sunt:

procedure TForml.AddlClick(Sender: TObject); begin

if Form2.ShowModal = mrOkthen ComboBoxl.Items.Add(Form2.Editl.Text);

«nd;

procedure TForml.DeletelClick(Sender: TObject); begin

if ComboBoxl.Itemlndex <> -1then ComboBoxl.Items.Delete(ComboBoxl.Itemlndex);

end;

procedure TForml.DropDownlClick{Sender: TObject); begin

<\miboBoxl. Style := csDropDown;©nd,

procedure TForml.DropDownListlClick(Sender: TObject); begin

('oinboBoxl. Style := csDropDownList; end;

Handlerele de evenimente de pe forma Form2 sunt:

procedure TForm2.FormShow(Sender: TObject); begin

Rdi tl.Clear;F.ditl .SetFocus;

end;

P6. Sorted

property Sorted: Boolean;

Indică dacă item-urile din lista Items sunt sortate alfabetic. Setarea acestei proprietăţi la true va sorta alfabetic aceste item-uri.

VI. MaxLength

property MaxLength: Integer;

Indică numărul maxim de caractere pe care utilizatorul le poate intro­duce în cutia de editare a componentei TComboBox.

231

iM ti ,

P8. SelText

property SelText: string;

Reprezintă textul selectat din cutia de editare ataşată componentei TComboBox. Poziţia primului caracter selectat precum şi numărul de caractere selectate sunt returnate cu ajutorul proprietăţilor SelStart, respectiv SelLength.

P9. Canvas

property Canvas: TCanvas;

Furnizează accesul la suprafaţa de desenare în momentul în care proprietatea Style are una din valorile csOwnerDrawVariable sau csOwnerDraw Fixed.

Metode ___________________________________________________

M l. Clear

procedure Clear;

Şterge toate item-urile din lista drop-down.

M2. SelectAll

procedure SelectAll;

Selectează întregul text al cutiei de editare.

Evenimente__________________________________________________

E l. OnChange

property OnChange: TNotifyEvent;

Apare în momentul în care un alt item este selectat sau un text este introdus în cutia de editare.

E2. OnDropDown

property OnDropDown: TNotifyEvent;

Apare când se execută click pe săgeata din dreapta a unei componente TComboBox. în acest moment se deschide lista drop-down.

238

E3.

property OnDrawItem: TDrawItemEvent;

Apare când un item trebuie afişat.Tipul TDrawItemEvent este definit astfel:

TDrawItemEvent = procedure( Cont rol: TWinControl;Index: Integer Rect: TRect; State: TOwnerDrawState) of object;

Semnificaţia parametrilor acestui eveniment este:

OnDrawItem

P a r a m e tr u S em n ifica ţie

Control C ontrolul care conţine item -ul.

Index Indexul item -ului.

Rect D reptunghiul care încon joară item -ul.

State Starea item ului. Poate fi selectat, b ifat sau are focus.

E4. OnMeasureltem

property OnMeasureltem: TMeasureltemEvent;

Apare când un item trebuie afişat. Evenimentul OnMeasureltem apare înaintea evenimentului OnDrawItem. Tipul TMeasureltemEvent este definit astfel:

TMeasureltemEvent = p rocedure(Control: TWinControl;Index: Integer; v ar Height: Integer) of object;

Semnificaţia parametrilor acestui eveniment este:

P a r a m e tr u S em n ifica ţie

Control C ontrolul care conţine item -ul.

Index Indexul item -ului.

H eight Înălţim ea dreptunghiul care înconjoară item -ul.

20.3. TColorBox m

TColorBox reprezintă un combo box din care utilizatorul poate selecta o culoare.

Ierarhie

TObject- > TPersistent- > TComponent- > TControl- >Twin Control

239

- >TCustomListControl- >TCustomCombo-> ->TCustomComboBox->TCustomColorBox->TColorBox

Definit în_____________________________________________________

System.pas

Pagina_______________________________________________________

Additional

Proprietăţi __________________________________________________

P I. ColorsName

property ColorNames[/Wei': Integer]: string;

ColorNames este folosită pentru a obţine numele uneia dintre culorile din lista de culori existentă în ColorBox. Proprietatea ne dă numele culorii aflată pe poziţia Index +1 (0 este indexul primei culori din listă). Proprietatea Style specifică numele folosit pentru fiecare culoare şi, de asemenea, specifică care culori vor fi incluse în listă.

P2. Colors

property Colors [Index-. Integer]: TColor;

Color este folosită pentru a obţine valoarea culorii din ColorBox. Index reprezintă indexul culorii (0 este indexul primei culori din cutie, 1 este indexul celei de-a d o u a , ş.a.m.d.).

Exem plul 1:

La apăsarea unui buton să se coloreze forma în culoarea al cărei indice va fi specificat.

Vom folosi un buton Buttonl, o cutie ColorBox! şi o cutie de editare E ditl în care vom menţiona indicele culorii.

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

procedure TForml.ButtonlClick(Sender: TObject) begin

Editl.SetFocus;Forml.Color:=ColorBoxl.Colors[strtoint(Editl.Text) ] ;

end;

240

P3. Style

property Style: TColorBoxStyle;

Controlează care culori vor fi incluse în listă şi care este formatul lor. Style poate să nu includă nici una sau mai multe dintre:

Style Sem nificaţie

cbStandardColors ColorBox afişează prim ele 16 culori constante din unitul G raphics. A cestea sunt constan te (ex. clRed, clBlue) ce rep rez in tă valori fixe RGB.

cbExtendedColors ColorBox include clMoneyGreen, clSkyBlue, clCream, şi clMedGray.

cbSystemColors ColorBox include constan ta sim bolică a culorii care reflectă va loarea specificată în W indow s C ontrol Panel.

cblncludeNone ColorBox include clNone. A ceastă op ţiune are efect num ai dacă Style include cbSystemColors

cblncludeDefault ColorBox include clNone. A ceastă opţiune are efect num ai dacă Style include cbSystemColors

cbCustomColor

Prim a în reg istra re conţine o culoare Custom (obişnuită).

C ând utilizatorul selectează în reg istra rea Custom, ColorBox afişează un Color Dialog din care u tilizatorul să poată alege o culoare pentru Custom.

cbPrettyNames ColorBox afişează culorile în cuvinte şi nu ca şi constantă, culoare de tip string. D e exem plu, va afişa Red în loc de clRed.

P4. Selected

property Selected: TColor;

Specifică culoarea curentă selectată.

Exem plul 2:

La apăsarea unui buton să se coloreze forma în culoarea selectată din ColorBox.

Vom avea pe formă un buton Buttonl şi o cutie ColorBoxl.

Handlerele de evenimente ale acestor obiecte sunt:

procedure TForml.BitBtnlClick(Sender: TObject); begin

Forml.Color:=ColorBoxl.Selected;end;

241

Metode

M l. Addltem

procedure Addltem (Item'. String; A O bject: TObject);

Adaugă un item în lista drop-down de itemi.

M2. Clear

procedure Clear; override;

Şterge tot textul din cutia de editare şi toţi itemii din lista de itemi.

M3. ClearSelection

procedure ClearSelection; override;

Deselectează orice item selectat din lista drop-down.

M4. CopySelection

procedure CopySelection (Destination: TCustomListControl);override;

Copiază itemul selectat din lista drop-down într-o altă listă.

M5. D eleteSelected

procedure DeleteSelected; override

Şterge itemul selectat din lista drop-down.

20.4. TListView

Este o componentă care permite afişarea de item-uri într-o varietate de moduri.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> ->TCustomListView -> TListView.

Definit în_____________________________________________________

com ctrls.pas

242

Pagina

Win32

Proprietăţi_______________________________________________

PI. Column

property Co\umn{Index: Integer]: TListColumn;

Indică coloana cu numărul de ordine Index.

P2. ColumnClick

property ColumnClick: Boolean;

Specifică dacă headerul unei coloane se comportă ca un buton.

P3. Columns

property Columns: TListColumns;

Facilitează lucrul cu coloane. Pentru a se permite lucrul cu coloane, trebuie ca proprietatea ViewStyle să fie setată la vsReport. Coloanele pot fi adăugate şi la momentul proiectării aplicaţiei cu ajutorul lui ListView Columns Editor care apare pe ecran la dublu click pe proprietatea Columns din Objectlnspector.

P4. ItemFocusedproperty ItemFocused: TListltem;ItemFocused conţine itemul care este selectat şi este înconjurat de un dreptunghi din linie punctată (item-ul care are focus) Dacă nici un item nu-este selectat atunci se returnează nil. La un moment dat un singur item poate avea această proprietate.

P5. Items

property Items: TListltems;

Items conţine lista itemurilor unei componente TListView. Aceste ite­muri pot fi prelucrate şi la momentul proiectării aplicaţiei prin dublu click pe proprietatea Items din Objectlnspector. Pe ecran va apare ListView Items Editor:

243

aItems Item Properties

New Item Caption:

Image Index:

State Index:

OK Cancel Help

P6. Largelmages

property Largelmages: TCustomlmageList;

Specifică care listă cu imagini este ataşată ListView-ului curent. Această proprietate este valabilă doar când proprietatea ViewStyle este setată la vslcon. Dacă Largelmages este nevidă, atunci fiecare item are ataşată o imagine.

P7. Smalllmages

property Smalllmages: TCustomlmageList;

Specifică care listă cu imagini este ataşată ListView-ului curent. Această proprietate este valabilă doar când proprietatea ViewStyle este setată la vsSmalllcon. Dacă Smalllmages este nevidă, atunci fiecare item are ataşată o imagine.

P8. MultiSelect

property MultiSelect: Boolean;

Indică dacă utilizatorul poate selecta mai multe item-uri la un moment dat. Implicit este false.

P9. SelCount

property SelCount: Integer;

Indică numărul de item-uri selectate la un moment dat.

P10. Selected

property Selected: TListltem;

244

Returnează primul item selectat dintr-o componentă TListView.

P i l . ShowColumnHeaders

property ShowColumnHeaders: Boolean;

Este valabilă doar dacă ViewStyle are valoarea vsReport şi indică dacă taburile reprezentând capete de coloane sunt afişate.

P12. Topltem

property Topltem: TListltem;

Returnează cel mai de sus item vizibil. Acesta poate să nu fie cel mai de sus item al TListView, dacă acela nu este vizibil.

P13. ViewStyle

property ViewStyle: TViewStyle;

Specifică modul în care sunt afişate item-urile unei ListView. Valori posibile pentru ViewStyle sunt:

V a lo a re S em n ifica ţie

vslcon Fiecare item apare ca un icon cu textul ataşat lui sub el. U tilizatorul îl poate m uta în orice a ltă poziţie în interiorul TListView-uM curent.

vsSmalllconFiecare item apare ca un icon cu textul a taşat la d reap ta lui. U tilizatorul îl poate m u ta în orice altă poziţie în interiorul TListView- ului curent.

vsListFiecare item apare ca un icon cu o e tichetă la d reap ta lui. Item -urile sun t aranjate în coloane şi nu po t fi m utate în orice loc d in cadrul TListView-ului curent.

vsReport

Fiecare item este a fişat pe p rop ria lui linie. C ea m ai din stânga co loană conţine icon-ul item -ului îm preună cu tex tu l a taşa t lut. Iar apoi, urm ătoarele coloane conţin urm ătoarele sub item uri (se ştie că un subitem nu poate avea la rândul său subitem -uri).

P14. SortType

property SortType: TSortType;

Indică felul în care sunt aranjate item-urile dintr-un TListView. Valori posibile pentru SortType sunt:

V a lo a re S em n ifica ţie

stNone N ici o sortare nu are loc.

stData Item -urile su n t sorta te crescător pe baza proprietăţii Data a lui TListltem. V a trebui im plem entat evenim entul OnCompare.

245

Îiîîitiţfiiii iii ?5 i i {-f rţ

V a lo a re S em n ifica ţie

stText Item -urile sunt sortate conform proprietăţii Caption a lui TListltem.

stBothItem -urile sunt sortate crescător pe baza proprietăţilo r Data şi Caption a lui TListltem. D acă evenim entul OnCompare nu este im plem enta t atunci el va fi ignorat.

P15. HotTrack

property HotTrack: Boolean;

Indică dacă item-urile sunt luminate în momentul în care cursorul de mouse trece pe deasupra lor.

Metode

M l. Arange

procedure Arrange(CWe: TList Arrangement);

Aranjează item-urile într-o ListView. Valori posibile pentru Code sunt:

V a lo a re S em n ifica ţie

arAlignBottom A lin iază item -urile de-a lungul m uchiei in ferioare a ferestrei.

arAlignLeft A lin iază item -urile de-a lungul m uchiei d in s tânga a ferestrei.

arAlignRight A lin iază item -urile de-a lungul m uchiei din d reap ta a ferestrei.

arAlignTop A lin iază item -urile de-a lungul m uchiei superioare a ferestrei.

M2. FindCaption

function ¥'mdCwption(StartIndex: Integer; Value: string;Partial, Inclusive, Wrap: Boolean): TListltem;

Returnează item-ul care are ataşată eticheta Value. Căutarea se face începând de la item-ul Startlndex. Dacă item-ul nu este găsit, atunci se returnează nil. Dacă Wrap este true, atunci, dacă item-ul nu este găsit, căutarea se continuă de la începutul listei.

M 3. GetltemAt

function GetItemAt(X, Y?Integer): TListltem;

Returnează item-ul aflat la poziţia (X, Y) faţă de colţul din stânga sus al cutiei TListView-ului.

246

M4. GetNearestltem

function GetNearestItcm(Po//i?: TPoint; Direction : TSearchDirection):TListltem;

Returnează cel mai apropiat item de punctul Point. Căutarea se poate face în direcţiile: sus (sdAbove), jo s (sdBellow), dreapta (sdRigth), stânga (sdLeft) sau în toate direcţiile(srM//).

M 5. Scroll

procedure ScrolKDX, DY: Integer);

Defilează conţinutul ferestrei cu DX respectiv D Y pixeli.

M6. Updateltem

procedure Updatcltem s( First Index, Lastlndex: Integer);

Redesenează item-urile având indexul în intervalul [Firstlndex, Lastlndex].

M7. IsEditing

function IsEditing: Boolean;

Indică dacă un item oarecare este în curs de editare.

Evenimente__________________________________________________

E l. OnChange

property OnChange: TLVChangeEvent;

Apare când un nou item este selectat sau proprietăţile State, Text, Image ale unui item sunt modificate. Tipul TLVCChangeEvent este definit astfel:

TLVChangeEvent = procedure(Sender: TObject;Item: TListltem; Change: TItemChange) of object;

E2. OnDeletion

property OnDeletion: TLVDeletedEvent;

Apare când un item este şters. Tipul TLVDeletedEvent este definit astfel:

TLVDeletedEvent = procedure(Sender: TObject;Item: TListltem) of object;

247

E3. Onlnsert

property Onlnsert: TLVDeletedEvent;

Apare când un nou item este inserat.

E4. OnCompare

property OnCompare: TLVCompareEvent;

Apare când două item-uri trebuie comparate pentru sortare. Tipul TLVCompareEvent este definit astfel:

TLVCompareEvent = pvocedurc(Sender: TObject;Item l, Item2: TListltem; D ata: Integer; var Com pare: Integer) of object;

Item-urile comparate sunt Item l şi Item2. Dacă Item l este mai mic decât Item2, atunci valoarea lui Compare trebuie setată la o valoare negativă. Dacă Item l este egal cu ltem 2 , atunci valoarea lui Compare trebuie setată la valoarea zero. Dacă Item l este mai mare decât Item2, atunci valoarea lui Compare trebuie setată la o valoare strict pozitivă.

E5. OnEditing

property OnEditing: TLVEditingEvent;

Apare când utilizatorul începe să editeze eticheta ataşată unui item. Tipul TLVEditingEvent este definit astfel:

TLVEditingEvent = procedure(Se/iekr: TObject;hem: TListltem; var AllowEdit: Boolean) of object;

Pentru a preveni editarea unui item, setaţi la false valoarea lui AllowEdit.

E6. OnEdited

property OnEdited: TLVEditedEvent;

Apare după ce utilizatorul a editat eticheta unui item. Tipul TLVEditedEvent este definit astfel:

TLVEditedEvent = procedur^(Sender: TObject;Item: TListltem; var S: string) of object;

E7. OnlnfoTip

property OnlnfoTip: TLVInfoTipEvent;

248

Apare când utilizatorul staţionează câteva momente deasupra unui item. Tipul TLVlnfoTipEvent este definit astfel:

TLVInfoTipEvent = procedure(Sender: TObject;Item. TListltem; v ar InfoTip: string) of object;

E8. OnData

property OnData: TLVOwnerDataEvent;

Apare înainte ca un item să fie afişat. Tipul TLVOwnerDataEvent este definit astfel:

LVOwnerDataEvent = procedure(Sender: TObject;hem: TListltem) of object;

Pentru ca acest eveniment să apară trebuie ca proprietatea OwnerData să fie true.

20.5. TListltems

Este lista de item-uri ce apar într-o componentă TListView.

Ierarhie______________________________________________________

TObject -> TPersistent -> TListltems

Definit în_____________________________________________________

com ctrls.pas

Proprietăţi___________________________________________________

P I. Count

property Count: Integer;

Indică numărul de item-uri din cadrul vectorului Item.

P2. Item

property ltem[Index: Integer]: TListltem;

Furnizează acces la item-urile unei liste prin intermediul numărului de ordine al item-ului. Primul item are numărul de ordine 0.

249

P3. Owner

property Owner: TCustomListView;

Returnează componenta TListView care manipulează item-urile din TListltems.

Metode____________________________________________ __

M l. Add

function Add: TListltem;

Adaugă un item la sfârşitul listei.

M2. Delete

procedure Delete(Index: Integer);

Şterge item-ul cu numărul de ordine Index, din cadrul listei curente.

M3. Clear

procedure Clear;

Şterge toate item-urile din cadrul listei curente.

M4. Insert

function Jnscrt(I/idex: Integer): TListltem;

Inserează un item pe poziţia Index. Acesta va putea fi apoi accesat cu ajutorul proprietăţii Items.

M5. IndexOf

function IndexOMValue: TListltem): Integer;

Returnează numărul de ordine al item-ului Value în cadrul listei de item­uri.

250

20.6. TListltem

Este o clasă care încapsulează proprietăţile, metodele şi evenimentele specifice unui item dintr-o listă TListltems.

Ierarhie______________________________________________________

TObject -> TPersistent -> TListltem

Definit în_____________________________________________________

com ctrls.pas

Proprietăţi___________________________________________________

PI. Caption

property Caption: string;

Indică textul care etichetează un item.

P2. Data

property Data: Pointer;

Reprezintă datele asociate item-ului.

P3. Checked

property Checked: Boolean;

Indică dacă un semn de bifare apare în stânga item-ului.

P4. Focused

property Focused: Boolean;

Indică dacă item-ul are focus.

P5. Imagelndex

property Imagelndex: TImageIndex;

Specifică numărul de ordine a imaginii (în cadrul unei componente TImageList) care este ataşată ca icon item-ului curent. Dacă proprietatea TListView. ViewStyle este vslcon, atunci Imagelndex este indicele ima­ginii din lista ataşată proprietăţii TListView.Largelmages, în caz contrar indicele este din lista TListView.Smalllmages.

251

P6. Index

property Index: Integer;

Indică numărul de ordine al unui item în cadrul TListltems. Primul item are numărul de ordine 0.

P7. Selected

property Selected: Boolean;

Specifică dacă item-ul este selectat.

P8. Subitems

property Subitems: TStrings;

Specifică lista de subitem-uri ataşată item-ului curent. Folosiţi proprie­tăţile lui TStrings pentru a manipula această listă.

P9. ListView

property ListView: TCustomListView;

Indică componenta de tip TListView care conţine item-ul curent. Proprietatea este ReadOnly.

P10. Owner

property Owner: TListltems;

Indică componenta de tip TListltems care conţine item-ul curent. Proprietatea este ReadOnly.

P i l . Statelndex

property Statelndex: TImageIndex;

Indică care imagine din TListView: :Statelmages este asociată cu item-ul curent.

Metode_____________________________________________________ _

M l. Delete

procedure Delete;

Şterge item-ul care o apelează.

252

M2. GetPosition

function GetPosition: TPoint;

Returnează coordonatele colţului din stânga sus al unui item în cadrul unei componente TListView.

M3. SetPosition

procedure SetPosition(const Value: TPoint);

Setează colţul din stânga sus al item-ului la poziţia Value în cadrul componentei TListView. Controlul trebuie să aibă proprietatea ViewStyle setată la vslcon sau vsSmalllcon.

M4. M akeVisible

procedure MakeVisibleffYzrZ/a/OA': Boolean);

Defilează lista cu item-uri până când item-ul care apelează această metodă devine vizibil/parţial vizibil.

M 5. Update

procedure Update;

Redesenează un item. Acest lucru este necesar dacă item-ul şi-a schimbat proprietăţile (Icon, Caption . ..)

M 6. DisplayRect

function DisplayRect(Coafe: TDisplayCode): TRect;

Returnează dreptunghiul care mărgineşte item-ul. Valori posibile pentru Code sunt:

V a lo a re S e m n ifica ţie

drBoundsR eturnează dreptunghiul care m ărgineşte în treg item -ul inclusiv icon-ul şi eticheta.

d rlro n R eturnează dreptunghiul care m ărgineşte icon-ul item -ului.

drL abel R eturnează dreptunghiul care m ărgineşte e ticheta item -ului.

drSelectBoundsR eturnează dreptunghiul care m ărgineşte în treg item -ul inclusiv icon-ul şi eticheta , excluzând coloanele. în cazu l ViewStyle este vsReport.

253

20. 7. TTreeView

Permite afişarea unei structuri ierarhice de item-uri, ca de exemplu structura de directoare de pe un disc. Fiecare nod din structură are asociat un text şi eventual un bitmap. Totodată un nod poate avea subnoduri care pot fi expandate, sau colapsate printr-un click pe părintele lor.

Arborele reprezentat într-o componentă TTreeView poate fi accesat cu ajutorul proprietăţii Items care este de tipul TTreeNodes. Această clasă manipu­lează arborele ca un tot. Accesarea unui nod particular din arbore se face cu ajutorul proprietăţii Item a clasei TTreeNodes. Fiecare nod al arborelui este un obiect de tipul TTreeNode.

Un nod din arbore are ataşat un text (proprietatea Text) şi eventual o imagine (proprietatea Imagelndex - care indică numărul de ordine al unei imagini din cadrul unei componente TImageList).

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomTreeView -> TTreeView.

Definit în__________________________________________________ _

com ctrls.pas

Pagina_______________________________________________________

Win32

Proprietăţi ____________________________________________

PI. Indent

property In d en t: integer;

Indică numărul de pixeli care sunt folosiţi pentru indentare în cazul expandării unor subnoduri. Implicit este 19.

P2. Items

property Items : TTreeNodes;

Items este lista nodurilor care sunt reprezentate într-un TTreeView. Aceste noduri sunt obiecte de tipul TTreeNode.Un arbore poate fi construit şi la momentul proiectării aplicaţiei cu

254

ajutorul TreeView Item s Editor, care este afişat la dublu click pe proprietatea Items din O bject Inspector:

OK j ..-Cancel'■■"■■■j-1- | Heip j

Butoanele Newltem şi NewSubltem adaugă câte un nod frate/fiu la nodul curent selectat.

Exem plul 1:

Următoarea procedură afişează în ListBoxl textul ataşat nodurilor arborelui reprezentat în componenta TreeView 1:

procedure TForml.ButtonlClick(Sender: TObject); var

i : integer; begin

for i := 0 to TreeViewl.Items.Count - 1 doListBoxl.Items.Add(TreeViewl.Items.Item[i].Text);

end;

Exem plul 2:

Următorul exemplu pune la dispoziţia utilizatorului - în momentul în care acesta execută click pe un nod al arborelui - informaţii despre acest nod, şi anume:

• textul ataşat;• numărul fiilor;• indicele absolut;• indicele relativ (în cadrul listei fiilor părintelui);• nivelul pe care se află în arbore;• nodul părinte (pentru nodurile de pe nivelul 0 părinte este considerat

chiar T reeV iew l.

Aceste informaţii sunt afişate într-o cutie de tip TListBox.Un nod poate fi selectat şi cu ajutorul tastelor <Up>, <Down>, deci dacă

255

doriţi ca aceste informaţii să le obţineţi şi când vă plimbaţi prin arbore cu ajutorul săgeţilor, copiaţi conţinutul acestui handler în handlerul ataşat evenimentului OnKeyPres (înlocuind bineînţeles linia

nod := TreeViewl.GetNodeAt(X,Y);cu linia

nod := TreeViewl.Selected;

)•

procedure TForml.TreeViewlMouseDown(Sender: TObj ect;Button: TMouseButton;

Shift: TShiftState; X, Y: Integer); var

nod, părinte : TTreeNode; begin

nod := TreeViewl.GetNodeAt(X, Y); if nod = nilthen ShowMessage('Nici un nod selectat!') else begin

ListBoxl.Clear;ListBoxl.Items.Add('Text 1 + nod.Text);ListBoxl. Items .Add ( 'Numar f ii : ' + IntToStr (nod. Count) ) ,- ListBoxl.Items.Add('Index relativ:'+IntToStr(nod.Index)); ListBoxl.Items.Add('Index absolut:'+

IntToStr(nod.Absolutelndex)); .ListBoxl.Items.Add('Nivel:'+IntToStr(nod.Level)); părinte := nod.Parent; if părinte <> nilthen ListBoxl.Items.Add('Părinte:'+parinte.Text) else ListBoxl.Items.Add('Părinte: TreeViewl');

end;end;

P3. Selected

property S e lec ted : TTreeNode;

Specifică nodul selectat dintr-o componentă TTreeView. Nodul selectat este încadrat într-un dreptunghi colorat.

P4. RightClickSelect

property RightClickSelect: boolean;

Indică dacă proprietatea Selected returnează noduri selectate cu butonul din dreapta al mouse-ului.

256

P5. ShowButtons

property ShowButtons : boolean;

Indică dacă butoanele (+), (-) apar în partea stângă a fiecărui nod cmc are subnoduri. Dacă ShowButtons este true, atunci acesie Iniiiuiiii' vor apărea şi la apăsarea lor nodul respectiv se va expanda sau colapsn.

P6. ShowLines

property ShowLines : boolean;

Indică dacă sunt afişate liniile care leagă un nod părinte de nodurile fii.

P7. ShowRoot

property Show R oot: boolean;

Indică dacă sunt afişate liniile care leagă nodul root de restul nodurilor.

P8. Topltem

property T op ltem : TTreeNode;

Indică cel mai de sus nod vizibil.

P9. Images

property Images : TImageList;

Reprezintă lista cu bitmap-urile ce se afişează la stânga nodurilor unui TTreeView. Unui nod i se poate ataşa o imagine fie la momentul proiectării aplicaţiei (prin intermediul lui TreeView Item s Editor) fie la momentul execuţiei aplicaţiei prin intermediul proprietăţii TTreeNode:: Imagelndex.

Exemplu:

Să exemplificăm puţin lucrul cu aceste proprietăţi. Construim un arbore (în componenta TreeViewl) Ia momentul proiectării aplicaţiei. Tot la momentul proiectării aplicaţiei construim şi un meniu Popup (cu meniurile AfiseazaLinii, AfiseazaRadacina, AfiseazaButoane, Indent, NodulSelectat, NodulDinVarf, care corespund proprietăţilor ShowLines, ShowRoot, ShowButtons, Indent, Selected şi Topltem) pe care îl ataşăm la TreeV iew l.Itemurile de meniu NodulSelectat şi NodulDinVarf vor afişa valorile proprietăţilor Selected şi Topltem, iar meniul Indent va afişa o fereastră de dialog în care uilizatorul este solicitat să introducă o valoare pentru

257

proprietatea Indent.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object PopupMenul: TPopupMenuobject AfiseazaRadacinal: TMenuItem

Caption = 'AfiseazaRadacina'Checked = True

endobject AfiseazaLiniil: TMenuItem

Caption = 'AfiseazaLinii’Checked = True

endobject AfiseazaButoanel: TMenuItem

Caption = 'AfiseazaButoane1 Checked = True

endobject Indent1: TMenuItem Caption = 'Indent'

endobject Noduldinvarf1: TMenuItem

Caption = 'Nodul din varf’ endobject NodulSelectatl: TMenuItem

Caption = 'Nodul Selectat' end

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

procedure TForml.AfiseazaRadacinalClick(Sender: TObject); beginAfiseazaRadacinal.Checked := not AfiseazaRadacinal.Checked; TreeViewl.ShowRoot := not TreeViewl.ShowRoot;

end;

procedure TForml.AfiseazaLiniilClick(Sender: TObject); beginAfiseazaLiniil.Checked := not AfiseazaLiniil.Checked; TreeViewl.ShowLines := not TreeViewl.ShowLines;

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

AfiseazaButoanel.Checked := not AfiseazaButoanel.Checked; TreeViewl.ShowButtons := not TreeViewl.ShowButtons;

end;procedure.TForml.IndentlClick(Sender: TObject);

varNrSir : string;

beginInputQuery('Cutie de dialog',

'Introduceti numărul de pixeli pentru indent', nrSir);

258

TreeViewl.Indent := StrToInt(NrSir); end;

procedure TForml.NoduldinvarflClick(Sender: TObject); var

nod : TTreeNode; begin

nod := TreeViewl.Topltem; if nod = nilthen ShowMessage('Arbore vid')else ShowMessage('Nodul din varf are eticheta ' + nod.Text);

end;procedure TForml.NodulSelectatlClick(Sender: TObject);

varnod : TTreeNode;

beginnod := TreeViewl.Selected; if nod = nilthen ShowMessage('Nici un nod selectat!')else ShowMessage('Nodul selectat are eticheta ’ + nod.Text);

end;

Metode

M l. AlphaSort

function A lphaSort: boolean;

Sortează nodurile în ordine alfabetică după eticheta ataşată fiecăruia.

M2. FullCollapse

procedure FullCollapse;

Colapsează toate nodurile dintr-o structură arborescentă. Vor rămâne afişate doar nodurile de pe primul nivel.Instrucţiunea:

TreeViewl.FullCollapse;

va colapsa arborele din cutia TreeV iew l.

M3. FullExpand

procedure FullExpand;

Expandează toate nodurile. Fiecare (sub)nod apare sub nodul părinte. Dacă ShowButtons este true, atunci toate caracterele (+) sunt transfor­mate în (-).

259

Instrucţiunea:

TreeViewl.FullExpand; va expanda arborele din cutia T reeV iew l.

M4. LoadFromFile

procedure Lo ad F ro m F i I e (F(7e Afa/ /1 e : string);

încarcă o structură de noduri dintr-un fişier cu numele FileName.

M5. SaveToFile

procedure SaveToFile(FileName : string);

Salvează o structură de noduri într-un fişier cu numele FileName. Forma în care se salvează un arbore este următoarea (un fiu apare indentat faţă de părintele lui):

aaaab

abaabbabc

ac

M6. GetNodeAt

function GetNodeAt(X, Y : integer) : TTreeNode;

Returnează nodul găsit la poziţia (X, Y). Coordonatele sunt calculate faţă de colţul din stânga sus al cutiei TtreeView (care are coordonatele (0,0)).

Exem plu:

Următoarea aplicaţie returnează eticheta ataşată nodului aflat la poziţia în care este apăsat butonul mouse-ului. Veţi observa că un nod va fi detectat chiar dacă punctul unde mouse-ul este apăsat este la dreapta nodului sau la stânga lui:

procedure TForml.TreeViewlMouseDown(Sender: TObject;Button: TMouseButton,-

Shift: TShiftState; X, Y: Integer); var

nod : TTreeNode; beginnod := TreeViewl.GetNodeAt(X, Y); if nod <> nil

260

then ShowMessage('A fost selectat nodul cu eticheta 1 + nod. Text)

M 7. GetHitTestlnfoAt

function GetHitTestInfoAt(X, Y: Integer): THitTests;

Returnează poziţia punctului de coordonate (X,Y) faţă de controlul TTreeView şi faţă de nodurile din arborele pe care îl conţine. Valorile returnate de funcţie sunt:

end;

V a lo a re S em n ifica ţie

htAbove Punctul se găseşte deasupra contro lu lu i TTreeView.

htBelow Punctul se găseşte sub controlul TTreeView.

htToRight Punctu l se găseşte la d reap ta controlului TTreeView.

htToLeft Punctul se găseşte la s tânga contro lu lu i TTreeView.

htN ow here Punctul se găseşte în interiorul controlul TTreeView, d ar sub ultim ul nod.

htO nhem Punctul se găseşte pe b itm ap-ul sau pe e ticheta asoc ia tă unui nod

htOnButton Punctul se găseşte pe butonul asociat nodului.

htO nlcon Punctul se găseşte pe bitm ap-ul asociat unui nod.

htO nlndent Punctul se găseşte pe indentarea unui nod.

htO nLabel Punctu l se găseşte pe e ticheta (textul) ataşat unui nod.

htOnRight Punctul se găseşte la d reap ta unui nod.

Evenimente__________________________________________________

E l. OnColapsing

property OnCollapsing: TTVCollapsingEvent;

Apare când un nod este pe cale să fie colapsat.Tipul TTVCollapsingEvent este definit astfel:

TTVCollapsingEvent = procedure(Sender: TObject;Node: TTreeNode; var AllowCollapse: Boolean) of object;

Node este nodul pe cale de a fi colapsat.Setaţi AllowCollpase la false pentru a nu permite colapsarea nodului Node.

261

E2. OnCollapsed

property OnCollapsed: TTVExpandedEvent;

Apare după ce un nod al arborelui a fost colapsat.Tipul TTVExpandedEvent este definit astfel:

TTVExpandedEvent = procedn re(Sender: TObject;Node: TTreeNode) of object;

Node este nodul colapsat.

E3. OnExpanding

property OnExpanding: TTVExpandingEvent;

Apare când un nod este pe cale de a fi expandat.Tipul TTVExpandingEvent este definit astfel:

TTVExpandingEvent = procedure(5enrfer: TObject;Node: TTreeNode; var AllowExpansion: Boolean) of object;

Node este nodul care urmează să fie expandat.Setaţi AllowExpansion la false pentru a nu permite expandarea nodului Node.

E 4. OnExpanded

property OnExpanded: TTVExpandedEvent;

Apare când un nod al arborelui este expandat (dacă are fii).Tipul TTVExpanded este definit astfel:

TTVExpandedEvent = procedureCSenc/er TObject;Node: TTreeNode) of object;

Node este nodul expandat.

Exem plu:

Următoarea aplicaţie va afişa un mesaj sugestiv în momentul în care apar evenimentele OnCollapsed, OnCollapsing, OnExpanded şi OnExpanding:

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

procedure TForml.TreeViewlCollapsed(Sender: TObject;Node: TTreeNode);

beginShowMessage('Nodul cu eticheta '+Node.Text +

' a fost colapsat');end;

262

procedure TForml.TreeViewlCollapsing(Sender: TObject;Node: TTreeNode; var AllowCollapse: Boolean);

beginShowMessage('Nodul cu eticheta '+Node.Text + ' va fi colapsat');

end;

procedure TForml.TreeViewlExpandedlSender: TObject;Node: TTreeNode);

beginShowMessage('Nodul cu eticheta '+Node.Text +

' a fost expandat1);end ;procedure TForml.TreeViewlExpanding(Sender: TObject;

Node: TTreeNode; var AllowExpansion: Boolean);begin

ShowMessage('Nodul cu eticheta '+Node.Text + ' va fi expandat1); end;

Exemplu:

Următoarea aplicaţie afişează ordinea în care vor fi expandate şi colapsate nodurile arborelui reprezentat în componenta TreeV iew l. Vom folosi două butoane (Buttonl şi Button2) care vor realiza colapsare respectiv expandare întregului arbore (evenimentele OnCollapsed, OnCollapsing , OnExpanded şi OnExpanding sunt implementate ca în aplicaţia precedentă).

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Buttonl: TButton Caption = 'Colapseaza'

endobject Button2: TButton

Caption = 'Expandeaza' end

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

procedure TForml.ButtonlClick(Sender: TObject); begin

TreeViewl.FullCollapse; end;procedure TForml.Button2Click(Sender: TObject); begin

TreeViewl.FullExpand; end;

263

' HfMtfc I

E5. OnDeletion

property OnDeletion: TTVExpandedEvent;

Apare când un nod este şters.

E6. OnEditing

property OnEditing: TTVEditingEvent;

Apare când textul ataşat unui nod (proprietatea TTreeNode.Text) este pe cale să fie editat. Tipul TTVEditingEvent este definit astfel:

TTVEditingEvent = procedur {Sender. TObject;N ode: TTreeNode; var AllowEdit: Boolean) of object;

Node este nodul care este editat.Setaţi AllowEdit la false pentru a nu permite editarea textului ataşat nodului Node.

E7. OnEdited

property OnEdited: TTVEditedEvent;

Apare după ce textul ataşat unui nod a fost editat. Tipul TTVEditedEvent este definit astfel:

TTVEditedEvent = procedure(Se/iâfer: TObject;N ode: TTreeNode; var S: string) of object;

Node este nodul al cărui text a fost editat, iar S este noua valoare a textului ataşat nodului.

E8. OnChanging

property OnChanging: TTVChangingEvent;

Apare când selecţia (focusul) este pe cale să se schimbe de la un nod la altul. Tipul TTVChangingEvent este definit astfel:

TTVChangingEvent = procedure(5'e«<ier: TObject;Node: TTreeNode; var AllowChange: Boolean) of object;

Setaţi valoarea lui AllowChange la false pentru a nu permite ca nodul actual să fie deselectat.

E9. OnChanged

property OnChange: TTVChangedEvent;

264

Apare după ce un alt nod a fost selectat. Acest eveniment nu apare dacă selectarea noului nod se face cu ajutorul butonului din dreapta al mouse- ului. Pentru a intercepta acest fel de schimbare implementaţi eveni­mentul OnMouseUp.Tipul TTVChangedEvent este definit astfel:

TTVChangedEvent = procedure(Sender: TObject;Node: TTreeNode) of object;

Node este noul nod selectat.

Exemplu:

Următoarea aplicaţie interceptează selectarea unui nou nod reprezentat într-o componentă TTreeView.

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

procedure TForml.TreeViewlChange(Sender: TObject;Node: TTreeNode);

beginShowMessage('A fost selectat nodul cu eticheta ’ + Node.Text);

end;procedure TForml.TreeViewlMouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState;X, Y: Integer);

varnod : TTreeNode;

beginnod := TreeViewl.GetNodeAt(X, Y) ; if (Button = mbRight) and (nod <> nil)then ShowMessage('A fost selectat nodul cu eticheta ' +

nod.Text);end;

20. 8. TTreeNodes

Este o clasă care implementează funcţionalitatea unei liste cu nodurile unei structuri arborescente.

Ierarhie_________________________ ____________________________

TObject -> TPersistent -> TTreeNodes

Definit în_____________________________________________________

com ctrls.pas

265

Proprietăţi

PI. Count

property Count: Integer;

Numără nodurile unei structuri arborescente.

P2. Item

property Item [Index: Integer]: TTreeNode;

Returnează nodul cu numărul de ordine Index.

P3. Owner

property Owner: TCustomTreeView;

Indică componenta de tip TTreeView, proprietară a listei curente de noduri.

Metode_____________________________________________________ _

M l. Add

function Add(Node: TTreeNode; const S: string): TTreeNode;

Adaugă un nod arbore la sfârşitul listei de noduri din care face parte Node (pe acelaşi nivel în arbore). Dacă Node este fiu al root-ului, atunci nodul adăugat va fi ultimul element al listei nodurilor fiu a root-ului, deci pe acelaşi nivel cu Node. S este valoarea proprietăţii Text al nodului nou adăugat.

M2. AddFirst

function AddFirst(AWe: TTreeNode; const S: string): TTreeNode;

Adaugă Node ca prim element al listei nodurilor din care face parte, (deci pe acelaşi nivel în arbore ca şi Node).

M3. AddChild

function AddChild(Node: TTreeNode; const S: string): TTreeNode;

Nodul Node este adăugat ca şi ultim fiu al lui Node.

266

function AddChildFirst(AWe: TTreeNode; const S: string):TTreeNode;

Nodul Node este adăugat ca şi prim fiu al lui Node.

M5. Insert

function Insert(AWe: TTreeNode; const S: string): TTreeNode;

Inserează nodul care apelează această metodă după nodul Node, pe acelaşi nivel.

M6. Delete

procedure Delete(Node: TTreeNode);

Şterge nodul specificat, împreună cu fii săi.

M7. Clear

procedure Clear;

Şterge toate nodurile dintr-un arbore.

M8. BeginUpdate

procedure BeginUpdate;

Blochează redesenarea cutiei care afişează un arbore în cazul unei modificări (inserare, ştergere) apărute în structura acestuia. Acest lucru ajută la mărirea vitezei de lucru în cazul prelucrării arborilor. Repermi- terea redesenării arborelui se face cu EndUpdate.

M9. EndUpdate

procedure EndUpdate;

Repermite desenarea arborelui după o execuţie a unor operaţii de modificare a acestuia. Se apelează neapărat după BeginUpdate.

Exem plu:

Următoarea aplicaţie construieşte (într-o componentă TTreeView) un arbore binar complet cu un număr fixat de nivele (care este citit dintr-o cutie de editare).

M4. AddFirstChild

267

Valorile proprietăţilor obiectelor aflate pe forma Form l sunt:

object Buttonl: TButtonCaption = 'ConstruiesteArbore'

endobject Editl: TEdit

Text = '2' end

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

varnivele : integer;

{$R *.DFM}procedure TForml.ConstruiesteArbore(nod : TTreeNode;

niv : integer);//aceasta procedura trebuie declarata in secţiunea public

varNodNou : TTreeNode;

beginif niv < nivele then begin

NodNou := TreeViewl. Items .AddChild (nod, IntToStr (niv) ) ,- ConstruiesteArbore(NodNou, niv + 1);NodNou := TreeViewl.Items.AddChild(nod,IntToStr(niv)); ConstruiesteArbore(NodNou, niv + 1);

end;end;procedure TForml-ButtonlClick(Sender: TObject);

varrădăcină : TTreeNode;

beginnivele := StrToInt(Editl-Text);TreeViewl.Items.BeginUpdate;TreeViewl. Items-Clear; // şterg arborele existentrădăcină := TreeViewl. Items .Add (nil,' 0 ') ; //rădăcină arboreluiConstruiesteArbore(rădăcină, 1);TreeViewl.Items.EndUpdate;TreeViewl .FullExpand; //afişe

end;

20.9. TTreeNode

Reprezintă un nod din cadrul listei cu noduri a unei componente TTreeNodes.

Ierarhie

TObject -> TPersistent -> TtreeNode

268

Definit în

com ctrls.pas

Proprietăţi___________________________________________________

PI. Absolutelndex

property Absolutelndex : integer;

Indică indicele absolut al unui nod în lista de noduri. Primul nod din listă are indexul 0.

P2. Count

property C ount: integer;

Indică numărul de copii ai unui (sub)nod arbore.

P3. Expanded

property Expanded: boolean;

Specifică dacă nodul este expandat.

P4. Focused

property Focused : boolean;

Indică dacă nodul curent este selectat, adică dacă este înconjurat de un dreptunghi având laturile din linie punctată. La un moment dat numai un nod poate avea acestă proprietate, dar mai multe noduri pot fi selectate.

P5. HasChildren

property HasChildren: boolean;

Indică dacă nodul curent (cel care a apelat această proprietate) are copii.

P6. Index

property Index : integer;

Această proprietate identifică în mod unic un nod în cadrul listei nodurilor copii ai nodului părinte.

P7. IsVisible

property IsV isible: boolean;

269

*** * HtWM wwMtf+t HHUmmnn w t t m mN#»«

Indică dacă un nod este vizibil într-o cutie de afişare. Un nod se consi­deră a fi vizibil dacă are indicele 0 sau dacă toţi părinţii lui sunt expandaţi.

P8. Item

property Item [Index integer] : TTreeNode;

Furnizează acces la nodul cu indicele Index din cadrul listei de noduri fiu al nodului curent.

P9. Level

property L ev e l: integer;

Indică nivelul în arbore al nodului care a apelat această proprietate. Nodul cel mai de sus (root) are nivelul 0, toţi fii lui au nivelul 1, ş.a.m.d.

P10. Parent

property P a ren t: TTreeNode;

Identifică nodul părinte al nodului care a apelat această proprietate.

P il . Selected

property S e lec ted : boolean;

Determină dacă nodul curent este selectat.

P12. Text

property T e x t: string;

Text este textul asociat unui nod.

P13. Data

property D a ta : pointer;

Pointează spre o structură de date asociată nodului curent.

P14. TreeView

property TreeView : TCustomTreeView;

Indică componenta TTreeView care afişează acest nod.

270

Metode

M l. Collapse

procedure Collapse(Recurse: Boolean);

Colapsează un nod. Dacă Recurse este true, toţi fiii acestui nod sunt colapsaţi, iar la următoarea expandare a nodului respectiv fiii vor fi colapsaţi. Dacă Recurse este false, fiii nu sunt colapsaţi, iar la următoarea expandare a nodului respectiv, fiii acestuia vor avea aceasşi stare ca şi înainte de apelul Collapse.

M2. Expand

procedure Expand (Recurse: Boolean);

Expandează un nod. Dacă Recurse este true, atunci toţi fiii acestui nod sunt expandaţi.

M3. Delete

procedure Delete;

Şterge nodul care o apelează, împreună cu fiii acestuia. De asemenea este eliberată întreaga memorie asociată nodurilor şterse.

M4. DeleteChildren

procedure DeleteChildren;

Şterge toţi fiii nodului care o apelează şi eliberează memoria asociată.

M5. GetFirstChild

function GetFirstChild: TTreeNode;

Returnează primul fiu al nodului care o apelează. Dacă acesta nu are fii, se retumeză nil.

M6. GetLastChild

function GetLastChild: TTreeNode;

Returnează ultimul fiu al nodului care o apelează.

M7. GetNext

function GetNext: TTreeNode;

Returnează următorul nod al listei de noduri, indiferent dacă acesta este sau nu vizibil.

M8. GetPrev

function GetPrev: TTreeNode;

Returnează precedentul nod al listei de noduri, indiferent dacă acesta este sau nu vizibil.

M9. GetNextSibling

function GetNextSibling: TTreeNode;

Returnează următorul nod (vizibil sau nu) aflat pe acelaşi nivel cu cel care apelează această metodă.

M10. GetPrevSibling

function GetPrevSibling: TTreeNode;

Returnează precedentul nod (vizibil sau nu) aflat pe acelaşi nivel cu cel care apelează această metodă.

M II . GetNextVisible

function GetNextVisible: TTreeNode;

Returnează următorul nod vizibil.

M12. GetPrevVisible

function GetPrevVisible: TTreeNode;

Returnează precedentul nod vizibil.

M14. IndexOf

function IndexOf(Va/«e: TTreeNode): Integer;

Dacă Value este fiu al nodului care a apelat această metodă, atunci IndexOf returnează indicele acestuia. Primul copil are indicele 0. Dacă nu, se returnează -1 .

272

M15. MakeVisible

procedure MakeVisible;

Face un nod vizibil. Dacă acesta nu este vizibil, atunci toţi părinţii săi vor fi expandaţi pentru ca acest nod să fie vizibil.

M16. MoveTo

procedure MoveTo (Destination: TTreeNode;Mode: TNodeAttachMode);

Mută un nod. Modul în care se face această mutare depinde de valoarea lui Mode. Valori posibile pentru Mode sunt:

V a lo a re S em n ifica ţie

N aA dd A daugă nodul care o apelează la sfârşitul listei de noduri, conform m etodei Add.

naAddFirst A daugă nodul care o apelează la începutul listei, conform m etodei AddFir.st.

naA ddC hild A daugă nodul care o apelează la sfârşitul listei nodurilor fii ai nodulu i Destination, conform m etodei AddChild.

naA ddC hildF irst A dauga nodu l conform m etodei AddFirstC hild.

naln sert Inserează nodul conform m etodei Insert.

M17. AlphaSort

function AlphaSort: Boolean;

Sortează crescător nodurile copii ale nodului curent. Sortarea se face pe baza proprietăţii Text.

M18. DisplayRect

function DisplayRect(7ex«9/i/y: Boolean): TRect;

Returnează dreptunghiul care mărgineşte un nod din arbore. Dacă TextOnly este true, atunci este returnat doar dreptunghiul care încon­joară textul unui nod, în caz contrar este returnată întreaga linie (din cadrul lui TTreeView) pe care se află nodul curent.

M19. EditText

function EditText: Boolean;

Permite utilizatorului să editeze textul ataşat unui nod. După apelarea acestei metode în locul textului apare o căsuţă de editare care conţine

textul ataşat nodului respectiv.

M20. EndEdit

procedure EndEdit(Cance/: Boolean);

încheie editarea textului ataşat unui nod.

274

21. GRAFICĂ

21.1. TColor

TColor = -(COLORJ3NDCOLORS + 1)..$02FFFFFF

Definit în_____________________________________________________

graphics.pas

Specifică culoarea unui obiect. Sunt definite constante de culoare care se potrivesc fie cu paleta sistem de culori (clAqua, clBlack, clBlue, clDkGray, clFuchsia, clGray, clGreen, clLime, clLtGray, clMaroon, clNavy, clOlive, clPurple, clRed, clSilver, clTeal, clWhite, şi clYellow), fie cu sistemul de culori definit de C ontrol Panel (clActiveBorder, clActiveCaption, clAppWorkSpace, clBackground, clBtnFace, clBtnHighlight, clBtnShadow, clBtnText, clCaptionText, clGrayText, clHighlight, clHighlightText, clInactiveBorder, clInactiveCaption, cllnactiveCaptionText, clMenu, clMenuText, clScrollBar, clWindow, clWindowFrame, şi clWindowText).

Totodată, o culoare se poate specifica sub forma unui număr pe 4 octeţi. Ultimii trei octeţi specifică intensităţile pentru sistemul RGB (Red, Green, Blue), astfel, valoarea 00FF0000 reprezintă albastru cu intensitate maximă, 0000FF00 reprezintă verde cu intensitate maximă, 000000FF reprezintă roşu cu intensitate maximă, OOFFFFFF reprezintă culoarea albă, iar 00000000 reprezintă culoarea neagră.

21.2. Funcţii pentru prelucrarea culorilor

F I. ColorToIdent

function ColorToIdent(Color: Longint; var Ident: string): Boolean;

După apel, Ident va conţine numele culorii Color (spre exemplu, clBlack, clWindow). Dacă culorii respective nu-i este ataşată o cons­tantă, atunci funcţia returnează false.

275

F2. IdentToColor

function IdentToColor(const I dent: string; var Color: Longint):Boolean;

După apel, Color va conţine culoarea reţinută în Ident sub forma unui şir de caractere reprezentând numele constantei de culoare (exemplu: clW hite, clWindowText).

F3. ColorToRGB

function ColorToRGB (Color: TColor): Longint;

Returnează culoarea Color în format RGB. Asta înseamnă neglijarea informaţiei stocată în cel mai important octet al tipului TColor.

F4. ColorToString

function ColorToString(Color: TColor): string;

Returnează numele culorii Color sub forma unui şir de caractere. Dacă există o constantă (exemplu: clWhite, clWindowText) care să identifice culoarea Color, atunci este returnată aceasta. în caz contrar, este retur- nată, sub formă de şir, valoarea hexazecimală a lui Color.

F5. StringToColor

function StringToColor(const S: string): TColor;

Returnează culoarea stocată sub formă de şir de caractere. S poate con­ţine fie numele constantei de culoare, fie o valoare hexazecimală 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 ________________________________________________

TObject -> TPersistent -> TGraphic

Definit în_____________________________________________________

graphics.pas

276

Proprietăţi_________________________ __________________________

P I . Height

property Height: Integer;

Specifică înălţimea, în pixeli, a imaginii.Fiecare obiect grafic trebuie să îşi definească propriile lui funcţii de tip G et şi Set pentru accesarea şi setarea valorii acestei proprietăţi.

P2. Width

property Width: Integer;

Specifică lăţimea, în pixeli, a imaginii.Fiecare obiect grafic trebuie să îşi definească propriile lui funcţii de tip G et şi Set pentru accesarea şi setarea valorii acestei proprietăţi.

P3. Empty

property Empty: Boolean;

Indică dacă obiectul are o imagine încărcată în el. Proprietatea este Read Only.Fiecare obiect grafic, descendent din TGraphic trebuie să îşi definească propria lui metodă de tip Get pentru a accesa valoarea acestei proprie­tăţi.

Metode______________________________________________________

M l. LoadFromFile

procedure LoadFromFile(const FileName: string);

Citeşte fişierul cu numele FileName şi îi încarcă conţinutul într-un obiect grafic.

M2. SaveToFile

procedure SaveToFile(const FileName: string);

Salvează imaginea grafică într-un fişier.

277

Evenimente

E l. OnChange

property OnChange: TNotifyEvent;

Apare de fiecare dată când imaginea grafică se schimbă.

E2. OnProgress

property OnProgress: TProgressEvent;

Apare când imaginea grafică se schimbă încet (încărcare, transformare etc.).Tipul TProgressEvent este definit astfel:

TProgressEvent = procedure (Sender: TObject;Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string) of object;

unde:• Stage este de tip:

TProgressStage = (psStarting, psRunning, psEnding);

şi indică unde ne aflăm: la începutul schimbării, în timpul schim­bării, sau la sfârşitul schimbării;

• PercentDone indică aproximativ cam cât la sută din transformare s- a realizat;

• RedrawNow indică dacă imaginea poate fi desenată pe ecran;

• R specifică porţiunea din imagine care s-a schimbat şi trebuie redesenată;

• M sg conţine un mesaj specificând tipul de transformare care este executată.

Descendenţii acestei clase pot genera evenimentul OnProgress prin apelarea metodei Progress (care este de tip protected).Deoarece TGraphic nu are reprezentare în Component Palette , progra­matorul trebuie să atribuie el însuşi un handler de evenimente la momentul execuţiei aplicaţiei.

278

21.4. TBitmap

Un bitmap este un obiect grafic folosit pentru a crea, manipula şi stoca imagini pe disc. Din punctul de vedere al utilizatorului un bitmap (în traducere harta pixelilor) este o matrice de pixeli care formează o imagine vizuală.

TBitmap este o clasă care stochează o imagine în format bitmap.

Ierarhie______________________________________________________

TObject -> TPersistent -> TGraphic -> TBitmap

Definit în_____________________________________________________

graphics.pas

Proprietăţi___________________________________________________

P I. Canvas

property Canvas: TCanvas;

Canvas furnizează acces la suprafaţa de desenare a bitmap-ului.

P2. Monochrome

property Monochrome: Boolean

Indică dacă bitmap-ul va afişa monocrom imaginea pe care o conţine.

P3. Handle

property Handle: HBitmap;

Este un handle - la obiectul de tip bitmap - folosit în apeluri ale func­ţiilor API.

P4. HandleType

property HandleType: TBitmapHandleType;

Indică dacă bitmap-ul este de tip DDB (D evice Dependent Bitmap) sau DIB (D evice Independent Bitmap). Bitmap-urile de tip DDB se dese­nează mai rapid pe ecran, iar cele de tip DIB sunt stocate în memorie într-un format standard recunoscut de către toate dispozitivele, inclusiv imprimante.

279

P5. ScanLine

property ScanLine]/?ovv: Integer]: Pointer;

O imagine în formatul bitmap este stocată ca o matrice de pixeli. Este astfel posibilă accesarea rapidă - prin intermediul proprietăţii ScanLine- a fiecărei linii a acestei matrici. Proprietatea este folosită doar pentru bitmap-uri de tip DIB.

Exemplu:

Următoarea aplicaţie adaugă 20 de unităţi la culoarea fiecărui pixel al unui bitmap.

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

i, j : Integer; b : TBitMap;P : PByteArray;

b e g i ni f OpenPictureDialogl.Execute t h e n b e g i n

b := TBitMap.Create;/ / inc.arc o im agine dintr-un f iş ie rb.LoadFromFile(OpenPictureDialogl.FileName); f o r i : = 0 t o b.height -1 d o //pentru fieca re linie b e g i n

P := b.ScanLine[i];f o r j := 0 t o b.width -1 d o

P [ j ] : = p [ j ] + 2 0 ; / / adaug 20 la valoarea fiecăru i pixele n d ;Canvas . Draw (0 , 0, b) ; / / desenez im aginea in coltul din stanga sus a form ei b . Free; // e liberez m em oria

e n d ;e n d ;

Metode

M l. LoadFromResource

procedure LoadFromResourceID(/n.s*mce: THandle; ResID: Integer);

încarcă un bitmap dintr-o resursă într-un obiect de tip TBitmap. Identifi­catorul de resursă, pentru bitmap, în cadrul modulului executabil Instance este ResID.

280

M2. LoadFromResourceName

procedure LoadFromResourceName(/n.s'taHce: THandle;const ResName: string);

încarcă un bitmap dintr-o resursă într-un obiect de tip TBitmap. Resursa, de tip bitmap, în cadrul modulului executabil Instance, este ResName.

21.5. Tlcon

Un icon este o imagine bitmap combinată cu o mască pentru a crea zone transparente.

Tlcon încapsulează o icoană (HICON) Windows.

Ierarhie______________________________________________________

TObject -> TPersistent -> TGraphic -> Tlcon

Definit în_____________________________________________________

graphics

Proprietăţi___________________________________________________

PI. Handle

property Handle: HIcon;

Este un handle - la obiectul de tip icon - folosit în apeluri ale funcţiilor- API.

21.6. TMetaFile

O imagine poate fi stocată în două modalităţi: bitmap şi metafile. Bitmap-ul este, în majoritatea cazurilor, o reprezentare ineficientă a unei imagini. Pur şi simplu stochează culoarea fiecărui pixel în parte. Metafde, din contră, este o metodă vectorială de stocare a unei imagini. Asta înseamnă că imaginile nu mai sunt stocate punct cu punct, ci cu ajutorul unor primitive (cerc, elipsă, dreptunghi etc.) care, combinate, dau imaginea dorită. Din această cauză, o imagine metafile este independentă de dispozitivul folosit pentru creare şi afişare.

Intern, un metafile este un vector de structuri care conţin primitivele folosite pentru desenarea imaginii.

TMetaFile încapsulează un metafile îmbunătăţit.

281

Ierarhie

TObject -> TPersistent -> TGraphic -> TmetaFile

Definit în_____________________________________________________

graphics.pas

Proprietăţi___________________________________________________

PI. MMHeight

property MMHeight: Integer;

Indică înălţimea obiectului metafile în unităţi de 0,01 milimetrii. Această proprietate oferă o mai mare acurateţe şi o independenţă faţă de dispo­zitivul cu care a fost creată imaginea metafile.

P2. MM Width

property MMWidth: Integer;

Indică lăţimea obiectului metafile în unităţi de 0,01 milimetrii. Acestă proprietate oferă o mai mare acurateţe şi o independenţă faţă de 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 aplicaţiei sau al programatorului care a creat acest metafile. Proprietatea este Read-Only.

21.7. TJpeglmage

Delphi pune la dispoziţia programatorilor clasa TJpeglmage pentru stocarea şi manipularea imaginilor JPG şi JPEG. Această clasă nu are repre­zentare în ComponentPallete.

282

Folosind proprietăţile şi metodele ei şi componenta Thnage puteţi construi o componentă de afişat imagini JPG.

I e r a r h i e ______________________________________________

TObject -> TPersistent -> TGraphic -> TJpeglmage.

Definit în_____________________________________________________

jpeg.pas

Proprietăţi___________________________________________________

PI. CompressionQuality

property CompressionQuality: TJPEGQualityRange;

Indică raportul dintre calitatea imaginii şi mărimea fişierului în care este stocată imaginea. Tipul TJPEGQualityRange este un domeniu cuprins între 1 şi 100. O calitate mare indică un fişier mare, iar o calitate mică un fişier mic.

P2. GrayScale

property Grayscale: Boolean;

Indică dacă imaginea jpeg va fi afişată alb negru sa color. O afişare alb negru este folosită în cazul în care se doreşte viteză mare de afişare.

P3. Height

property Height: Integer;

Indică lăţimea, în pixeli, a imaginii jpeg.

P4. Width

property Width: Integer;

Indică înălţimea, în pixeli, a imaginii jpeg.

P5. Performance

property Performance: TJPEGPerformance;

Indică raportul dintre calitatea culorii şi viteza de decompresie.Valorile posibile pentru această proprietate sunt date de tipul TJPEGPerformance definit astfel:

type TJPEGPerformance = (jpBestQuality, jpBestSpeed);

P6. PixelFormat

property PixelFormat: TJPEGPixelForm;

Specifică numărul de biţi folosiţi pentru a reprezenta un pixel. Valori posibile pentru PixelFormat sunt date de TJPEGPixelFormat = (jf24Bit, jffiBit).

P7. Scale

property Scale: TJPEGScale;

Indică dimensiunile imaginii când aceasta este afişată. Valori posibile pentru Scale sunt:

V a lo a re S em n ifica ţie

jsF u llS ize Im aginea este afişată ia d im eniunile originale.

js H a lfIm aginea este afişată la jum ăta te din dim ensiunile iniţiale. T im pul de afişare este de asem enea ju m ăta te din cel necesar afişării la d im en­s iun ile originale.

jsQ u a rterIm aginea este afişată la un sfert din d im ensiunile iniţiale. T im pul de afişare este de asem enea un sfert din cel necesar afişării la d im en­siunile originale.

jsE ighthIm aginea este afişată la 1/8 din dim ensiunile iniţiale. T im pul de afişare este de asem enea 1/8 din cel necesar afişării la dim ensiunile originale.

Exemplu:

Următoarea aplicaţie încarcă o imagine jpg şi o afişează într-o compo­nentă TImage.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Imagel: TImage Stretch = True

endobject Buttonl: TButton

Caption = 'Buttonl' endobject OpenPictureDialogl: TOpenPictureDialog

Filterlndex = 2 end

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

284

uses jpeg;

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

x : TJpeglmage; b e g i n

i f OpenPictureDialogl.Execute t h e n b e g i n

x ;= TJpeglmage.Create;x.LoadFromFile(OpenPictureDialogl.FileName);Imagel.Picture.Assign(x)

e n d ;e n d ;

21.8. TGraphicsObject

Este o clasă abstractă, de bază pentru obiectele care încapsulează o unealtă grafică W indows precum TPen, TBrush, TFont.

Evenimente

E l. OnChange

property OnChange: TNotifyEvent;

Apare când un obiect grafic se schimbă.Deoarece obiectul TGraphicsObject nu are reprezentare în Component Palette, programatorul trebuie să-i atribuie singur un handler de eveni­mente la momentul execuţiei programului. Vom exemplifica acest lucru pentru obiectul TPen.

21.9. TBrush

Reprezintă culoarea şi modelul folosite pentru a umple suprafeţe închise. TBrush încapsulează obiectul pensulă (HBRUSH) din Windows.

Ierarhie______________________________________________________

TObject -> TPersistent -> TGraphicsObject -> TBrush

Definit în_____________________________________________________

graphics.pas

28.S

Proprietăţi

P I. Bitmap

property Bitmap: TBitmap;

Specifică o imagine care este folosită drept model. Această imagine trebuie să fie un pătrat cu latura de 8 (opt) pixeli. Dacă este mai mare se va folosi un pătrat de 8x8 din colţul din stânga sus al imaginii atribuite acestei proprietăţi.

P2. Color

property Color: TColor;

Specifică culoarea pensulei.

P3. Style

property Style:TBrushStyle;

Specifică stilul de haşurare. Valori posibile pentru Style sunt: bsSolid, bsClear, bsH orizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross.Dacă proprietatea Bitmap are atribuită o valoare, atunci valoarea pro­prietăţii Style nu are nici un efect.

P4. Handle

property Handle: HBrush;

Identificatorul W indows pentru acest obiect.

21.10. TPen

Reprezintă culoarea şi stilul folosit pentru a trasa curbe. TPen încap­sulează obiectul stilou (HPEN) din Windows.

Ierarhie______________________________________________________

TObject -> TPersistent -> TGraphicsObject -> TPen

Definit în_____________________________________________________

graphics.pas

286

Proprietăţi

PI. Color

property Color: TColor;

Specifică culoarea liniei.

P2. Style

property Style: TPenStyle;

Specifică stilul liniei. Valori posibile pentru Style sunt:

V a lo a re S em n ifica ţie

P sSotid Linie continuă.

PsD ash Linie alcătu ită d intr-o serie de liniuţe mai mici.

P sD ot Linie punctată.

psD ash D ot Linie în care alternează liniuţele şi punctele

psD ash D otD o t Linie a lcătu ită d intr-o serie de com binaţii lin iuţă, punct, punct.

P sC lear N ici o linie nu este desenată.

P3. Mode

property Mode: TPenMode;

Specifică modul în care culorile pensulei şi culorile canvasului interac- ţionează. Valori pentru Mode sunt:

V a lo a re S em n ifica ţie

Pm Black în to tdeauna negru.

PmW hite în to tdeauna alb.

Pm N ot Inversul culorii fundalului.

Pm C opy C uloarea specificată în proprietatea Color.

Pm N olCopy Inversul culorii specificată în p roprietatea Color.

Pm XorSe aplică operatorul X O R între culoarea fundalului şi cca a creionului.

P4. Width

property Width: Integer;

Specifică lăţimea maximă a pensulei.

287

P5. Handle

property Handle: HPen;

Reprezintă handle-ul Windows la acest obiect.

21.11. TFont

Specifică fontul folosit pentru un text.

Ierarhie______________________________________________________

TObject -> TPersistent -> TGraphicsObject -> Tfont

Definit în_______________________________________________ __

graphics.pas

Proprietăţi_____________________________ ______________________

P I. Color

property Color: TColor;

Specifică culoarea textului.

P2. Size

property Size: Integer;

Specifică înălţimea fontului în număr de puncte.

P3. Height

property Height: Integer;

Specifică înălţimea fontului în număr de pixeli. Relaţia dintre Size şi Height este următoarea:

Height = Size * ScreenPixelsPerlnch / 72.

P4. Style

property Style: TFontStyles;

Specifică modul în care sunt desenate caracterele fontului. Style este o variabilă de tip mulţime deci are ca valoare o submulţime din următoa­rele elemente:

288

Valoare Semnificaţie

FsB old T ex t îngroşat.

F slta lic T ex t înclinat.

Fs Underline T ex t subliniat.

FsStrikeout T ex t tă ia t în două cu o linie orizontală.

P5. Pitch

property Pitch: TFontPitch;

Indică dacă toate caracterele fontului au aceeaşi lăţime. Valorile permise pentru Pitch sunt:

Valoare Semnificaţie

fp F ix ed T oa te caracterele au aceeaşi lăţim e. A cest lucru este folosit la coduri sursă.

fpV ariab le C aracterele au lăţim e variabilă. A cest lucru este util la editare de texte.

fp D efault Lăţim ea caracterelor depinde de font.

P6. Name

property Name: TFontName;

Este numele fontului.

P7. Handle

property Handle: HFont;

Este identificatorul obiectului de tip font.

Observaţie:

Setarea proprietăţilor unui obiect de tip TFont poate fi făcută într-o formă vizuală cu ajutorul componentei TFontDialog.

Exemplu:

Următoarea aplicaţie tipăreşte un text pe fereastra aplicaţiei. Valorile proprietăţilor fontului sunt selectate cu ajutorul componentei TFontDialog.

procedure T F o r m l . B i t B t n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

if F o n t D i a l o g l . E x e c u te then begin

I m a g e l . C a n v a s . F o n t := F o n t D i a l o g l . F o n t ;

289

I m a g e l . C a n v a s . T e x t O u t (10 , 10 , 'A c e s t a e s t e u n t e x t ' ) ; end;

21.12. TCanvas

Furnizează spaţiul de desenare pentru obiecte care îşi pot desena o imagine pe suprafaţă.

Ierarhie______________________________________________________

TObject -> TPersistent -> TCanvas

Definit în_____________________________________________________

graphics.pas

Proprietăţi___________________________________________________

PI. Brush

property Brush: TBrush;

Specifică culoarea şi modelul de haşurare pentru suprafeţe închise sau fundal uri.

P2. Font

property Font: TFont;

Specifică fontul folosit când se va scrie un text pe o imagine.

P3. Pen

property Pen: TPen;

Specifică tipul de pen folosit.

P4. PenPos

property PenPos: TPoint;

Specifică poziţia curentă a creionului de desenare.

end ;

290

P5. ClipRect

property ClipRect: TRect;

Specifică marginile suprafeţei de desenare. Operaţiile de desenare exe­cutate în afara acestui dreptunghi sunt invalide.

P6. CopyM ode

property CopyMode: TCopyMode;

Specifică modul în care imaginea se va comporta când va fi pusă pe suprafaţa de desenare. Valori posbile pentru CopyM ode sunt:

V a lo a re S em n ifica ţie

cmBlachiess U m ple dreptunghiul destinaţie cu negru.

cmDstlnvert Inversează im aginea de pe ecran şi ignoră im aginea sursă.

anM ergePaintC om bină im aginea de pe Canvas şi cea din b itm ap-ul sursă fo losind operatoru l OR.

cmSrcAndC om bină im aginea de pe Canvas şi cea din b itm ap-ul sursă fo losind operatoru l AND.

iinSrcCopy C op iază im aginea sursă pe Canvas.

cmSrcF.mseInversează im aginea de pe Canvas şi rezultatul îl com bină cu cea din bitm ap-ul sursă fo losind operatorul B oolean OR.

cinSnliivcrt C om bină im aginea de pe Canvas cu cea din b itm ap-ul sursă folosind operatoru l B oolean XOR.

n n S rc l’ainl C om bină im aginea de pe Canvas şi cu cea din b itm ap-ul sursă folosind operatorul B oolean OR.

cmWhitcnt'ss U m ple dreptunghiul destinaţie eu alb.

O bservaţie:

Valoarea implicită este cmSrcCopy.

P7. Pixels

property Pixels[X, Y: Integer]: TColor;

Specifică culoarea pixelului de coordonate (X,Y) din interiorul spaţiului de desenare.

P8. Handle

property Handle: HDC;

Reprezintă un handle la un device context.

291

P9. TextFlags

property TextFlags: Longint;

Indică felul în care textul este desenat pe Canvas. Valori posibile pentru TextFlags sunt (ele pot fi combinate cuajutorul operatorului or):

V a lo a re S em n ifica ţie

E T 0_C L IP P E DA re efect doar când textul este tipărit cu m etoda TextRect, şi va trunch ia textul la d im ensiunea dreptunghiu lu i în care se doreşte desenarea.

E T O jO P A Q U Eîn spate le tex tu lu i tip ă rit se va desena un fundal care va astupa p orţiunea din im agine peste care s-a suprapus dreptunghiul tex tului.

Metode

Ml. Arc

procedure Arc(X7, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);

Desenează un arc, de-a lungul unei elipse. Elipsa este mărginită de dreptunghiul care are coordonatele punctelor din colţurile stânga sus şi dreapta jos egale cu (XT, Y l) repspectiv (X2, Y2). Arcul este delimitat de intersecţiile dreptelor care trec prin centru elipsei şi prin punctele (X3, K3)-prima dreaptă, respectiv (X4, Y4)~ a doua dreaptă. Arcul este desenat de-a lungul perimetrului elipsei în sensul acelor de ceasornic, pornind de la primul punct (cel obţinut din intersecţia elipsei cu drepta care trece prin (X3, Y3) şi prin centrul elipsei) şi terminând cu cel de al doilea punct (cel obţinut din intersecţia elipsei cu drepta care trece prin (X4, Y4) şi prin centrul elipsei).

Exemplu:

Următoarea aplicaţie desenează un arc de cerc din care lipseşte cadranul I.

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

C a n v a s . A r c (0 , 0, 100 , 1 0 0 , 50, 0, 100 , 5 0 ) ; end;

M2. Chord

procedure Chord(A7, Yl, X2, Y2, X3, Y3, X4, Y4: Integer);

Desenează o figură închisă, delimitată de o elipsă (mărginită de

292

dreptunghiul (XI,Y1)-{X2,Y2)) şi de dreapta determinată de punctele (X 3, Y3), (X4, Y4). Arcul de elipsă care face parte din figură este luat de-a lungul perimetrului elipsei, în sensul acelor de ceasornic, plecând de la (X3, Y3) şi până la (X4, Y4). Dacă (X3, Y3), (X4, Y4) nu se află pe peri­metrul elipsei, atunci se vor considera cele mai apropiate puncte de pe elipsă şi care se află şi pe dreapta curentă.

Exemplu:

Următoarea aplicaţie desenează o suprafaţă închisă sub forma unei jumătăţi de cerc. Suprafaţa va fi haşurată cu linii verticale de culoare verde.

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

C a n v a s . B r u s h . S t y l e := b s V e r t i c a l ;C a n v a s . B r u s h . C o l o r : = c l G r e e n ;C a n v a s . C h o r d (0 , 0, 100 , 100 , 0, 50 , 100 , 5 0 ) ;

end;

M3. Ellipse

procedure Ellipse(X7, Yl, X2, Y2\ Integer);

procedure Ellipse(const Rect: TRect);

Desenează o elipsă care este încadrată de dreptunghiul de coordonate (XI, Y l) şi (X2, Y2).

Exemplul 1:

Următoarea aplicaţie desenează un cerc care are centrul în mijlocul 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

R a za : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ,-

beginR a z a := 1 0 0 ; / / raza cerculuiC e n t r u X := C l i e n t W i d t h div 2 ; / / coordonatele centrului C e n t ru Y := C l i e n t H e i g h t div 2;C a n v a s . E l l i p s e (C e n tru X - R a z a , C e n tru Y - R a z a ,

C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;end;

293

Exemplul 2:

Următoarea aplicaţie desenează două cercuri concentrice:procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

R a z a : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ;

beginR a za := 1 0 0 ; / / raza cercului exteriorC e n t ru X := C l i e n t W i d t h div 2 ; / / coordonatele centrului C e n t r u Y := C l i e n t H e i g h t div 2;C a n v a s . E l l i p s e (C e n tru X - R a z a , C e n tru Y - R a za ,

C e n t ru X + R a za , C e n t ru Y + R a z a ) ;R a za := 5 0 ; / / raza cercului interiorC a n v a s . E l l i p s e (C e n tru X - R a za , C e n t ru Y - R a za ,

C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;end;

Această aplicaţie are însă un neajuns. Dacă desenăm prima dată cercul interior şi apoi cercul exterior atunci acesta va fi astupat. Pentru a remedia acest lucru vom seta proprietatea Style a obiectului TBrush la valoarea bsClear. Noul cod sursă este:

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

R a z a : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ;

beginR a za := 5 0 ; / / raza cercului exteriorC e n t ru X := C l i e n t W i d t h div 2; / / coordonatele centrului C e n t r u Y := C l i e n t H e i g h t div 2;C a n v a s . E l l i p s e (C e n tru X - R a z a , C e n tru Y - R a z a ,

C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;R a z a := 1 0 0 ; / / raza cercului interior C a n v a s . B r u s h . S t y l e := b s C l e a r ;C a n v a s . E l l i p s e (C e n t ru X - R a za , C e n tru Y - R a za ,

C e n t ru X + R a z a , C e n t ru Y + R a z a ) ;end ;

Exemplul 3:

Următoarea aplicaţie desenează elipse pe formă. La apăsarea mouse-ului se reţine colţul din stânga sus al dreptunghiului care are laturile tangente la elipsă. Colţul din dreapta jos al acestui dreptunghi va fi punctul în care se eliberează mouse-ul.

varf i n a l : b o o l e a n = true;X S t a r t , Y S t a r t , Xtemp, Ytemp : i n t e g e r ;

294

procedure T F o r m l . F o r m C r e a t e (S e n d e r : T O b j e c t ) ; begin

C a n v a s . B r u s h . S t y l e := b s C l e a r ; end;

procedure T F o r m l . FormMouseDown(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s . Pen .M ode := pmNot;X S t a r t := X; // coordonatele coltului din stanga sus Y S t a r t := Y;Xtemp := X; // posibilele coordonate ale coltului din dreapta jos Ytemp -. = Y; f i n a l := false;

end;procedure T F o r m l . F o rm M o u seM o v e(S en d e r : T O b j e c t ;

S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;begin if not f i n a l then begin

C a n v a s . E l l i p s e ( X S t a r t , Y S t a r t , Xtemp, Y te m p ) ; / / şterg vechiul// segment

C a n v a s . E l l i p s e ( X S t a r t , Y S t a r t , X, Y) ; II desenez noul segment Xtemp := X;Ytemp := Y;

end;end;

procedure T F o r m l . FormMouseUp(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: i n t e g e r ) ;

beginC a n v a s . Pen .M ode := pm B lack ;C a n v a s . E l l i p s e ( X S t a r t , Y S t a r t , X, Y) ; // trasez segmentul definitiv f i n a l := true;

end;

M4. Pie

procedure Pie(X7, Yl, X2, Y2, X3, Y3, X4, Y4: Longint);

Desenează un sector de elipsă. Elipsa este încadrată în dreptunghiul de coordonate (X I,Y l), (X2,Y2). Secţiunea desenată este determinată de două drepte care trec prin centrul elipsei şi prin punctele de coordonatc (X3, Y3), (X4, Y4).

?'1S

Exemplu:

Următoarea aplicaţie desenează un sector de cerc reprezentând primul cadran.

procedure T F o r m l . B u t t o n 3 C l i c k ( S e n d e r : T O b j e c t ) ; begin

C a n v a s . P i e (0 , 0, 99 , 99 , 99 , 4 9 , 49 , 0 ) ; end;

M5. FillRect

procedure FillRect(const Rect: TRect);

Haşurează dreptunghiul Rect cu modelul şi culoarea curente (specificate de obiectul TBrush).

Exemplu:

Următoarea aplicaţie desenează dreptunghiuri de dimensiuni şi culori aleatoare. Generarea dreptunghiurilor se face până la apăsarea unei taste.

varf i n a l : b o o l e a n = false;

procedure T F o r m l . B u t t o n 3 C l i c k ( S e n d e r : T O b j e c t ) ; beginwhile not f i n a l do begin

C a n v a s . B r u s h . C o l o r : = r a n d o m ( $ 1 0 0 0 0 0 0 ) ;C a n v a s . F i l l R e c t ( R e c t ( r a n d o m ( 4 0 0 ) , r a n d o m ( 4 0 0 ) ,

r a n d o m ( 4 0 0 ) , r a n d o m ( 4 0 0 ) ) ) ;A p p l i c a t i o n . P r o c e s s M e s s a g e s ;

end; end;

procedure T F o r m l . F o r m l K e y P r e s s ( S e n d e r : T O b j e c t ; var Key; C h a r ) ; begin

f i n a l := true; end;

M6. FloodFill

procedure FloodFillfX, Y: Integer; Color: TColor; FillStyle: TFillStyle);

Haşurează o suprafaţă, care nu este neapărat dreptunghiulară. Suprafaţa haşurată conţine punctul (X,Y) şi este mărginită de alte suprafeţe care au toate culoarea Color sau toate nu au culoare Color. Valori posibile pentru FillStyle sunt:

296

V a lo a re S em n ifica ţie

fsSurfaceH aşurează suprafa ţa care are culoare C olor. Procesul este oprit când toate punctele care urm ează să fie colorate nu au cu loarea Color.

fsB o rd erH aşurează suprafaţa care nu are culoarea indicată de param etru l Color. Procesul este oprit în m om entul în care toate punctele care urm ează să fie co lorate au culoarea Color.

Exemplul 1:

Următoarea aplicaţie generează o grilă cu 100 de căsuţe şi colorează aleator 50 de căsuţe.

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

i : b y t e ;X, Y : i n t e g e r ;

beginC a n v a s . P e n . C o l o r := c l G r e e n ;/ / generam grilaC a n v a s . R e c t a n g l e (0 , 0, 200 , 2 0 0 ) ;for i := 1 to 9 dobegin

C a n v as . MoveTo (1 , i * 2 0 ) ; // trasam liniile orizontale C a n v a s . L i n e T o (200 , i * 2 0 ) ;C a n v as .MoveTo ( i * 20 , 1 ) ; // trasam liniile verticale C a n v a s . L i n e T o ( i * 20 , 2 0 0 ) ;

end;// sclcctam aleator 50 de puncte// si haşuram căsuţele care le conţine cu o culoare aleatoare for i := 1 to 50 do begin repeat

X := r a n d o m ( 2 0 0 ) ; until X mod 10 <> 0; //nu doresc puncte pe grilaj repeat

Y := r a n d o m ( 2 0 0 ) ; until Y mod 10 <> 0;C a n v a s . B r u s h . C o l o r := ra n d o m ($ 1 0 0 0 0 0 0 ) ; //culoarea dehasurare C a n v a s . F l o o d F i l l (X, Y, c l G r e e n , f s B o r d e r ) ;

end; end;

Exemplul 2:

Următoarea aplicaţie generează (la apăsarea unui buton) o grilă cu 100 căsuţe. La executarea unui click cu mouse-ul în interiorul unui careu, acesta se va colora cu una din cele 10 culori disponibile.

const a : array [1..10] oft c o l o r = ( c l r e d , c l l i m e , c l y e l l o w , c l b l u e , c l n a v y , c l o l i v o ,

c l g r e e n , c l p u r p l e , c l f u c h s i a , c i t e a i ) ;

2 ()7

p r o c e d u r e T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; v a r

x , y , i ; i n t e g e r ;b e g i n

x : = 0 ;y : = 0 ;f o r i := 1 t o 10 do

b e g i nI m a g e l . C a n v a s .M o v e T o ( x ,y ) ;I ih a g e l . C a n v a s . L in e T o (x , 450) ; x := x + 50 ;

e n d ; x := 0; y := 0;f o r i : = l t o 10 do

b e g i nI m a g e l . C a n v a s .M o v e T o ( x ,y ) ;I m a g e l . C a n v a s . L i n e T o ( 4 5 0 , y ) ; y := y + 50 ;

e n d ;

e n d ;

p r o c e d u r e T F o r m l . Im age lM ouseD ow n(S e n d e r : TObj e c t ;B u t t o n ; T M o u s e B u t t o n ; S h i f t : T S h i f t S t a t e ;X, Y: I n t e g e r ) ;

b e g i nI m a g e l . C a n v a s . B r u s h . C o l o r := a [ l + r a n d o m ( l O ) ] ;I m a g e l . C a n v a s . F l o o d F i l l ( x , y , c l b l a c k , f s b o r d e r ) ;

e n d ;

M7. FrameRect

procedure FrameRect(const Reef. TRect);

Desenează un dreptunghi. Marginea are lăţime 1 şi este desenată cu setările proprietăţii Brush. Interiorul dreptunghiului nu este afectat.

M8. MoveTo

procedure MoveTo(X, Y: Integer);

Mută cursorul grafic în poziţia (X,Y).

M9. LineTo

procedure LineTo(X, Y: Integer);

Desenează o linie din poziţia PenPos până în poziţia (X,y). PenPos devine (X,Y).

298

Exemplu 1:

Următoarea aplicaţie trasează, pe formă, un segment între punctele de coordonate (10,20) şi (100, 250).procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ,- begin

C a n v a s . M oveTo(10 , 2 0 ) ;C a n v a s . L i n e T o (100 , 2 5 0 ) ;

end;

Exemplul 2:

Următoarea aplicaţie trasează segmente cu ajutorul mouse-ului. Pentru aceasta trebuie să implementăm evenimentele OnMouseDown şi OnMouseUp.

procedure T F o r m l . FormMouseDown(S e n d e r ; T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s .MoveTo(X, Y) ;

end;procedure T F o r m l . F o rm M o u seU p (S e n d e r : T O b j e c t ;

B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s . L in e T o (X , Y) ;

end;

Exemplul 3:

Dorim ca segmentul trasat să aibă o anumită grosime. Pentru aceasta folosim o cutie de editare (E ditl) în care vom specifica grosimea liniei trasate.

Handlerele de evenimente pentru setarea grosimii liniei sunt:procedure T F o r m l . F o r m C r e a t e (S e n d e r : T O b j e c t ) ; begin

C a n v a s . P e n . W i d th := S t r T o I n t ( E d i t l . T e x t ) ; end;procedure T F o r m l . E d i t l C h a n g e ( S e n d e r .- T O b j e c t ) ; begin try

C a n v a s . P e n . W i d t h := S t r T o I n t ( E d i t l . T e x t ) ; excepton E C o n v e r t E r r o r do C a n v a s . P e n . W id th := 1;

299

end;end;

Exemplul 4:

Următoarea aplicaţie desenează segmente de dreaptă cu ajutorul mouse- ului. Segmentele trasate pot avea diferite culori. Selectarea culorii de desenare se face cu ajutorul unei componente de tip TColorDialog.

Handlerele pentru evenimentele OnMouseDown şi OnMouseUp sunt cele din aplicaţia anterioară.

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

if C o l o r D i a l o g l . E x e c u t ethen C a n v a s . P e n . C o l o r : = C o l o r D i a l o g l . C o l o r ;

end;

Exemplul 5:

Dorim să trasăm segmentele la fel ca în aplicaţia PaintBrush, şi anume dorim să fixăm unul din capetele segmentului iar celălalt capăt să îl plimbăm până în momentul în care ne vom decide asupra locului în care îl fixăm.

varf i n a l : b o o l e a n = true;X S t a r t , Y S t a r t , Xtemp, Ytemp : i n t e g e r ;

procedure T F o r m l . FormMouseDown(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s . M oveTo(X, Y) ;C a n v a s . Pen .M ode := pmNot;X S t a r t : = X; // coordonatele unuia dintre capetele segmentului Y S t a r t := Y; f i n a l := false;Xtemp : = X; // posibilele coordonate ale celuilalt capat al segementului Ytemp := Y;

end;

procedure T F o r m l . FormMouseUp( S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s .M o v e T o ( X S ta r t , Y S t a r t ) ;C a n v a s . P e n . Mode := p m B lack ;C a n v a s . L in e T o (X, Y) ,- // trasez segmentul definitiv f i n a l := true;

300

end ;

procedure T F o r m l . FornMouseMove (S e n d e r : T O b j e c t ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

begin if not f i n a l then begin

C a n v a s .M o v e T o ( X S t a r t , Y S t a r t ) ;C a n v a s . L in e T o (Xtemp, Ytemp) ; // şterg vechiul segment C a n v a s .M o v e T o ( X S t a r t , Y S t a r t ) ;C a n v a s . L in e T o (X, Y) ; // desenez noul segment Xtemp := X;Ytemp : = Y;

end;end;

Exem plul 6:

Următoarea aplicaţie trasează o linie curbă pe o formă. Linia va urma traiectoria cursorului de mouse.

varf i n a l : b o o l e a n = true;

procedure T F o r m l . FormMouseDown(S e n d e r : T O b j e c t ;B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginf i n a l := false;C a n v a s . MoveTo (X, Y)

end;procedure T F o r m l . F o rm M o u seM o v e(S en d e r : T O b j e c t ;

S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;beginif not f i n a lthen C a n v a s . L in e T o (X , Y ) ;

end;procedure T F o r m l . FormMouseUp(S e n d e r : T O b j e c t ;

B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginf i n a l := true;

end;

Exemplul 7:

Următoarea aplicaţie trasează linii de diferite lungimi şi le ordonează după lungime folosind metoda bublesort. Culoarea fiecărei linii va fi

301

generată aleator.Vom folosi un RadioGroup cu două butoane care ne vor permite să alegem modul de sortare al liniilor (crescător sau descrescător).

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object I m a g e l : TImage W id th = 321 H e i g h t = 313

endobject B i t B t n l : T B i t B t n

C a p t i o n = ' t r a s e a z a ' endobject R a d io G r o u p l : T R ad io G ro u p

C a p t i o n = ' o r d o n a r e 'I t e m l n d e x = 0

I t e m s . S t r i n g s = (' c r e s c ă t o r '' d e s c r e s c ă t o r ' )

endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:var a : array[ 1 . . 4 0 0 ] of i n t e g e r ;

procedure T F o r m l . d e s e n e a z ă ; var

x , y : i n t e g e r ; begin

I m a g e l . C a n v a s . B r u s h . C o l o r : = c l w h i t e ;I m a g e l . C a n v a s . R e c t a n g l e ( 0 , 0 , I m a g e l . W i d t h , I m a g e l . H e i g h t ) ; x : = l ;y : = l ;repeat

I m a g e l - C a n v a s . P e n . C o l o r : = ra n d o m (6 5 5 3 5 * 2 5 6 ) ;I m a g e l . C a n v a s .M o v e T o ( x ,y ) ;I m a g e l . C a n v a s . L i n e T o ( a [ (y + 1) div 2] , y ) ; y := y + 2;I m a g e l . C a n v a s .M o v e T o ( x ,y )

until y >= I m a g e l . H e i g h t ;I m a g e l . R e f r e s h ;

end;procedure T F o r m l . o r d o n a r e _ c r e s c a t o r ; var g a s i t : b o o l e a n ;

i , t : i n t e g e r ;beginfor i := 1 to ( I m a g e l . H e i g h t ) do

a [ i ] := r a n d o m ( I m a g e l .W id th ) d e s e n e a z ă ; repeat

g a s i t :=false;for i := 1 to I m a g e l . H e i g h t div 2 do if a [ i ] > a [ i + l ] then

302

beging ă s i t := true; t : = a [ i J ; a [ i ] := a [ i + 1 ) ;a t i + 1 ] : = t ;

end; d e s e n e a z a until not g a s i t ;

end;procedure T F o r m l . o r d o n a r e _ d e s c r e s c a t o r ; var g a s i t : b o o l e a n ;

i , t : i n t e g e r ;beginfor i := 1 to ( I m a g e l . H e i g h t ) do

a [ i ] : = r a n d o m d m a g e l .W id th ) ; d e s e n e a z a ; repeat

g a s i t := false;for i := 1 to I m a g e l . H e i g h t div 2 do if a[i] < a[i +1] then begin

g a s i t := true; t : = a [ i ] ; a [ i ] := a [ i + 1 ] ; a [ i +1 ] : = t ;

end; d e s e n e a z a until not g a s i t ;

end;procedure T F o r m l . B i t B t n l C l i c k ( S e n d e r : T O b j e c t ) ; begincase R a d i o G r o u p l . I t e m l n d e x of

0: o r d o n a r e _ c r e s c a t o r ;1 : o r d o n a r e _ d e s c r e s c a t o r ;

end; end;

M10. Polygon

procedure Polygon(Po/>i?s: array of TPoint);

Desenează o linie poligonală închisă care are vârfurile descrise în vec­torul Points. Ultimul punct este automat unit cu primul. Interiorul poligonului va fi haşurat cu modelul şi culoarea curente descrise în proprietatea Brush.

Exemplul \ :

Următoare aplicaţie desenează un poligon oarecare. Vârfurile poligo­nului sunt alese aleator.

303

procedure T Fo rm l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

a : array[0..10] of T P o i n t ; i : b y t e ;

beginfor i := 0 to 10 do

a [ i ] := P o i n t ( r a n d o m ( 4 0 0 ) , r a n d o m ( 4 0 0 ) ) ;C a n v a s . P o l y g o n ( a ) ;

end;

Exemplul 2:

Următoarea aplicaţie desenează un poligon regulat cu un număr specificat de vârfuri.

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

n r _ s i r : string;a : array of T P o i n t ;r a z a : i n t e g e r ; / / raza cercului circumscrisu n g h i , p a s : r e a l ;n : i n t e g e r ; / / numărul de laturii : i n t e g e r ;C e n t r u X , C e n t ru Y : i n t e g e r ;

//coordonatele centrului cercului circumscris begin

if I n p u t Q u e r y ( ' C i t i r e p o l i g o n ' ,' D a t i n u m ă r u l d e l a t u r i ' , n r _ s i r )

then begin//ş te rg ecranulC a n v a s . R e c t a n g l e (0 , 0 , C l i e n t W i d t h , C l i e n t H e i g h t ) ; n := S t r T o I n t ( n r _ s i r ) ;S e t L e n g t h ( a , n ) ; r a z a := 100;C e n t ru X := C l i e n t W i d t h div 2;C e n t r u Y := C l i e n t H e i g h t div 2; u n g h i : = 0; //unghiurile in radiani p a s := 2 * p i / n ; for i := 0 to n - 1 do begin

a [ i ] . x := C e n t ru X + t r u n c ( r a z a * c o s ( u n g h i ) ) ; a [ i ] . y := C e n t ru Y - t r u n c ( r a z a * s i n ( u n g h i ) ) ; u n g h i := u n g h i + p a s ;

end;C a n v a s . P o l y g o n (a ) ;

end;end;

M ll. PolyLine

procedure Polyline(Points: array of TPoint);

304

Desenează o linie poligonală deschisă.

M12. Rectangle

procedure Rectangle(A7, Y1,X2, Y2: Integer);

p rocedure Rectangle(const R e c t TRect);

Desenează un dreptunghi. Marginea va fi desenată conform cu setările proprietăţii Pen, iar interiorul conform setărilor proprietăţii Brush.

Exemplu:

Următoarea aplicaţie desenează dreptunghiuri pe o formă. La apăsarea mouse-ului se reţine colţul din stânga sus al dreptunghiului. Colţul din dreapta jos al dreptunghiului va fi punctul în care se eliberează butonul mouse-ului.

varf i n a l : b o o l e a n = true;X S t a r t , Y S t a r t , Xtemp, Ytemp : i n t e g e r ;

procedure T F o r m l . Form M o u seD o w n (Sen d e r : T O b j e c t ;B u t t o n ; T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s . P e n . Mode := pmNot;X S t a r t := X; // coordonatele coltului din stanga sus Y S t a r t := Y;Xtemp : = X; // posibilele coordonate ale coltului din dreapta jos Ytemp := Y; f i n a l := f a l s e ;

e n d ;

procedure T F o r m l . FormMouseMove(S e n d e r : TObj e c t ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

begin if not f i n a l then begin

C a n v as . R e c t a n g l e ( X S t a r t , Y S t a r t , Xtemp, Y te m p ) ; //şterg vechiul//segment

C a n v a s . R e c t a n g l e ( X S t a r t , Y S t a r t , X, Y) ; //desenez noul segment Xtemp := X;Ytemp := Y;

end;end;procedure T F o r m l . FormMouseUp(S e n d e r : T O b j e c t ;

B u t t o n : T M o u se B u t to n ;S h i f t : T S h i f t S t a t e ; X, Y: I n t e g e r ) ;

beginC a n v a s . Pen .M ode := p m B lack ;

305

C a n v a s . R e c t a n g l e ( X S t a r t , Y S t a r t , X, Y) ; //trasez segmentul definitiv f i n a l := t r u e ;

e n d ;

p r o c e d u r e T F o r m l . F o r m C r e a t e 1 S e n d e r : T O b j e c t ) , - b e g i n

C a n v a s . B r u s h . S t y l e := b s C l e a r ; end,-

M13. TextOut

procedure TextOut(T, Y: Integer; const Text: string);

Scrie un text şi apoi poziţionează cursorul grafic Ia sfârşitul Iui.

Exem plu 1:

Următoarea aplicaţie afişează vertical un text care este dat într-o cutie de editare. Vom folosi o cutie de editare E ditl şi un buton la apăsarea căruia textul va fi scris vertical.

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

x , y : i n t e g e r ; i : i n t e g e r ;

beginX : = 2 0 ; // coordonata orizontala a punctului din care se incepe tiparirea y : = 2 0 ; //coordonata verticala a punctului din care incepe tiparirea i : = 1 ;//coloram alb dreptunghiul in care se desenează C a n v a s . B r u s h . C o l o r := c l w h i t e ;C a n v a s . R e c t a n g l e (0 , 0, C l i e n t W i d t h , C l i e n t H e i g h t ) ,- repeat

//testam daca mai incap caractere pe aceeaşi coloana sau trebuie sa trecem la alta if y > C l i e n t H e i g h t - C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) then y := 20;C a n v a s . T e x t O u t ( x , y , E d i t l - T e x t [ i ] ) ; y := y + C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) ; i : = i + 1 ;

until i > l e n g t h ( E d i t l . T e x t ) ; end;

Exem plu 2:

Acest exemplu este o generalizare a exemplului precedent: dându-se un text într-o cutie de editare, acesta va fi tipărit oblic, literele nefiind neapărat unele sub altele, ci aleator pe coloana respectivă. Culoarea fiecărei litere va fi generată aleator.

306

procedure T F o r m l . B u t t o n l C l i c k (S e n d e r : T O b j e c t ) ; var

x , y : i n t e g e r ; i : i n t e g e r ;

beginx : = 20 ; II coordonata orizontala a punctului din care se incepe tiparirea y := 2 0 ; //coordonata verticala a punctului din care incepe tiparirea i ;= 1 ;//coloram alb dreptunghiul in care se deseneaza C a n v a s . B r u s h . C o l o r := c l w h i t e ;C a n v a s . R e c t a n g l e (0 , 0, C l i e n t W i d t h , C l i e n t H e i g h t ) ,- repeat

//testam daca mai incap caractere pe aceeaşi coloana sau trebuie sa trecem la alia if y > C l i e n t H e i g h t - C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) then y := 20;C a n v a s . F on t . Col o r : = Random (ŞFFFFFF) ; II fiecare caracter va avea o alta

/ / culoare aleasa aleatorC a n v a s . T e x t O u t ( x , y , E d i t l . T e x t [ i ] ) ; y := y + C a n v a s . T e x t H e i g h t ( E d i t l . T e x t [ i ] ) ;U x va f i aleator si un caracter nu va f i tipărit neaparat sub precedentul x : = x + r a n d o m ( 2 0 ) ; i : = i + 1;

u n t i l i > l e n g t h ( E d i t l . T e x t ) ; e n d ;

M14. TextWidth

function TextWidth(const Text: string): Integer;

Returnează lungimea, în pixeli, a unui şir de caractere. Această metodă este utilă pentru a testa dacă un şir de caractere încape într-o imagine.

M15. TextHeight

function TextHeight(const Text-, string): Integer;

Returnează înălţimea, în pixeli, a unui şir de caractere. Această metodă este utilă pentru a testa dacă un şir de caractere încape într-o imagine.

Exem plu:

Următoarea aplicaţie desenează un text în mijlocul ferestrei curente. Aplicaţia conţine două butoane, o cutie de editare şi o componentă TFontDialog. La apăsarea butonului Buttonl se schimbă fontul cu care va fi desenat textul în fereastră. La apăsarea butonului Buttonl se desenează textul (din cutia de editare E d itl) centrat în fereastră.

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

procedure TForml.ButtonlClick(Sender: TObject);

307

C e n tru X , C e n t r u Y , i n a l t i m e , l a t i m e : i n t e g e r ; begin

C e n tru X := C l i e n t W i d t h div 2; / / centrul ferestrei C e n t ru Y := C l i e n t H e i g h t div 2;i n a l t i m e := C a n v as . T e x t H e i g h t ( E d i t l . T e x t ) ; / / inaltimea textului l a t i m e -. = C a n v a s . T e x t W i d t h ( E d i t l . T e x t ) ; / / latimea textului C a n v a s . T e x tO u t ( C e n t r u X - l a t i m e div 2,

C e n t ru Y - i n a l t i m e div 2 , E d i t l . T e x t ) ;end;procedure T F o r m l . B u t t o n 2 C l i c k ( S e n d e r : T O b j e c t ) ; beginif F o n t D i a l o g l . E x e c u t e then begin

C a n v a s . F o n t . A s s i g n ( F o n t D i a l o g l . F o n t ) ; // schimb fontul cu care// se deseneaza

* 1. F o n t . A s s i g n ( F o n t D i a l o g l . F o n t ) // si fontul textului din Editlend -

end;

M16. Draw

procedure Draw(A", Y: Integer; Graphic: TGraphic);

Copiază un desen, specificat de parametrul Graphic, pe canvas, în poziţia de coordonate (X,Y). Imaginea copiată poate să fie bitmap, icon sau metafile, şi va fi desenată într-un dreptunghi cu colţul din stânga sus de coordonate (X,Y), conform setărilor lui CopyMode.

Exem plu:

Următoarea aplicaţie încarcă o imagine în obiectul h (de tip TBitmap) şio afişează centrat pe fereastra curentă.

procedure T F o r m l . B u t t o n 2 C l i c k ( S e n d e r : T O b j e c t ) ; var

b : TBi t m a p ; begin

b := T B i t m a p . C r e a t e ; b . L o a d F ro m F i1e ( ' i m a g i n e . bm p ' ) ;C a n v a s .D r a w ( C l i e n t W i d t h div 2 - b . W id th div 2,

C l i e n t H e i g h t div 2 - b . H e i g h t div 2 , b ) ;b . F r e e ;

end;

M17. StretchDraw

procedure StretchDraw(const Rect: TRect; Graphic: TGraphic );

Copiază un desen, specificat de parametrul Graphic, pe canvas, în dreptunghiul Rect. Imaginea copiată poate să fie bitmap, icon sau

308

metafile, şi va fi redimensionată astfel încât să umple în întregime dreptunghiul Rect.

M18. DrawFocusRect

procedure DrawFocusRect(const Rect: TRect);

Desenează un dreptunghi care dă senzaţia că are focus. Acest lucru se realizează folosind operatorul XOR.

M19. CopyRect

procedure Copy Rec t(D<?.vr: TRect; Canvas: TCanvas; Source: TRect);

Copiază o parte a canvas-ului (parametrul Canvas) specificată prin drep­tunghiul Source pe suprafaţa de desenare curentă în dreptunghiul Deşt.

Exem plu:

Următoarea aplicaţie salvează o parte din imaginea desenată pe formă într-un fişier pe disc.

procedure T F o r m l .Fo rm K ey D o w n (S e n d e r : T O b j e c t rvar Key: Word; S h i f t : T S h i f t S t a t e ) ;

beginif k e y = o r d ( ’ S ’ ) / / daca s-a apa.sat tasta S (Save) then begin

b := T B i t M a p .C r e a t e ; b . H e i g h t := 100 ; b . W id th := 200 ;// copiez un dreptunghi 200x100b . C a n v a s . C o p y R e c t ( R e c t (0 , 0, 200 , 1 0 0 ) ,

F o r m l .C a n v a s , R e c t ( 1 0 , 10 , 2 1 0 , 1 1 0 ) ) ; if S a v e P i c t u r e D i a l o g l . E x e c u te // salvez imaginea bmpthen b . S a v e T o F i l e ( S a v e P i c t u r e D i a l o g l . F i l e N a m e ) ; b . F r e e ;

end;end;

Evenimente

E l. OnChange

property OnChange: TNotifyEvent;

Apare după ce o imagine s-a schimbat. Acest eveniment este generat după ce a fost apelată una din metodele care schimbă conţinutul Canvas- ului.

309

E2. OnChanging

Apare înainte de a se schimba o imagine. Acest eveniment este generat înainte de a fi apelată una din metodele care schimbă conţinutul Canvas- ului.

Deoarece componenta TCanvas nu are propria ei reprezentare în C om ponent Pallete, programatorul trebuie să-i asigneze un handler de evenimente.

Următorul exemplu arată cum se poate atribui la momentul execuţiei (la apăsarea unui buton) câte un handler de evenimente la fiecare dintre evenimentele OnChange şi OnChanging.

Prototipurile acestor evenimente trebuie declarate în secţiunea public:

procedure D u p a (S e n d e r : T O b j e c t ) ; procedure î n a i n t e (S e n d e r : T O b j e c t ) ;

Implementările sunt următoarele:

varHDupa, H I n a i n t e : T N o t i f y E v e n t ;

procedure T F o r m l . D u p a (S e n d e r : T O b j e c t ) ; beginif A s s i g n e d ! HDupa) //daca mai exista un alt handler instalat t h e n HDupa (S e n d e r ) ; // il apelez S h o w M e ssa g e ( ' D u p a ') ,-

e n d ;

procedure T F o r m l . î n a i n t e ( S e n d e r : T O b j e c t ) ; begin

i f A s s i g n e d ( H I n a i n t e ) / / daca mai exista un alt handler instalat then H I n a i n t e ( S e n d e r ) ; //ilapelez S h o w M e ssa g e ( ' î n a i n t e ' ) ;

end;

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

if A s s i g n e d (C a n v a s . O nC hange) // testez daca exista un alt handler instalat then HDupa : = C a n v a s . O n C hange; // in caz afirmativ il reţin C a n v as . OnChange : = D u p a ; // si il atribui pe cel nou

if A s s i g n e d ( C a n v a s .O nC hang ing) then H I n a i n t e := C a n v a s .O n C h an g in g ;C a n v a s . O nC h an g in g := î n a i n t e ;

C a n v a s . L in e T o ( 1 0 0 , 1 0 0 ) ; // desenez ceva pe suprafaţa formei B u t t o n l . E n a b l e d := false;

end;

property OnChanging: TNotifyEvent;

310

21.13. TGraphicControl

Este o clasă de bază pentru toate controalele care nu au propria lor fereastră. Scopul acestor obiecte este de a afişa text şi imagine pe suprafaţa lor. Ele nu pot primi focus.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->TGraphicControl

Definit în_____________________________________________________

controls.pas

Proprietăţi___________________________________________________

P I. Canvas

property Canvas: TCanvas;

Furnizează, controlului grafic, o suprafaţa pentru desenare. Proprietatea este ReadOnly.

Metode______________________________________________________

M l. Paint

procedure Paint;

La primirea mesajului W M PA IN T, controlul iniţializează canvas-ul şi apelează metoda Paint. In această clasă metoda Paint nu face nimic, dar descendenţii trebuie să o redefinească pentru a indica modul în care se desenează suprafaţa unui control.

21.14. TPaintBox

Furnizează o componentă TCanvas în interiorul unui dreptunghi, preve­nind desenarea în afara marginilor acestuia.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TPaintBox

311

Definit în

graphics.pas

Pagina

System

Proprietăţi______

P I. Canvas

property Canvas: TCanvas;

Reprezintă suprafaţa de desenare.

Exemplu:

Următoarea aplicaţie desenează un grafic de funcţie de un sigur parametru. Forma aplicaţiei conţine 4 cutii de editare în care utilizatorul este solicitat să introducă domeniul şi codomeniul funcţiei, o compo­nentă TPaintBox în care se va realiza desenarea şi un buton (Buttonl) la a cărui apăsare se va declanşa desenarea.

function f ( x : r e a l ) : r e a l ; begin

R e s u l t := s i n ( x ) ; end;

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; var

a : array of T P o i n t ; i : i n t e g e r ;

//dom eniu l s i codom eniul funcţieim in x , maxx, m in y , maxy : r e a l ;

beginm in x := S t r T o F l o a t ( E d i t l . T e x t ) ;maxx := S t r T o F l o a t ( E d i t 2 . T e x t ) ;m in y := S t r T o F l o a t ( E d i t 3 . T e x t ) ;maxy := S t r T o F l o a t ( E d i t 4 . T e x t ) ;

S e t L e n g t h ( a , 3 0 0 ) ; for i := 0 to 299 do begin

/ / i n vectorul a sunt s tocate perechile (xj'(x)) in coordonate ecran a [ i ] . x : = i ;a [ i ] . y := t r u n c ( ( f (m inx + i * a b s (m ax x - m inx) / 300)

- m i n y ) / (m a x y -m in y )* 3 0 0 ) ;end;P a i n t B o x l . C a n v as . P o l y l i n e (a) ; / / se deseneaza funcţia

312

en d ;

21.15. TImage

Permite afişarea unei imagini pe ecran. Această imagine este valoarea proprietăţii Picture. Poate fi icon, bitmap, metafile, sau orice alt obiect grafic definit de utilizator.

Ierarhie

TObject -> TPersistent -> TComponent -> TControl -> -> TGraphicControl -> TImage.

Definit în

extctrls.pas

Pagina

Additional

Proprietăţi

PI. AutoSize

property AutoSize: Boolean;

Dacă AutoSize este truc, atunci controlul în interiorul căruia se afişează imaginea se va redimensiona în funcţie de dimensiunile acesteia.

P2. Stretch

property Stretch: Boolean;

Indică dacă imaginea trebuie să se redimensioneze astfel încât să ocupe întreaga suprafaţă a controlului.

P3. Center

property Center: Boolean;

Indică dacă imaginea trebuie centrată în interiorul controlului. Această proprietate nu are nici un efect dacă proprietăţile AutoSize sau Stretch sunt setate la true.

313

Specifică imaginea afişată.

Exemplul 1:

Pe o formă avem o componentă Tlmage cu ajutorul căreia dorim să afişăm o imagine aflată într-un fişier pe disc. Pentru aceasta ne folosim de o componentă TOpenPictureDialog care ne facilitează selectarea fişierului cu imaginea. La apăsarea butonului Buttonl vom realiza selectarea fişierului cu imaginea şi afişarea acesteia pe formă în componenta Im a g e l:

procedure T F o r m l . B u t t o n l C l i c k (S e n d e r : T O b j e c t ) ; begin

i f O p e n D i a l o g I . E x e c u t ethen I m a g e l . P i c t u r e . L o a d F r o m F i l e ( O p e n D i a l o g I . F i l e s . S t r i n g s [0] ) ;

/ /n e -a m fo lo s it d e m etoda LoadF rom File a lui TPicture / / pen tru a încărca o im agine dintr-un f iş ie r afla t p e disc. end;

Exemplul 2:

Următoarea aplicaţie afişează textul „DELPHI 7” a cărui dimensiune creşte pe măsură ce acesta se apropie de partea de jos a unei ferestre. Viteza de transformare a dimensiunii caracterelor poate fi setata de utilizator.Vom folosi o componentă Im agel care va constitui fereastra în care va fi afişat textul, o componentă TrackBarl cu ajutorul căreia vom seta viteza de transformare a dimensiunii caracterelor textului, o componentă Tim erl pentru a afişa la intervale regulate textul modificat şi un buton B itB tn l.

Proprietăţile obiectelor de forma Form l sunt:

object I m a g e l : T lm ag e L e f t = 0 Top = 0 W id th = 400 H e i g h t = 400

endobject B i t B t n l : T B i t B t n

C a p t i o n = ' E x e c u t a 'O n C l i c k = B i t B t n l C l i c k

endobject T r a c k B a r l : T T r a c k B a r

Min = 1 P o s i t i o n = 1

P4. Picture

property Picture: TPicture;

314

e n do b j e c t T i m e r l : T T im er

E n a b l e d = F a l s e I n t e r v a l = 500

e n d

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

p r o c e d u r e T F o r m l . B i t B t n l C l i c k ( S e n d e r : T O b j e c t ) ; b e g i n

x := 150 ; y := 50 ;I m a g e l . C a n v a s . F o n t . S i z e := 10;T i m e r l . E n a b l e d : = t r u e ;

e n d ;

p r o c e d u r e T F o r m l . T i m e r l T i m e r ( S e n d e r : T O b j e c t ) ; b e g i n

T i m e r l . I n t e r v a l := T r a c k b a r l . P o s i t i o n * 50;I m a g e l . C a n v a s . R e f r e s h ;i f y + I m a g e l . C a n v a s . T e x t H e i g h t ( 1t ' ) + 20 < I m a g e l . H e i g h t t h e n i f y + 2 * I m a g e l . C a n v a s . T e x t H e i g h t ( ' t ' ) > I m a g e l . H e i g h t

t h e n b e g i nI m a g e l . C a n v a s . B r u s h . C o l o r := c l w h i t e ;I m a g e l . C a n v a s . R e c t a n g l e ( 0 , 0 , 4 0 0 , 4 0 0 ) ;I m a g e l . C a n v a s . F o n t . C o l o r := c l r e d ;I m a g e l . C a n v a s .T e x t O u t ( x ,y , 'D E L P H I 7 ' ) ; y := y + 60;

en d e l s e b e g i n

y := y + I m a g e l . C a n v a s . F o n t . S i z e + 3;X : = X - 5;I m a g e l . C a n v a s . B r u s h . C o l o r := c l w h i t e ;I m a g e l . C a n v a s . R e c t a n g l e ( 0 , 0 , 4 0 0 , 4 0 0 ) ;I m a g e l . C a n v a s . F o n t . S i z e :=

I m a g e l . C a n v a s . F o n t . S i z e + 3 ; I m a g e l . C a n v a s . T e x t O u t ( x , y , 'DELPHI 7 ' ) ;

e n d e l s e e x i t ;

e n d ;

La apăsarea butonului BitBtnl vom seta coordonatele punctului în care va apare iniţial textul si vom seta proprietatea Enabled a componentei Timerl ca fiind true. La fiecare următor interval de timp vom redesena textul cu un font mai mare. Ne vom opri în momentul în care textul depăşeşte înălţimea ferestrei considerate (Im agel .Height). De asemenea, se poate seta şi culoarea cu care va fi afişat textul.

315

Reprezintă o curbă care poate fi trasată pe o formă.

Ierarhie

21.16. TShape

TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TShape.

Definit în___________________________________________________

extctrls.pas

Pagina_____________________________________________________

Additional

Proprietăţi__________________________________________________

PI. Brush

property Shape: TShapeType;

Specifică culoarea şi modelul de haşurare folosit pentru curbă.

P2. Pen

property Pen: TPen;

Specifică tipul de creion folosit pentru marginea curbei.

P3. Shape

property Shape: TShapeType;

Specifică curba care apare pe formă. Valori posibile pentru Shape sunt:

V a lo a re S em nifica tic

StCircle C urba este un cerc.

stEllipse C urba este o elipsă.

stRectangle C urba este un dreptunghi.

stRoundRect C urba este un dreptunghi cu colţurile rotunjite.

stRoundSquare C urba este un pătrat cu colţurile rotunjite.

slSquare C urba este un pătrat.

Următoarea aplicaţie schimbă succesiv, la apăsarea butonului B u tton l, proprietatea Shape a unui obiect de tip TShape. :

Valorile proprietăţilor obiectului TShape sunt:

object S h a p e l : T Shape W id th = 121 H e i g h t = 65 S h ap e = s t S q u a r e

endHandlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; beginif S h a p e l . S h a p e = s t C i r c l ethen S h a p e l . S h a p e : = s t R e c t a n g l eelse S h a p e l . S h a p e := s u c c ( S h a p e l . S h a p e ) ;

end;

21.17. TBevel

Reprezintă componenta care desenează un chenar cu contur.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TBevel.

Definit în_____________________________________________________

extrctrl.pas

Pagina______________________________________________________

Additional

Proprietăţi___________________________________________________

P I. Style

property Style: TBevelStyle;

Indică stilul chenarului. Valori posibile pentru Style sunt:

V a lo a re S em n ifica ţie

bsLow ered C henaru l este adâncit.

bsR aised C henarul este ridicat.

317

]

P2. Shape

property Shape: TBevelShape;

Indică forma curbei. Valori posibile pentru Shape sunt:

V a lo a re S em n ifica ţie

bsBox în treaga com ponentă apare rid icată s-au scobită, în funcţie de valoarea proprietăţii Style.

bsFram e în treaga m argine a com ponentei apare rid icată s-au scobită.

bsTopLine D oar m arginea de sus a com ponentei este afişată.

bsBottomLine D oar m arginea de jo s a com ponentei este afişată.

bsLeflLine D oar m arg inea stângă a com ponentei este afişată.

bsRiglitUne D oar m arg inea d reap tă a com ponentei este afişată.

21.18. TSplitter

Este o componentă care poate împărţi zona client în două panouri redimensionabile la momentul execuţiei programului.

Pentru a obţine cele două panouri redimensionabile, procedaţi astfel:

• aşezaţi pe formă primul panou, şi aliniaţi-l la stânga (proprietatea Align va fi setată la valoarea alLeft);

• aşezaţi pe formă (la dreapta primului panou) o componentă TSliptter; ea se va alinia automat la stânga (va fi lipită de marginea din dreapta a primului panou);

• aşezaţi pe formă cel de al doilea panou şi aliniaţi-l astfel încât să ocupe întreaga zonă client rămasă disponibilă (proprietatea Align va fi setată la valoarea alClient); acum componenta TSplitter se va afla între cele două panouri;

• rulaţi aplicaţia; cele două panouri pot fi redimensionate automat la momentul execuţiei programului.

Observaţie:

Nu doar panourile pot fi folosite, ci orice alt control ce poate fi aliniat(are proprietatea Align)\

Ierarhie

TObject -> TPersistent -> TComponent -> TControl ->-> TGraphicControl -> TSplitter.

318

Definit în

extctrlx.pax

Pagina

Additional

Proprietăţi

PI. Beveled

property lleveled: Boolean;

Indică dacă splilter-ul are o sau nu un chenar.

P2. MinSize

property MinSi/.e: NaluraINumber;

Indică care trebuie să fie dimensiunea minimă a panorilor pentru ca acestea să poală li redimensionate. Pentru dimensiuni mai mici de MinSize, panourile mi se modifică.

P3. ResizeSiyle

property ResizeSiyle: TResizeStyle;

Indică felul în care se face redimensionarea panorilor. Valori posibile pentru ResizeSiyle sunt:

V a lo a re S em n ifica ţie

rsNone Nu ;ne loc nici o redim ensionare.

rsLineO linie cslc desenată pentru a indica noua poziţie a splitter-ului. Keiliim-iiMonare e lectivă se face doar după ce este e liberat butonul de tiumsc.

rs UpdateK cilim cnsionarea panourilor şi m utarea splitter-u lu i se face concom itent cu m işcarea m ouse-ului.

Evenimente

E l. OnCanResize

property OnCanResize: TCanResizeEvent;

Apare când utilizatorul încearcă să mişte splitter-ul.

319

E2. OnMoved

property OnMoved: TNotifyEvent;

Apare după ce utilizatorul a terminat de mutat splitter-ul.

E3. OnPaint

property OnPaint: TNotifyEvent;

Apare când splitter-ul trebuie să se redeseneze.

Este o colecţie de imagini de aceeaşi dimensiune, fiecare dintre acestea putând fi accesată prin intermediul unui indice. Dacă încercaţi să adăugaţi la lista cu imagini o imagine cu dimensiuni mai mari decât cele setate cu ajutorul proprietăţilor Height şi Width, această imagine va fi ruptă în imagini mai mici care vor fi adăugate la listă. Deci în loc de o imagine veţi avea mai multe. Dacă din contră încercaţi să adăugaţi la listă o imagine cu dimensiunile mai mici decât cele specificate cu ajutorul proprietăţilor Height şi Width atunci lista va rămâne nemodificată, la ea neadăugându-se nimic. De aceea este foarte important să setaţi corect aceste dimensiuni, iar apoi să adăugaţi doar imagini de acest fel. Acest lucru îl puteţi face încărcând în prealabil imaginea nu direct în listă ci într-un obiect de tip TBitmap - de unde îi puteţi citi dimensiunile - iar apoi după ce setaţi dimensiunile listei, să o adăugaţi la ea. Schimbarea dimen­siunilor imaginilor listei la momentul execuţiei programului va duce la pier­derea informaţilor din ea.

încărcarea unei imagini într-o listă se poate face şi la momentul proiec­tării aplicaţiei, prin adăugarea pe formă a unei componente TImageList şi apoi execuţia a dublu click pe ea. Pe ecran va apare un ImageListEditor care vă permite să prelucraţi o listă cu imagini la timpul proiectării aplicaţiei.

Cu acest editor pot fi încărcate şi imagini de diferite dimensiuni, dar nu se va putea vedea decât o parte din ele (conform cu Options).

TObject->TPersistent->TCo/nponent->TCustomImageList->TImageList

21.19. TImageList

Ierarhie

Definit în

controls.pas

320

Pagina

Win32

Proprietăţi________________________________________________ _

PI. Count

property Count: Integer;

Indică numărul de imagini dintr-o listă.

P2. Height

property Height: Integer;

Indică înălţimea în pixeli a unei imagini. Datorită faptului că în listă pot fi stocate doar imagini de aceeaşi dimensiune, la schimbarea acestei valori, lista va 11 vidată.

IM. Width

property Width: Integer;

Indică lăţimea în pixeli a unei imagini. Datorită faptului că în listă pot fi stocate doar imagini de aceeaşi dimensiune, la schimbarea acestei valori, lista va fi vidată.

1*4. BlendColor

property BlendColor: TColor;

Specifică culoarea care este folosită în momentul în care proprietatea DrawingStyle are una din valorile dsFocus sau dsSelected.

P5. DrawingStyle

property DrawingStyle: TDrawingStyle;

Indică felul în care va fi desenată o imagine de către metodele obiectului TlmageList. Valori posibile pentru DrawingStyle sunt:

V a lo a re S em n ifica ţie

dsFocusD esenează im aginea am estecată 25% cu culoare specificată de către BlendColor.

dsSelected D esenează im aginea am estecată 50% cu culoare specificată de către B lendColor.

dsN orm al D esenează im aginea folosind doar cu loare de funda) (proprietatea

V a lo a re S em n ifica ţie

BkColor).

dsT ransparent D esenează im aginea neţinând cont de p roprietatea BkColor.

Următorul exemplu demonstrează felul în care este desenată o imagine dintr-o listă în funcţie de valoarea lui DrawingStyle. Vom folosi o componentă TlmageList în care încărcăm la momentul proiectării aplicaţiei o singură imagine. Mai folosim o componentă Tlmage în care afişăm imaginea din listă, şi o componentă TComboBox în care încărcăm cele patru stiluri de desenare: dsFocus, dsSelected , dsNormal, dsTransparent (sub forma unor şiruri de carac­tere cu acelaşi nume). La schimbarea itemului selectat din TComboBox se va schimba şi felul în care este desenată imaginea:

procedure TForml.ComboBoxlChange(Sender: TObj ect);var r:TRect;

beginif ComboBoxl.Text = 'dsFocus'then ImageListl.DrawingStyle := dsFocus else if ComboBoxl.Text = ’dsSelected'

then ImageListl.DrawingStyle := dsSelected else if ComboBoxl.Text = ’dsNormal'

then ImageListl.DrawingStyle := dsNormal else ImageListl.DrawingStyle : = dsTransparent;

r -.= Imagel.ClientRect;Imagel.Canvas.Brush.Color := clWhite;Imagel.Canvas.FillRect(r) ;

ImageListl .Draw(Imagel. Canvas ,0,0,0); //desenam prima imagine din lista

end;

Metode

M l. Add

function Add (Image, Mask: TBitmap): Integer;

Adaugă imaginea Image împreună cu masca Mask la lista cu imagini. Mask poate să fie nil.

M2. Addlcon

function AddIcon(//wage: Tlcon): Integer;

Adaugă un icon la lista cu imagini.

322

procedure Addlmages(Va/ne: TCustomlmageList);

Adaugă imagini dintr-o altă listă cu imagini.

M4. Clear

procedure Clear;

Şterge toate imagiile din listă.

M5. Delete

procedure Delete(Index: Integer);

Şterge imaginea cu numărul de ordine Index din listă.

M6. Draw

procedure Draw (Canvas: TCanvas; X, Y, Index: Integer;Enabled: Boolean=True);

Desenează imaginea cu numărul de ordine Index pe suprafaţa Canvas la poziţia (X,Y). Această imagine este desenată în conformitate cu proprie­tatea DrawingStyle.

M7. FileLoad

function ¥\\6Lo'ăd(ResType: TResType; Name: string;MaskColor: TColor): Boolean;

încarcă, în lista cu imagini, din fişierul Name, tipul de resursă specificat. Valori posibile pentru ResType sunt: rtBitmap, rtlcon, rtCursor.

M 8. GetBitmap

procedure GetBitmap(//it/e\: Integer; Image: TBitmap);

Returnează imaginea cu numărul de ordine Index din lista cu imagini.

M 9. Getlcon

procedure GetIcon(/«<ie;t: Integer; Image: TIcon);

Returnează imaginea cu numărul de ordine Index, sub forma unui icon.

M10. Insert

procedure Insert(/«cfe;c: Integer; Image, Mask: TBitmap);

M3. Addlm ages

323

Inserează un bitmap şi masca ataşată lui pe poziţia Index a unei liste cu imagini.

M II . Insertlcon

procedure InsertIcon(/«afe*: Integer; Image: Tlcon);

Înserează un icon pe poziţia Index+l a unei liste cu imagini.

M12. Move

procedure Move(CurIndex, Newlndex: Integer);

Mută imaginea de pe poziţia Curlndex în poziţia Newlndex.

M13. Replace

procedure Rep\ace(Index: Integer; Image, Mask: TBitmap);

înlocuieşte imaginea cu numărul de ordine Index din listă cu o altă imagine (Image) împreună cu masca asociată ei.

M14. Replacelcon

procedure ReplaceIcon(/rtctex: Integer; Image: Tlcon);

înlocuieşte imaginea de pe poziţia Index cu un Icon.

Evenimente_____

E l. OnChange

property OnChange: TNotifyEvent;

Apare când lista se schimbă (o imagine este adăugată, ştearsă,...).

22. TIMERE - COMPONENTA TTimer

Timer-ele înştiinţează utilizatorul despre scurgerea unui interval de timp. înştiinţarea se produce prin generarea unui mesaj. Programatorul Delphi poate intercepta acest mesaj sub forma unui eveniment. în interiorul acestui eveniment trebuie scris cod care se va executa la un interval (de obicei regulat) de timp. Sistemul de operare W indows oferă funcţii API pentru prelucrarea timer-elor. Mediul Delphi încapsulează aceste funcţii în componenta TTimer.

22.1. TTimer ^

Componenta TTimer încapsulează funcţiile API ale timer-elor W indows. Un tim er este o rutină care măsoară repetat scurgerea unui interval de timp. După scurgerea acestui interval de timp - a cărui valoare este indicată de către proprietatea Interval - sistemul este notificat prin apelarea evenimentului OnTimer. Datorită faptului că timer-ul depinde de viteza cu care sunt prelucrate mesajele din coada de mesaje, intervalul scurs va fi aproximativ.

Ierarhie______________________________________________________

TObject->TPersistent->TComponent->TTimer

Definit în_____________________________________________________

extctrls

Pagina_______________________________________________________

System

Proprietăţi___________________________________________________

P I. Enable

property Enabled: Boolean;

Specifică dacă ti.uer-ul răspunde la evenimentul OnTimer. Dacă Enable este true, atunci controlul răspunde normal la acest eveniment, în caz contrar evenimentul nu va fi apelat.

325

P2. Interval

property Interval: Cardinal;

Specifică numărul de milisecunde dintre două apeluri consecutive ale handlerului de evenimente OnTimer.

Evenimente

E l. OnTimerproperty OnTimer: TNotifyEvent;Apare de fiecare dată când trec “Interval” milisecunde de la ultimul eveniment OnTimer.

Exem plul 1:

Următorul exemplu foloseşte două componente de tip TTimer şi o cutie de editare de tip TEdit. La fiecare cinci secunde în cutia de editare este afişat textul “Au mai trecut 5 secunde” . Acest text este afişat timp de două secunde apoi cutia de editare este curăţată.

Proprietăţile obiectelor de pe forma Form l sunt:

object Editl: TEdit Enabled = False

endobject Timer1: TTimer

Interval = 5000 endobject Timer2: TTimer

Enabled = False Interval = 2000

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

procedure TForml.TimerITimer(Sender: TObject); begin

Editl.Clear;Editl.Text := 'Au mai trecut 5 secunde.';Timer2.Enabled := true;

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

Editl.Clear;Timer2.Enabled := false;

end;

326

Exemplul 2:

Următoarea aplicaţie afişează în bara de titlu a formei câte secunde s-au scurs de la pornirea aplicaţiei.

vari : integer; titlu : string;

procedure TForml.FormCreate(Sender: TObject); begin

i := 1;titlu := Caption; //titlul formei

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

Caption := titlu + ' 1 + 'Au trecut ' + IntToStr(i)+1 secunde de la pornirea aplicaţiei';

inc(i); end;

Exem plul 3:

Următoarea aplicaţie realizează apariţia la un interval dat de timp a unei forme pe care este afişat un text.Obiectele de pe forma folosită vor fi un Timerl şi o etichetă L abell în care va fi scris textul care dorim sa fie afişat. Dimensiunea, culoarea şi celelalte proprietăţi ale textului se pot seta din Object Inspector.Vom realiza această aplicaţie folosind proprietăţile TransparentColor şi AlphaBlend ale formei F onul.

Proprietăţile formei Form l şi ale obiectelor de pe această formă sunt:

object Forml: TForml Left = 353 Top = 278 Width = 426 Height = 146 AlphaBlend = True AlphaBlendValue = 0 Caption = 'Forml'Color = c 1 Ac-liveCaption TransparonLColor = True Font.Color clWindowText Font.Height = -11 Font . Nr-irne = 'MS Sans Serif'Font.St yle = [ ]Text Ile i qht: = 13 object Labell: TLabel

Caption = 'Sa invatam DELPHI 7!'Color = clActiveCaption

327

Font.Color = clYellowFont.Height = -27Font.Name = 'MS Sans Serif'Font.Style = [fsBold]

endobject Timerl: TTimer

Interval = 50 OnTimer = TimerlTimer

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

v a raparent : boolean;

procedure TForml.TimerlTimer(Sender: TObject); begin

aparent := not aparent; if aparent then begin

Forml.TransparentColor := false;Forml.AlphaBlend := false;Forml.AlphaBlendValue : = 255;

end else begin

Forml.TransparentColor := true;Forml.AlphaBlend := true;Forml.AlphaBlendValue := 0;

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

aparent := true; end

Exem plul 4:

Următorul exemplu va afişa un text, literă cu literă, cu o anumită frecvenţă.Vom considera o componentă Im agel şi o componentă OnTimer 1. Vom afişa literele cu o frecvenţă' data de valoarea proprietăţii Interval a obiectului OnTimerI. Vom seta 25 dimensiunea textului şi culoarea albastru. Dacă lungimea textului depăşeşte lăţimea pe care am setat-o pentru Im agel, atunci vom continua scrierea pe rândul următor. La lansarea în execuţie a programului, textul va începe să se scrie din colţul stânga sus al imaginii Im agel.

328

Proprietăţile evenimentelor de pe forma Form l sunt:

object Imagel: Tlmage Left = 0 Top = 0 Width = 400 Height = 400 AutoSize = True

endobject Timerl: TTimer

Interval = 100 OnTimer = TimerlTimer

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

procedure TForml.TimerlTimer(Sender: TObject); begin

text := 'Acesta este un exemplu simplu de lucru'+' cu componenta OnTimer.';

imagel.Canvas.Font.Size := 25; imagel.Canvas.Font.Style := [fsbold]; imagel.Canvas.Font.Color := clblue if i > length(text) then elseif x > imagel.Width then begin

y := y + 50; x := 50;

end else begin

imagel.Canvas.TextOut(x,y,text[i]);X : = X + 3 0 ;inc(i );

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

X := 10; y := 10;

end;

329

23. FERESTRE DE DIALOG

Cutiile de dialog sunt ferestre complexe în care utilizatorul este solicitat să-şi introducă opţiunile referitor la felul în care se va executa în continuare aplicaţia. Cutiile de dialog pot fi prefabricate sau simple.

Cele prefabricate sunt complexe şi ele sunt destinate unui scop precis. Spre exemplu TOpenDialog, TPrintDialog. Toate acestea derivă din clasa TCommonDialog. Afişarea unei ferestre de dialog este modală şi se face ape­lând metoda Execute. Această metodă întoarce valoarea tru e dacă utilizatorul şi-a setat opţiunile dorite şi a apăsat butonul Ok. Metoda întoarce valoarea false dacă utilizatorul a apăsat butonul Cancel.

Apăsarea unuia dintre butoanele O k sau Cancel nu conduce la efectuarea vreunei operaţii de către componenta de dialog. Programatorului îi revine sarcina de a scrie codul ce se va executa după apăsarea unuia dintre butoanele O k sau Cancel.

Cutiile de dialog simple sunt create şi afişate cu ajutorul unor funcţii (spre exemplu ShowMessage). Ele sunt folosite pentru a afişa un text către utilizator (procedura ShowMessage) sau pentru a citi un text introdus de către utilizator.

23.1. TCommonDialog

Este strămoşul comun al tuturor componentelor ce reprezintă o cutie de dialog. Din el derivă TOpenDialog, TSaveDialog, TPrintDialog, TColorDialog, TOpenPictureDialog, TSavePictureDialog, TFontDialog, TPrinterSetupDialog, TFindDialog, TReplaceDialog.

Ierarhie___________________________________________________ __

TObject -> TPersistent -> TComponent -> TcommonDialog

Definit în_____________________________________________________

dialogs.hpp

330

Proprietăţi

PI. Ctl3D

property Ctl3D: Boolean;

Indică dacă fereastra de dialog are aspect 3D. Dacă Ctl3D este false, fereastra va avea un aspect plat.

P2. Handle

property Handle: HWnd;

Este identificatorul la fereastra dialogului. Acest identificator devine valid doar după apelarea metodei Execute. înainte de crearea ferestrei dialogului şi după distrugerea ei, Handle are valoarea 0.

Metode

M l. Execute

function Execute: Boolean; virtual; abstract;

Afişează fereastra cutiei de dialog. Toate cutiile de dialog enumerate mai sus sunt vizibile doar la momentul execuţiei aplicaţiei, după ce s-a apelat metoda Execute. Fiecare componentă va suprascrie această metodă pentru afişarea propriei cutii de dialog. O fereastră de dialog constă dintr-o parte specifică (spre exemplu, componenta TOpenDialog este destinată selectării unui fişier, componenta TColorDialog este destinată selectării unei culori, etc.) şi două butoane (unul etichetat cu Ok iar celălalt cu Cancel). Metoda returnează true dacă utilizatorul a făcut o selecţie validă şi a apăsat butonul Ok. în caz contrar (când este apăsat butonul Cancel) metoda returnează false.

Evenimente

El. OnShow

property OnShow: TNotifyEvent;

Apare când cutia de dialog este afişată.

331

E2. OnHide

property OnClose: TNotifyEvent;

Apare când cutia de dialog este închisă.

23.2. TOpenDialog

Afişează o cutie de dialog pentru a selecta şi deschide fişiere. Pe ecran este afişată:

Look in:

jBnj i Doc j Examples j Help j Images

J Include

File name:

Files of type:

j LibJ Objrepos J Ocx j Projects J Pvcs j Quickrpt

L_J Source ~=*1 D e lsLU su iTj Deploy j f f j License

>1 Readme, cnt Readme

□ pen

j£ 3 Cancel

P* Open asjead-only

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TOpenDialog.

Definit în

dialogs.pas

Pagina

Dialogs

Proprietăţi

PI. FileName

property FileName; TFileName;

332

Indică numele şi calea ultimului fişier selectat.

Exemplu:

Următoarea aplicaţie încarcă într-o componentă TMemo textul aflat într- un fişier. Numele şi calea fişierului sunt selectate cu ajutorul unei componente TOpenDialog.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Buttonl: TButtonCaption = 'Deschide Fişier'

endobject OpenDialogI: TOpenDialog

Filter = 'Fişiere Pascalj*.pas' end

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

procedure TForml.ButtonlClick(Sender: TObject); begin

if OpenDialogI.Executethen Memol.Lines.LoadFromFile(OpenDialogI.FileName);

end;

P2. Files

property Files: TStrings;

Returnează o listă cu numele şi căile fişierelor selectate. Selectarea mai multor fişiere este posibilă numai în cazul în care flagul ofAllowMultiSelect din cadrul proprietăţii Options este true.

Exemplu:

Următoarea aplicaţie afişează într-o componentă TListBox numele tutu­ror fişierelor selectate. Fişierele sunt selectate cu ajutorul unei compo­nente TOpenDialog.

Valorile proprietăţilor obiectelor de pe forma F orm l sun t:.object Buttonl: TButton

Caption = 'Afiseaza nume' endobject OpenDialogI: TOpenDialog

Filter = 'Fişiere Pascal|* .pas'Options = [ofHideReadOnly, ofAllowMultiSelect,

ofEnableSizing]end

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

333

procedure TForml.ButtonlClick(Sender: TObject); beginif OpenDialogI.Executethen ListBoxl.Items.Assign(OpenDialogI.Files) ;

end;

P3. Filter

property Filter: string;

Specifică un filtru pentru selecţia de fişiere. Filtrul este creat la fel ca şi la TComboListBox.

P4. Filterlndex

property Filterlndex: Integer;

Specifică care filtru să fie ales când se deschide o cutie de dialog. Filtrele în cadrul proprietăţii Filter au ataşate numere de ordine. Primul filtru are numărul de ordine 1, al doilea 2, etc. Dacă se încearcă accesarea unui filtru care are numărul de ordine mai mare decât numărul total de filtre, atunci este ales primul filtru (cel cu numărul de ordine 1).

P5. DefaultExt

property DefaultExt: string;

Specifică extensia implicită pentru un fişier. Acest lucru este util în momentul în care utilizatorul tastează un nume de fişier fară extensie. La acest fişier este adăugată extensia DefaultExt. Spre exemplu dacă extensia fişierelor a fost setată la .pas (OpenDialogI.DefaultExt : = 1 pas ') , atunci, dacă utilizatorul tastează numele fişierului fară extensie (de exemplu unitl), implicit este unitl.pas.

P6. HistoryList

property HistoryList: TStrings;

Este o listă cu fişierele care au fost deja deschise.

P7. InitialDir

property InitialDir: string;

Indică directorul curent care va apărea implicit când se deschide o cutie de dialog. Dacă nu se specifică nici un director atunci InitialDir va fi directorul curent de lucru.

334

P8. Options

property Options: TOpenOptions;

Descrie felul în care se comportă fereastra de dialog.

Evenimente__________________________________________________

El. OnCanClose

property OnCanClose: TCloseQueryEvent;

Apare când utilizatorul închide cutia de dialog printr-o operaţie diferită de Cancel. Aceste eveniment este util atunci când selecţia unui nume de fişier este incorectă. Acest eveniment trebuie să îi spună utilizatorului de ce cutia de dialog nu poate fi închisă. Tipul TCloseQueryEvent este definit astfel:

TCloseQueryEvent = procedure(5e«<ier: TObject;var CanClose: Boolean) of object;

Pentru a preveni închiderea dialogului setaţi variabila CanClose la false.

E2. OnFolderChange

property OnFolderChange: TNotifyEvent;

Apare când utilizatorul schimbă directorul al cărui conţinut este curent afişat în cutia de dialog.

E3. OnTypeChange

property OnSelectionChange: TNotifyEvent;

Apare când utilizatorul selectează un alt filtru pentru fişierele afişate în cutia de dialog.

E4. OnSelectionChange

property OnSelectionChange: TNotifyEvent;

Apare când utilizatorul modifică conţinutul cutie de dialog. Acest lucru poate însemna: selectarea unui nou fişier sau director, selectarea unui nou filtru, crearea unui director etc.

335

23.3. TSaveDialog

Afişează o cutie de dialog asemănătoare cu cea de tipul Save As. Utilizatorul poate specifica aici modul şi locul de salvare a unui fişier.

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TOpenDialog -> TSaveDialog.

Definit în

dialogs.pas

Pagina

D ialogs

Observaţii:

Componenta TSaveDialog nu introduce nici o proprietate, metodă sau eveniment nou faţă de cele întâlnite la TOpenDialog.

Exemplu:!•:

Următoarea aplicaţie salvează într-un fişier textul aflat într-o compo­nentă TMemo. Numele şi calea fişierului în care se va face salvarea este selectat cu ajutorul unei componente TSaveDialog.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Buttonl: TButton Caption = 'Salveaza'

endobject SaveDialogl: TSaveDialog

DefaultExt = 'txt'Filter = 'Fişiere text|*.txt'

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

I procedure TForml.ButtonlClick(Sender: TObject);I begin( if SaveDialogl.Execute

then Memol.Lines.SaveToFile(SaveDialogl.FileName); end;

336

Observaţie:

Mediul Delphi pune la dispoziţia programatorului încă două compo­nente de dialog pentru încărcat şi salvat fişiere cu imagini. Ele se nu­mesc TOpenPictureDialog şi TSavePictureDialog şi au aceleaşi proprie­tăţi ca şi componentele TOpenDialog şi TSaveDialog. Singura diferenţă este faptul că TOpenPictureDialog şi TSavePictureDialog pun la dispo­ziţia programatorului filtre pentru fişierele cu imagini.Filtrele implementate sunt:

Al1(*.jpg;*.j peg;*.bmp;*.i co;*.emf; ’ JPEG Image File {*.jpg,*.jpeg) Bitmaps (*.bmp)Icons (*.ico)Enhanced Metafiles (*.emf)Metafiles (*.wmf)[*.wmf

. wmf)

23.4. TFontDialog

Afişează o cutie de dialog pentru selectarea unui font:

Font:

E ffects

f ~ S trikeou t

I- U nderline

Color:

| B lack

Font style: Size:

|M S Sans Serif |Regu lar J1

MS Sans S e iif A . I J T i n i — : [MS Serif

ţ Playbill Small Fonts

T Symbol System Tahom a

_ l

Ita lic 1 B o ld 1 Bold Ita lic 1

_ J 223 H

Sam ple

A a B tA ă O o

[ Script:

_eritia l European

OK

Cancel

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TFontDialog.

337

Definit în

dialogs.pas

Pagina______________________________________________________

Dialogs

Proprietăţi___________________________________________________

PI. Font

property Font: TFont;

Specifică fontul selectat. Când utilizatorul alege un font şi apasă butonul Ok, fontul selectat este valoarea lui Font.

Evenimente

E l. OnApply

property OnApply: TFDApplyEvent;

Apare când utilizatorul apasă butonul Apply al ferestrei de dialog. Tipul jTFDApplyEvent este definit astfel:

TFDApplyEvent = procedure(.SVw/e/': TObject; Wnd: HWND)of object;

Wnd este menţinut pentru compatibilitate înapoi şi are aceeaşi valoare ca jşi proprietatea Handle.

Exemplu:

Următoarea aplicaţie setează fontul cu care este scris textul din cutia de editare E ditl. Fontul este selectat cu ajutorul unei componente TFontDialog.

I Valorile proprietăţilor obiectelor de pe forma Forml sunt:

I object Editl: TEdit( Text = 'Acesta este un text!'

endobject Buttonl: TButton

Caption = 'Seteaza Font' end

338

J

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

procedure TForml.ButtonlClick(Sender: TObject); begin

if FontDialogl.Executethen Editl.Font.Assign(FontDialogl.Font);

end;

procedure TForml.FontDialoglApply(Sender: TObject; Wnd: HWND); begin

Editl.Font.Assign(FontDialogl.Font) ; end;

23.5. TColorDialog

Afişează o cutie de dialog pentru selectarea unei culori:

Basic colors:

H r r n r i i i ■ rrrrrarnî mr r {smmmm mr mummuu mmmmMuuM wrrrnrmr

Custom colors: r r r r r r r r

r r r r r r r r

OK Cancel

Hue:fT2T Red: p T

Şal: f i 74 Green: ['215

ColoilSolid Lum. J Î43* glue: [ S F

Add to Custom Colors

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TFontDialog

Definit în

dialogs.pas

339

Pagina

Dialogs

Proprietăţi________________________________________________ _

PI. Color

property Color: TColor;

Returnează culoarea selectată.

Exemplu:

Următoarea aplicaţie selectează cu ajutorul unei componente TColorDialog culoare de fond a formei principale.

Handlerele de evenimente ale obiectelor de pe forma Forml sunt:

procedure T F o r m l . B u t t o n l C l i c k (S e n d e r : T O b j e c t ) ; begin

if C o l o r D i a l o g l . E x e c u tethen F o r m l . C o l o r := C o l o r D i a l o g l . C o l o r ;

end;

P2. CustomColors

property CustomColors: TStrings;

Indică care dintre culorile prelucrate sunt disponibile în cutia de dialog. Fiecare culoare prelucrată este specificată printr-un şir de forma ColorX=ValoareHexa (spre exemplu ColorA=808298). Se pot specifica cel mult 16 culori prelucrate (de la ColorA la ColorP).

Exemplu:

Următoarea aplicaţie setează 16 culori prelucrabile aleatoare.procedure T F o r m l . B u t t o n 2 C l i c k (S e n d e r : T O b j e c t ) ; var

i : b y t e ;Random Color : i n t e g e r ;

beginwith C o l o r D i a l o g l do begin

C u s to m C o lo r s . C l e a r ; //ş te rg culorile deja existentefor i := 0 to 15 dobegin

R andom Color := r a n d o m ) $ 1 0 0 0 0 0 0 ) ;C u s t o m C o lo r s .A d d ( ' C o l o r ' + c h r ( o r d ( ' A ' ) + i ) + ’= ' +

I n tT o H e x (R a n d o m C o lo r , 6 ) ) ;

340

end;end;

end;

23.6. TFindDialog

Afişează o cutie de dialog care permite introducerea unui text care va fi căutat într-un fişier:

Find what:

I- M atch whole word only D irection Cancel

' ' r y p ^ - own.

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog -> -> TFindDialog.

Definit în

dialogs.pas

Pagina

Dialogs

Proprietăti

PI. FindText

property FindText: string;

La apăsarea butonului FindNext, FindText va primi ca valoare şirul introdus în cutia Find what de către utilizator.

P2. Options

property Options: TFindOptions;

Setează modul de comportare a cutiei TFindDialog.

341

TFindOptions este un tip mulţime, deci Options va fi o submulţime din următoarele valori:

V a lo a re S em n ifica ţie

frD ow nSelectează butonul de radio D ow n. C ând această valoare nu este inclusă în Options, în seam nă că butonul radio U p este selectat.

frF indN ext A cest flag este setat când u tilizatorul apasă pe butonul F in d N e x t

frM atrh C ase Selectează cutia de control M a tc h C ase.

frR eplaceSe aplică num ai la TReplaceD ialog. A cest flag ind ică faptul că aplicaţia trebuie să în locu iască doar prim a apariţie a lui FindText.

frR eplaceA llSe aplică num ai la TReplaceD ialog. A cest flag ind ică faptul că ap licaţia trebu ie să în locuiască toate apariţiile lui FindText.

frW h oleW ord ■ Selectează cu tia de control M a tc h W h o le W o rd .

frShow H elp A fişează un buton de Help.

P3. Position

property Position: TPoint;

Indică coordonatele colţului din stânga sus al ferestrei de dialog.

Metode______________________________________________________

M l. CloseDialog

procedure CloseDialog;

închide cutia de dialog, lăsând însă toate proprietăţile acesteia neschim­bate.

Evenimente__________________________________________________

E l. OnFind

property OnFind: TNotifyEvent;

Apare când butonul FindNext este apăsat. în acest handler de eveni­mente utilizatorul poate şi trebuie să scrie codul necesar căutării unui subşir într-un şir. La prima vedere s-ar părea că operaţia de căutare a textului este făcută automat de către această componentă. Acest lucru este total greşit, această componentă oferind un mod mai prietenesc în care utilizatorul poate introduce şirul pe care îl caută. Programatorului îi

342

revine sarcina de a implementa evenimentele care se generează când butonul FindNext este apăsat.

Exem plu:

Următoarea aplicaţie caută un text într-o componentă TRichEdit. Munca de căutare este simplificată deoarece componenta TRichEdit furnizează metoda FindText pentru căutarea unui şir de caractere.

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

procedure TForm l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

F i n d D i a l o g l . P o s i t i o n := P o i n t ( R i c h E d i t l . L e f t +R i c h E d i t l .W id th , R i c h E d i t l . T o p ) ;

F i n d D i a l o g l . E x e c u t e ; end;procedure TForm l . F i n d D i a l o g l F i n d ( S e n d e r : T O b j e c t ) ; var

p o z : i n t e g e r ;S t a r t P o z , L ung im e : I n t e g e r ;

beginwith R i c h E d i t l do begin

if S e l L e n g t h <> 0then S t a r t P o z := S e l S t a r t + S e l L e n g t h

/ / i n cazu l in care am m ai g asit ce l puţin inca o apariţie a şirului / / incep cautarea dupa selecţia curentaelse S t a r t P o z := 0; // incep cautarea de la inceputul textului

Lungim e := L e n g t h ( T e x t ) - S t a r t P o z ;/ / lungim ea textului in care caut

p o z := F i n d T e x t ( F i n d D i a l o g l . F i n d T e x t , S t a r t P o z ,Lung im e , [ s t M a t c h C a s e ] ) ;

if p o z <> -1 then begin

S e t F o c u s ;/ /s e le c te z textul gasit S e l S t a r t := p o z ;S e l L e n g t h := L e n g t h ( F i n d D i a l o g l . F i n d T e x t ) ;

endelse Sh o w M e ssa g e ( ' T e x t u l c a u t a t nu m ai a p a r e c a s u b s i r ' ) ;

end; end;

Exemplu:

Următoarea aplicaţie realizează căutarea unui text într-o componentă TMemo. Deoarece nu mai avem la dispoziţie o metodă aşa de puternică

343

de căutare (precum metoda FindText a lui TRichEdit) vom folosi funcţia Pos împreună cu restrângerea şirului în care se realizează căutarea.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object B u t t o n l : T B u t to n C a p t i o n = ' C a u t a '

endobject F i n d D i a l o g l : T F i n d D i a l o g

O p t i o n s = [frDow n, f r D i s a b l e M a t c h C a s e , f rD isa b le U p D o w n , f rD i s a b l e W h o le W o rd , f rW holeW ord]

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

varS : string;p o z , i n a i n t e : i n t e g e r ;

procedure T F o r m l . B u t t o n l C l i c k ( S e n d e r : T O b j e c t ) ; begin

F i n d D i a l o g l . P o s i t i o n := P o i n t (Memol. L e f t +Memol.W id th , M e m o l .T o p ) ;

F i n d D i a l o g l . E x e c u t e ; p o z := 1;/ / incep cautarea clin poziţia curenta a cursoruluii n a i n t e := M em ol. S e l S t a r t - 1;// S va indica textul in care executam cautareaS := c o p y (Memol. L i n e s . T e x t , Memol. S e l S t a r t ,

l e n g t h (Memol. L i n e s . T e x t ) - Memol. S e l S t a r t ) ;end;procedure T F o r m l . F i n d D i a l o g l F i n d (S e n d e r : T O b j e c t ) ; var

p o z : i n t e g e r ;S t a r t P o z , L ung im e : I n t e g e r ;

begin/ / cau t şirul dorit in textu l Sp o z := p o s ( F i n d D i a l o g l . F i n d T e x t , S ) ; if p o z = 0then S h o w M e ssa g e ( ' T e x t u l c a u t a t nu m ai a p a r e c a s u b s i r ' ) else begin

// m archez tex tu l gasitM em ol. S e l S t a r t := p o z + i n a i n t e - 1;M em ol. S e l L e n g t h := l e n g t h ( F i n d D i a l o g l . F i n d T e x t ) ;M emol. S e t F o c u s ; i n a i n t e := i n a i n t e + p o z ;/ / restrâng cautareaS := c o p y ( S , p o z + 1 , l e n g t h ( s ) ) ;

end;end;

344

23.7. TReplaceDialog

Afişează o cutie de dialog de tip Find-Replace pentru căutare şi înlocuire de text.

U M

Find what: ]

Replace with: | ~ '-;i j '"

f ~ M atch whole word only ------------------------

CancelI M atch case ------------------------

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDicdog -> -> TFindDialog -> TReplaceDialog.

Definit în

dialogs.pas

Pagina_______________________________________________

Dialogs

Proprietăţi____________________________________________

PI. ReplaceText

property ReplaceText: string;

Conţine textul care trebuie să înlocuiască FindText.

Observaţie:

Celelalte metode şi proprietăţi sunt preluate de la TFindDialog.

Replace

345

Evenimente

E l. OnReplace

property OnReplace: TNotifyEvent;

Apare când unul din butoanele Replace sau ReplaceAll este apăsat. In interiorul acestui handler de evenimente programatorul trebuie să scrie o secvenţă de cod care se va executa când se doreşte înlocuirea unui şir într-un text.

Exemplu:

Următoarea aplicaţie efectuează căutarea şi înlocuirea unui şir într-un text dat. începerea procesului de căutare se realizează la apăsarea butonului Buttonl.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object Forml: TForml ActiveControl = Memol object Buttonl: TButton Caption = 'înlocuieşte'TabOrder = 0 OnClick = ButtonlClick

endobject ReplaceDialogl: TReplaceDialog

Options = [frDown, frDisableMatchCase, frDisableWholeWord]

OnReplace = ReplaceDialoglReplace end

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

varS : string;poz, inainte : integer;

procedure TForml.ButtonlClick(Sender: TObject); begin

ReplaceDialogl.Position := Point(Memol.Left +Memol.Width, Memol.Top);

ReplaceDialogl.Execute; poz := 1;/ / incep cautarea din p o ziţia curenta a cursorului inainte := Memol.SelStart - 1;/ / S va indica textul in care executam cautarea s i eventual inlocuirea S := copy(Memol.Lines.Text, Memol.SelStart,

length(Memol.Lines.Text) - Memol.SelStart);end;

346

p r o c e d u r e TForml.ReplaceDialoglReplace(Sender: TObject); v a r

poz : integer;StartPoz, Lungime: Integer;

b e g i n

i f frReplace i n ReplaceDialogl.Options / / daca se fa c e inlocuirea p a s cu p a s t h e n b e g i n

/ / caut şirul dorit in textul Spoz := pos(ReplaceDialogl.FindText, S); i f poz = 0t h e n ShowMessage('Textul cautat nu mai apare ca subsir') e l s e b e g i n

/ / m archez textul gasitMemol.SelStart := poz + inainte - 1;Memol.SelLength :=

length(ReplaceDialogl.FindText);/ / inlocuiesc textul si in cutia de d ia log si in şiru l S Memol.SelText := ReplaceDialogl.ReplaceText; delete(S, poz, length(ReplaceDialogl.FindText)); insert(ReplaceDialogl.ReplaceText, S, poz);Memol.SetFocus; inainte := inainte + poz;/ / restrâng cautarea s i inlocuireaS := copy(S, poz+1,length(S));

e n d ;e n d

e l s e / / in locuirea s e fa c e cu R eplace A l l ... e n d ;

23.8. TPrinterSetupDialog 3 .

Generează o cutie de dialog pentru configurarea imprimantei:

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog ->-> TPrinterSetupDialog.

Definit în

dialogs.pas

Pagina

D ialogs

M l

Plini Setup

Printer

Name: [Epson LX-800 Properties

Status: Default printer; Ready

Type: Epson LX-80Q

Where: LPT1:

Comment:

Paper Orientation

Size: A4 21 Ox ^97 mm

Source: Tractor

(* iPortraij

Landscape j

Cancel |

Observaţie:

Această componentă este singura (dintre cele din pagina Dialogs) pentru care, după ce este apăsat butonul Ok, programatorul nu mai trebuie să scrie cod. Ea configurează automat imprimanta în funcţie de opţiunile setate de către utilizator.

Exemplu:

Următoarea aplicaţie configurează imprimanta.

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g i n

i f PrinterSetupDialogl.Executet h e n ShowMessage('Imprimanta a fost setata.')e l s e ShowMessage('A fost apasat butonul Cancel.');

23.9. TPrintDialog

Afişează o cutie de dialog pentru setarea modului în care vor fi tipărite paginile trimise pentru listat la imprimantă.

e n d ;

348

Print

- Printer —

Name:

Status: Default printer; Ready

Type: Epson LX-800

W here: LPT1:

Comment:

Print range

& All

r ; | p

r

Properties

Copies....................................................

N umber of copies: [Î

12 r j (7 Collate

OK Cancel

Ierarhie

TObject -> TPersistent -> TComponent -> TCommonDialog ->-> TPrintDialog.

Definit în_____________________________________________________

dialogs.pas

Pagina______________________________________________________

D ialogs

Proprietăţi___________________________________________________

P I. Copies

property Copies: Integer;

Indică numărul de copii care trebuie făcute. Dacă Copies este 0 sau 1, atunci căsuţa cu Number of Copies din cutia de dialog va indica 1.

P2. FromPage

property FromPage: Integer;

Indică numărul paginii de la care să înceapă listarea.

349

P3. ToPage

property ToPage: Integer;

Indică numărul paginii până la care să se facă listarea.

P4. M axPage

property MaxPage: Integer;

Indică numărul maxim al unei pagini pe care utilizatorul o poate intro­duce pentru tipărire. Acest lucru este posibil doar dacă flagul poPageNums este setat.

P5. MinPage

property MinPage: Integer;

Indică numărul minim al unei pagini pe care utilizatorul o poate introduce pentru tipărire.

P6. PrintToFile

property PrintToFile: Boolean;

Indică dacă este bifată cutia de control Print To File.

P7. PrintRange

property PrintRange: TPrintRange;

Valoarea lui PrintRange corespunde cutiei cu butoane de radio PrintRange cu cele trei butoane: All, Selection şi Pages. Valori posibile pentru PrintRange sunt:

V aloare Sem n ificaţie

prAU Pages Butonul AU este selectat, deci toate paginile fişierului vor fi tipărite.

prSelectionButonul Selection este selectat, deci se listează selecţia curentă a textului.

prPageN um sButonul P ages este selectat, deci utilizatorul poate introduce intervalul de pagini care vor tl tipărite.

P8. Collate

property Collate: Boolean;

Indică dacă cutia de control Collate este selectată. Această cutie este utilă dacă se listează mai multe copii ale unui document. Dacă această

350

opţiune este setată, atunci se listează prima copie a documentului, apoi a doua copie, etc., în caz contrar se listează toate copiile primei pagini, apoi toate copiile celei de a doua pagini, etc.

Exemplu:

Următoarea aplicaţie implementează lucrul cu proprietăţile obiectului TPrintDialog.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

o b j e c t Buttonl: TButton Caption = 'Tipăreşte'

e n do b j e c t PrintDialogl: TPrintDialog

Collate = T r u eOptions = [poPageNums, poDisablePrintToFile]

e n d

Handlerele de evenimente ale obiectelor de pe forma Form l sunt: u s e s

printers;

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

i, p : integer;/ /p e n tr u tipărit o zona continua de p ag in i de_la, pana_la : integer;

b e g i nPrintDialogl.MinPage := 1;PrintDialogl.MaxPage := 10; //avem maxim 10pagini de tipărit

i f PrintDialogl. PrintRange = prAUPages / / tipăresc toate pag in ile

t h e n b e g i nde_la := PrintDialogl.MinPage; pana_la := PrintDialogl.MaxPage;

e n de l s e b e g i n / / tipăresc doar o p a rte din pagin i

de_la := PrintDialogl.FromPage; pana_la := PrintDialogl.ToPage;

e n d ;

i f PrintDialogl.Execute t h e n b e g i n

Printer. BeginDoc; // incep tiparirea i f PrintDialogl. Collate / / daca collate este truet h e n f o r i := 1 t o PrintDialogl. Copies d o // pentru fiecare copie

f o r p := de_la t o pana_la d o / / pentru fiecare pagina b e g i n

/ / t ip ă r e sc ceva p e fieca re paginaPrinter.Canvas.TextOut(10, 10, 'Pagina ' +

351

IntToStr(p)); Printer. NewPage; / / trec la o pag ina noua

Kc e n de l s e / / co llate este false

f o r p := de_la t o pana_la d of o r i := 1 t o PrintDialogl.Copies d o

b e g i n/ / t ip ă r e sc ceva p e fieca re paginaPrinter.Canvas.TextOut(10, 10, 'Pagina ' +

IntToStr(p));Printer.NewPage;

e n d ;Printer. EndDoc; / / s e term ina tiparirea

e n d ;e n d ;

23.10. Funcţii care afişează cutii de dialog

F I. CreateMesscigeDialog

function CreateMessageDialog(const Msg: string;DlgType: TMsgDIgType; Buttons: TMsgDlgButtons): TForm;

Creează o cutie de dialog care va afişa mesajul Msg. Tipul cutiei este specificat de parametrul DlgType. Butoanele amplasate pe cutie sunt specificate în parametrul TMsgDlgButtons.Tipul cutiei poate fi unul dintre:

V aloare Sem n ificaţie

m tW am ing Cutia de dialog conţine un semn de exclamare galben.

m tE rror Cutia de dialog conţine un semn de stop colorat în roşu.

m tlnform ation Cutia de dialog conţine caracterul "i" colorat în albastru.

m tConfirm ation Cutia de dialog conţine un semn de întrebare colorat în verde.

m tCustom Cutia de dialog conţine doar text simplu.

Butoanele amplasate pe cutia de dialog pot fi unul sau mai multe dintre următoarele:

V aloare T extu l în scris pe buton

m bYes Yes

mbNo No

m bO k Ok

m bC ancel Cancel

m bA bort Abort

m bR etry Retry

352

V aloare T extu l înscris pe buton

mb Ignore Ignore

m bAll AII

inbNoToAll N o To All

m bYesToAll Y es To AU

m bH elp Help

Observaţie:

Cutia de dialog nu va fi afişată ci doar creată. Pentru afişarea cutiei de dialog puteţi folosi metodele clasei TForm.

Exemplu:

Următoarea aplicaţie afişează o cutie de dialog în care utilizatorul îşi exprima intenţia cu privire la terminarea aplicaţiei curente.

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

f : TForm; b e g i n

f := CreateMessageDialog('Doriţi sa terminati?’,mtConfirmation, [mbOK, mbCancel]);

i f f.ShowModal = mrOK t h e n Application.Terminate; f.Free;

e n d ;

F2. ShowM essage

procedure ShowMessage(const Msg: string);

Afişează o cutie de dialog simplă care conţine un mesaj către utilizator şi un buton Ok.

Exemplu:

Următoarea aplicaţie afişează la apăsarea butonului Buttonl data curentă.

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); b e g i n

ShowMessage ( 1 Astăzi este: ' +DateToStr (Date) ) e n d ;

353

function InputQuery(const ACaption, APrompt: string;var Value: string): Boolean;

Afişează o cutie de dialog în care utilizatorul este solicitat să introducă un şir de caractere. Această cutie de dialog este o fereastră care are titlu (specificat de către parametrul ACaption), un text informativ asupra şirului care trebuie furnizat de către utilizator (parametrul APrompt), o cutie de editare în care trebuie introdusă valoarea solicitată şi două butoane (Ok şi Cancel). Valoarea introdusă de către utilizator va fi retumată în şirul Value. Funcţia returnează true dacă utilizatorul a apăsat butonul Ok şi false în caz contrar.

Exemplu:

Următoarea aplicaţie solicită utilizatorului introducerea unui număr. Aplicaţia va face şi validarea numărului introdus.

u s e sfilectrl;

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

nr : integer; sir : s t r i n g ;

b e g i ni f InputQuery('Cutie de dialog', 'Introduceti un numar', sir) t h e n t r y

nr := StrToInt(sir); e x c e p t

o n EConvertError d o nr := 0; e n d

e n d ;

F4. SelectDirectory

function SelectDirectory(const Caption', string;const Root: WideString; out Directory: string): Boolean;

Afişează o cutie de dialog care îi permite utilizatorului să aleagă un director. Caption este eticheta cutiei de dialog. Root este directorul a cărui structură va fi afişată. Directory va conţine numele şi calea direc­torului selectat. Funcţia returnează true dacă utilizatorul a selectat un director şi a apăsat butonul Ok şi false în cazul în care utilizatorul a apăsat butonul Cancel.

F 3 . InputQuery

354

Exemplu:

Următoarea aplicaţie setează directorul curent la o valoarea selectată de către utilizator.

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

dir : s t r i n g ; b e g i n

i f selectDirectory('Selecteaza D i r e c t o r c :\',dir) t h e n SetCurrentDir(dir);

e n d ;

355

24. DATE Şl TIMPURI

Tipurile şi clasele din acest capitol sunt destinate lucrului cu date calendaristice şi timpuri. O dată calendaristică este reprezentată de tripletul (zi, lună, an). Un timp, sau oră este reprezentat prin cvadruplul (oră, minut, secundă, sutime de secundă).

Tipul TDateTime stocheată o dată calendaristică şi un timp. Intern, obiectele de tip TDateTime menţin şi manipulează o dată de tip double.

Tipul TDate stocheată o dată calendaristică.Tipul TTime stocheată un timp.Componenta TDateTimePicker furnizează utilizatorului posibilitatea de

alegere în mod sugestiv (dintr-un calendar cu ajutorul mouse-ului) a unei date sau a unui timp.

Pe lângă aceste obiecte, unitul System.pas pune la dispoziţia progra­matorului o gamă completă de funcţii pentru manipularea datelor şi timpurilor.

24.1. TDate

Este un tip care codifică o dată calendaristică (zi, lună, an). în unitul system.pas este definit astfel:

type TDate = TDateTime;

24.2. TTime

Este un tip care codifică un moment din zi (oră, minut, secundă, milisecundă). în unitul system.pas este definit astfel:

type TTime = TDateTime;

24.3. TDateTime

Este un tip care codifică o dată calendaristică (lună, zi, an), un moment din timpul zilei (oră, minut, secundă, milisecundă) împreună cu funcţiile care prelucrează aceste valori.

Intern, o valoare TDateTime esle reprezentată de o variabilă double. Partea întreagă reţine data, iar partea fracţionară reţine timpul. Mai precis, în

356

partea întreagă este reţinut numărul de zile care au trecut de la data de 12/30/1899.

Spre exemplu, data de 21 May 2001 este reţinuta ca valoarea 37032. Putem obţine data calendaristică reprezentată de o valoare întreagă

executând următorul cod:

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

data : TDate; b e g i n

data := StrToInt (Editl .Text) ; //in cutia Editl se afla numărul intreg dorit ShowMessage(DateToStr(data));

e n d ;

în partea fracţionară este reţinut cât la sută au trecut din cele 24 de ore ale unei zile. Acest procent este calculat la nivel de milisecunde:

c o n s t MSecsPerDay = 24 * 60 * 60 * 1000;Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) /

MSecsPerDay;Următorul cod transformă un număr real cuprins între 0 şi 1 într-un timp

stocat într-o variabilă TDateTime pe care apoi îl afişează.

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

data : TTime; b e g i ndata ;= StrToFloat(Editl.Text);ShowMessage(TimeToStr(data) ) ;

e n d ;

24.4. Operatori aritmetici şi relaţionali

Deoarece valorile de tip dată/timp sunt stocate sub formă de valori double, pentru manipularea acestor variabile pot fi folosiţi operatorii aritmetici uzuali (+, -).

Atenţie

Folosirea operatorilor aritmetici implică respectarea regulilor de stocare a variabilelor dată/timp.

Astfel, dacă se doreşte mărirea cu o zi a unei date, atunci se adaugă o unitate la valoarea respectivă:

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

t : TDate;

357

b e g i nt : = Date; //fu n c ţia Date returnează data curenta ShowMessage (DateToStr (t)) t t + 1;ShowMessage(DateToStr(t)) ;

e n d ;

Astfel, dacă se doreşte mărirea cu o secundă a unui timp, atunci se adaugă o valoarea 1000/MSecsPerDay:

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

t : TTime; b e g i n

t : = Time; // funcţia Time retumeaza ora curenta ShowMessage(TimeToStr(t)); t := t + 1000/MSecsPerDay;// am adaugat aceasta valoare deoarece // o secunda are 1000 de milesecunde ShowMessage(TimeToStr(t));

e n d ;

De asemenea pentru a compara două variabile dată/timp pot fi folosiţi operatorii relaţionali uzuali (=, <, >, o , >=, <=)•

Exemplu:

! Următoarea aplicaţie compară două date calendaristice şi afişează unmesaj sugestiv referitor la relaţia dintre ele. Datele sunt citite cu ajutorul unei componente TDateTimePicker care va fi prezentată mai jos în acest capitol.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

o b j e c t Buttonl: TButton Caption = 'Compara'

e n do b j e c t DateTimePickerl: TDateTimePicker DateFormat = dfshort DateMode = dmComboBox Kind = dtkDate

e n do b j e c t DateTimePicker2: TDateTimePicker DateFormat = dfshort DateMode = dmComboBox Kind = dtkDate

e n d

Handlerul de evenimente al obiectului Buttonl este:

p r o c e d u r e TForml.ButtonlClick(Sender: TObject); v a r

dl, d2 : integer;

358

b e g i ndl := trunc(DateTimePickerl.Date); // vom lua doar partea reprezentând data <3.2 := trunc (DateTimePicker2 .Date) ; i f dl < d2 t h e n ShowMessage('<1) e l s e i f dl = d2

t h e n ShowMessage('=') e l s e ShowMessage('>');

e n d ;

24.5. Funcţii şi proceduri

în cele ce urmează sunt prezentate o serie de funcţii şi proceduri utile lucrului cu variabile de tip TDateTime (respectiv TDate şi TTime).

FI. D ate

function Date: TDateTime;

Returnează data curentă.

F2. Time

function Time: TDateTime;

Returnează timpul curent.

F3. Now

function Now: TDateTime;

Returnează data şi timpul curent.

F4. IncMonth

function IncMonth(const Date: TDateTime;NumberOjMonths: Integer): TDateTime;

Adaugă NumberOjMonths la data Date şi returnează noua dată rezultată. NumberOfMonths poate fi şi negativă semnificând întoarcerea la o dată precedentă lui Date.

F5. IsLeapYear

function IsLeapYear(Year. Word): Boolean;

Returnează true dacă anul Year este an bisect.

359

procedure DecodeTime(77we: TDateTime;var Hour, Min, Sec, MSec: Word);

Decodifică timpul stocat în obiectul Time în valorile componente: oră (hour), minut (min), secundă (sec) şi milisecundă (msec).

F7. EncodeTime

function EncodeTime(//owr, Min, Sec, MSec: Word): TDateTime;

Codifică valorile Hour, Min, Sec, MSec într-un obiect TDateTime pe care îl returnează.

F8. DecodeDateprocedure DecodeDate(£toe: TDateTime;

var Year, Month, Day: Word);

Decodifică data stocată în obiectul Date în valorile componente: an (year), lună (month) şi zi (day).

F9. EncodeDate

function EncodeDate( Year, Month, Day: Word): TDateTime;

Codifică valorile Year, Month, Day într-un obiect de tip TDateTime pe care îl returnează.

FIO. StrToTime

function StrToTime(const S: string): TDateTime;

Converteşte o valoare şir de caractere care conţine valori pentru oră, minut, secundă, milisecundă, într-un obiect TDateTime.

F I I . TimeToStr

function TimeToStr(T/me: TDateTime): string;

Converteşte timpul Time într-un şir de caractere şi returnează rezultatul. Şirul returnat va conţine ora, minutul şi secunda.

F12. StrToDate

function StrToDate(const S: string): TDateTime;

Converteşte o valoare şir de caractere care conţine valori pentru an, lună, zi, într-un obiect TDateTime.

F6. DecodeTime

360

F13. DateToStr

function DateToStr(£toe: TDateTime): string;

Returnează data curent stocată în obiectul D ate , sub forma unui şir de caractere.

F14. StrToDateTime

function StrToDateTime(const S: string): TDateTime;

Converteşte o valoare şir de caractere care conţine valori pentru an, lună, zi, oră, minut, secundă, milisecundă, într-un obiect TDateTime.

F15. DateTimeToStr

function DateTimeToStr(Datfe77me: TDateTime): string;

Returnează data şi timpul stocate în obiectul DateTime sub forma unui şir de caractere.

F16. DayOfWeek

function DayOfWeek (Date: TDateTime): Integer;

întoarce ziua din săptămână pentru data specificată în variabila Date. Prima zi din săptămână este considerată Duminică. Valorile returnate de funcţie sunt numere întregi în intervalul 1..7.

Exemplu:

Următoarea aplicaţie afişează ziua curentă din săptămână sub forma unui şir de caractere conţinând numele zilei.

procedure TForml.ButtonlClick(Sender: TObject); var

d: TDateTime;zile: array[1..7] of string;

beginziletl] := 'Duminica'; zile[2] := 'Luni'; zile[3] := 'Marti'; zile[4] := 'Miercuri'; zile [5] := 'Joi ' zile[6] := 'Vineri'; zile[7] := 'Sambata';ShowMessage('Astăzi este ' + zile[DayOfWeek(Now)]);

end;

361

24.6. TDateTimePicker

Ierarhie

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TDateTimePicker.

Definit în_____________________________________________________

com ctrls.pas

Pagina ______________________________________________

Win32

Proprietăţi___________________________________________________

PI. CalColors

property CalColors: TMonthCalColors;

Indică culorile folosite pentru fiecare parte din calendar. Clasa TMonthCalColors are următoarele proprietăţi: MonthBackColor, TextColor, TitleBackColor, TitleTextColor, TrailingTextColor care

I indică culorile pentru fundalul principal (acolo unde sunt afişate datele),textul cu care aceste date sunt afişate (în cazul în care fac parte din luna curent selectată), fundalul de titlu (acolo unde sunt afişate numele lunii şi anul), textul de titlu (care indică numele Junii şi anul), textul cu care sunt afişate datele care nu fac parte din luna curent selectată.

Exemplu:

Următoarea aplicaţie setează culorile unui calendar. Pentru aceasta este folosită o componentă de tip TRadioGroup care are itemurile: MonthBackColor, TextColor, TitleBackColor, TitleTextColor şi TrailingTextColor.La apăsarea butonului Buttonl este afişată o fereastră de dialog (C olorD ialogl) pentru selectarea culorii. în funcţie de itemul selectat din RadioGroupl se vor schimba culorile diferitelor părţi ale componentei D ateTim ePickerl.

Valorile proprietăţilor obiectelor de pe forma Forml sunt:

object Buttonl: TButtonCaption = 'Schimba Culoarea1

endobject DateTimePickerl: TDateTimePicker

362

DateFormat = dfShort DateMode = dmComboBox Kind = dtkDate

endobject RadioGroupl: TRadioGroup

Caption = 'Culoare calendar'Items.Strings = (

'MonthBackColor''TextColor'’Ti tleBackColor''TitleTextColor''TrailingTextColor ')

endobject ColorDialogl: TColorDialog end

I landlerele de evenimente ale obiectelor de pe forma Form l sunt:

procedure TForml.ButtonlClick(Sender: TObject); begin

if C o lo r D ia lo g l . E x ecu te // daca a fost selectata o culoare then // si s-a apasat butonul okwith D a te T im e P ic k e r l .C a lC o lo r s do

case R a d io G ro u p l. I te m ln d e x of-1 : ShowMessage('Nici un item selectat');0 : MonthBackColor := ColorDialogl.Color;1 : TextColor := ColorDialogl.Color;2 : TitleBackColor := ColorDialogl.Color;3 : TitleTextColor := ColorDialogl.Color;4 : TrailingTextColor := ColorDialogl.Color;

end;end;

P2. Kind

property Kind : TDateTimeKind;

Indică dacă componenta TDateTimePicker este folosită ca selector de dată sau de timp. Valori posibile pentru TDateTimePicker sunt:

V a lo a re S em n ifica ţie

dtkTime C om ponen ta v a a fişa şi v a m anipu la ore.

dtkDate C om ponenta va afişa şi v a m anipu la date calendaristice.

P3. DateM ode

property DateMode : TDTDateMode;

Dacă valoarea lui DateM ode este dmComboBox, atunci componenta afişează (în*cazul în care Kind este setată la dktDate) un calendar din care utilizatorul poate selecta data dorită. Dacă valoarea lui DateM ode

363

este dm lfpDown, atunci componenta nu mai afişează calendarul prietenos, ci permite utilizatorului să selecteze data (sau timpul) cu ajutorul unei componente TUpDown.

P4. Date

property Date : TDate;

Indică data selectată de utilizator.

Exemplu:

Următoarea aplicaţie permite selectarea unei date calendaristice cu ajutorul componentei TDateTimePicker. La închiderea calendarului este afişat un mesaj cu data aleasă.

Fişierul .dfm conţine:

object DateTimePickerl: TDateTimePicker DateFormat = dfLong OnCloseUp = DateTimePickerlCloseUp

endHandlerul de evenimente este:procedure TForml.DateTimePickerlCloseUp(Sender: TObject); begin

if DateTimePickerl-Kind = dtkDatethen ShowMessage('Data selectata este:' +

DateToStr(DateTimePickerl.Date));end;

P5. Time

property T im e: TTime;

Indică timpul setat de către utilizator.

P6. DateTime

property DateTime : TDateTime;

Indică data şi timpul setate de către utilizator.

P7. M axDate

property M axD ate: TDate;

Indică data maximă până la care utilizatorul poate parcurge calendarul.

364

P8. M inDate

property M inD ate: TDate;

Indică data minimă de la care utilizatorul poate parcurge calendarul.

P9. DateFormat

property DateForm at: TDTDateFormat;

Indică modul în care este afişată o dată. Valori posibile pentru DateForm at sunt:

V a lo a re ' S em n ifica ţie

DfShort Pentru afişare se fo loseşte form atul scurt (ex. 7/11/2001).

DfLong Pentru afişare se fo loseşte form atul lung (ex. 7 no iem brie 2001).

Evenimente______________________________________________ ___

E l. OnChange

property OnChange : TNotifyEvent;

Apare când utilizatorul selectează o dată sau un timp nou.

E2. OnDropDown

property OnDropDown: TNotifyEvent;

Apare când este afişat calendarul din care utilizatorul îşi poate selecta o dată.

E3. OnCloseUp

property OnCloseUp : TNotifyEvent;

Apare când calendarul din care utilizatorul îşi selectează o dată este închis.

Exemplul 1:

Să reluăm aplicaţia construită mai sus în care foloseam două compo­nente TDateTimePicker pentru compararea a două date calendaristice. Acolo foloseam un buton care declanşa compararea celor două date. Acum vom folosi în locul butonului evenimentul OnCloseUp al celei de a doua componente TDateTimePicker.

365

Noul handler de evenimente va fi:

procedure TForml.DateTimePicker2CloseUp(Sender: TObject);var dl, d2 : integer;

begindl := trunc (DateTimePickerl .Date) ; / / vom lua doar partea d2 := trunc (DateTimePicker2 . Date) ; // reprezentând data if dl < d2 then ShowMessage('<') else if dl = d2

then ShowMessage (.’ = ') else ShowMessage(’>');

end;

Exemplul 2:

Următoarea aplicaţie calculează numărul de zile care au trecut de la naşterea unui om până la o dată specificată de utilizator.Vom folosi două componente TDateTimePicker în care vom introduce cele două date: data naşterii (în D ateTim ePickerl) şi data curentă (în DateTim ePickerl).

procedure TForml.DateTimePicker2CloseUp(Sender: TObject); begin

ShowMessage(IntToStr(trunc(DateTimePicker2.Date-DateTimePickerl.Date)) + ' zile');

end;

Exemplul 3:

Următoarea aplicaţie calculează cu câte zile este mai mare o persoană decât cealaltă.Vom folosi două componente TDateTimePicker în care vom introduce cele două date: data naşterii primei persoane (în DateTim ePickerl) şi data naşterii celei de a doua persoane (în DateTimePicker2).

Proprietăţile obiectelor de pe formă sunt:

object Labell: TLabel Left = 56 Top = 104 Width = 143 Height = 13Caption = ’Data de naştere a persoanei 1'

endobject Label2: TLabel

Left = 328 Top = 104 Width = 143 Height = 13Caption = 'Data de naştere a persoanei 2'

end

366

object DateTimePickerl: TDateTimePicker Left = 56 Top = 120DateFormat = dfLong

endobject DateTimePicker2: TDateTimePicker

Le f t = 328 Top = 120DateFormat = dfLong

endobject Buttonl: TButton

Left = 240 Top = 224 Width = 7 5 Height = 25 Caption = 'Cate Zile?'OnClick = ButtonlClick

endHandlerele de evenimente sunt:

uses DateUtils;procedure TForml.ButtonlClick(Sender: TObject); begin

ShowMessage(IntToStr(DaysBetween(DateTimePickerl.Date, DateTimePicker2.Date)) +

end;zile');

367

25. GRIDURI

Grid-urile sunt componente care permit afişarea informaţiei într-o formă tabelară. Unitatea de bază a unui grid este celula. Un grid are o parte fixă şi o parte care poate fi defilată. Partea fixă constă dintr-un număr de celule aflate în stânga şi în partea de sus a grid-ului. Celulele fixe sunt specificate prin intermediul proprietăţilor FixedCols şi FixedRows. Accesarea celorlalte celule se poate face fie prin intermediul proprietăţii Cells (a componentei TStringGrid) fie cu ajutorul metodei CellRect (a componentei TDrawGrid) care returnează dreptunghiul ce înconjoară celula.

într-o celulă a unui grid se poate desena un grafic (componenta TDrawGrid) sau se poate afişa un text (componenta TStringGrid).

25.1. TCustomGrid

Este clasa de bază care defineşte comportamentul primar al grid-urilor.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGrid

Definit în_____________________________________________________

grids.pas

Proprietăţi___________________________________________________

PI. Col

property Col: Longint;

Indică numărul de ordine al coloanei care conţine celula selectată.

P2. Row

property Row: Longint;

Indică numărul de ordine al liniei care conţine celula selectată.

368

P3. ColCount

property ColCount: Longint;

Indică numărul de coloane ale unui grid.

P4. RowCount

property RowCount: Longint;

Indică numărul de linii ale unui grid.

Observaţie:

Folosind proprietăţile RowCount şi ColCount se poate modifica struc­tura unui grid. Coloanele se vor adăuga sau şterge în partea dreaptă a gridului. Liniile vor fi adăugate sau şterse din partea de jos a grid-ului.

P5. DefaultColWidth

property DefaultColWidth: Integer;

Indică lăţimea implicită a coloanelor gridului. Lăţimea unei anumite coloane se poate modifica folosind proprietatea ColWidths.

P6. DefaultRowHeight

property DefaultRowHeight: Integer;

Indică înălţimea implicită a liniilor gridului. înălţimea unei anumite linii se poate modifica folosind proprietatea RowHeights.

P7. ColWidths

property ColWidths[/«de;c Longint]: Integer;

Indică lăţimea în pixeli a celulelor fiecărei coloane din grid.

P8. RowHeights

property RowHeights[/rcefex: Longint]: Integer;

Indică înălţimea în pixeli a celulelor fiecărei linii din grid.

P9. EditorM ode

property EditorMode: Boolean;

Indică dacă conţinutul celulei curente se poate edita.

369

P 10 .

P il.

P12.

P13.

P14.

P15.

FixedColor

property FixedColor: TColor;

Specifică culoarea celulelor fixe ale gridului.

FixedCols

property FixedCols: Integer;

Indică numărul celulelor fixe din marginea stângă a gridului. Aceste celule nu pot fi defilate.

FixedRows

property FixedRows: Integer;

Indică numărul celulelor fixe din partea de sus a gridului. Aceste celule nu pot fi defilate.

Options

property Options: TGridOptions;

Reprezintă un set de opţiuni care definesc comportamentul unui grid. Tipul TGridOptions este definit astfel:

TGridOptions = set of TGridOption;

iar tipul TGridOption este definit:

TGridOption = (goFixedVertLine, goFixedHorzLine,goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving, goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor, goThumbTracking);

LeftCol

property LeftCol: Longint;

Indică numărul de ordine al celei mai din stânga coloane vizibile.

TopRow

property TopRow: Longint;

Indică numărul de ordine al celei mai de sus linii vizibile.

370

P16. ScrollBars

property ScrollBars: TScroilStyle;

Indică tipul barei de defilare folosită pentru a defila celulele unui grid. Valori posibile pentru ScrollBars sunt:

V a lo a re S em n ific a fie

ssNone G rid-ul nu are nici o bară de defilare.

ssHorizontal G rid-ul are o bară orizontală de defilare.

ssVertical G rid-ul are o bară v erticală de defilare.

ssBoth G rid-ul are o bară o rizon tală şi o bară verticală pen tru defilare.

P17. Selection

property Selection: TGridRect;

Specifică marginile selecţiei curente de celule în grid.Tipul TGridRect este definit astfel:

TGridRect = record case Integer of

0: (Left, Top, Right, Bottom: Longint);1: (TopLeft, BottomRight: TGridCoord);

end;

In primul caz se indică numerele de ordine ale primei coloane, primei linii, ultimei coloane, ultimei linii ale selecţie curente.In al doilea caz se indică coordonatele colţurilor din stânga sus şi dreapta jos ale selecţiei curente de celule. Tipul TGridCoord este definit astfel:

TGridCoord = record X: Longint;Y : Longint;

end;

Exemplul 1:

Următoarea aplicaţie calculează suma numerelor înscrise în selecţia de celule a componentei TStringGrid curente. Utilizatorul poate edita conţinutul fiecărei celule.

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

begin s : = 0 ;

371

with StringGridl dofor i := Selection.Top to Selection.Bottom do

for j := Selection.Left to Selection.Right do s := s + StrToInt(Cells [j, i]);

ShowMessage(IntToStr(s)); end;

25.2. TDrawGrid

Este o componentă care permite afişarea de informaţie în formă tabelară. Accesarea unei celule a gridului se face prin intermediul metodei CellRect care returnează dreptunghiul ce înconjoară celula. Folosind proprietatea Canvas se poate desena în interiorul unei celule.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGrid ->TDrawGrid.

Definit în_____________________________________________________

grids

Pagina ___________________

Additional

Metode

M l. CellRect

function CellRect(ACol, ARow. Longint): TRect;

Returnează coordonatele ecran ale celulei de la intersecţia liniei ARow şi coloanei ACol. Dacă celula respectivă nu este vizibilă se returnează un dreptunghi vid.

M2. MouseToCell

procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);

Returnează în perechea (ARow, ACol) coordonatele celulei aflate în poziţia (X, Y) faţă de colţul din stânga sus al grid-ului.

372

Evenimente

E l. OnDrawCell

property OnDrawCell: TDrawCellEvent;

Apare când o celulă trebuie redesenată. Operaţia de redesenare se reali­zează folosind canvas-ul grid-ului. Tipul TDrawCellEvent este definit astfel:

TDrawCellEvent = procedure (Sender: TObject;ACol, ARow: Longint; Rect: TRect;State: TGridDrawState) of object;

unde:

• ACol şi ARow reprezintă indicii celulei care trebuie redesenată.• Rect este dreptunghiul care mărgineşte celula.• State indică starea celulei. Valorile posibile pentru State sunt din

următoarea mulţime:

V a lo a re S em n ifica ţie

g oSelected C elu la este selectată.

goFocused C elu la are focus.

goFixed C elu la este fixă.

E2. OnSelectCell

property OnSelectCell: TSelectCellEvent;

Apare când o celulă este selectată. Tipul TSelectCellEvent este definit astfel:

TSelectCellEvent = procedure (Sender: TObject;ACol, ARow: Longint;var CanSelect: Boolean) of object;

CanSelect trebuie setat la valoare true dacă celula din poziţia {ARow, ACol) poate fi selectată şi false în caz contrar.

Exemplul 1:

Următoarea aplicaţie permite selectarea căsuţelor pentru care suma dintre coloana şi linia pe care se află este un număr impar.

procedure TForml.StringGridlSelectCell(Sender: TObject;ACol, ARow: Integer; var CanSelect: Boolean);

begini f (ACol + ARow) mod 2 = 0

373

then CanSelect := false eise CanSelect := true;

end;

E3. OnGetEditText

property OnGetEditText: TGetEditEvent;

Apare când este dorită valoarea conţinută în celula aflată la intersecţia liniei ARow cu coloana ACol. Tipul TGetEditEvent este definit astfel:

TGetEditEvent = procedure {Sender. TObject;ACol, ARow: Longint; var Value: String) of object;

Value reprezintă textul conţinut în celula (ARow, ACol).

E4. OnSetEditText

property OnSetEditText: TSetEditEvent;

Apare când utilizatorul editează textul dintr-o celulă. Tipul TSetEditEvent este definit astfel:

TSetEditEvent = procedure (Sender: TObject;ACol, ARow: Longint; const Value: String) of object;

Value reprezintă textul conţinut în celula (ARow, ACol).

Exemplul 2:

Următoarea aplicaţie calculează suma numerelor de pe fiecare linie şi fiecare coloană a unei componente TStringGrid şi le afişează în liniile respectiv coloanele fixe ale acestei componente. Utilizatorul poate introduce noi valori în celulele StringGrid-uhii. Sumele de pe linii şi coloane vor fi recalculate în momentul în care utilizatorul schimbă valoarea introdusă într-o celulă.

Valorile proprietăţilor obiectelor de pe forma Form l sunt:

object StringGridl: TStringGridOptions = [goFixedVertLine, goFixedHorzLine, goVertLine,

goHorzLine, goRangeSelect, goEditing]endHandlerele de evenimente ale obiectelor de pe forma Form l sunt:

procedure TForml.FormCreate(Sender: TObject);var i, j : integer;

begin/ / in itia l toa te căsuţele su n t 0for i := 0 to StringGridl.RowCount - 1 do

for j := 0 to StringGridl.ColCount - 1 do

374

procedure TForml.StringGridlSetEditText(Sender; TObject;ACol, ARow: Integer; const Value: String);

var s, i : integer; begin

/ / calculez sum a p e linia A R owS : = 0 ;

for i := 1 to StringGridl.ColCount - 1 do try

s := s + StrToInt(StringGridl.Cells[i, ARow]); except

on EConvertError do ; end;

.StringGridl.Cells[0, ARow] := IntToStr(s );/ / calcu lez sum a pe co loana AColS : = 0 ;

for i := 1 to StringGridl.RowCount - 1 do try

s := s + StrToInt(StringGridl.Cells[ACol, i ]); except

on EConvertError do ; end;

StringGridl.Cells[ACol, 0] := IntToStr(s); end;

StringGridl.Cells[j, i] := IntToStr(0);end ;

25.3. TStringGrid abc

Este o componentă care permite afişarea de text într-o formă tabelară. Accesarea unei celule se face cu ajutorul proprietăţii Cells.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl -> TCustomGrid ->TDrawGrid ->-> TStringGrid

Definit în_____

grids.pas

Pagina_______

Additional

375

Proprietăţi

PI. Cells

property Cells [ACol, ARow: Integer]: string;

Furnizează acces la textul din fiecare celulă a unui grid. ACol indică coloana pe care se găseşte celula, iar ARow indică linia pe care se află celula. Prima linie şi prima coloană au indexul 0.

Exem plul 1:

Următoarea aplicaţie afişează în fiecare celulă a unei componente TStringGrid suma indecşilor liniei şi coloanei pe care se află căsuţa respectivă. In căsuţele fixe este afişat textul 'Linia x', respectiv ’Coloana

/ •procedure TForml.ButtonlClick(Sender: TObject);

var i , j : integer; begin

with StringGridl do begin

// completam coloana fixafor i := 0 to RowCount - 1 do

Cells[0, i] := 'Linia ' + IntToStr(i);

II completam linia fixafor j := 1 to ColCount - 1 do

Cellstj, 0] := 'Coloana ' + IntToStr(j);

// completam restul celulelor for i := 1 to RowCount - 1 do

for j := 1 to ColCount - 1 do Cellstj, i] := IntToStrfi + j);

end;end;

P2. Cols

property Coh[Index: Integer]: TStrings;

Furnizează acces la lista de şiruri din fiecare coloană a unui grid.P3. Rows

property Rows [Index: Integer]: TStrings;

Furnizează acces la lista de şiruri din fiecare linie a unui grid.

376

Exem plul 2:

Următoarea aplicaţie afişează într-o cutie de editare multilinie (M em ol) şirurile din linia curent selectată a componentei Strin gG rid l. Şirurile sunt afişate câte unul pe fiecare linie.

procedure TForml.StringGridlSelectCell(Sender: TObject;ACol, ARow: Integer; var CanSelect: Boolean);

beginMemol.Lines.Assign(StringGridl.Rows[ARow]);

end;

Exem plul 3:

Se consideră două matrici. Se cere să se afişeze produsul lor.Vom considera fiecare matrice ca fiind reprezentată printr-o componentă StringGrid. Deci vom avea pe forma Form l trei componente StringGrid: una corespunzătoare primei matrice, o alta corespunzătoare celei de-a doua matrice şi o a treia pentru matricea produs. Vom mai considera şi patru cutii de editare în care vom introduce dimensiunile (numărul de linii şi numărul de coloane) celor două matrice considerate. Vom mai folosi şi două butoane. Primul buton numit A p lică " are rolul de a seta dimensiunile celor două componente StringGrid corespunză­toare matricelor iniţiale. La apăsarea acestui buton se va afişa un mesaj corespunzător dacă numărul de linii ale primei matrice este diferit de numărul de coloane ale celei de-a doua matrice (condiţie necesară pentru a se putea efectua produsul a două matrici). Dacă datele introduse sunt corecte, la apăsarea acestui buton se vor seta dimensiunile celor trei StringGrid - uri.La apăsarea celui de-al doilea buton se va afişa în cel de-al treilea StringGrid produsul rezultat din înmulţirea matricelor reprezentate în StringGridurile 1 şi 2.

Proprietăţile obiectelor de pe forma Form l sunt:

object StringGridl: TStringGrid ColCount = 2 FixedCols = 0 RowCount = 1 FixedRows = 0Options = [goFixedVertLine, goFixedHorzLine, goVertLine,

goHorzLine, goRangeSelect, goEditing, goAlways ShowEditor]

endobject StringGrid2: TStringGrid

ColCount = 2 FixedCols = 0 RowCount = 2 FixedRows = 0

377

Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goAlwaysShowEdi tor]

object StringGrid3: TStringGrid FixedCols = 0 FixedRows = 0Options = [goFixedVertLine, goFixedHorzLine, goVertLine,

goHorzLine, goRangeSelect, goEditing]

end

endobj ect Editl: TEditendobj ect Edit2: TEditendobj ect Edit3: TEditendobject Edit4: TEditendobj ect BitBtn].; TBitBtn

Caption = 'Calculeaza produs1 OnClick = BitBtnlClick

endobject BitBtn2: TBitBtn

Caption = 'Aplica'OnClick = BitBtn2Click

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

procedure citire_matricel; var

i,j : integer; begin

Forml.StringGridl.Refresh;for i := 0 to Forml.StringGridl.ColCount - 1 do

for j := 0 to Forml.StringGridl.RowCount - 1 doa[i,j] := StrToInt(Forml.StringGridl.Cells[i,j ]);

end;procedure citire_matrice2; var

i,j : integer; begin

Forml.StringGrid2.Refresh;for i := 0 to Forml.StringGrid2.ColCount - 1 do

for j : = 0 to Forml. StringGrid2 . RowCount 1 dob[i,j] := StrToInt (Forml. StringGrid2 . Cells [i, j ]) ,-

end;procedure TForml.BitBtnlClick(Sender: TObject); var

i,j,k ; integer; begin

citire_matricel ,- citire_matrice2 ,-

378

Forml.StringGrid3.Refresh; for i := 0 to StringGridl.ColCount - 1 do

for j := 0 to StringGrid2.RowCount - 1 do begin

c [ i , j ] ; = 0 ;for k := 0 to StringGridl.ColCount - 1 do

c[i,j] := c[i,j] + a[i,k] * b [ k , j ] ;end;

for i := 0 to StringGridl.ColCount - 1 do for j := 0 to StringGrid2.RowCount - 1 do

Forml.StringGrid3.Cells[i,j] : = IntToStr(c[i,j]);

end;

procedure TForml.BitBtn2Click(Sender: TObject); begin

Forml.StringGridl.ColCount := StrToInt(Forml.Editl.Text);Forml.StringGridl.RowCount := StrToInt (Forml. Edit2 . Text) ,- Forml.StringGrid2.ColCount := StrToInt(Forml.Edit3.Text);Forml.StringGrid2.RowCount := StrToInt(Forml.Edit4.Text);if Forml.Editl.Text o Forml.Edit4.Textthen

ShowMessage('Nu se poate efectua inmultirea! Numărul de '+ ' linii ale primei matrici trebuie sa fie egal cu '+' numărul de coloane al matricii a doua.')

else beginForml.StringGrid3.RowCount :=

Forml.StringGrid2.RowCount;Forml.StringGrid3.ColCount :=

Forml. StringGridl. ColCountend;

end;

379

26. TScreen

Reprezintă starea ecranului în care rulează aplicaţia curentă. Toate proprietăţile, metodele şi evenimentele acestei componente se referă doar la aplicaţia curentă chiar dacă în sistem mai rulează alte aplicaţii care, la rândul lor, au forme, controale, etc. active.

Proprietăţi___________________________________________ ________

P I. Forms

property Forms [Index: Integer]: TForm;

Este un vector care conţine toate formele aplicaţiei. Prima formă are indexul 0. Este posibil ca unele forme să fie create la timpul execuţiei aplicaţiei. Aceste forme vor intra în calcul doar din momentul în care vor fi instanţiate şi până în momentul în care vor fi distruse.

P2. FormCount

property FormCount: Integer;

Indică numărul formelor aplicaţiei. Această proprietate este folosită împreună cu Forms pentru a manipula toate formele unei aplicaţii. Următoarea aplicaţie constă din două forme. Pe prima formă se află un buton şi o cutie de editare multiline. La apăsarea butonului se vor afişa informaţii despre cele două forme (şi anume titlul, înălţimea şi lăţimea):

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

beginMemol.Clear;Memol.ScrollBars:=ssVertical ; for i := 0 to Screen.FormCount-1 do begin

Memol.Lines.Add(Screen.Forms[i].Caption);Memol. Lines . Add (IntToStr (Screen. Forms [ .i ] . Height) ) ;Memol.Lines.Add(IntToSt r (Screen.Forms[i] .Width));

end; end;Observăm (din informaţiile afişate de căsuţa de editare multilinie) că nu contează dacă forma a doua este sau nu afişată. Să facem o aplicaţie în care să conteze acest lucru, mai precis să creăm o formă la timpul

380

execuţiei aplicaţiei. Pentru aceasta mai folosim un buton la a cărui apăsare să creăm o nouă formă.Mai întâi, apăsăm primul buton pentru a ne afişa informaţiile despre formele existente. Observăm că doar prima formă este recunoscută. Apăsăm şi cel de al doilea buton. O nouă formă este creată. Acum apăsăm din nou primul buton şi observăm că în cutia de editare multilinie vor apărea informaţii despre două forme:

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

beginMemol.Clear;Memol.ScrollBars:=ssVertical ; for i := 0 to Screen.FormCount-1 do begin

Memol.Lines.Add(Screen.Forms[i].Caption);Memol.Lines.Add(IntToStr(Screen.Forms[i].Height));Memol.Lines.Add(IntToStr(Screen.Forms[i].Width));

end; end;

procedure TForml.Button2Click(Sender: TObject);var Form2:TForm;

beginForm2:=TForm.Create(Application);Form2.Left:=100;Form2.Top:=100;Form2.Width:=100 ;Form2.Height: =100 ;Form2.Caption:=1blabla' ;Form2.Name:='Form2';Form2 .Visible:=true;

end;

Evident, cu ajutorul lui Forms şi FormCount pot fi modificate proprie­tăţile unei forme. Următorul exemplu modifică titlul şi lăţimea primei forme din Forms'.

procedure TForml-ButtonlClick(Sender: TObject); begin

Screen.Forms[0].Caption:= 'Noul titlu';Screen.Forms[0].Width:=Screen.Forms[0].Width div 2;

end;

P3. ActiveForm

property ActiveForm: TForm;

Reprezintă forma activă (cea care are focus) a aplicaţiei. Este tot o pro­prietate Read-Only, deci nu se i se poate atribui nici o valoare. Schim­

381

barea formei active se poate face prin intermediul metodei SetFocus. La schimbarea formei active apare evenimentul OnActiveFormChange.

P4. CustomForms

property CustomForms[/ndex: Integer]: TCustomForm;

Este asemănătoate cu Forms dar, de data aceasta, sunt luate în calcul nu numai formele ci şi paginile de proprietăţi.

P5. CustomFormCount

property CustomFormCount: Integer;

Este asemănătoare cu FormCount dar, de data aceasta, pe lângă forme sunt numărate şi paginile de proprietăţi.

P6. ActiveCustomForm

property ActiveCustomForm: TCustomForm;

Conţine forma sau pagina de proprietăţi care are focus.

P7. DataM odules

property DataModules[/mfe*: Integer]: TDataModule;

Este lista cu modulele de date care sunt instantiate la un moment dat de către aplicaţie.

P8. DataM oduleCount

property DataModuleCount: Integer;

Indică numărul modulelor de date instanţiate la un moment dat de către aplicaţie.

P9. ActiveControl

property ActiveControl: TWinControl;

Indică care control este activ, adică are focus. Este tot o proprietate Read-Only, iar schimbarea controlului activ se poate face prin inter­mediul metodei FocusedControl. Evident, controlul activ se află pe ActiveForm. La schimbarea controlului Active Control apare evenimen­tul OnActiveControlChange.Următoarea aplicaţie 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 făcută manual, în cazul nostru prin intermediul procedurii SchimbaControl care are prototipul definit în secţiunea p rivate a clasei TForml astfel:

procedure TForml. SchimbaControl (Sender-.TObject) ; begin

Editl.Text:=Screen.ActiveControl.Name; end;

procedure TForml.FormCreate(Sender: TObject); begin

Screen.OnActiveControlChange:=SchimbaControl; end;

P10. Cursors

property Cursors [Index: Integer]: HCursor;

Este un vector cu toate cursoarelor disponibile aplicaţiei. Un nou cursor poate fi adăugat acestei liste în felul următor:

a. Creaţi un cursor folosind editorul de cursoare (spre exemplu: Im age E d ito r ).

b. în vectorul Cursors stabiliţi-i poziţia astfel încât să nu intre în conflict cu alte cursoare deja existente.

c. Obţineţi un handle la el folosind funcţia API LoadCursor care are doi parametrii: primul este un handle la instanţa aplicaţiei, iar al doilea este numele care identifică cursorul.

constcrMyCursor = 5 ;

procedure TForml.FormCreate(Sender: TObject) ,- begin

Screen.Cursors[crMyCursor] :=LoadCursor (Hlnstance, 'NewCursor' ) ,-

Cursor := crMyCursor; end;

P i l . Cursor

property Cursor: TCursor;

Reprezintă cursorul aplicaţiei. Dacă această proprietate este setată la crDefault atunci diferite componente vor putea avea tipul de cursor propriu.De exemplu, la apăsarea butonului Buttonl, cursorul aplicaţiei va fi setat la crHelp. Chiar dacă cursoarele diferitelor componente au alte valori, va fi afişat doar cursorul de help:

383

procedure TForml.ButtonlClick(Sender: TObject); begin

Screen.Cursor:=crHelp; end;

P12. Fonts

property Fonts: TStrings;

Este lista cu toate numele de fonturi disponibile în sistem.

Exem plul 1:

Următoarea aplicaţie ne returnează lista cu toate fonturile disponibile în sistem. Pentru aceasta avem nevoie de o cutie de editare multilinie în interiorul căreia vom scrie numele fonturilor (câte unul pe linie) şi un buton la a cărui apăsare declanşăm operaţia de detectarea fonturilor. Deci handlerul de evenimente pentru acel buton este:

procedure TForml.ButtonlClick(Sender: TObject); begin

Memol.Lines;=Screen.Fonls; end;

Exem plul 2:

Următoarea aplicaţie afişează u text folosind diferite fonturi. Pentru aceasta avem nevoie de un ComboBox în care să punem toate numele de fonturi şi din care apoi să alegem ce font dorim, de o componentă TLabel la care să-i schimbăm proprietatea Font şi de un buton la a cărui apăsare să iniţializăm datele cu ce ne este necesar:

procedure TForml.ButtonlClick(Sender: TObject); begin

ComboBoxl.Style:=csDropDownList;ComboBoxl.Items :=Screen.Fonts;Labell.Caption;='Acesta este un test';

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

Labell.Font.Name:=ComboBoxl.Items.Strings[ComboBoxl.Itemlndex];

end;

P13. Heigth

property Height: Integer;

Indică înălţimea ecranului aplicaţiei în număr de pixeli.

384

P14. Width

property Width: Integer;

Indică lăţimea ecranului în număr de pixeli.

O bservaţie:

Aceste două proprietăţi pot fi folosite pentru redimensionarea ferestrelor astfel încât să încapă în ecran.

Metode______________________________________________________

M l. Create

constructor Create(A Owner. TComponent); override;

Crează o instanţă a lui TScreen. Nu apelaţi această metodă. Mai degrabă folosiţi variabila Screen, care este creată şi iniţializată de către mediu, tot prin intermediul metodei Create.

M2. Destroy

destructo r Destroy; override;

Este destructorul clasei. Nu apelaţi această metodă pentru variabila Screen deoarece Delphi face eliberarea resurselor utilizate.

Evenimente ______________________________________________

E l. OnActiveControlChange

property OnActiveControlChange: TNotifyEvent;

Este apelat imediat după ce focusul se mută la un alt control.

E2. OnActiveFormChange

property OnActiveFormChange: TNotifyEvent;

Apare imediat după ce focusul a fost schimbat la o altă formă. Acest eveniment este util doar într-o aplicaţie cu mai multe forme.

385

27. CLIPBOARDUL

Este un loc de stocare temporară a informaţiei rezultată în urma unei operaţii de tip Cut sau Copy. Orice tip de dată poate fi plasată în Clipboard. Această plasare este totuşi condiţionată de formatele de date pe care le cunoaşte Clipboardul. Obţinerea informaţiilor din acest container se face în urma unei operaţii de tip Paste. Un lucru important de reţinut în privinţa Clipboard-ului este faptul că conţinutul său nu se pierde decât la o nouă operaţie Cut sau Copy (când o altă informaţie este depusă în el) sau la resetarea Windows-ului.

Componenta TClipboard din Delphi încapsulează funcţiile Clipboard- ului Windows. Ea este definită în unitul clipbrd.pas care trebuie inclus de fiecare dată când se foloseşte această componentă non-vizuală. Acest unit mai oferă şi o funcţie C lipboard:

function Clipboard: TClipboard;

care returnează o instanţă a lui TClipboard. Delphi instanţiază un singur obiect Clipboard de fiecare dată când este necesară o operaţie de tip Cut, Copy sau Paste. Dacă aplicaţia nu a folosit niciodată Clipboardul atunci funcţia Clipboard crează o instanţă a lui TClipboard. Dacă aplicaţia a mai folosit şi înainte Clipboardul atunci funcţia Clipboard returnează anterioara instanţiere a lui TClipboard.

Observaţie:

Este indicat să folosiţi funcţia Clipboard decât să instanţiaţi un nou obiect a lui TClipboard.

Proprietăţi___________________________________________________

P I. AsText

property AsText: string;

întoarce sau setează conţinutul Clipboardului sub formă de şir de caractere care nu depăşeşte 255 de caractere. Această proprietate poate fi folosită atât pentru obţinerea conţinutului Clipboardului:

sir:=Clipboard. AsText;

cât şi pentru setarea conţinutului Clipboardului:

386

Clipboard. AsText:=sir;

Pentru a manipula şiruri mai mari de 255 de caractere folosiţi metodele SetTextBuf şi GetTextBuf

P2. Formats

property Formats!/nrfe.*: Integer]: Word;

Returnează numărul de formate distincte în care se găsesc datele disponibile în Clipboard la un moment dat. Este Read-Only.

P3. FormatCount

property FormatCount: Integer;

Indică numărul de formate ale vectorului Formats.

Metode__________________________________________________

M l. Assign

procedure Assign(& wce: TPersistent);

întoarce sau setează conţinutul Clipboardului. Această metodă este asemănătoare cu proprietatea AsText, dar în cazul de faţă se poate asigna orice tip de obiect care derivă din TPersistent. De exemplu, pentru a se copia o imagine în C lipboard executăm următoarea instrucţiune:

Clipboard. Assign(Bitmap);

iar pentru a obţine o imagine din Clipboard executăm următoarea ins­trucţiune:

Bitmap. Assign(Clipboard);

M2. Clear

procedure Clear;

Se şterge conţinutul Clipboardului. Metoda Clear este apelată ori de câte ori se face o operaţie de tip Cut sau Copy.

M3. Open

procedure Open;

Deschide Clipboardul pentru a permite copierea de date în el fără a

387

permite altor aplicaţii să le altereze. Această operaţie este utilă atunci când în Clipboard trebuie trimise pe rând mai multe item-uri de informaţie care nu sunt toate disponibile la un moment dat, iar în tot acest timp alte aplicaţii nu au voie să acceseze Clipboardul. După apelarea metodei Close alte aplicaţii au voie să acceseze Clipboardul.Nu este obligatorie folosirea procedurii Open , decât în cazul în care nu se doreşte ca alte aplicaţii să altereze conţinutul Clipboardului. Oricum, după apelarea lui Close, toate aplicaţiile îi pot manipula conţinutul.

M4. Close

procedure Close;

închide Clipboardul dacă este cumva deschis. După închidere, acesta poate fi accesat şi de către alte aplicaţii. Este posibil ca metoda Open să fie apelată de mai multe ori. în acest caz pentru ca Clipboardul să fie accesibil trebuie apelată metoda Close tot de atâtea ori de cât a fost apelată Open.

Exem plul 1:

Să facem o aplicaţie care are trei butoane. Primul (Buttonl) apelează metoda Open şi deci alte aplicaţii nu au voie să acceseze Clipboardul. Al doilea îl închide, adică apelează metoda Close, iar apoi afişează conţinutul lui. Al treilea buton (Button3) adaugă date în Clipboard. Datele care sunt adăugate sau afişate se iau din cutia de editare E ditl.

Handlerele de evenimente pentru cele trei butoane sunt următoarele:

procedure TForml.ButtonlClick(Sender: TObject); begin

Clipboard.Open; end;

procedure TForml.Button2Click(Sender: TObject); begin

Clipboard.Close;Editl.Text:=Clipboard.AsText;

end;

procedure TForml,Button3Click(Sender; TObject);var s :string;

begins :=Editl.Text;ClipBoard.SetTextBuf(Pointer(s));E ditl.dead­

end;

388

Pentru o mai bună înţelegere a modului în care funcţionează acest exemplu v-aş ruga să lansaţi în execuţie şi aplicaţia ClipboardViewer din Start\Programs\Accessories. Pentru început facem click pe butonul Buttonl. In acest moment în ClipboardViewer apare mesajul Cannot open Clipboard deci conţinutul lui nu va putea fi accesat din alte aplicaţii. Pentru a vedea cum funcţionează Open-urile imbricate mai apăsăm încă o dată pe Buttonl. Apoi scriem ce dorim în E ditl şi apăsăm Button3. Textul este mutat în Clipboard, dar noi avem afişat mesajul Cannot open Clipboard. Apoi apăsăm de două ori pe Button2 (deoarece am deschis Clipboardul de două ori) şi mesajul Cannot open Clipboard va dispare din ClipboardViewer, în locul lui apărând textul scris de noi.

M5. GetBufSize

function GetTextBuf(Buffer. PChar; BufSize: Integer): Integer;

Returnează primele BufSize caractere din Clipboard în zona de memorie spre care indică variabila Buffer. Funcţia întoarce numărul de caractere copiate. Acest număr poate fi diferit de BufSize în cazul în care nu sunt suficiente caractere în Clipboard.

M6. SetTextBuf

procedure SetTextBuf(Ba//er: PChar);

Copiază zona de memorie spre care pointează Buffer în Clipboard.

Exemplul 2:

Să realizăm un exemplu care să pună în lumină folosirea acestor două metode. Pentru aceasta ne vom folosi de două butoane: primul, Buttonl, care mută conţinutul cutiei de editare E ditl în Clipboard şi al doilea buton, Button2, la a cărui apăsare conţinutul Clipboardului este copiat în E d itl .

Cele două handlere de evenimente sunt:

procedure TForml.ButtonlClick(Sender: TObject); var s:string;

beginS:=Editl.Text;Clipboard.SetTextBuf(Pointer(s));

end;

procedure TForml.Button2Click(Sender: TObject); var p :PChar;

beginp : =StrAlloc (10) ;Clipboard.GetTextBuf(p,10);

389

Editl.Text:=p; end;

Şi componentele pot fi mutate prin intermediul Clipboardului, şi anume:

M7. SetComponent

procedure SetComponent( Component: TComponent);

Copiază o componentă în Clipboard.

M8. GetComponent

function GetComponent(Owner, Parent: TComponent): TComponent;

Returnează o componentă aflată în Clipboard şi îi setează acesteia pro­prietăţile Owner şi Parent în conformitate cu valorile transmise ca parametru.

Atenţie!

Trebuie făcută distincţie între proprietatea Owner şi proprietatea Parent. Proprietatea Owner este setată, pentru o componentă oarecare, la valoarea parametrului transmis metodei Create a acesteia. De exemplu toate componentele de pe o formă sunt proprietatea formei, pe când proprietatea Parent a unei componente poate fi şi, de exemplu, un Panel.

Exem plul 3:

Următorul exemplu este o aplicaţie care conţine două forme, două butoane şi o cutie de editare (toate trei aflându-se pe forma F orm l). La apăsarea lui Buttonl cutia de editare E ditl este copiată în Clipboard, iar la apăsarea lui Button2 componenta TEdit din Clipboard este copiată pe forma Form2.

Handlerele de evenimente pentru cele două butoane sunt (nu uitaţi să includeţi uniturile ClipBrd şi Unit2):

procedure TForml.ButtonlClick(Sender: TObject); begin

Clipboard.SetComponent(Editl); end;procedure TForml.Button2Click(Sender: TObject);

var c:TComponent; begin

RegisterClass(TEdit);c :=Clipboard.GetComponent(Form2,Form2);Form2.Show;

390

en d ;

în exemplul de mai sus am folosit şi procedura RegisterClass. Este necesar acest lucru: de fapt este necesară înregistrarea oricărei clase care trebuie adusă din clipboard. în caz contrar este generată o excepţie din clasa EClassNotFound. înregistrarea unei componente nu face ca clasa componentei să fie înregistrată.

M9. HasFormat

function HasFormat(Forma?: Word): Boolean;

Returnează true dacă printre formatele în care se află datele din Clipboard se găseşte şi Format. Unele dintre valorile posibile pentru Format sunt: CF_TEXT, CF_BITMAP, CF_MET AFILEPICT, CF_PICTURE, CF_OBJECT.

391

28. TApplication

Este o clasă care încapsulează o aplicaţie WINDOWS. Metodele, proprietăţile acestei clase reflectă fundamentele stabile în Windows privitor la modul de a crea, distruge, menţine, etc. o aplicaţie. De aceea TApplication simplifică interfaţa dintre mediul Windows şi utilizator când acesta scrie aplicaţii pentru acest sistem. Fiecare aplicaţie Delphi instanţiază automat o variabilă numită Application de tip TApplication. Această componentă nu este vizuală (deci nu apare în ComponentPalette), dar, totuşi, unele dintre valorile proprietăţilor pot fi setate la momentul proiectării aplicaţiei din Project\ Options.

Ierarhie______________________________________________________

TO bject-> TPersistent- > TComponent- > TApplication

Proprietăţi___________________________________________________

PI. Active

property Active: Boolean;

Returnează true dacă aplicaţia este activă şi are focus. Active este setată la true în constructorul aplicaţiei. Proprietatea este Read-Only.

P2. ExeName

property ExeName: string;

Este numele aplicaţiei. Această proprietate este Read-Only. Valoarea ei se poate schimba dacă proiectul se salvează sub un alt nume iar apoi se recompilează.

P3. Handle

property Handle: HWND;

Furnizează accesul la handle-ul de fereastră al formei principale.

P4. HelpFile

property HelpFile: string;

392

Indică numele fişierului Help ataşat aplicaţiei. Valoarea acestei proprie­tăţi poate fi şi şirul vid, în acest caz apelul help-ului va fi ignorat. Este posibil ca o formă să aibă propriul ei help (proprietatea HelpFile a lui TForm). în cazul acesta este apelat helpul formei active şi nu helpul aplicaţiei.

P5. Hint

property Hint: string;

Specifică şirul de caractere care apare ca help hint când mouse-ul trece pe deasupra unei componente. Acest şir este afişat când apare eveni­mentul OnHint.

P6. HintColor

property HintColor: TColor;

Specifică culoarea cutiei în care apare afişat help hint-ul. Implicit este clInfoBk.

P7. HintHidePause

property HintHidePause: Integer;

Specifică intervalul de timp după care help hint-n\ nu va mai fi afişat dacă mouse-ul nu se mută de pe componenta respectivă. Implicit este două secunde şi jumătate.

P8. HintPause

property HintPause: Integer;

Este intervalul de timp care trebuie să treacă înainte ca help hint-u\ să fie afişat când mouse-ul se mută pe o componentă. Implicit este o jumătate de secundă.

P9. HintShortPause

property HintShortPause: Integer;

Indică intervalul de timp pe care sistemul de operare îl aşteaptă înainte ca să afişeze un nou help hint dacă unul a fost deja afişat. Acest lucru este util în momentul în care se trece repede cu mouse-ul de la o componentă la alta. Implicit este 50 de milisecunde.

393

P19. Icon

Este iconul aplicaţiei care va fi afişat în task-bar. Acest icon poate fi diferit de cel al formei principale a aplicaţiei.

property Icon: Tlcon;

P i l . MainForm

property MainForm: TForm;

Indică care formă este principală pentru aplicaţie. Valoarea acestei pro­prietăţi este setată la prima formă creată cu CreateForm. Această valoare nu poate fi modificată la momentul execuţiei ci doar la momen­tul proiectării aplicaţiei din Project\Options. Când forma principală este închisă aplicaţia se termină.

P12. ShowHint

property ShowHint: Boolean;

Indică dacă help hint-w[\e vor fi sau nu afişate în aplicaţie. Valoarea implicită este true.

P13. ShowMainForm

property ShowMainForm: Boolean;

Indică dacă aplicaţia (când se va lansa în execuţie) va afişa sau nu forma principală. Acest lucru este util la crearea serverelor OLE. Implicit este true.

P14. Terminated

property Terminated: Boolean;

Indică dacă aplicaţia a primit sau nu mesajul WM_QUIT care închide aplicaţia. Acest lucru este util în aplicaţiile care trebuie să execute multe calcule. în aceste cazuri este indicat să se apeleze Application.ProcessM essages şi Terminated, periodic, pentru a se vedea dacă trebuie sau nu abandonate calculele şi terminată aplicaţia.

P15. Title

property Title: string;

Indică şirul de caractere care apare în dreptul iconului aplicaţiei când aceasta este reprezentată în task-bar. Acest şir poate fi diferit de

394

proprietatea Caption a formei principale a aplicaţiei. Valoarea acestei proprietăţi este luată din modulul EXE. La momentul proiectării aplica­ţiei valoarea ei poate fi setată din Projects\Options.

Metode

M l. Create

constructor C re a te ^ Owner: TComponent); override;

Este constructorul clasei. Această metodă nu trebuie apelată de către programatorul în Delphi, deoarece acesta crează automat o instanţă a acestei clase pentru fiecare aplicaţie. Această instanţă poate fi accesată prin intermediul variabilei Application.

M2. Destroy

destructo r Destroy; override;

Distruge aplicaţia. Nici această metodă nu trebuie apelată niciodată. Pentru a termina o aplicaţie apelaţi Terminate.

M3. BringToFront

procedure BringToFront;

Face ca ultima formă activă a aplicaţiei să fie pusă deasupra tuturor celorlalte forme.

M4. CreateForm

procedure Cvtait\'orm (TonnClass: TFormCIass; var Reference);

Crează o nouă formă, a cărei referinţă este pasată lui Reference. Această metodă este folosită pentru a crea o nouă formă la momentul execuţiei aplicaţiei. Proprietarul noi forme create va fi chiar aplicaţia. Primul apel al acestei metode va crea forma principală a aplicaţiei.

M5. HandleException

procedure HandleException(Sender. TObject);

Furnizează un mod implicit de a prelucra excepţii. în momentul în care apare o excepţie care trece de toate blocurile try , aplicaţia apelează metoda HandleException. Dacă excepţia nu este de tip EAbort atunci

395

este apelat evenimentul OnException (dacă există unul), iar dacă nu se afişează un mesaj privitor la excepţia în cauză.

M6. HelpContext

function f IclpContext(Context: THelpContext): Boolean;

Apelează help-ul aplicaţiei. Context este identificatorul help de context. De exemplu, dacă Context are valoarea 100 va fi afişat acel ecran al help-ului care are identificatorul de context egal cu 100. Această metodă apelează evenimentul OnHelp.

M7. HelpJump

function HelpJump(const JumplD: string): Boolean;

Din nou apelează help-ul aplicaţiei, de data aceasta topicul căutat în help este dat sub formă de string.

M8. Initialize

procedure Initialize;

Această metodă este prima apelată de către orice proiect Delphi.

M9. MessageBox

function MessageBox(7'ext, Caption: PChar; Flags: Longint): Integer;

Afişează o cutie de dialog cu unul sau mai multe butoane. Caption este titlul cutiei de dialog, Text este textul afişat în ea şi este de obicei o întrebare. Acest text nu poate fi mai lung de 255 de caractere şi este fragmentat de către sistem pentru a putea încape în cutia de dialog.Flags indică felul şi butoanele cutiei. Dintre valorile lui Flags (se pot şi combina aceste valori) amintim:

M B_APPLM ODALEste o fereastră modală, deci aplicaţia nu va rula în continuare până când această fereastră nu este închisă.

M B_DEFB LITTON 1 Primul buton de pc cutia de dialog este cel implicit.

M B_DEFBUTTO N2 Al doilea buton dc pe cutia dc dialog este cel implicit.

M B J3E FBU T T O N 3A l treilea buton de pe cutia de dialog este cel implicit.

M B_DEFBUTTO N4 Al patrulea buton de pe cutia de dialog este cel implicit.

M B J tE L P Este un buton de help. Apăsând acest buton sau

396

tasta FI este generat evenim entul OnHelp.

M BJC O N E X C L A M A T IO N Un sem n de exclamare apare în cutia de dialog.

M B_ICONIN FORMATION Un icon constând în litera i încercuită apare în cutia de dialog.

M B JC O N S T O P Un semn de stop apare în cutia de dialog.

M B_O K Cutia conţine butonul Ok.

M B„O KCANCEL Cutia conţine butoanele Ok şi Cancel.

M B_RETRYCANCEL Cutia conţine butoanele Retry şi Cancel.

M B_Y E SN O Cutia conţine butoanele Yes şi No.

M B_Y ESN O C A N C EL Cutia conţine butoanele Y es, N o şi Cancel.

M B_ABORTRETRYIGNORECutia conţine butoanele ABORT, RETRY şi IGNORE.

M B„RTLREADINGTextul este afişat de la dreapta la stânga în conformitate cu modul de scriere arab.

M B_RIGHT Textul este aliniat la stânga.

Funcţia returnează O, dacă nu este destulă memorie pentru a o crea, sau una dintre următoarele valori:

V aloareV aloare

N um ericăîn sem n ătate

IDABORT 3 Utilizatorul a apăsat butonul Abort.

IDCANCEL 2 Utilizatorul a apăsat butonul Cancel.

IDIGNORE 5 Utilizatorul a apăsat butonul Ingnore.

IDNO 7 Utilizatorul a apăsat butonul No.

IDOK 1 Utilizatorul a apăsat butonul Ok.

IDRETRY 4 Utilizatorul a apăsat butonul Retry.

IDYES 6 Utilizatorul a apăsat butonul Yes.

M10. Minimize

procedure Minimize;

Apelaţi această metodă pentru a minimiza o aplicaţie. Nu confundaţi această metodă cu minimizarea unei forme, lucru care se obţine prin setarea proprietăţii WindowStcite a lui TForm.

397

procedure ProcessMessages;

întrerupe execuţia aplicaţiei pentru a-i permite Windows-ului să proce­seze mesajele din coada de mesaje. Sunt procesate doar acele mesaje care privesc aplicaţia curentă. Această metodă este utilă atunci când sunt făcute calcule multe, în acelaşi eveniment. în acest caz metoda ProcessM essages trebuie apelată periodic pentru ca, de exemplu, inter­faţa aplicaţiei să fie redesenată.

Exemplul 1:

Următoarea aplicaţie arată cum poate fi folosită ProcessM essages. Am spus că această metodă este utilă în cazul în care în interiorul unui eveniment se fac multe calcule (spre un apel recursiv cu multe puncte de întoarcere). Noi vom simplifica puţin lucrurile şi, în locul calculelor complexe, vom implementa un ciclu infinit, deci evenimentul nu se termină. De exemplu, la apăsarea butonului aplicaţia nu mai poate fi controlată în nici un fel (ci doar prin resetarea calculatorului);

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

beginWhile true do

i : = 2 ;end;Dacă aplicaţia de mai sus este rulată în interiorul mediului Delphi ea poate fi întreruptă folosind Run\Program Reset.Dacă în interiorul ciclului introducem un ProcessM essages, aplicaţia va putea fi controlată fără nici o problemă (adică se pot apăsa şi alte butoane, se pot mări, micşora, etc. formele aplicaţiei):

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

beginWhile true do begin

i:=2;Application.ProcessMessages; if Application.Terminated then Exit;

end; end;

M il . ProcessM essages

398

M12. Restore

procedure Restore;

Readuce aplicaţia la mărimea ei normală. Nu confundaţi această metodă cu aducerea unei forme la mărimea normală, lucru care se obţine prin setarea proprietăţii WindowState a lui TForm.

M13. Run

procedure Run;

Execută aplicaţia. Delphi crează automat un bloc principal al progra­mului care apelează această metodă.

A tenţie !

Nu confundaţi această metodă cu lansarea în execuţie a unei alte aplicaţii, lucru care se poate face, de exemplu, cu CreateProcess.

M14. ShowException

procedure ShowException(E: Exception);

Afişează mesajul unei excepţii. Această metodă este apelată dacă nici un handler de evenimente nu este asociat evenimentului OnException.

M15. Terminate

procedure Terminate;

Termină o aplicaţie.

Evenimente

E l. OnActivate

property OnActivate: TNotifyEvent;

Apare când o aplicaţie devine activă, adică când primeşte focus sau când este lansată în execuţie.

E2. OnDeactivate

property OnDeactivate: TNotifyEvent;

Apare când o aplicaţie devine inactivă, adică când este terminată sau când focusul trece la o alta.

399

E3. OnException

Apare când o excepţie a scăpat de toate blocurile except sau finally. în interiorul acestui handler de evenimente trebuie furnizat un nod general de prelucrare a excepţiilor. Dacă nu există un astfel de handler de eveni­mente este apelată metoda ShowException.

E4. OnHelp

THelpEvent = function (Command: Word; Data : Longint;v ar CallHelp: Boolean): Boolean of object;

property OnHelp: THelpEvent;

Apare când a fost iniţiată o cerere de tip help.

E5. OnHint

property OnHint: TNotifyEvent;

Apare când cursorul de mouse se mişcă pe deasupra unui control care poate afişa un help-hint.

Exem plul 2:

Următorul exemplu afişează într-un StatusBar hintul componentelor de pe o formă. Deoarece TApplication nu este o componentă vizuală, ea nu poate fi afişată în O bject Inspector, deci nu i se poate ataşa direct un handler de evenimente pentru evenimentul OnHint (de fapt nu se poate ataşa direct nici un handler pentru nici un eveniment), ci trebuie creată o procedură cu acelaşi tip de parametri ca şi evenimentul, iar apoi trebuie asignată evenimentului în cauză. în cazul nostru procedura se numeşte AfişeazăHint, iar definiţia ei o includem în secţiunea private a clasei:

procedure AfiseazaHint(Sender:TObject);

Implementările necesare sunt:

procedure TForml.FormCreate(Sender: TObject); begin

StatusBarl.SimplePanel:=true;Application.OnHint:=AfiseazaHint;

end;

procedure TForml.AfiseazaHint(Sender:TObject) ; begin

StatusBarl.SimpleText:^Application.Hint; end;

property OnException: TExceptionEvent;

400

E6. OnMessage

TMessageEvent = procedure (var Msg: TMsg; v ar Handled: Boolean)of object;

property OnMessage: TMessageEvent;

Apare când sistemul trimite un mesaj aplicaţiei. Cu ajutorul acestui eve­niment pot fi interceptate toate mesajele pe care Windows-ul le trimite aplicaţiei. Totuşi, deoarece într-o secundă sunt trimise mii de mesaje, utilizarea acestui eveniment duce la încetinirea aplicaţiei.

E7. OnMinimize

property OnMinimize: TNotifyEvent;

Apare când aplicaţia este minimizată.

E8. OnRestore

property OnRestore: TNotifyEvent;

Apare când o aplicaţie anterior minimizată este adusă la forma ei normală.

E9. OnShowHint

property OnShowHint: TShowHintEvent;

Apare când un help-hint este pe cale de a fi afişat. Acest eveniment este util pentru specificarea modului în care este afişat hint-ul respectiv. Tipul TShowHintEvent este definit astfel:

THintlnfo = record HintControl: TControl;HintPos: TPoint;HintMaxWidth: Integer;HintColor: TColor;CursorRect: TRect;CursorPos: TPoint;ReshowTimeout: Integer;HideTimeout: Integer;HintStr: string;

end;

TShowHintEvent = procedure (var HintStr: string;var CanShow: Boolean; v ar Hintlnfo: THintlnfo) of object;

401

unde:

• HintStr este şirul de caractere care conţine textul hint-ului;

• CanShow este true dacă hint-ul se poate afişa;

• Hintlnfo este o variabilă de tip THintlnfo în care sunt reţinute:

- controlul pentru care se afişează hint-ul (HintControl)\- poziţia în care este afişat hint-u\ (HintPos)\- lăţimea //(«/-ului (HintMaxWidth);- culoarea /imf-ului (HintColor);

dreptunghiul în interiorul căruia trebuie să se afle mouse-ul pentru ca hint-ul să apară (implicit este dreptunghiul contro­lului) (CursorRect)\

- poziţia cursorului de mouse în interiorul controlului (•CursorPos)\

- numărul de milisecunde care trebuie să treacă până când hint-ul este afişat din nou, chiar dacă mouse-ul nu a părăsit controlul în cauză (implicit este zero ceea ce indică că hint-ul este afişat doar dacă mouse-ul pleacă şi revine apoi pe control) (ReshowTimeouty,

- valoarea proprietăţii HintHidePause (HideTimeout);- şirul care va fi afişat ca hint (HintStr).

402

29. TIPĂRIREA LA IMPRIMANTĂ

Mediul Delphi permite aplicaţiilor scrise în el să acceseze în două moduri imprimanta, şi anume în mod text şi în modul standard Windows.

29.1. Modul Text

în acest caz imprimanta este considerată ca un dispozitiv standard de tip fişier text, aşa că tipărirea de şiruri de caractere este identică cu scrierea de text într-un fişier pe disc. Următorii paşi trebuie urmaţi pentru a tipări un text la imprimantă:

1. atribuirea unei variabile fişier text la imprimantă;2. deschiderea fişierului pentru scriere;3. scrierea de text în el;4. închiderea fişierului.

Atribuirea de la punctul 1) se face cu ajutorul procedurii AssignPrn definită în unitul Printers astfel:

procedure AssignPrn(var F: Text);

în acest caz tipărirea unei linii Ia imprimantă în mod text se face în felul următor:

uses printers;procedure TForml.ButtonlClick(Sender: TObject);var F: TextFile;

beginAssignPrn(F);Rewrite(F);Writeln(, 'Acesta este un text');CloseFile(F);

end;Tipărirea în mod text a tuturor liniilor unei cutii de editare multi-linie se

face în felul următor (pe formă trebuie să se găsească o astfel de cutie, adică o componentă de tip TMemo):

uses printers;procedure TForml.ButtonlClick(Sender: TObject); var F:TextFile;

i:integer;begin

AssignPrn(F);

403

Rewrite(F);for i:=0 to Memol.Lines.Count-1 do

writeln(F,Memol.Lines.Strings[i)); closeFile (F)

end;

29.2. Mod standard Windows

Tipărirea unui text se poate face în două feluri, şi anume:

1. folosind o componentă TRichEdit în care se introduce textul ce urmează a fi tipărit iar apoi apelarea metodei Print\

2. folosind clasa TPrinter.

Vom analiza pe rând cele două variante subliniind avantajele şi dezavatajele fiecăreia.

I. Folosind metoda Print a componentei TRichEdit nu mai trebuie să scriem atâta cod ca în cazul folosirii componentei TPrinter. Dar, în schimb, nu avem suficient control asupra imprimantei şi a textului trimis spre ea. Mai precis, chiar dacă afişăm o cutie de dialog (TPrintDialog) cu ajutorul căreia selectăm paginile şi numărul de copii care urmează a fi tipărite, aceste lucruri nu vor fi luate în considerare de către metoda Print care tipăreşte o singură dată întreg documentul din cutia de editare respectivă. Ceea ce se poate schimba folosind metoda Print împreună cu o componentă TPrintDialog este tipul imprimantei folosite şi, bineînţeles, proprietăţile acesteia (care se setează apăsând butonul Properties) din respectiva cutie de dialog. în plus, formatarea textului trebuie făcută în interiorul cutie RicliEdit deoarece o linie prea lungă va fi ruptă automat (restul fiind trecut pe linia următoare) dacă se tipăreşte pe o hârtie prea mică. Setarea dimensiunii unei pagini în RichEdit se face cu ajutorul proprietăţii PageRect care este de tipul TRect.

Concluzionând, tipărirea conţinutului unei cutiei RichEditl se face în felul următor:

procedure TEditForm. PrintlClick(Sender: TObject);beginif PrintDialogl.Execute thenRichEditl.Print('Titlul documentului');

end;

în acest exemplu am folosit totuşi o componentă TPrintDialog cu ajutorul căreia se poate schimba imprimanta, dimensiunea foii pe care se tipăreşte, calitatea tipăriturii, etc. Parametrul metodei Print este un şir de caractere care va apărea în Print Manager ca titlu al documentului care se tipăreşte. De obicei, este numele şi calea fişierului ce urmează a fi trimis la imprimantă.

404

II. TPrinter

O altă modalitate de a tipări la imprimantă este oferită de către componenta TPrinter. Vom vedea că acestă componentă ne conferă un control mai puternic asupra textului tipărit. Delphi instanţiază pentru fiecare aplicaţie care foloseşte această componentă (nonvizuală) o variabilă de acest tip, numită Printer. Aşa că, dacă doriţi să folosiţi imprimanta prin intermediul acestei componente, nu apelaţi niciodată metoda Create, ci folosiţi variabila deja instanţiată Printer. Dar mai întâi să vedem care sunt proprietăţile şi metodele acestei componente.

PI. Canvas

property Canvas: TCanvas;

Reprezintă suprafaţa de tipărire a paginii curente. Suprafaţa foii de hârtie se consideră echivalentă cu o suprafaţa pe care se poate desena, scrie cu ajutorul proprietăţilor componentei TCanvas. De exemplu, schimbarea fontului, modului de scriere, a pen-ului, brush-ului, etc. se face tot prin intermediul acestei proprietăţi. De exemplu, pentru ca tipărirea să se facă cu acelaşi font cu care este scris şi textul (în acest exemplul este vorba de tipărirea tot în mod text), vom proceda în felul următor:

procedure TForml.PrintlClick(Sender: TObject); var Line: Integer;

PrintText: TextFile;beginif PrintDialogl.Execute then beginAssignPrn(PrintText);Rewrite(PrintText);Printer.Canvas.Font := Memol.Font; for Line := 0 to Memol.Lines.Count - 1 do Writeln(PrintText, Memol.Lines[Line]);

CloseFile(PrintText); end;

end;

P2. Copies

property Copies: Integer;

Indică numărul de copii curent tipărite ale documentului.

P3. PageHeight

property PageHeight: Integer;

Indică înăţimea în număr de pixeli a paginii care se tipăreşte curent.

405

P4. Page Width

property PageWidth: Integer;

Indică lăţimea în număr de pixeli a paginii care se tipăreşte curent.

P5. PageNumber

property PageNumber: Integer;

Indică numărul paginii care este curent tipărită. Această proprietate este automat incrementată de către metoda NewPage.

P6. Capabilities

property Capabilities: TPrinterCapabilities;

Indică capabilităţile imprimantei curente. Tipul TPrinterCapabilities este definit astfel:

TPrinterCapability = (pcCopies, pcOrientation, pcCollation); TPrinterCapabilities = set of TPrinterCapability;

deci capabilităţile imprimantei se referă la setările curente ale driver-ului de imprimantă şi anume: număr de copii, orientarea şi dacă indicatorul de tipărire în întregime a unei copii înainte ca vreo pagină din celelalte copii să fie tipărită este setat.

P7. Printers

property Printers: TStrings;

Este lista cu toate imprimantele instalate în sistem.

P8. Printerlndex

property Printerlndex: Integer;

Este numărul de ordine din lista Printers a imprimantei curent selectate. Dacă doriţi ca imprimanta implicită să fie cea curentă, atunci setaţi această proprietate la -1 .

P 9. Orientation

property Orientation: TPrinterOrientation;

Indică felul în care se va tipări documentul trimis la imprimantă. Valori posibile pentru Orientation sunt:

406

V aloare Sem nificaţie

p o P o rtra it Documentul se va tipări verical pe pagină.

poL an dscape Documentul se va tipări orizontal pe pagină.

P10. Aborted

property Aborted: Boolean;

Indică dacă utilizatorul a apelat sau nu metoda Abort pentru a termina tipărirea la imprimantă.

P il . Fonts

property Fonts: TStrings;

Reprezintă lista fonturilor suportate de către imprimantă.

P12. Title

property Title: string;

Este titlul care apare în PrintManager când documentul este tipărit. Această proprietate are valoare identică cu parametru metodei Print a lui TRichEdit.

Metode______________________________________________________

M l. Create

constructor Create;

Este constructorul clasei. Nu apelaţi acest constructor deoarece Delphi instanţiază automat un obiect de acest tip şi îl atribuie variabilei Printer.

M2. Destroy

destructor Destroy;

Este destructorul clasei. Nici această metodă nu trebuie apelată deoarece obiectul Printer este automat distrus.

M3. NewPage

procedure NewPage;

Apelarea acestei metode determină ca tipărirea să se facă pe o nouă pagină. Proprietatea PageNumber este incrementată, iar proprietatea Pen

407

a Canvas-\i\u\ este setată la (0,0).

M4. BeginDoc

procedure BeginDoc;

Se începe tipărirea unui nou document la imprimantă. Documentul nu este tipărit efectiv decât după apelarea metodei EndDoc.

M5. EndDoc

procedure EndDoc;

Termină de trimis la imprimantă documentul curent. între această metodă şi BeginDoc trebuiesc introduse instrucţiuni de genul:

Printer.Can vas.OutT ext....

Aceste două metode - BeginDoc şi EndDoc - se comportă ca şi procedurile AssignPrn şi CloseFile. Dacă se apelează metoda BeginDoc şi totuşi nu s-a putut face tipărirea corectă (de exemplu, dacă textul care urma a fi tipărit trebuia citit dintr-un fişier care era distrus) trebuie apelată metoda Abort.

M6. Abort

procedure Abort;

întrerupe trimiterea unui document spre imprimantă. în acest caz toate datele trimise cu ajutorul canvas-ului vor fi pierdute.

Observaţie:

în cazul în care se doreşte întreruperea tipăririi unui document se foloseşte PrintM anager-ul.

Exemplul 1:

Tipărirea unei linii de text se face astfel:uses printers;procedure TPrintForm.BitBtnlClick(Sender: TObject); begin

Screen.Cursor := crHourGlass; try

Printer.BeginDoc; tryWith Printer .Canvas do begin

Font.Name: = 'Arial ’ ;Font.Size:= 10;

408

Font.Style:=[fsBold];TextOut(0,0,'Acesta este un text');

end;Printer.EndDoc;

excepton Exception do Begin

Printer.Abort;Printer.EndDoc;Raise;

end; end;

finallyScreen.Cursor:=crDefault;

end; end;

Tipărirea unei imagini se face astfel:

procedure TForml.PrintlClick(Sender: TObject); beginwith Printer do begin

BeginDoc;Canvas. Draw(0, 0, Imagel. Picture .Graphic) ; {Im aginea v a f i desenată in) EndDoc; {colţul din stânga sus a paginii}

end; end;

29.3. Cutiile de dialog

De un mare ajutor pentru utilizator sunt cutiile de dialog TPrintDialog şi TPrinterSetupDialog. Prima dintre ele afişează un dialog cu privire la docu­mentul care urmează a fi afişat, mai precis număr de copii, care pagini, în ce ordine, tipărire în fişier, etc. Din păcate, interacţiunea cu aplicaţia a acestui dialog este minimă, utilizatorul trebuind să ţină cont de toate aceste lucruri şi să le manipuleze ca atare. Spre exemplu, este inutil ca utilizatorul să seteze că doreşte două copii ale documentului, iar apoi apasă pe butonul OK al dialogului, căci nu se întâmplă nimic dacă în corpul ataşat acestui eveniment (apăsarea lui OK) programatorul nu a scris codul corespunzător tipării docu­mentului (de câte ori trebuie), folosindu-se, spre exemplu, de componenta TPrinter.

în schimb, interacţiunea lui TPrinterSetupDialog cu aplicaţia este maximă, fără a mai fi nevoie ca programatorul să scrie nici un rând de cod pentru setarea imprimantei conform specificaţiilor utilizatorului. Folosirea acestei componente nu este necesară deoarece TPrintDialog are un buton denumit Properties la a cărui apăsare se deschide un dialog pentru setarea imprimantei.

409

Să începem cu prezentarea primeia dintre cele două componente. Datorită faptului că este o cutie de dialog, va avea metoda Execute care are acelaşi efect cu cel de la toate componentele de dialog.

Proprietăţi___________________________________________________

P I. Copies

property Copies: Integer;

Indică numărul de copii setate în PrinterDialog.

P2. Collate

property Collate: Boolean;

Indică dacă cutia de control Collate este vizată sau nu. Dacă este vizată, tipărirea în cazul în care Copies este mai mare decât 1 trebuie să se facă astfel: mai întâi prima copie a întreg documentului, apoi a doua etc. Dacă nu este vizată, atunci tipărirea trebuie făcută astfel: mai întâi prima pagină a documentului de câte ori trebuie, apoi a doua pagină de câte ori trebuie etc.

Un exemplu de folosire a lui Collate împreună cu Copies (celelalte proprietăţi nu sunt luate în calcul) este următorul:

uses Printers;procedure TForml.ButtonlClick(Sender: TObject);var i,k:integer;

beginif PrintDialogl.Execute then begin

Printer.BeginDoc;if PrintDialogl. Collate { Se scoate intai prima copie in

intregime a docum entului) then for k:=l to PrintDialogl. Copies do {iar apoi celelalte copii)

beginfor i:=0 to Memol.Lines.Count do beginif i mod 59=0then Printer.NewPage;Printer.Canvas.TextOut(0,12*(i mod 60),

Memol.Lines!i]); end; { La ultima pagina trebuie testat ce linie este,

pentru ca in caz contrar ){o sa generaţi o excepţie pentru index in afara lim itelor)

Printer.NewPage; end

410

else (se tipăreşte mai intai prima pagina de cate ori este necesar}for k:=l to (Memol.Lines.Count+1 div 60)+l do beginfor i:=l to PrintDialogl.Copies do beginfor j:=0 to 59 doPrinter.Canvas.TextOut(0,12*j,

Memol.Lines[(k-1)* 60+j]);Printer.NewPage;

end;Printer.NewPage;

end;Printer.EndDoc;

end;end;

P3. PrintToFile

property PrintToFile: Boolean;

Indică dacă căsuţa PrintToFile (de tip CheckBox) este sau nu vizată. Pentru ca această căsuţă să apară setaţi flagul poPrintToFile din pro­prietatea Options. Pentru a dezafecta această cutie de editare setaţi flagul poDisablePrintToFile.

P4. PrintRange

property PrintRange: TPrintRange;

Indică tipul de tipărire. Valori posibile pentru PrintRange sunt:

V aloare Sem nificaţie

prAUPagesToate paginile sunt tipărite. Corespunde selectării butonului de radio AII.

prSelection

Doar textul selectat este tipărit. Corespunde selectării butonului de radio Selection. In cazul unei cutii de editare mulţi linie este mai dificil de determinat care este textul selectat. Dacă folosiţi o cutie RichEdit, atunci determinarea selecţiei se face mai uşor deoarece aveţi la dispoziţie evenimentul OnSelectionChange. Determinarea selecţiei se face apoi cu ajutorul proprietăţilor SelStart şi SelLength.

prPageNumsDoar paginile ale căror număr de ordine este introdus vor fi tipărite. Corespunde selectării butonului de radio Pages.

P5. MinPage

property MinPage: Integer;

Indică cea mai mică valoare pe care utilizatorul o poate introduce pentru a specifica un număr de pagină ce urmează a fi tipărită.

411

P 6 . M axPage

Indică cea mai mare valoare pe care utilizatorul o poate introduce pentru a specifica un număr de pagină ce urmează a fi tipărită. Dacă utilizatorul introduce un număr de pagină mai mare atunci se semnalează un mesaj de eroare. Această proprietate poate fi folosită la un editor de texte pentru a specifica numărul de pagini al acestuia.

P7. FromPage

property FromPage: Integer;

Indică numărul paginii de la care să înceapă tipărirea documentului.

P8. ToPage

property ToPage: Integer;

Indică numărul paginii din document până la care se face tipărirea.

P9. Options

property Options: TPrintDialogOptions;

property MaxPage: Integer;

Determină felul cum apare şi cum se comportă cutia de dialog.Valori posibile pentru Options sunt orice submulţime din următoarea mulţime de flaguri:

V aloare Sem n ificaţie

poDisablePrintToFile Dezafectează cutia PrintToFile. Aceasta va fi afişată în continuare dar utilizatorul nu o va putea folosi.

poHelp A fişează un buton de help.

poPageNums

Se permite specificarea unui interval de pagini pentru a fi tipărite. Butonul radio Pages va fi vizibil şi va putea fi selectat. Mai trebuie îndeplinită o condiţie în plus şi anume ca MaxPage să lie strict mai mare decât MinPage.

poPrintToFileA fişează cutia de control PrintToFile. Dacă este setat şi flagul poDisablePrintToFile, atunci această cutie va fi afişată dar nu va fi activă.

poSelectionButonul Selection este posibil a fi selectat. Aceasta înseam nă că utilizatorul doreşte să tipărească doar textul marcat.

poW arningA fişează un mesaj de eroare dacă încercaţi să trimiteţi un text către o imprimantă neinstalată.

412

30. MULTIMEDIA

Aplicaţiile multimedia sunt acele aplicaţii care încorporează sunet şi imagine. Nu vorbim despre multimedia din jocuri din două motive:

1. acestea utilizează facilităţile multimedia la un nivel mult superior;2. afişarea imaginilor şi redarea sunetului în jocuri se realizează în

majoritatea cazurilor, cu ajutorul DirectX-ului.

O simplă aplicaţie multimedia constă dintr-o fereastră în care este afişată o imagine. Aplicaţii mai complexe conţin sunet şi imagini animate. Aplicaţii şi mai complexe permit utilizatorului să interacţioneze cu aceste facilităţi.

Cel mai simplu mod de a încorpora sunet într-o aplicaţie se realizează folosind funcţia API PlaySound. Prototipul “C” al acestei funcţii este:

BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);

unde parametrul pszSound specifică numele fişierului ce conţine sunetul iar parametrul fdwSound este o mulţime de flag-uri ce indică modul în care va fi rulat sunetul. Spre exemplu, rularea unui fişier cu numele sunet.wav se face prin execuţia instrucţiunii:

PlaySound('sunet.wav', NULL, SND_FILENAME);în prealabil trebuie să includeţi unit-ul MMSystem.h. Un mare deza­

vantaj al funcţiei PlaySound este acela că ea nu poate rula fişiere cu sunete de lungime mai mare decât memoria disponibilă.

Mediul Delphi pune la dispoziţia programatorului două componente specializate în manipularea elementelor multimedia: TM ediaPlayer şi TAnimate.

f i30.1. TMediaPlayer ^

Controlează dispozitivele care furnizează un driver MCI (Multimedia Control Interface). Dintre dispozitivele multimedia (care pot fi hard sau soft) amintim: CD-ROM-ul, VCR, secvenţializorul MIDI, Scanner, DiscVideo etc.

Componenta TM ediaPlayer are o interfaţă grafică şi este alcătuită din mai multe butoane. Fiecare dintre acestea poate fi apăsat cu ajutorul mouse- ului, dar ele nu reprezintă componente independente. Această interfaţă este:

413

11 - ► 1 H !► m

Butoanele care alcătuiesc interfaţa grafică a acestei componente sunt:

B u ton V aloare Sem nificaţie

Play btPlay Rulează (play) un clip.

Pause btPauseOpreşte temporar înregistrarea sau rularea. Dacă butonul de pauză este deja apăsat, o nouă apăsare va duce la continuarea operaţiei întrerupte.

Stop btStop Opreşte definitiv rularea sau înregistrarea.

Next btNext Trece la următoarea pistă.

Prev btPrev Trece la pista anterioară.

Step btStep Mută înainte cu un număr de cadre.

Bark btBack Mută înapoi cu un număr de cadre.

Record btRecord Porneşte înregistrarea.

Eject btEject Scoate mediul. Acest buton este utilizat atunci când clip-ul curent este rulat de pe un CD sau VCR.

Ierarhie______________________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TCustomControl.

Definit în_____________________________________________________

m player.pas

Pagina_______________________________________________________

System

Proprietăţi___________________________________________________

PI. AutoOpen

property AutoOpen: Boolean;

Specifică dacă dispozitivul multimedia va fi rulat automat în momentul în care care aplicaţia este lansată în execuţie. Dacă AutoOpen este true, atunci media player-ul încearcă să deschidă dispozitivul multimedia specificat în proprietatea DeviceType (sau FileName dacă DeviceType este dtAutoSelect). Dacă AutoOpen este false, atunci dispozitivul trebuie deschis cu ajutorul metodei Open.

414

P2. DeviceType

Specifică tipul de dispozitiv pe care îl poate deschide un media player. Valori posibile pentru DeviceType sunt: dtAutoSelect, dtAVIVideo, dtCDAudio, dtDAT, dtD igitalVideo, dtMMMovie, dtOther, dtOverlay, dtScanner, dtSequencer, dtVCR, dtVideodisc, sau dtWaveAudio. Implicit este dtAutoSelect.

property DeviceType: TMPDeviceTypes;

P3. D isplay

property Display: TWinControl;

Specifică o fereastră folosită de un dispozitiv multimedia care are nevoie de o fereastră pentru ieşire. Exemple de dispozitive multimedia care au nevoie de o fereastră de ieşire sunt: Animation, AVI Video, D igital Video, Overlay, şi VCR. Implicit este nil. în acest caz dispozitivul creează automat o fereastră.

P4. StarPos

property StartPos: Longint;

Specifică poziţia de start în cadrul mediului curent.

P5. EndPos

property EndPos: Longint;

Specifică poziţia în interiorul mediului curent la care să se oprească rularea sau înregistrarea. EndPos este setată conform valorii proprietăţii TimeFormat.

P6. FileName

property FileName: string;

Specifică numele fişierului în/din care este salvat/încărcat mediul curent.

P7. Frames

property Frames: Longint;

Specifică numărul de cadre cu care mediul poate fi derulat înainte sau înapoi cu ajutorul metodei Step.

415

P8. Length

property Length: Longint;

Specifică lungimea clip-ului curent. Această valoare este specificată folosind formatul de timp.

P9. Position

property Position: Longint;

Specifică poziţia curentă în cadrul clip-ului. Această valoare este specificată folosind formatul de timp.

P10. TimeFormat

property TimeFormat: TMPTimeFormats;

Indică formatul necesar pentru a specifica o poziţie într-un clip. Cele mai utilizate formate sunt:

V aloare Sem nificaţie

tfM illisecondsM ilisecunde. Numărul de m ilisecunde stocate ca un număr pe 4 octeţi. Este folosit mai mult la m ediile audio.

tfFramesCadre. Este reprezentat pe 4 octeţi. Este folosit la m ediile video, un cadru fiind o imagine.

P il. EnabledButtons

property EnabledButtons: TButtonSet;

Indică care din butoanele componentei sunt utilizabile. Valorile posibile pentru EnabledButtons sunt submulţimi ale mulţimii: {bpPlay , btRecord, btStop, btNext, btPrev, btStep , btBack, btPause, btEject}.

P12. Shareable

property Shareable: Boolean;

Indică dacă dispozitivul multimedia curent deschis este partajat şi altor aplicaţii.

Metode______________________________________________________

Principale metode sunt cele care sunt activate de butoanele conţinute în componenta TMediaPlayer.

416

Alte metode sunt:

M l. Open

procedure Open;

Pentru a rula un dispozitiv multimedia este nevoie ca acesta să fie deschis. Metoda Open deschide un dispozitiv multimedia.

M2. Save

procedure Save;

Salvează mediul curent în fişierul cu numele specificat de proprietatea FileName.

Să realizăm o aplicaţie care rulează un fişier .wav. Pentru aceasta folosim o componentă TM ediaPlayer şi setăm din Object Inspector AutoOpen la true, iar FileName cu numele fişierului .wav. Apoi lansăm aplicaţia în execuţie şi apăsăm butonul de Play.

Atenţie !

Componenta TM ediaPlayer nu funcţionează pe PcSpeaker.

Evenimente________________________________________________

E l. OnClick

property OnClick: EMPNotify;

Tipul EMPNotify este definit astfel:

EMPNotify = procedure (Sender: TObject;Button: TMPBtnType; var DoDefault: Boolean) of object;

E2. OnNotify

property OnNotify: TNotifyEvent;

30.2. TAnimate

Este un control ce furnizează o fereastră în care este afişat un clip AVI (Audio Video Interleaved). Un clip AVI este o succesiune de cadre. Un cadru

417

conţine un bitmap. Există şi clip-uri AVI cu sunet, dar acestea nu pot fi rulate în acest control.

Ierarhie________ ____________________________________________

TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> -> TAnimate.

Definit în_____________________________________________________

comctrls.pas

Pagina_______________________________________________________

Win32

Proprietăţi___________________________________________________

PI. FileName

property FileName: TFileName;

Indică numele fişierului AVI care se doreşte afişat în control.

P2. Active

property Active: Boolean;

Indică dacă controlul rulează clip-ul AVI.

P3. CommonA VI

property CommonAVI: TCommonAVI;

Indică dacă controlul rulează unul din clip-urile AVI furnizate de Shell32.dll. Valori posibile pentru CommonAVI sunt:

Valoare Semnificaţie

aviNone Clip-ul este furnizat prin setarea proprietăţii FileName.

aviFindFolder Indică clip-ul afişat în timpul căutării unui director.

aviFindFile Indică clip-ul afişat în timpul căutării unui fişier.

aviFindComputer Indică clip-ul afişat în timpul unui calculator.

aviCopyFiles Indică clip-ul afişat în timpul copierii mai multor fişiere.

aviCopyFile Indică clip-ul afişat în timpul copierii unui fişier.

418

V aloare Sem nificaţie

aviR ecycleF ile Indică clip-ul afişat în timpul trimiterii unui fişier în R ecycle Bin.

aviE m ptyR ecycle Indică clip-ul afişat în timpul golirii lui R ecycle B in.

aviD eleteF ile Indică clip-ul afişat în timpul ştergerii unui fişier.

P4. FrameCount

property FrameCount: Integer;

Indică numărul de cadre din clip.

P5. StartFrame

property StartFrame: Smalllnt;

Indică numărul de ordine al cadrului care va fi afişat când controlul este activat.

P6. StopFrame

property StopFrame: Smalllnt;

Indică numărul de ordine al ultimului cadru AVI care este afişat în timp ce controlul este activ.

P7. FrameHeight

property FrameHeight: Integer;

Indică înălţimea, în pixeli, a fiecărui cadru afişat.

P8. FrameWidth

property FrameWidth: Integer;

Indică lăţimea, în pixeli, a fiecărui cadru afişat.

P9. Open

property Open: Boolean;

Indică dacă clip-ul este încărcat în memorie şi gata pentru derulare.

P10. Repetitions

property Repetitions: Integer;

Indică de câte ori va fi repetată secvenţa de cadre înainte ca proprietatea

419

Active să devină false.

p roperty Timers: Boolean;

Indică dacă cadrele sunt afişate ca răspuns la evenimentul OnTimer al unei componente TTimer. Acest lucru este util când se doreşte rularea în paralel a unui clip muzical. Evenimentul OnTimer va fi responsabil cu derularea clip-ului AVI.

Exemplu:

Următoarea aplicaţie ilustrează folosirea acestei proprietăţi în cazul unui clip AVI cu 13 cadre. Pe formă vom avea o componentă TTimer şi o componentă TAnimate cu următoarele proprietăţi:

object Animatei: TAnimate Width = 60 Height = 39 FileName ='C :\Program Files\Borland\Delphi7\Demos\CoolStuf\cool.avi' StopFrame = 13 Timers = True

endobject Timerl: TTimer

Interval = 100 OnTimer = TimerlTimer

endHandlerele de evenimente ale acestei aplicaţii sunt:var

t : integer;

procedure TForml.FormActivate(Sender: TObject); begin

t := 1; end;

procedure TForml.TimerlTimer(Sender: TObject); begin

Animatei.Seek(t); t := 1 + t mod 13;

end;

P i l . Timers

420

Metode

M l. Play

procedure PX'dyi From Frame, ToFrame: Word; Count: Integer);

Afişează secvenţa de cadre care începe la cadrul FromFrame termină la cadrul ToFrame, de Count ori.

M2. Seek

procedure Seek(Frame: Smalllnt);

Afişează cadrul cu numărul de ordine Frame.

M3. Stop

procedure Stop;

întrerupe derularea clip-ului AVI.

Evenimente______________________________________________

E l. OnOpen

property OnOpen; TNotifyEvent;

Apare când valoarea proprietăţii Open se schimbă din false în true.

E2. OnClose

property OnClose; TNotifyEvent;

Apare când valoarea proprietăţii Open se schimbă din tru e în false.

E3. OnStart

property OnStart: TNotifyEvent;

Apare când clip-ul începe să se deruleze.

E4. OnStop

property OnStop: TNotifyEvent;

Apare când controlul a terminat de afişat clip-ul AVI.

i se

421

31. DEZVOLTAREA DE COMPONENTE

Delphi nu este doar un mediu pentru dezvoltarea vizuală a aplicaţiilor cu ajutorul componentelor existente, ci include tot ceea ce este necesar pentru a crea noi componente.

Materialul care urmează prezintă doar modul în care aceste componente sunt create în O bjectPascal folosind mediul Delphi. Pentru o mai bună înţele­gere a lor, utilizatorul poate studia codurile sursă a câtorva componente aflate în directoarele: ...\DEMOS\PROPEDlT şi ..ASOURCEY...

Principalele etape necesare pentru a crea o componentă sunt:

1. înţelegerea componentelor;2. scrierea de proprietăţi;3. scrierea de evenimente;4. scrierea de metode;5. grafica în componente;6. editoarele de componente;7. înregistrarea componentelor;8. adăugarea unei imagini la componentă.

în final sunt prezentate câteva exemple şi sunt discutate câteva tipuri mai speciale de componente, şi anume:

1. componente grafice;2. componente cutii de dialog (engl. dialog boxes).

31.1. înţelegerea componentelor

Prima întrebare la care trebuie răspuns, în acest capitol, este următoarea: Ce este o componentă? Cei care au ajuns până aici ştiu foarte bine răspunsul: O componentă nu este altceva decât o clasă. O clasă în cel mai adevărat sens al programării orientate pe obiecte (OOP). Totuşi există unele mici diferenţe datorate formei noi (necesară programării sub W indows) în care sunt puse elementele atât de cunoscutei clase. Şi anume, pentru început este important să se reţină că într-o clasă intră trei tipuri de informaţii:

422

a. Inform aţii de stare

Indică starea unei componente la un moment dat. în vechile clase această informaţie era dată de către conţinutul datelor membre. Aici s-a făcut un pas înainte, creându-se proprietăţile. O proprie­tate, la cel mai simplu nivel, este legată de o singură dată membră şi are aceeaşi valoare ca şi ea. Motivul pentru care au fost create aceste proprietăţi a fost acela de a asigura o interfaţă mai puternică între programator şi datele membre.

b. Inform aţii de acţiune

Indică modul în care componentele pot acţiona asupra lor sau asupra mediului înconjurător. Acest lucru este realizat prin inter­mediul metodelor.

c. Inform aţii de răspuns

îi dau posibilitatea programatorului să răspundă (prin intermediu codului sursă) la modificările care au loc în sistem sau într-o aplicaţie. Aceste informaţii sunt recepţionate prin intermediul evenimentelor.

Deşi oricare două componente sunt diferite în unele aspecte, ele au totuşi şi un aspect comun: toate derivă din clasa TComponent care defineşte un minim de atribute necesare pentru a putea opera sub mediul Delphi.

Deoarece componentele sunt clase, crearea lor se poate face folosind doar cod sursă. Dar, folosind mediul vizual de dezvoltare Delphi, munca programatorului este uşurată. Astfel, în momentul în care doriţi să creaţi o nouă componentă alegeţi itemul Component din (File\New) sau din meniul Component alegeţi submeniul New. Pe ecran va apare fereastra New Compo­nent ale cărei elemente sunt: Class N am e, Ancestor Type, Palette P age , Unit File N am e şi Search Path.

• în cutia de editare Class Name se introduce numele noii compo­nente. Conform convenţiilor acest nume trebuie să înceapă cu litera T (de exemplu, TComponentaMea).

• în lista de tip drop down Ancestor Type, se alege componenta care este strămoşul direct al componentei noastre. Componenta noastră va moşteni toate proprietăţile, metodele şi evenimentele din com­ponenta strămoş (de exemplu, strămoşul poate fi: TComponent).

• în lista de tip drop down Palette Page, se alege numele paginii din C om ponent Palette în care noua componentă va apărea când va fi introdusă în bibliotecă.

423

• U nit file nam e indică numele şi calea unitului ataşat componentei (de exemplu:

C:\Program Files\Borland\Delphi 7\Lib\ComponentaMea.pas

)•

• Search p a th indică calea în care este căutat unitul ataşat compo­nentei.

Acţionând butonul Create Unit va fi creat următorul unit:

unit ComponentaMea;interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs;

typeTComponentaMea = class(TComponent) private

{ Private declarations } protected

{ Protected declarations } public

{ Public declarations } published

{ Published declarations } end;

procedure Register;implementation procedure Register; begin

RegisterComponents('Samples', [TComponentaMea]); end;end.

Observăm totodată că mediul Delphi a făcut şi înregistrarea compo­nentei (despre care vom vorbi puţin mai încolo).

Fişierele necesare unei componente sunt:

- un pachet (.DPL) sau o colecţie de pachete (.DPC);- un pachet compilat (.DCP);- un unit compilat (.DCU);- un fişier în care este stocat bitmap-ul afişat în Com ponent Pallete

(.DCR);- un fişier Help (.HLP).

424

31.2. Scrierea de proprietăţi

Proprietăţile îi creează utilizatorului iluzia că setează sau citeşte valorile unor variabile. De fapt proprietăţile se comportă ca şi nişte variabile, singura diferenţă fiind faptul că (proprietăţile) nu pot fi transmise ca parametru de tip referinţă (var). Principalul avantaj pentru utilizator este faptul că unele proprietăţi sunt disponibile în Object Inspector la momentul proiectării aplicaţiei (engl design time), deci munca de setare sau citire a valorilor lor este mult simplificată.

Pentru creatorul de componente, proprietăţile oferă mai multe avantaje:

• permit ascunderea detaliilor de implementare;• permit atribuirea unor valori implicite;• permit reducerea numărului de metode disponibile la momentul

execuţiei aplicaţiei. Aceste metode sunt, de fapt, incluse în proprie­tăţi.

• metodele pentru o proprietate pot fi override, aceasta însemnând că ceea ce pentru utilizator pare a fi o aceeaşi proprietate, în alte componente are implementări diferite.

31.2.1. Tipuri de proprietăţi

O proprietate poate fi de orice tip. Diferenţa dintre tipuri este modul în care ele apar în Object Inspector :

Tip dc proprietate Semnificaţie

Proprietăţisimple

Pot fi numerice, character, sau şir. Ele apar in Object Inspector ca şi numere, caractere sau şiruri. Utilizatorul poate edita direct valoarea lor. De exemplu proprietăţile: Top, Height, Caption a lui TForm.

Proprietăţi de tip enumerare

Sunt afişate în Object Inspector sub forma unei liste drop-down, toate valorile pe care le poate lua o proprietate de acest tip. De exem plu, proprietatea Align a lui TMemo.

Proprietăţi de tip mulţime

Sunt afişate în Object Inspector ca o mulţime. Expandarea acestei proprietăţi se face executând dublu click pe semnul + din faţa denumirii proprietăţii. După expandare utilizatorul este solicitat să trateze fiecare elem ente ca o mulţime de valori Booleane: true dacă elementul este inclus, false în caz contrar. De exem plu, proprietatea Options a lui TOpenDialog.

Proprietăţi de tip obiect

Sunt la rândul lor clase şi au propriile lor editoare, denumite editoare de proprietăţi. Un editor de proprietăţi poate fi activat prin click pe butonul (pe care sunt trei puncte) aflat în dreapta valorii proprietăţii. Dc exemplu, proprietatea Font. Această proprietate este şi de tip mulţime (de subpio prietăţi) deoarece în faţa denumirii ei (din Object Inspector) apare semnul i

425

31.2.2. Declararea proprietăţilor

Pentru a declara o proprietate trebuie specificate trei lucruri:

1. numele proprietăţii;2. tipul proprietăţii;3. metodele pentru a citi/seta valoarea proprietăţii.

Proprietăţile pot fi declarate în:

• secţiunea public, făcând astfel posibilă accesarea lor la momentul execuţiei aplicaţiei; setarea valorii unei astfel de proprietăţi se face la momentul execuţiei programului şi doar prin cod;

• secţiunea published, făcând astfel posibilă accesarea lor şi la momentul proiectării aplicaţiei; acest lucru face ca proprietatea să fie vizibilă în Object Inspector, deci valoarea ei poate fi setată şi la momentul proiectării (din Object Inspector).

Un exemplu tipic de declarare a unei proprietăţi este următorul: type

TComponentaMea=class(TComponent) private

FNumar:integer; published

property Număr:integer read FNumar write FNumar; end;

O dată membră poate fi accesată şi indirect, cu ajutorul unor metode de tipul Get sau Set (care vor fi discutate în secţiunea următoare):

typeTComponentaMea=class(TComponent) private

FNumar:integer;procedure SetValoare(Val:integer); function GetValoare:integer;

publishedproperty Număr:integer read SetValoare write SetValoare;

end;

31.2.3. Memorarea internă a datelor

Datele unei proprietăţi sunt memorate ca date membre ale clasei. Nu există restricţii, dar este de preferat să se respecte nişte convenţii:

Identificatorii pentru datele membre ale proprietăţilor încep cu litera F şi încorporează numele proprietăţii. De exemplu, proprietatea Width definită în TControl are data membră asocită cu numele FWidth.

426

Datele membre pentru o proprietate trebuie declarate ca private, deci componentele descendente nu o pot accesa direct, ci doar prin intermediul proprietăţii ataşate.

31.2.4. Metode de acces

Sintaxa declarării unei proprietăţi permite părţilor read şi w rite să specifice metodele folosite pentru a accesa o dată membră.

• Metoda Read

Este o funcţie care nu are nici un parametru (excepţie făcând proprie­tăţile de tip a rray şi proprietăţile care împart aceeaşi metodă read) şi returnează o valoare de acelaşi tip ca şi proprietatea. Această metodă se foloseşte când este nevoie de valoarea unei proprietăţi. în acel moment funcţia ataşată citeşte valoarea datei membre corespunzătoare şi o returnează.Prin convenţie numele ei începe cu Get şi se continuă cu numele pro­prietăţii.Singura excepţie pentru regula fară parametri o au proprietăţile array care pasează indecşi ca parametri, sau pentru proprietăţile care au specificatorul index.

• Metoda W rite

Este o procedură care are un singur parametru (excepţie făcând proprie­tăţile de tip a rray şi proprietăţile care au aceeaşi metodă write) şi care setează datele membre corespunzătoare unei proprietăţi. Parametrul are acelaşi tip cu proprietatea.Prin convenţie, numele procedurii începe cu Set şi se continuă cu numele proprietăţii.Această procedură se apelază când este atribuită o nouă valoare proprietăţii şi va seta datele membre la noile valori.De exemplu, să considerăm clasa declarată mai sus:

typeTComponentaMea=class(TComponent) private

FNumar:integer;procedure SetValoare(Val:integer); function GetValoare:integer);

publishedproperty Număr:integer read GetValoare write SetValoare;

end;

427

Implementările lui GetValoare şi SetValoare sunt:

procedure TComponentaMea.SetValoare(Val: integer); begin

if Val o FNumar then FNumar := Val;

end;

function TComponentaMea.GetValoare:integer; begin

GetValoare := FNumar; end;

Observaţie:

Funcţiile de tip Get şi Set trebuie declarate în secţiunea private a unei clase pentru a nu se avea acces la ele din afara clasei.

Mai multe proprietăţi pot utiliza aceleaşi metode read şi write, folosindu-se pentru aceasta de specificatorul index.

31.2.5. Valori implicite ale proprietăţilor

In momentul declarării unei proprietăţi se poate specifica o valoare implicită pentru acea proprietate. De exemplu, pentru a specifica că valoarea implicită pentru proprietatea /sTrue este true, vom scrie următoarea linie:

property IsTrue:boolean = {default=true};Asta nu înseamnă că valoarea iniţială a proprietăţii va fi setată la true

(mai general la ceea ce i se atribuie lui default), ci că, în cazul în care valoarea unei proprietăţi va fi diferită de valoarea lui default, ea va fi salvată în fişierul .dfin.

Dacă redeclaraţi o proprietate, atunci puteţi să specificaţi că ea nu va avea nici o valoare implicită, chiar dacă proprietatea strămoş are acest lucru, folosind specificatorul nodefault:

property Newlnteger:integer = {nodefault};

31.2.6. Proprietăţi de tip array

Aceste proprietăţi pot fi indexate într-un mod asemănător cu al vecto­rilor. Un exemplu este proprietatea Lines a componentei TMemo. Această proprietate reprezintă o listă indexată de stringuri (AnsiString) care împreună alcătuiesc textul cutie de tip TMemo. Fiecare string poate fi accesat prin inter­mediul unui indice.

428

Scrierea unei proprietăţi de tip array este asemănătoare cu scrierea unei proprietăţi normale, cu unele mici excepţii şi anume:

Declararea proprietăţii cuprinde unul sau mai mulţi indecşi de un tip specificat. Acest tip poate să fie orice, nu neapărat un tip ordinal.

Părţile de tip read şi write ale unei metode trebuie să fie metode şi nu date membre.

Metodele ataşate părţilor read şi write au, pe lângă parametrii obişnuiţi, şi parametrii corespunzători indecşilor. Aceşti parametri trebuie să fie în ace­eaşi ordine şi de acelaşi tip ca şi cei specificaţi în declararea proprietăţii.

Exemplu:type

TComponentaMea=class(TComponent) private

function GetNumberSize(Index:integer):string; publicproperty NumberSize[Index:integer]:string =

{read=GetNumberSize};

end;

Funcţia GetNumberSize este:

function TComponentaMea.GetNumberSize (Index:integer):string;

begincase Index of

0: Result:= "Zero";100: Result = "Mediu";1000: Result = "Mare"; else Result = "Lungime foarte mare";

end; end;

31.2.7. Editoare de proprietăţi

într-un sens mai larg, această noţiune poate fi definită ca fiind o cutie de dialog prin intermediul căreia utilizatorul setează valoarea unei anumite proprietăţi (de exemplu, proprietatea Color a lui TForm). în momentul în care o componentă este selectată în O bject Inspector, acesta scanează toate pro­prietăţile şi va crea un editor de proprietăţi pentru fiecare proprietate în parte. De exemplu, dacă proprietatea este de tip integer, atunci un editor de proprietăţi pentru întregi va fi creat (implicit este de tipul TIntegerProperty).

429

Toate editoarele de proprietăţi derivă din TPropertyEditor. Editorul de proprietăţi este creat pe baza tipului proprietăţii care urmează să fie editată aşa cum este el dedus din tipul folosit de către RegisterPropertyEditor.

Pentru a uşura munca programatorului, Delphi-ul pune la dispoziţie câteva clase predefmite de editoare de proprietăţi. O parte din tipurile de edi­toare de proprietăţi predefmite ar fi:

T ip Sem nificaţie

T O rdinalP roperty Este clasa de bază pentru toate editoarele de tip ordinal (integer, char, enumerare...).

TIntegerP roperty Este editorul implicit pentru proprietăţile de tip long şi pentru toate subtipurile lui long (int, 1..10, etc).

TC harProperty Este editorul implicit pentru proprietăţile de tip char sau subintervale ale lui ch ar ( ‘A ’..’F ) .

T F loatP roperty Este editorul im plicit pentru numere reale.

TEnum Property Este editorul implicit pentru toate proprietăţile de tip enumerare.

TStringProperty Este editorul implicit pentru şiruri de caractere.

TSetElem entProperty Este editorul implicit pentru un elem ent dintr-o mulţime. Acest elem ent este văzut ca valoare booleană (aparţine sau nu mulţimii).

TSetPropertyEste editorul im plicit pentru proprietăţile de tip mulţime. A cest editor nu permite editarea directă a mulţimii, dar va afişa o listă de sub-proprietăţi cu fiecare elem ent al mulţimii.

T C lassP ropertyEste editorul implicit pentru proprietăţile care sunt la rândul lor clase. Va afişa numele clasei şi va permite editarea proprietăţilor obiectului ca sub-proprietăţi ale proprietăţii curente.

TM ethodProperty Este editorul im plicit pentru pointeri la metode (de exem plu, pentru evenimente).

TCom ponentPropertyProprietatea care are un editor de acest tip poate lua ca valoare orice componentă, de pe forma curentă, care are însă acelaşi tip cu proprietatea. D e exem plu proprietatea A ctiveC ontrol a lui TForm.

T C olorP roperty

Este editorul im plicit pentru proprietăţi de tip TColor. A fişează o listă drop-down cu culorile disponibile. La dublu click pe proprietate apare o cutie de dialog din care se va selecta visual culoarea dorită.

TFontNam ePropertyA fişează o listă drop-down cu toate fonturile disponibile din sistem.

TFontPropertyEste editorul im plicit pentru proprietăţi de tip TFont. Se poate edita sub-properităţile individual sau se accesează o cutie de dialog.

TC ursorP ropertyEste editorul im plicit pentru proprietăţi de tip TCursor. Se afişează o listă drop-down pentru a se alege un cursor dintre cele disponibile.

TM odalR esultPropertyEste editorul implicit pentru proprietăţi de tip TM odalResult. Se afişează o listă drop-down pentru alegerea unei valori modale. De exem plu, proprietatea M odalR esult a lui TBitBtn.

T ip Sem nificaţie

TShortCutProperty Este editorul im plicit pentru proprietăţi de tip TShortCut. Permite fie alegerea, fie tastarea unui short-cut.

TM PFilenam eProperty Afişează o cutie de dialog pentru deschiderea unui fişier media.

TD ateP roperty,TTim eProperty

Sunt editoarele pentru proprietăţile de tip dată şi timp a lui TDateTime.

TDateTim e Property Permite editarea datei şi timpului împreună.

Dacă doriţi să creaţi alte proprietăţi mai speciale trebuie ca clasa editorului vostru să derive din unele din clasele descrise mai sus (sau direct din TProperty Editor).

Observaţie:

Un editor de proprietăţi trebuie creat doar atunci când nici unul dintre tipurile implicite nu sunt suficiente. Acest lucru apare dacă proprietatea este un obiect.

Pentru a manipula comportamentul unei proprietăţi, utilizatorul trebuie să redefmească 4 metode ale lui TPropertyEditor şi anume:

M l. GetAttributes

function GetAttributes: TProperty Attributes; override;

îi spune lui O bject Inspector despre caracteristicile editorului de pro­prietăţi, pentru ca acesta (O bject Inspector) să afişeze unealta necesară. GetAttributes returnează o mulţime de tipul TPropertyAttributes care este alcătuit din următoarele valori:

V aloare Sem nificaţie

paV alueL istEditorul poate să retumeze o listă cu valori posibile pentru o proprietate. Aceasta va însemana că un buton drop-down va apărea în O bject In spec tor la dreapta proprietăţii.

paSortL ist Indică lui O bject In spec to r că lista trebuie sortată.

paSu bP roperties Proprietatea are subproprietăţi care vor fi afişate indentat.

paR eadO n ly Utilizatorul nu poate m odifica valoarea proprietăţii la timpul proiectării aplicaţiei.

p a D ia log Indică că metoda E dit va afişa o cutie de dialog pentru editarea proprietăţii.

paM ultiS electIndică lui O bjectln spec tor să afişeze proprietatea respectivă în cazul în care există selectate mai multe com ponente care o au.

■paRevertable Permite proprietăţii să revină la o valoare iniţială.

paA utoU pdate Componenta trebuie reînnoită după fiecare schimbare a unei

431

V aloare Sem n ificaţie

proprietăţi.

Exemple:

E ditoru l de proprietăţi

A tribu te

TEnum Property paM ultiSelect, paValueList, paS ortU st, paR evertable

TSetElem entProperty paM ultiSelect, paV alueList, paSortL ist

TSetProperty paM ultiSelect, paSubProperties, paR eadO nly, paR evertable

T C lassP roperty paM ultiSelect, paSubProperties, paR eadO nly

TFontNam eProperty paM ultiSelect, paValueList, paSortList, paR evertable

TC olorP roperty paM ultiSelect, paD ialog, paV alueList, paR evertable

paM ultiSelect, paValueList, paSortList, paR evertable

TF ontProperty paM ultiSelect, paSubProperties, paD ialog , paR eadO nly

TShortCutProperty paM ultiSelect, paValueList, paR evertable

M2. GetValue

function GetValue: string; override;

Este o funcţie care converteşte datele membre într-un şir de caractere text pentru a fi afişat în Object Inspector (de exemplu, o mulţime este afişată sub forma unui string [ell,el2,...,eln]). Implicit, această funcţie întoarce valoarea "unknown''. Dacă proprietatea nu este un string, atunci editorul trebuie să facă conversia la string.De exemplu, metoda GetValue pentru tipul integer este:

function TIntegerProperty.GetValue: string; begin

Result:=IntToStr(GetOrdValue); end;

M3. SetValue

procedure SetVaIue(const Value: string); override;

Această procedură converteşte stringul din coloana cu valori a unei proprietăţi în valori efective pe care le atribuie datelor membre cores­punzătoare. Utilizatorul poate tasta un şir de caractere pe care metoda SetValue îl va converti la tipul proprietăţii şi îl va asigna datelor mem­bre. în cazul în care şirul nu este corect trebuie generată şi tratată o excepţie.De exemplu, procedura SetValue pentru tipul integer este:

432

procedure TIntegerProperty.SetValue(const Value: string);var L : Longint;

beginL := StrToInt(Value);SetOrdValue(L);

end;Editorul de proprietăţi mai moşteneşte un set de metode folosit pentru a atribui sau citi diferite feluri de valori:

T ipul proprietăţii M etod a “ G et” M etod a “Set”

T ip ordinal GetOrdValue SetOrdValue

S trin g GetS trValue SetStrValue

E ven im en t GetM ethodValue SetM etbod Value

T ip V arian t GetVarValue SetVarValue

T ipuri reale GetFIoatVa lue SetFJoatValue

M 4. Edit

procedure Edit; override;

Este apelată de fiecare dată când utilizatorul apasă butonul ( ...) din dreapta unei proprietăţi sau când pe proprietate se execută dublu click. Acest lucru poate genera, de exemplu, afişarea unei cutii de dialog, pentru a permite editarea proprietăţii într-un mod mai sugestiv decât text simplu (vezi Font sau Color). în interiorul acestei metode urmaţi paşii:

a. construiţi editorul pe care îl folosiţi pentru proprietate;b. citiţi valoarea curentă şi atribuiţi-o proprietăţii folosind o metodă de

tip “Ger”;c. când utilizatorul selectează o nouă valoare folosiţi o metoda “Se?” ;d. distrugeţi editorul de proprietăţi.

Exemplu:procedure TColorProperty.Edit;var ColorDialog: TColorDialog;

beginColorDialog := TColorDialog.Create{Application);

tryColorDialog.Color : = GetOrdValue; if ColorDialog.Execute then SetOrdValue(ColorDialog.Color) ;

finally

ColorDialog.Free; end;

433

e n d ;

M5. Activate

procedure Activate; override;

Această metodă este apelată ori de câte ori proprietatea respectivă devine selectată în O bject Inspector. Acest lucru este util, de exemplu, în cazul în care anumite atribute ale proprietăţii trebuie sau pot fi determinate doar atunci când aceasta este selectată.

Restricţii:

Se poate apela doar atunci când GetAttributes întoarce paM ultiSelect şi paSubProperties.

M6. AllEqual

function AllEqual: Boolean; override;

Este apelată atunci când mai multe componente sunt selectate în Object Inspector. Dacă întoarce true, atunci este apelată GetValue. Dacă, dim­potrivă, întoarce valoarea false, atunci un şir vid este afişat în Object Inspector.

Restricţii:

Se poate apela doar atunci când GetAttributes întoarce paMultiSelect.

M7. GetEditLimit

function GetEditLimit: Integer; override;

Returnează numărul de caractere pe care utilizatorul le poate introduce pentru specificarea valorii unei proprietăţi. Implicit este 255.

M 8. GetName

function GetName: string; override;

Returnează numele proprietăţii. Toate liniile de subliniere sunt înlocuitre cu spaţii.

M9. GetProperties

procedure GetProperties(Proc: TGetPropEditProc); override;

Această metodă trebuie redefinită doar pentru a apela PropertyProc pentru fiecare dintre sub-proprietăţile proprietăţii curent editate şi

434

atribuirea de editoare pentru fiecare din acestea. De exemplu, tipul TSetProperty specifică câte un editor pentru fiecare element al unei mulţimi. Totodată, TClassProperty are nevoie de un editor pentru fiecare element al său deoarece acesta poate fi, de asemenea, o clasă:

procedure TClassProperty.GetProperties(Proc: TGetPropEditProc); var I: Integer;

Components: TComponentList;begin

Components := TComponentList.Create; tryfor I := 0 to PropCount - 1 do

Components.Add(TComponent(GetOrdValueAt(I ))); GetComponentProperties(Components, tkProperties,

Designer, Proc);finally

Components.Free; end;

end;

M 10. GetPropType

function GetPropType: PTypelnfo;

Returnează un pointer la tipul informaţiei proprietăţii (proprietăţilor) curent editate. Această metodă nu mai trebuie redefinită. Felul în care este implementată în TPropertyEditor este următorul:function TPropertyEditor.GetPropType: PTypelnfo; begin

Result := FPropList'' [ 0 ] . Proplnf . PropType'' end;

M II . GetValues

function GetValue: string; override;

Este apelată când GetAttributes întoarce paValueList. De exemplu, felul în care este ea implementată pentru tipul TEnuiiiProperty este următorul:

procedure TEnumProperty.GetValues(Proc: TGetStrProc); var I: Integer,-

EnumType: PTypelnfo;begin

EnumType := GetPropType; with GetTypeData(EnumType)" do

for I := MinValue to MaxValue doProc(GetEnumName(EnumType, X ));

end;

435

M12. Initialize

procedure Initialize; override;

Este apelată după ce editorul de proprietăţi a fost creat dar înainte de a fi apelat.

M13. GetComponent

function GetComponent(//!^ejc: Integer): TPersistent;

Este returnată a Index-a componentă editată de acest editor de pro­prietăţi.

Restricţii:

Poate fi apelată doar când paM ultiSelect este returnată de către GetAttributes.

Toate acestea fiind făcute nu ne mai rămâne decât să înregistrăm editorul de proprietăţi.

Prin înregistrarea unui editor se asociază un tip de proprietate cu un anu­me editor de proprietăţi. Se poate înregistra editorul pentru o anumită proprie­tate a unei anumite componente, sau pentru toate proprietăţile de un anumit tip.

înregistrarea unei componente se face cu ajutorul metodei RegisterPropertyEditor. Ea are prototipul definit astfel:

procedure RegisterPropertyEditor(PropertyType: PTypelnfo;ComponentClass: TClass; const PropertyName: string EditorClass: TPropertyEditorClass);

unde:

- PropertyType

Este un pointer la tipul informaţiei pentru tipul proprietăţii editate aşa cum este ea returnată de către funcţia Typelnfo. De exemplu, Typelnfo (TComponentaMea).

- ComponentClass

Este tipul componentei la care se aplică acest tip de editor. Dacă acest parametru este nil, atunci tipul de editor se aplică pentru toate proprietăţile având tipul PropertyType.

- PropertyName

Este numele proprietăţii la care se restricţionează acest editor. Dacă acest parametru este ( ” ), atunci acest editor se aplică la toate proprietăţile având PropertyType în ComponentClass.

436

- EditorClass

Este tipul editorului de proprietăţi folosit pentru a edita proprietatea specificată. Acesta va fi creat prin apelul EditorClass. Create.

Exemple:procedure Register; begin

RegisterPropertyEditor(Typelnfo(TComponent), nil,'' , TComponentProperty);

RegisterPropertyEditor(Typelnfo(TComponentName),TComponent, 'Name', TComponentNameProperty);

RegisterPropertyEditor(Typelnfo(TMenuItem),TMenu,'',TMenuItemProperty);

end;

Aceste trei funcţii descriu trei utilizări diferite ale lui RegisterPropertyEditor:

Prima înregistrează editorul de proprietăţi (TComponentProperty) pentru toate proprietăţile de tipul TComponent.

A doua înregistrează un editor pentru o proprietate specifică în cadrul unei anumite componente. în acest caz este vorba de proprietatea Name.

A treia funcţie înregistrează un editor pentru toate proprietăţile de tip TMenuItem în componente de tip TMenu.

31.3. Scrierea de metode

Nu introduce nimic nou faţă de metodele claselor.

Exemplu:

Să vedem însă când sunt apelaţi constructorul şi destructorul unei clase. Pentru aceasta vom implementa o componentă simplă care are un constructor şi un destructor. Aceştia sunt definiţi în secţiunea public a clasei TComponentaMea astfel:

constructor Create(AOwner : TComponent); override; destructor Destroy; override;Implementările acestor două metode speciale sunt:constructor TComponentaMea.Create(AOwner : TComponent); begin

inherited C re a te (AOwner) ; //se apeleaza constructorul clasei de baza Show M essage( ' S -a a p e l a t c o n s t r u c t o r u l . ' ) ;

437

e n d ;

destructor TComponentaMea.Destroy; begin

ShowMessage('S-a apelat destructorul.'); inherited Destroy; // se apeleaza destructorul clasei de baza

end;

Următorul pas este instalarea acestei componente. Acest lucru îl vom realiza accesând itemul Install din meniul Component. Un mesaj ne va confirma pagina pe care a fost aşezată componenta. Selectăm componenta din Com ponent Palette şi o aşezăm pe formă. în acest moment va fi apelat pentru prima dată constructorul şi va fi afişat mesajul scris de noi în corpul constructorului. Aceasta însemnă că obiectele amplasabile pe formă (compo­nentele) sunt active, ele executând o anumită secvenţă de instrucţiuni. Acum să lansăm aplicaţia în execuţie. în acest moment constructorul se va apela pentru a doua oară. Aceasta înseamnă că a fost creat un nou obiect de clasă TComponentaMea. La distrugerea formei aplicaţiei se va apela destructorul. Acesta se va mai apela încă o dată la ştergerea componentei de pe formă.

31.4. Scrierea de evenimente

Un eveniment este o legătură dintre o apariţie în sistem (ca de exemplu apăsarea unei taste sau mişcarea cursorului de mouse) şi o secvenţă de instruc­ţiuni (numită handler de evenimente) care răspunde la apariţia respectivă.

Privit prin prisma utilizatorului de componente, evenimentul este doar un nume legat de un eveniment al sistemului, ca de exemplu OnClick, care apare în momentul în care utilizatorul apasă un buton al mouse-ului.

Privit prin prisma creatorului de componente, un eveniment este un pointer la o metodă. Din acest motiv şi tipurile de evenimente trebuie să fie de tip pointeri la metode. De exemplu tipul de eveniment TKeyPressEvent este definit astfel:

TKeyPressEvent = procedure(Senflfer TObject; var Key: Char)of object;

iar tipul TNotifyEvent este definit astfel:

type TNotifyEvent = procedure (Sender: TObject) of object;

Handlerele de evenimente trebuie să fie neapărat proceduri, deşi compi­latorul permite şi funcţii. Chiar şi aşa se pot obţine informaţii de la utilizator prin folosirea de parametrii referinţă (aşa cum se vede mai sus).

Componentele folosesc proprietăţile pentru a crea evenimente. Spre deosebire de majoritatea proprietăţilor, evenimentele nu folosesc metode în părţile cu read şi w rite, ele accesând direct datele membre ale componentei.

438

Prin convenţie, data membră are acelaşi nume ca şi evenimentul, precedat însă de litera F, iar evenimentul are numele prefixat de cuvântul On:

typeTControl = class(TCom ponent)

privateFOnClick: TNotifyEvent; { declare a field to hold

the method pointer }

protectedproperty OnClick: TN otifyEvent read FOnClick write FOnClick;

end;

Din punctul de vedere al modului de interacţiune evenimentele pot fi împărţite în două categorii:

• interacţiune-utilizator, care sunt generate întotdeauna de către un mesaj Windows; de exemplu, când utilizatorul apasă un buton de mouse, Windows-ul trimite aplicaţiei mesajul

WM_LBUTTONDOWN.

• schimbări de stare, care sunt generate de schimbarea valorilor unor proprietăţi.

31.5. Grafica în componente

Unul dintre lucrurile cele mai importante dintr-o componentă este modul în care ea se afişează pe ecran. Windows-ul oferă un puternic Graphics Device Interface (GDI) pentru grafice independente de dispozitiv. Dar acest GDI este greu de folosit, necesitând eforturi serioase din partea programatorilor. Delphi- ul minimizează efortul necesar creării graficii pentru o componentă, dându-i posibilitatea programatorului să se concentreze spre aspectele importante ale unei aplicaţii şi să neglijeze detaliile.

Folosindu-se de proprietatea Canvas a unei componente, programatorul este scutit de lucrul la un nivel scăzut cu funcţii grafice. Canvas-ul manipulează toate resursele grafice ca Pen, Brush, Font, etc. care vor fi alocate şi eliberate fără ca programatorul să se mai ocupe de aceasta.

Exemplu:

Desenarea unei elipse într-o fereastră, mai întâi folosind funcţii API, iar mai apoi folosind avantajele lui Delphi:

procedure TMyWindow.Paint(PaintDC: HDC;var Paintlnfo: TPaintStruct);

var PenHandle, OldPenHandle: HPEN;BrushHandle, OldBrush.Han.dle-. HBRUSH;

439

beginPenHandle := CreatePen(PS_SOLID, 1, RGB(0, 0, 255));OldPenHandle := SelectObject(PaintDC, PenHandle) ,- BrushHandle := CreateSolidBrush(RGB(255, 255, 0)) ;OldBrushHandle := SelectObject(PaintDC, BrushHandle);

Ellipse(HDC, 10, 10, 50, 50);SelectObject(OldBrushHandle);DeleteObject(BrushHandle);SelectObject(OldPenHandle);DeleteObject(PenHandle);

end;

procedure TForml.FormPaint(Sender: TObject); beginwith Canvas do begin

Pen.Color := clBlue;Brush.Color := clYellow;Ellipse(10, 10, 50, 50);

end; end;

Deci canvasul poate fi folosit fie la un nivel superior (prin metode de genul M oveTo, LineTo, Ellipse, TextOut, FloodFill, etc. sau prin proprietăţile Pen, Brush, Pixels, Font, etc.) sau la un nivel de jos prin apelul funcţiilor API.

Nu toate componentele au proprietatea Canvas ci doar acelea care derivă din TGraphicControl. De aceea, componentele vizuale trebuie să derive din TGraphicControl.

Deci, pentru ca în momentul în care o componentă este plasată pe o formă să apară ceva desenat pe formă (ceva diferit de imaginea sa în Com ponent Palette), trebuie ca programatorul să redefinească metoda Paint a lui TGraphicControl.

31.6. Editoarele de componente

Editoarele de componente permit tratarea acestora (a componentelor) ca pe un întreg. Editorul de forme instanţiază un editor de componente în momen­tul în care componenta este aşezată pe formă. Tot atunci se determină câte unelte sunt necesare componentei. Aceste unelte sunt afişate în partea de sus a meniului (denumit şi speed menu) de tip popup care apare la click dreapta pe o componentă aşezată pe o formă. Fiecare din aceste unelte sunt numite, în limbajul VCL, verbe.

Un editor de componente este o clasă care derivă din TDefaultEditor. Pentru a adapta comportamentul componentei la necesităţile dumneavoastră, trebuie să redefiniţi câteva metode ale lui TDefaultEditor şi anume:

440

M l.

M2.

M3.

M4.

M5.

M6.

constructo r Create(AComponent: TComponent;ADesigner. TFormDesigner); override;

Este constructorul apelat pentru a crea un editor de componente. AComponent este componenta care urmează a fi editată.

GetVerbCount

function GetVerbCount: Integer; override;

Returnează numărul verbelor pe care editorul vostru le oferă.

GetVerb

function GetVerb (index: Integer): string; override;

Returnează un şir care reprezintă al Index-lea verb din speed menu. Primul verb are numărul de ordine 0, al doilea are numărul de ordine 1, ş.a.m.d.

ExecuteVerbprocedure ExecuteVerb(Index: Integer); override;Lansează în execuţie al Index-lea verb. Dacă utilizatorul execută dublu click pe o componentă, atunci este apelată ExecuteVerb(0).

Edit

procedure Edit; override;

Ciclează prin toată lista de proprietăţi a unei componente. Pentru fiecare proprietate, Edit apelează EditProperty. Utilizatorul nu trebuie să rede- finească Edit ci doar EditProperty.

EditProperty

procedure Ed i tProperty(PropertyE ditor TPropertyEditor;v ar Continue, FreeEditor: Boolean); override;

- PropertyEditor este numele editorului de proprietăţi care va fi afişat.

- Continue îi spune metodei Edit dacă să mai cicleze sau nu prin lista de proprietăţi.FreeEditor indică dacă editorul de proprietăţi va fi distrus sau nu.

Create

441

M7. Copy

procedure Copy; override;

Este apelată în momentul în care o componentă este copiată în Clipboard. Ceea ce se copiază în clipboard când se dă Copy pe o com­ponentă este definiţia acesteia din fişierul .dfm. De exemplu, pentru o componentă TLabel, ceea ce se copiază în Clipboard este:object Labell: TLabel

Left = 96 Top = 88 Width = 32 Height = 13 Caption = 'Labell'

end

Ca şi în cazul editoarelor de proprietăţi trebuie făcută şi înregistrarea editoarelor de componente.

înregistrarea editoarelor de componente se face cu ajutorul procedurii RegisterComponentEditor definită astfel:

procedure RegisterComponent£ditor(ComponentClass-. TComponentClass;ComponentEditor. TComponentEditorCIass);

unde ComponentClass şi ComponentEditor sunt pointeri la tipul clasei respectiv la tipul editorului clasei.

31.7. Help pentru componente

Crearea unui fişier help pentru o componentă se face cu ajutorul utilitarului HCW. Pentru a furniza context sensitive pentru o componentă (adică în momentul în care focusul este pe o componentă şi se apasă FI să apară ecranul de help pentru aceea componentă), trebuie ca fişierul help al acelei componente să fie adăugat la helpul Delphi. Acest lucru se poate face folosind utilitarul OpenHelp (furnizat odată cu Delphi-ul). Mie personal acest utilitar nu mi-a funcţionat, de aceea am adoptat o altă metodă: am scris direct în fişierul BcbHelp.cfg care se găseşte în directorul Help. în acest fişier am mai adăugat două linii (să presupunem că componenta creată de mine se numeşte TMyComp, iar fişierul de help pentru ea se numeşte TMyComp.hlp):

: INDEX TMyComp=c : \Program Files\...\TMyComp. hlp : LINK c:\Program Files\...\TMyComp .hlp .

442

31.8. înregistrarea componentelor

Este un process prin care i se indică Delphi-ului care componente vor fi adăugate la pachetele sale cu componente şi unde vor fi adăugate acestea în Component Palette.

Pentru a înregistra o nouă componentă urmaţi etapele descrise mai jos:

1. Adăugaţi o procedură numită Register la fişierul .PAS. Acesta va arăta ceva de genul următor:

unit MyBtns; interface

typeţ Scrieţi interfaţa pentru componentă aici}

procedure Register; { aici declaraţi procedura R egister) implementation { Faceli implementarea componentei aici} procedure Register; begin

{înregistraţi componenta aici} end;

end.

2. în interiorul procedurii Register apelaţi RegisterComponents

procedure RegisterComponents(const Page: string;ComponentClasses: array of TComponentClass);

Este o procedură care are doi parametri: numele paginii din Component Palette în care va fi adăugată componenta, vectorul cu clasele componentelor.De exemplu, înregistrarea componentei cu numele TDesen pe pagina Samples:

procedura Register; begin

RegisterComponents('Samples’, [TDesen]); end;E posibil ca un unit să conţină mai multe componente, deci este mai uşor să se apeleze o singură dată procedura RegisterComponents pentru mai multe componente care vor fi înregistrate pe aceeaşi pagină:

procedure Register; begin

RegisterComponents!'Samples', [TDesen,TMyComp]); end;

443

31.9. Adăugarea unei imagini la o componentă

Pentru ca o componentă să poată fi adăugată la C om ponent Palette, trebuie să fie însoţită de o imagine care să o reprezinte. Această imagine este un pătrat cu latura de 24 pixeli şi care poate fi creată şi cu Im age E ditor şi anume:

Lansaţi Im ageEditor-ul din meniul Tools, submeniul Im ageEditor. Din meniul File al Im age Editor-ului alegeţi submeniul New, iar apoi subsub- meniul Com ponent Resource File (.dcr).

Va fi creată o nouă fereastră care arată în felul următor:Contents este un item pe care faceţi click dreapta. Va apare un meniu

popup din care alegeţi comanda New|Bitmap. O cutie de dialog vă va cere să introduceţi dimensiunile imaginii (care în cazul nostru vor fi de 24x24).

La click dreapta pe item-ul Bitmap] va apărea acelaşi meniu popup ca şi mai înainte, dar de data aceasta sunt disponibile şi celelalte item-uri, şi anume Edit (cu care editaţi imaginea), Delete (cu care ştergeţi item-ul Bitmap) şi R enam e (cu ajutorul căruia puteţi schimba numele itemului Bitm ap], Această schimbare de nume este necesară deoarece numele bitmap-ului trebuie să fie identic cu numele componentei şi trebuie scris cu majuscule. De exemplu, dacă componenta este TMyComp, atunci numele bitmap-ului trebuie să fie TMYCOMP.

Numele fişierului care conţine imaginea este identic cu cel .PAS, dar, bineînţeles, cu extensia .DCR. Dacă utilizatorul nu specifică nici o imagine, atunci Delphi-ul foloseşte o imagine oarecare.

31.10. Exemple

31.10.1. O componentă grafică

Această componentă se afişează pe ecran sub diferite forme (Cerc, Pătrat,Dreptunghi,Elipsa), în funcţie de valoarea proprietăţii M odel (care este de tip enumerare, deci un editor implict de tip TEnumProperty va fi afişat):

unit Desen;interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs;

typeTModel=(fCerc,fElipsa,fPatrat,fDreptunghi);TDesen = class(TGraphicControl) private

FModel:TModel;procedure SetDesenModel(Valoare:TModel);

444

protectedprocedure Paint; override;

publicconstructor Create(AOwner: TComponent); override;

publishedproperty Model:TModel read FModel write

SetDesenModel default fCerc;end;

procedure Register; implementationconstructor TDesen.Create(AOwner: TComponent); begin

inherited Create(AOwner);Width:= 100;Height:= 100;FModel:=fPatrat;

end;procedure TDesen.SetDesenModel(Valoare:TModel); begin

if ValoareoFModel then begin

FModel:=Valoare;Invalidate;

end;end;procedure TDesen.Paint;

var p :TRec t;m:integer;

beginp :=ClientRect; case Fmodel of

fDreptunghi:Canvas.Rectangle(p.Left,p.Top,p.Right,p .Bottom); : Canvas.Ellipse(p.Left,p.Top,p.Right,p.Bottom); : begin

if Height>Width then m:=Width else m:=Height;Canvas.Rectangle(p.Left,p.Top,

p.Left+m,p.Top+m) ;end;

: beginif Height>Width then m:=Width else m:=Height;Canvas.Ellipse(p.Left,p .Top,

p.Left+m,p.Top+m);end;

end; end;

fElipsa fPatrat

fCerc

445

procedure Register; begin

RegisterComponents('Samples 1, [TDesen]); end;

end.

31.10.2. O componentă grafică cu un eveniment

Este aceeaşi componentă din exemplul anterior, dar de data aceasta i-am ataşat un eveniment OnChange care, pe lângă Sender, mai are încă un parametru şi anume Fost în care se specifică, în momentul în care apare o schimbare de desen, fostul tip de desen (Cerc, Elipsa, Dreptunghi sau Patrat). Pentru aceasta am definit un nou tip de eveniment TChangeEvent conform cu partea teoretică de la C rearea de evenimente.

unit Desen;interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs;

typeTModel=(fCerc,fElipsa,fPatrat,fDreptunghi);TChangeEvent=procedure(Sender:TObject; var Fost;string)

of obj ect ,•TDesen = class(TGraphicControl) private

FModel:TModel;FOnChange:TChangeEvent; s:string;procedure SetDesenModel(Valoare:TModel) ;

protectedprocedure Paint; override;

publicconstructor Create(AOwner: TComponent); override;

published{ Published declarations )property Model:TModel read FModel write SetDesenModel

default fCerc;property OnChange:TChangeEvent read FOnChange write FOnChange;

end;procedure Register; implementationconstructor TDesen.Create(AOwner: TComponent); begin

inherited Create(AOwner);Width:= 100;Height:=100;

446

FModel:=fPatrat ; end;procedure TDesen.SetDesenModel(Valoare:TModel); begin

if ValoareoFModel then begin

if assigned(FOnChange) then FOnChange(Self,s);FModel:=Valoare;Invalidate;

end;end;procedure TDesen.Paint; var p :TRect;

m:integer;begin

p:=ClientRect; case FModel of

fDreptunghi: begins :='Dreptunghi';Canvas.Rectangle(p.Left,p.Top,

p .Right,p .Bottom)end;

fElipsa : begins :='Elipsa';Canvas.Ellipse(p.Left,p.Top,

p .Right,p .Bottom);end;

fPatrat : begins:='Patrat'; if Height>Width then m:=Width else m:=Height;Canvas.Rectangle(p.Left,p.Top,

p .Left+m,p.Top+m)end;

fCerc : begins :='Cere'; if Height>Width then m:=Width else m:=Height;Canvas.Ellipse(p.Left,p.Top,

p . Lef t+m, p . Top+m) ;end;

end;end;

procedure Register; begin

RegisterComponents('Samples', [TDesen]); end;

e n d .

31.10.3. O cutie de dialog specială

Această cutie afişează un AboutBox. Pentru aceasta copiaţi fişierul about.pas din directorul ...\BIN în directorul d-voastră de lucru. Acest unit conţine o formă TAboutBox pe care se află etichetele cu denumirile ProductName, Version, Copyright, Comments şi o componentă TImage în care va apărea un icon al aplicaţiei pentru care creaţi cutia About. Componenta noastră va folosi această formă, deci unitul nostru (TAboutDlg) va trebui să includă unitul About.pas.

Ştim de la clasicele cutii de dialog (TOpenDialog...) că o componentă de acest tip trebuie să aibă o metodă Execute care va aduce la suprafaţă o cutie de dialog. în cazul nostru, metoda Execute va afişa forma TAboutBox. Deci componentei noastre TAboutBoxDlg îi adăugăm patru proprietăţi corespun­zătoare celor patru etichete de pe forma AboutBox şi o metodă Execute care va instanţia o componentă TAboutBox.

unit AboutDlg;interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms,Dialogs,About;

typeTAboutBoxDlg = class(TComponent) private

FProductName, FVersion, FCopyright, FComments: string; protected publicfunction Execute: Boolean,-

publishedproperty ProductName: string read FProductName

write FProductName; property Version: string read FVersion write FVersion; property Copyright: string read FCopyright write FCopyright; property Comments: string read FComments write FComments;

end;var AboutBox:TAboutBox; procedure Register;implementationprocedure Register; begin

RegisterComponents('Samples', [TAboutBoxDlg]); end;

448

function TaboutBoxDlg.Execute: Boolean; begin

Abo\itBox := TaboutBox. Create (Application) ; try

if ProductName = ’'then ProductName := Application.Title;AboutBox.ProductName.Caption := ProductName; AboutBox.Version.Caption := Version;AboutBox.Copyright.Caption := Copyright;AboutBox.Comments.Caption : = Comments;AboutBox.Caption := 'About ' + ProductName;with AboutBox dobegin

Programlcon.Picture.Graphic := Application.Icon; Result (ShowModal = IDOK);

end; finally

AboutBox.Free;

end;end;end.

31.10.4. A doua cutie de dialog specială

O cutie de dialog trebuie să iniţializeze un dialog cu utilizatorul şi deci să returneze rezultatul dialogului. In acest scop am creat componenta TSirDialog care afişează o cutie de dialog în care utilizatorul este solicitat să introducă un şir de caractere. Cutia de dialog, care este formată din o componentă TEdit şi două componente TBitBtn (un buton de tip Default, iar celălalt de tip Cancel) s-ar fi putut realiza şi vizual (aşa cum era realizat AboutBox-\i\ din exemplul anterior), dar atunci ar fi fost mai problematică transmiterea de date spre componenta propriu-zisă (în cazul nostru TSirDialog). Aşa că am realizat această cutie de dialog doar folosind cod sursă. Componenta propriu-zisă TSirDialog are o proprietate şi anume proprietate Sir care va reţine şirul introdus de utilizator şi o metodă Execute care va crea un dialog cu utilizatorul şi va returna un şir de caractere introdus de acesta.

unit SirDialog;interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;

typeTSirDialog = class(TComponent)

449

privateFSir:string;

protected public

function Execute:boolean; published

property Sir .-string read FSir write FSir; end;

procedure Register; implementation

function TSirDialog.Execute:boolean; var f:TForm;

e:TEdit;bOk,bCancel:TBitBtn;

beginf:=TForm.Create(Application);f . Le f t : = 1; f . Top : = 1f.Width := 300 ; f.Height : = 200 ;f.Caption := 'SirDialog';f.Font.Color := clWindowText;f.Font.Height := -11;f.Font.Name := 'MS Sans Serif';f.Font.Style := [];e:=TEdi t.Create(f) ;e.Top:= 5 0; e.Le f t:= 8 0;e.Width := 121; e.Height := 21 ;e.TabOrder := 1 ;e.Text := ' ' ;e.Parent:=f;e.Visible:=true;bOk:=TBitBtn.Create(f);bCancel:=TBitBtn.Create(f);bOk.Kind:=bkOk ;bCancel.Kind:=bkCancel;b0k.Top:=100; bCancel.Top:=100;bOk.Left:=50; bCancel.Left:=150;bOk.Parent:=f ;bCancel.Parent: = f;Result:=f.ShowModal=mrOk; if Resultthen FSir:=e.Text;e.Free; bOk.Free; bCancel.Free;f.Free;

end;procedure Register; beginRegisterComponents('Samples', [TSirDialog]);

end;

450

e n d .

31.10.5. O componentă cu editor de proprietăţi

Este vorba de o componentă simplă care are două proprietăţi NumeSursa şi NumeDestinaţie. Acestea reprezintă două nume de fişiere între care se va face o operaţie de copiere prin intermediul metodei Copiază. Nimic deosebit până aici. însă ceea ce am vrut să scot în evidenţă a fost modul de introducere al numelor celor două fişiere. Pentru aceasta nu am creat două proprietăţi de tip string care să reprezinte cele două nume, ci am creat o clasă care are ca date membre cele două nume de fişiere.

Deci, cum am mai spus şi în partea teoretică, o componentă care are o proprietate cu editor de proprietăţi are nevoie de cel puţin 4 clase şi anume:

a. clasa propriu-zisă a componentei

în cazul nostru se numeşte TCopyComp.

b. clasa proprietăţii

Deoarece este nevoie de editoare de proprietăţi doar atunci când valoarea proprietăţii este o dată complexă. în cazul nostru clasa se numeşte TNumeFisiere.

c. clasa editorului de proprietăţi

Trebuie să derive din TPropertyEditor care trebuie să redefîneacă câteva metode. în cazul nostru clasa se numeşte TNumeFisiereProperty şi are redefinite metodele Edit şi GetAttributes.

d. clasa părţii de dialog

Constă din două componente TEdit în care se vor introduce numele fişierelor între care se va face copierea, două butoane TButton care vor fi folosite pentru a apela două cutii de dialog (componente de tip TOpenDialog) care vor permite selectarea, din fişierele existente, a celor două între care se face operaţia de copiere. Totodată dialogul mai conţine două componente TBitBtn una de tip Default şi alta de tip Cancel al căror scop este evident. Această cutie de dialog va arăta astfel:

451

m Dialogul z m m

y o k : : X Caflce|

Pentru a nu încărca un singur fişier, am pus clasele TCopyComp şi TNumeFişiere în alt unit:

unit CopyComp;interfaceuses

Classes, Graphics, Controls, Forms,fmxutils;

typeTNumeFisiere = class(TPersistent) private

FFisierSursa:string;FFisierDestinatie:string; procedure SetSursa(Valoare:string); procedure SetDestinatie(Valoare:string);{ Private declarations }

protected{ Protected declarations }

public( Public declarations }procedure Atribuie(Valoare:TNumeFisiere);

published{ Published declarations }property FisierSursa:string read FFisierSursa write SetSursa; property FisierDestinatie:string read FFisierDestinatie

write SetDestinatie;end;

TCopyComp=class(TComponent)FNumeFisiere:TNumeFisiere;constructor Create(AOwner:TComponent); override; procedure SetFisiere(Valoare:TNumeFisiere);

452

privateprotectedpublicprocedure Copiaza;

publishedproperty NumeFisiere:TNumeFisiere read FNumeFisiere

write SetFisiere;end;

implementation

procedure TNumeFisiere.SetSursa(Valoare:string); begin

if ValoareoFFisierSursa then FFisierSursa:=Valoare;

end;procedure TNumeFisiere.SetDestinatie(Valoare:string); begin

if ValoareoFFisierDestinatie then FFisierDestinatie:=Valoare;

end;procedure TNumeFisiere.Atribuie(Valoare:TNumeFisiere); begin

FişierSursa:=Valoare.FisierSursa;FisierDestinatie:=Valoare.FisierDestinatie;

end;constructor TCopyComp.Create(AOwner: TComponent); begin

inherited Create(AOwner);FNumeFisiere:=TNumeFisiere.Create ;FNumeFisiere.FisierSursa:='f1.txt';FNumeFisiere.FisierDestinatie:=1f2.txt1;

end;procedure TCopyComp.SetFisiere(Valoare:TNumeFisiere); begin

FNumeFisiere.Atribuie(Valoare); end;procedure TCopyComp.Copiaza; beginCopyFile(FNumeFisiere.FisierSursa,FNumeFisiere.FisierDestinatie); end;end.

iar unitul care conţine clasele TDialogul şi TNumeFisiereEditor este:

unit dialog;

453

i

interfaceuses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, CopyComp, StdCtrls, Buttons,Dsgnlntf;

typeTDialogul = class(TForm)Editl: TEdit;Edit2: TEdit;BitBtnl: TBitBtn;BitBtn2: TBitBtn;Buttonl: TButton;Button2: TButton;OpenDialogI: TOpenDialog;OpenDialog2: TOpenDialog; procedure ButtonlClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure BitBtn2click(Sender: TObject); procedure EditlChange(Sender: TObject); procedure Edit2Change(Sender: TObject);private

{ Private declarations }FNumeFisiere -.TNumeFisiere;FOriginalSursa, FOriginalDestinatie: string,- procedure SetNumeSursa(Valoare:string); procedure SetNumeDestinatie(Valoare:string); procedure SeteazaNumeFisiere(Valoare:TNumeFisiere);

public{ Public declarations }property EditorNume:TNumeFisiere read FNumeFisiere

write SeteazaNumeFisiere;end;TNumeFisiereProperty = class(TClassProperty)

publicprocedure Edi t; override;function GetAttributes-. TPropertyAttributes; override;

end;

procedure Register;implementation{ $R * . DFM}

procedure TDialogul.SetNumeSursa(Valoare:string); begin

OpenDialogI.FileName:=Valoare;FNumeFisiere.FisierSursa:=Valoare;Editl.Text:=OpenDialogl.FileName;

end;

454

procedure TDialogul.SetNumeDestinatie(Valoare:string); begin

0penDialog2.FileName:=Valoare;FNumeFisiere.FisierDestinatie:=Valoare;Edit2.Text:=0penDialog2.FileName;

end;procedure TDialogul.SeteazaNumeFisiere(Valoare:TNumeFisiere); begin

FNumeFisiere: =Valoare;FOriginalSursa:=Valoare.FisierSursa;FOriginalDestinatie:=Valoare.FisierDestinatie;SetNumeSursa(Valoare.FisierSursa) ;SetNumeDestinatie(Valoare.FisierDestinatie);

end;procedure TDialogul-ButtonlClick(Sender: TObject); begin

if OpenDialogI.Execute then Editl.Text:=OpenDialogl.FileName;

end;procedure TDialogul.Button2Click(Sender: TObject) ,- begin

if 0penDialog2.Execute then Edit2.Text:=0penDialog2.FileName;

end;procedure TNumeFisiereProperty.Edit; var

NumeFisiere: TNumeFisiere;NumeEditor: TDialogul;

beginNumeFisiere := TNumeFisiere(GetOrdValue);NumeEditor := TDialogul.Create(Application); tryNumeEditor.EditorNume := NumeFisiere;NumeEditor.ShowModal;

finallyNumeEdi tor.Free ;

end; end;function TNumeFisiereProperty.GetAttributes: TPropertyAttributes; begin

Result := [paDialog, paSubProperties, paMultiSelect]; end;procedure Register,- begin

RegisterComponents(’Samples', [TCopyComp]); RegisterPropertyEditor(Typeinfo(TNumeFisiere) ,nil, ’ ',

TNumeFisiereProperty);end;

455

procedure TDialogul.BitBtn2Click(Sender: TObject); begin

SetNumeSursa(FOriginalSursa);SetNumeDestinatie(FOriginalDestinatie);

end;procedure TDialogul.EditlChange(Sender: TObject); begin

SetNumeSursa(Editl.Text); end;

procedure TDialogul.Edit2Change(Sender: TObject); begin

SetNumeDestinatie(Edit2.Text); end;end.

31.10.6. Un editor de componente

Este vorba de aceeaşi componentă de mai sus (TCopyComp) la care îi mai adăugăm un item în meniul de context care apare la click drepta pe ea (la timpul proiectării aplicaţiei). Acest nou item se va numi Editează Nume şi la apăsarea lui va apărea cutia de dialog de la proprietatea NumeFisiere.

Noua clasă, a editorului de componente, se va numi TCopyCompEditor şi va redefini metodele EdilProperty, GetVerbCount, GetVerb şi ExecuteVerb. Codul sursă de la componenta anterioară rămâne acelaşi, aşa că nu îl mai rescriu, ci doar adaug la el (la unit-ul dialog) următoarele linii:

{A ceste linii se vor adăuga în secţiunea interface}TCopyCompEditor = class(TDefaultEditor) protected

procedure EditProperty(PropertyEditor-. TPropertyEditor; var Continue, FreeEditor: Boolean); override;

publicprocedure ExecuteVerb(Index: Integer); override; function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override;

end;

{A ceste linii se vor adăuga în secţiunea im p lem entation}

procedure TCopyCompEditor.EditProperty(PropertyEdi tor: TPropertyEdi tor; var Continue, FreeEditor: Boolean);

varPropName: string;

beginPropName := PropertyEditor.GetName; if (CompareText(PropName, 'NumeFisiere') = 0) then

456

beginProperCyEdi tor.Edi t ;Continue := False;

end; end;function TCopyCompEditor.GetVerbCount: Integer; begin

Result := 1; end;function TCopyCompEditor.GetVerb(Index: Integer): string; begin

if Index = 0 thenResult := 'Editează Nume1

else Result := 1 1 ; end;procedure TCopyCompEditor.ExecuteVerb(Index: Integer); begin

if Index = 0 then Edit; end;

iar în interiorul procedurii Register se va adăuga linia:

RegisterComponentEditor(TCopyComp, TCopyCompEditor);

BIBLIOGRAFIE

1. M. Oltean, M. Cocan, C ++B uilder în Aplicaţii, Editura Albastră, Grupul Microinformatica, 1998.

2. M . Oltean, Programarea avansată în Delphi, Editura Albastră, Grupul Microinformatica, 1999.

3. M. Oltean, C. Groşan, Programare în C++Builder, Editura Albastră, Grupul Microinformatica, 2000.

4. Delphi Pages, http://www.delphipages.com.

5. Torry's Delphi Pages, http://www.torry.net.

6. About Dephi Programming, http://delphi.about.com.

7. Project Jedi, http://www.delphi-jedi.org.

8. Delphi32, http://www.delphi32.com.

9. Delphi Super Page, http://delphi.icm.edu.pl.

10. The Delphi Magazine, http://www.thedelphimagazine.com.

11. The Delphi Pool, http://www.lmc-mediaagentur.de/dpool.htm.

12. Unofficial Delphi Developers FAQ,http:// w w w . gnomehome .demon. nl/uddf.

13. DelphiSeek, http://www.delphiseek.com.

14. The Delphi Corner, http://www.delphicorner.,f9.co.uk.

15. Dr. Bob's Delphi, C+Builder, and JBuilder Programming Clinic, http://www.drbob42.com.

16. Delphi-Dolphin, http://www.delphi-dolphin.com.

17. The Delphi Compendium: Delphi Programming Resources, http://www.cyber-matrix.com/delphi.html.

18. The Delphi Compendium'. Delphi Programming Resources, http://www.cyber-matrix.com/delphi.html.

LLLiL lLU V l t t i X i t x U Lwww.albastra.ro

www.gmi.ro

I.S.B.N. 973-650-119-1

Delphi este un mediu de programare vizual destinat proiectării rapide a aplicaţiilor Windows.

Cartea oferă o imagine de ansamblu, descriind şi exemplificând elementele de bază necesare programării aplicaţiilor In mediul Delphi.

i

L H m ijiiA . t u j & s i m400500 str. Observatorului 1

Cluj-Napoca, România tel. 0264.438328*, fax 0264.598263

e-mail:[email protected] C. P. 186 Of. Post. Cluj-Napoca 1


Recommended