[ Pobierz całość w formacie PDF ]
.Opublikowane w³aœciwoœciobiektu TStatusPanel podlegaj¹ automatycznemu zapisowi w strumieniu, aorganizacja zapisu kolejnych elementów jest w³aœnie charakterystyczn¹ cech¹kolekcji.Co prawda skupiliœmy siê na jednym aspekcie kolekcji — wspó³pracy zestrumieniem — lecz nie jest to jej jedyna i najwa¿niejsza cecha; o jeju¿ytecznoœci stanowi przede wszystkim efektywnoœæ zarz¹dzania elementami — ichdodawanie, usuwanie, zwalnianie i przechowywanie w strumieniu; o szczegó³achmo¿esz przeczytaæ w systemie pomocy Delphi.Zastosowanie kolekcji zilustrujemy przyk³adem grupowania przyciskówTddgRunButton, opisanych w rozdziale 11.Stworzymy komponent TddgLaunchPad,pozwalaj¹cy na uruchamianie wybranej aplikacji za pomoc¹ jednego z przyciskówumieszczonych na pasku narzêdziowym.Komponent ten wywodzi siê z klasyTScrollBox.Jedn¹ z jego w³aœciwoœci jest kolekcja RunButtons, zawieraj¹caobiekty klasy TRunBtnItem.Przyk³adowy element kolekcji — klasa TRunBtnItemKa¿dy element kolekcji — jako obiekt TRunBtnItem — stanowi „obudowê” dlaprzycisku TddgRunButton, bêd¹cego elementem listy, jedna z jego w³aœciwoœcijest wiêc wskazaniem na ów przycisk:typeTRunBtnItem = class(TCollectionItem)privateFCommandLine: String; // PolecenieFLeft: Integer; // Pozycja przyciskuFTop: Integer; // ""FRunButton: TRunButton; // Wskazanie na przycisk…publicconstructor Create(Collection: TCollection); override;…published{ Opublikowane w³aœciwoœci podlegaj¹ce strumieniowaniu }property CommandLine: String read FCommandLine write SetCommandLine;property Left: Integer read FLeft write SetLeft;property Top: Integer read FTop write SetTop;end;Wskazanie na odnoœny przycisk (FRunButton) jest jednak w³aœciwoœci¹ prywatn¹.Mo¿na by s¹dziæ, ¿e jej opublikowanie by³oby rozs¹dniejsze, gdy¿ rozwi¹za³obywszystkie problemy ze strumieniowaniem przycisku.To prawda, lecz pojawia siêpewien problem: otó¿ strumieniowanie przebiega nieco inaczej w stosunku dokomponentów (przycisk), ni¿ w stosunku do innych pochodnych klasy TPersistent(element kolekcji) — odczyt komponentu ze strumienia po³¹czony jest ztworzeniem jego egzemplarza, natomiast dla innych klas wywodz¹cych siê zTPersistent odczytywana zawartoœæ wpisywana jest do istniej¹cego egzemplarza.Wzwi¹zku z tym poszczególne przyciski TddgRunButton nie s¹ przechowywane wstrumieniu, lecz dynamicznie tworzone przez konstruktory elementówTRunBtnItem.TRunButtons — kolekcja komponentuKolejnym krokiem jest zdefiniowanie, na bazie klasy TCollection, nowej kolekcjiprzechowuj¹cej obiekty TRunBtnItem.Kolekcjê tê nazwaliœmy TRunButtons:typeTRunButtons = class(TCollection)privateFLaunchPad: TLaunchPad; // wskazanie na w³aœcicielafunction GetItem(Index: Integer): TRunBtnItem;procedure SetItem(Index: Integer; Value: TRunBtnItem);protectedprocedure Update(Item: TCollectionItem); override;publicconstructor Create(LaunchPad: TLaunchPad);function Add: TRunBtnItem;procedure UpdateRunButtons;property Items[Index: Integer]: TRunBtnItem readGetItem write SetItem; default;end;Zwróæ uwagê na specyficzne w³aœciwoœci i metody zwi¹zane z obs³ug¹ elementówkolekcji TRunBtnItem; stanowi¹ one jej w³aœciwoœæ tablicow¹.Kolekcja zawieraponadto wskazanie na przedmiotowy pasek przycisków (FLaunchPad).Bli¿szezwi¹zki pomiêdzy paskiem, kolekcj¹ i jej elementami stan¹ siê bardziejzrozumia³e, gdy przyjrzymy siê ich szczegó³om implementacyjnym.Implementacja — wspó³praca kolekcji i jej elementów z komponentem macierzystymTworzenie, zwalnianie i zapis w strumieniu kolekcji, jej elementów i przyciskówpoleceñ ilustruje kod przedstawiony na wydruku 12.10.Wydruk 12.10
[ Pobierz całość w formacie PDF ]