[ Pobierz całość w formacie PDF ]
.Przedmiotową listę obrazków znalezć można jednak znacznie prościej tak się bowiem składa,iż komponent TMenuItem wyposażony został w metodę realizującą wprost opisaneposzukiwanie.Oto ona:function TMenuItem.GetImageList: TCustomImageList;varvItem: TMenuItem;vMenu: TMenu;beginResult := nil;vItem := Parent;while (vItem nil) and (vItem.SubMenuImages = nil) dovItem := vItem.Parent;if vItem nilthenResult := vItem.SubMenuImageselsebeginvMenu := GetParentMenu;if vMenu nilthenResult := vMenu.Images;end;end;A skoro tak, to nasza metoda GetParentImageList() może być zapisana w nieco prostszejpostaci:Imglist::TCustomImageList*__fastcallTMenuItemImageIndexProperty::GetParentImageList(void){TMenuItem*Component =dynamic_cast(GetComponent(0));if(Component){return Component->GetImageList();}return 0;}W charakterze kolejnego przykładu przedstawimy jeszcze jeden obiekt wykorzystujący listęobrazków: będzie nim jedna z sekcji nagłówka tabelek THeaderSection.Obiekt tenzalicza się do kategorii elementów kolekcji, wywodzi się bowiem z klasy TCollectionItem, ijako taki związany jest ze swą macierzystą kolekcją THeaderSections stanowiącą dla niegoklasę pojemnik (ang.container class) i wskazywaną przez właściwość Collection.Komponentem rodzicielskim dla tej kolekcji jest komponent reprezentujący nagłówek jako całość THeaderControl i dostępny za pomocą jej metody GetOwner(); to właśnie onzarządza żądaną listą obrazków, ukrywającą się pod jego właściwością Images.Wszystko to byłoby niezwykle proste, gdyby nie pewien szkopuł: otóż metodaTHeaderSections::GetOwner() jest metodą chronioną (protected) a więcniedostępną dla bezpośredniego wywołania.Aby udostępnić ją użytkownikowi, należałobyzdefiniować klasę pochodną do THeaderSections i wypromować w niej metodęGetOwner() na metodę publiczną (public).Taka klasa, nie definiująca żadnych nowychelementów, lecz jedynie udostępniająca niedostępne normalnie metody i właściwości, nosi nazwęklasy dostępowej (ang.access class) w naszym przypadku będzie ona miała następującądeklarację:class THeaderSectionsAccess :public THeaderSections{public:DYNAMIC Classes::TPersistent*__fastcall GetOwner(void);};Edytor dla właściwości ImageIndex obiektu THeaderSection będzie się różnił odopisywanego przed chwilą TMenuItemImageIndexProperty jedynie metodąGetParentImageList(), realizującą scenariusz przed chwilą opisany; na wydruku 10.26przedstawiamy jej implementację:Wydruk 10.26 Implementacja metodyTHeaderSectionImageIndexProperty::GetParentImageListImglist::TCustomImageList* __fastcallTHeaderSectionImageIndexProperty::GetParentImageList(void){THeaderSection* Component = dynamic_cast(GetComponent(0));if(Component){THeaderSections* HeaderSections =dynamic_cast(Component->Collection);if(HeaderSections){TPersistent* Owner =static_cast(HeaderSections)->GetOwner(); THeaderControl* HeaderControl = dynamic_cast(Owner);if(HeaderControl){return HeaderControl->Images;}}}return 0;}Uniwersalne podejście do edycji właściwościImageIndexPoza opisanymi przed chwilą obiektami TMenuItem i THeaderSection biblioteka VCLzawiera jeszcze kilka innych klas wywodzących się z TPersistent lub TComponent iposiadających właściwość ImageIndex.Ich zestawienie zawiera tabela 10.10.Tabela 10
[ Pobierz całość w formacie PDF ]