[ Pobierz całość w formacie PDF ]
.bez wzglêdu na nazwê) w³aœciwoœci typu TShapeType// w dowolnym komponencieRegisterPropertyEditor(EnumTypeInfo("TShapeType")*TShapeTypePropInfo->PropType,0, //dowolny komponent"", //dowolna w³aœciwoœæ typu TShapeType__classid(TShapeTypePropertyEditor));}}Przyjêliœmy dla uproszczenia, i¿ nazwa prezentowanego na wydruku 8.17 plikuŸród³owego to NameOfThisFile.cpp, co znajduje swe odzwierciedlenie m.in.wdyrektywie namespace.Dyrektywa #include "NameOfThisFile" jest w³aœciwiezbêdna, podobnie jak i sam plik NameOfThisFile.h; kod pliku implementacyjnegow³¹czany jest bowiem do kodu Ÿród³owego pakietu za pomoc¹ makra USEUNIT().Ponadto, jako ¿e pakiety zawieraj¹ce wy³¹cznie edytory (komponentów i (lub)w³aœciwoœci) przydatne s¹ jedynie na etapie projektowania, nale¿y zaznaczyæopcjê DesignTime only na karcie Description opcji pakietu.Wykorzystanie kolekcji obrazków w edytorach w³aœciwoœciIkony towarzysz¹ce elementom rozwijalnej listy w edytorzeTShapeTypePropertyEditor stanowi³y jedynie dodatek do tekstowej reprezentacjiowych elementów, nie posiadaj¹c samoistnego znaczenia.Przyjrzyjmy siê terazsytuacji diametralnie przeciwnej, kiedy to w³aœciwoœæ podlegaj¹ca edycjiidentyfikuje pewien obrazek, dok³adniej – jest indeksem obrazka we wskazanejliœcie typu, np.TCustomImageList.Jak ³atwo siê domyœliæ, elementamirozwijalnej listy dopuszczalnych w³aœciwoœci s¹ tutaj obrazki zmagazynowane wramach komponentu TCustomImageList (lub pochodnego, np.TImageList) i teraz toone graj¹ pierwsze skrzypce, a ewentualne ich opisy tekstowe posiadaj¹ li tylkoznaczenie pomocnicze.Wskazanie na ów komponent „magazynuj¹cy” mo¿e znajdowaæsiê w tym samym komponencie, co edytowana w³aœciwoœæ, b¹dŸ te¿ w jegokomponencie rodzicielskim [2 Dla unikniêcia zbytniej komplikacji tekstuokreœlenia „komponent rodzicielski” u¿ywamy w tym rozdziale na okreœleniezarówno komponentu wskazywanego przez w³aœciwoœæ Parent, jak i komponentówrodzicielskich tego ostatniego, bêd¹cych „dziadkami” przedmiotowego komponentu– czyli w sensie przechodniego domkniêcia relacji rodzicielstwa – przyp.t³um.](byæ mo¿e dalszego rzêdu); w dalszej czêœci poka¿emy praktyczne konsekwencjetej ró¿nicy.Na potrzeby naszych rozwa¿añ skonstruowaliœmy na bazie klasy TImage komponentTEnhancedImage, którego zadaniem jest po prostu reprezentowanie obrazkaidentyfikowanego przez indeks (okreœlony przez w³aœciwoœæ ImageIndex) w liœcieobrazków wskazanej przez w³aœciwoœæ ImageList.Je¿eli w³aœciwoœæ ImageList niewskazuje na ¿adn¹ listê (jest pustym wskaŸnikiem), komponent ten zachowuje siêidentycznie jak jego komponent bazowy TImage.Deklaracjê komponentu TEnhancedImage przedstawia wydruk 8.18.Wydruk 8.18.Deklaracja komponentu TEnhancedImage//----------------------------------------------------------------------//#ifndef EnhancedImageH#define EnhancedImageH//---------------------------------------------------------------------//#include#include#include#include//--------------------------------------------------------------------////--------------------------------------------------------------------//class PACKAGE TEnhancedImage : public TImage{typedef TImage inherited;private:// lista obrazków (komponent magazynuj¹cy):TCustomImageList* FImageList;// indeks obrazka we wskazanej liœcieImglist::TImageIndex FImageIndex;// czy u¿ywana jest zewnêtrzna lista, czy te¿ komponent funkcjonuje// jak komponent TImage?bool FUseImageList;protected:virtual void __fastcall SetUseImageList(bool NewUseImageList);virtual void __fastcall SetImageIndex(Imglist::TImageIndex NewImageIndex);virtual void __fastcall SetImageList(Imglist::TCustomImageList* NewImageList);virtual void __fastcall UpdatePicture(void);// Override Notificationvirtual void __fastcall Notification(TComponent* AComponent, TOperationOperation);public:__fastcall TEnhancedImage(TComponent* Owner);__published:__property bool UseImageList = {read=FUseImageList,write=SetUseImageList,default=false};__property TCustomImageList* ImageList = {read=FImageList,write=SetImageList,default=0};__property Imglist::TImageIndex ImageIndex = {read=FImageIndex,write=SetImageIndex,default=-1};};//---------------------------------------------------------------------////---------------------------------------------------------------------//#endifNowe metody i w³aœciwoœci komponentu zwi¹zane s¹ z obs³ug¹ wspomnianej listy iindeksu oraz z ich wp³ywem na aktualnie reprezentowany obrazek, kryj¹cy siê podw³aœciwoœci¹ Picture.Zapewniono tak¿e wra¿liwoœæ komponentu na usuniêcielisty, przedefiniowuj¹c odpowiednio metodê Notification().Charakterystycznedla komponentu metody znajduj¹ siê we fragmencie kodu implementacyjnegoprezentowanym na wydruku 8.19.Wydruk 8.19.Nowe metody komponentu TEnhancedImage// konstruktor__fastcall TEnhancedImage::TEnhancedImage(TComponent* Owner): TImage(Owner),FUseImageList(false),FImageIndex(-1),FImageList(0){}//------------------------------------------------------------------------//void __fastcall TEnhancedImage::SetUseImageList(bool NewUseImageList){if(NewUseImageList != UseImageList){FUseImageList = NewUseImageList;UpdatePicture();}}//------------------------------------------------------------------------//void __fastcall TEnhancedImage::SetImageIndex(Imglist::TImageIndexNewImageIndex){if(NewImageIndex != FImageIndex){FImageIndex = NewImageIndex;UpdatePicture();}}//------------------------------------------------------------------------//void __fastcall TEnhancedImage::SetImageList(Imglist::TCustomImageList*NewImageList){if(NewImageList != FImageList){FImageList = NewImageList;if(ImageList == 0) ImageIndex =-1;}}//------------------------------------------------------------------------//void __fastcall TEnhancedImage::UpdatePicture(void){if( UseImageList&& ImageList != 0&& ImageIndex >= 0&& ImageIndex < ImageList->Count ){std::auto_ptr Image(new Graphics::TBitmap());ImageList->GetBitmap(ImageIndex, Image.get());Picture->Assign(Image
[ Pobierz całość w formacie PDF ]