[ Pobierz całość w formacie PDF ]
.Obiekt ten zalicza siÄ™ dokategorii elementów kolekcji, wywodzi siÄ™ bowiem z klasy TCollectionItem i jako taki zwiÄ…zanyjest ze swÄ… macierzystÄ… kolekcjÄ… THeaderSections stanowiÄ…cÄ… dla niego klasÄ™-pojemnik (ang.container class) i wskazywanÄ… przez wÅ‚aÅ›ciwość Collection.Komponentem rodzicielskim dla tejkolekcji jest komponent reprezentujÄ…cy nagłówek jako caÅ‚ość THeaderControl i dostÄ™pny zapomocÄ… jej metody GetOwner(); to wÅ‚aÅ›nie on zarzÄ…dza żądanÄ… listÄ… obrazków, ukrywajÄ…cÄ… siÄ™ podjego wÅ‚aÅ›ciwoÅ›ciÄ… Images.Wszystko to byÅ‚oby niezwykle proste, gdyby nie pewien szkopuÅ‚: otóż metodaTHeaderSections::GetOwner() jest metodÄ… chronionÄ… (protected), a wiÄ™c niedostÄ™pnÄ…dla bezpoÅ›redniego wywoÅ‚ania.Aby udostÄ™pnić jÄ… użytkownikowi, należaÅ‚oby zdefiniować klasÄ™pochodnÄ… do THeaderSections i wypromować w niej metodÄ™ GetOwner() na metodÄ™publicznÄ… (public).Taka klasa, nie definiujÄ…ca żadnych nowych elementów, lecz jedynieudostÄ™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Ä™: 59class THeaderSectionsAccess :public THeaderSections{public:DYNAMIC Classes::TPersistent*__fastcall GetOwner(void);};Edytor dla wÅ‚aÅ›ciwoÅ›ci ImageIndex obiektu THeaderSection bÄ™dzie siÄ™ różniÅ‚ od opisywanegoprzed chwilÄ… TMenuItemImageIndexProperty jedynie metodÄ… GetParentImageList(),realizujÄ…cÄ… scenariusz przed chwilÄ… opisany; na wydruku 8.26 przedstawiamy jej implementacjÄ™.Wydruk 8.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 VCL zawierajeszcze kilka innych klas wywodzÄ…cych siÄ™ z TPersistent lub TComponent i posiadajÄ…cychwÅ‚aÅ›ciwość ImageIndex.Ich zestawienie zawiera tabela 8.10.Tabela 8.10.Obiekty VCL posiadajÄ…ce wÅ‚aÅ›ciwość ImageIndex 60Klasa komponentu GenealogiaTCoolBand ’! TCollectionItem’! TPersistentTCustomAction ’! TComponent’! TPersistentTHeaderSection ’! TCollectionItem’! TPersistentTListColumn ’! TCollectionItem’! TPersistentTMenuItem ’! TComponent’! TPersistentTTabSheet ’! TWinControl’! TControl’! TComponent’! TPersistentTToolButton ’! TGraphicControl’! TControl’! TComponent’! TPersistentNa podstawie doÅ›wiadczeÅ„ nabytych przy konstrukcji edytorów dotychczas opisanych można bypokusić siÄ™ o generalne rozwiÄ…zanie edycji wÅ‚aÅ›ciwoÅ›ci ImageIndex dla wszystkich obiektów5zestawionych w tabeli 8.10.RozwiÄ…zanie to ma postać klasy bazowej, z której Å‚atwo wyprowadzićedytor dla konkretnego obiektu.DeklaracjÄ™ tej klasy przedstawia wydruk 8.27.Wydruk 8.27.Deklaracja abstrakcyjnej klasy bazowej dla edytorów wÅ‚aÅ›ciwoÅ›ci ImageIndexclass PACKAGE TImageIndexProperty : public TIntegerProperty{typedef TIntegerProperty inherited;private:static const int Border = 2;static const int MaxImageWidth = 64;static const int MaxImageHeight = 64;protected:virtual Imglist::TCustomImageList* __fastcall GetImageList(void) = 0;public:virtual TPropertyAttributes __fastcall GetAttributes(void);virtual void __fastcall GetValues(Classes::TGetStrProc Proc);DYNAMIC void __fastcall ListMeasureWidth(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AWidth);DYNAMIC void __fastcall ListMeasureHeight(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AHeight);DYNAMIC void __fastcall ListDrawValue(const AnsiString Value,Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,bool ASelected);DYNAMIC void __fastcall PropDrawValue(Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,bool ASelected);5Celowo mówimy tu ogólnie o obiektach , nie komponentach , rezerwujÄ…c to ostatnie okreÅ›lenie dlaegzemplarzy klas wywodzÄ…cych siÄ™ z klasy TComponent przyp.tÅ‚um. 61__property Imglist::TCustomImageList* RemoteImageList ={read=GetImageList};protected:#pragma option push -w-inlinline __fastcall virtual TImageIndexProperty(const _di_IFormDesignerADesigner,int APropCount): TIntegerProperty(ADesigner,APropCount){ }#pragma option poppublic:#pragma option push -w-inlinline __fastcall virtual ~TImageIndexProperty(void){ }#pragma option pop};Jako że wymienione w tabeli 8.10 obiekty różniÄ… siÄ™ (z punktu widzenia wÅ‚aÅ›ciwoÅ›ci ImageIndex)jedynie relacjÄ… do listy zawierajÄ…cej żądane obrazki, jedynÄ… metodÄ… wymagajÄ…cÄ… przedefiniowania wklasach pochodnych jest metoda GetImageList().Przedefiniowanie to jest konieczne, bowiemmetoda ta jest metodÄ… czysto wirtualnÄ… (ang.pure virtual), a wiÄ™c klasa TImageIndexPropertyjest abstrakcyjnÄ… klasÄ… bazowÄ… (ang.abstract base class).Jak Å‚atwo zauważyć, tabela 8.10 wprowadza podziaÅ‚ prezentowanych obiektów na dwie grupy: tychwywodzÄ…cych siÄ™ z klasy TComponent (czyli komponentów) i pozostaÅ‚ych, wywodzÄ…cych siÄ™ jedyniez klasy TPersistent.ImplementacjÄ™ metody GetImageList() w klasie bazowej dla tej drugiejgrupy (TPersistentDerivedImageIndexProperty) przedstawia wydruk 8.28.Wydruk 8.28
[ Pobierz całość w formacie PDF ]