[ Pobierz całość w formacie PDF ]
.Metoda GetAttributes()Edytor nasz umo¿liwiaæ ma wybór „wartoœci” z rozwijalnej listy, nale¿y wiêcwpisaæ na jego listê atrybutów wartoœæ paValueList.Jednoczeœnie edytowanaw³aœciwoœæ ma byæ niewidoczna w przypadku zaznaczenia kilku komponentów, wiêcna liœcie atrybutów nie mo¿e znajdowaæ siê wartoœæ paMultiSelect:TPropertyAttributes __fastcall TImageIndexPropertyEditor::GetAttributes(void){return (inherited::GetAttributes() > paMultiSelect);}Metoda GetComponentImageList()Ta metoda ma kluczowe znaczenie dla poprawnego funkcjonowania edytora,udostêpnia bowiem wskaŸnik do listy obrazków danego komponentu lub informuje obraku takiej listy, zwracaj¹c wartoœæ NULL.Wszystko rozpoczyna siê od uzyskania wskaŸnika do macierzystego komponentuedytowanej w³aœciwoœci; poniewa¿ brak atrybutu paMultiSelect zapewnia, ¿ezaznaczony jest tylko jeden komponent, jego adres jest wartoœci¹ wyra¿eniaGetComponent(0).[3 Metoda GetComponent()klasy TPropertyEditor deklarowana jestnastêpuj¹co:Classes::TPersistent* __fastcall GetComponent(int Index);]Maj¹c ju¿ wskaŸnik komponentu, nale¿y upewniæ siê, i¿ jest to komponent klasyTEnhancedImage lub pochodnej – mo¿na to bardzo ³atwo zrealizowaæ za pomoc¹rzutowania dynamicznego.Ostatni¹ czynnoœci¹ bêdzie oczywiœcie odczytanie w³aœciwoœci ImageListwskazywanego komponentu, po zweryfikowaniu jego klasy.Oto kompletna treœæmetody:Imglist::TCustomImageList* __fastcallTImageIndexPropertyEditor::GetComponentImageList(void){TEnhancedImage* Component = dynamic_cast(GetComponent(0));if(Component) // czy komponent jest klasy TEnhancedImage?{// tak, zwróæ wskaŸnik jego listy obrazkówreturn Component->ImageList;}return 0;}W przypadku gdy lista obrazków wykorzystywanych przez dany komponent znajdujesiê w jego komponencie macierzystym, jej odnalezienie jest nieco bardziejskomplikowane; zajmiemy siê tym w dalszej czêœci rozdzia³u.Metoda GetValues()Metoda ta zajmuje siê, jak wiadomo, skompletowaniem zawartoœci rozwijalnejlisty.W naszym przypadku ka¿dy z obrazków w rozwijalnej liœcie reprezentowanybêdzie przez swój indeks w liœcie TCustomImageList:void __fastcall TImageIndexPropertyEditor::GetValues(Classes::TGetStrProc Proc){TCustomImageList* ImageList = ComponentImageList;if(ImageList != 0){for(int i = 0; iCount; ++i) Proc(IntToStr(i));}}Zwróæ uwagê, i¿ wskazanie na listê – magazyn obrazków zapamiêtane zosta³o wpomocniczej zmiennej roboczej.Z punktu widzenia poprawnoœci kodu jest to bezznaczenia, lecz odczytanie zmiennej lokalnej trwa przecie¿ znacznie szybciejni¿ bezpoœredni odczyt w³aœciwoœci komponentu, który teraz wykonuje siê tylkoraz.Metody ListMeasureWidth() i ListMeasureHeight()Metody wymienione w tytule odpowiedzialne s¹ za okreœlenie wymiarówwyœwietlanych obrazków.W przeciwieñstwie do edytora TShapeTypePropertyEditor,gdzie beztrosko dostosowywaliœmy szerokoœæ i wysokoœæ komórek inspektoraobiektów do wymiarów ikon – przy milcz¹cym za³o¿eniu, ¿e te ostatnie bêd¹raczej niewielkie, jak na ikony przysta³o – tym razem musimy wzi¹æ pod uwagêpewne realistyczne ograniczenia.WyobraŸmy sobie, jak wygl¹da³aby rozwijalnalista, w której ka¿dy z obrazków zajmowa³by (powiedzmy) po³owê wysokoœciekranu? Przypadek ten ukazuje dobitnie, i¿ obrazki zbyt du¿e (czyli zbytszerokie i (lub) zbyt wysokie) musz¹ byæ poddane przeskalowaniu, które ³atwojest wykonaæ za pomoc¹ metody StretchDraw() p³Ã³tna TCanvas.Jako ograniczenie zarówno szerokoœci, jak i wysokoœci obrazka wybraliœmyarbitralnie wielkoœæ 64 pikseli.Mieœci siê ona jeszcze w akceptowalnychgranicach (nawet przy rozdzielczoœci 640´480 widocznych bêdzie kilka pozycji) ijest jednoczeœnie na tyle du¿a, by rozró¿niæ mo¿na by³o najwa¿niejsze szczegó³ywyœwietlanych obrazków.No i oczywiœcie jest potêg¹ dwójki, co tak lubiane jestprzez programistów… Ka¿dy z wyœwietlonych obrazków musi ponadto zachowaæ odstêpod krawêdzi komórki i wypisywanego tekstu – jego wielkoœæ okreœlona jest przezzmienn¹ Border, arbitralnie ustawion¹ na 2 piksele.Oto treœæ metod ListMeasureWidth() i ListMeasureHeight():Wydruk 8.21.Implementacja metod ListMeasureWidth() i ListMeasureHeight()void __fastcall TImageIndexPropertyEditor::ListMeasureWidth(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AWidth){TCustomImageList* ImageList = ComponentImageList;if(ImageList != 0){if(ImageList->Width < MaxImageWidth){AWidth += ImageList->Width + Border*2;}else{AWidth += MaxImageWidth + Border*2;}}}//-------------------------------------------------------------------------//void __fastcall TImageIndexPropertyEditor::ListMeasureHeight(const AnsiString Value,Graphics::TCanvas* ACanvas,int& AHeight){TCustomImageList* ImageList = ComponentImageList;if(ImageList != 0){if( ImageList->Height < MaxImageHeight && ImageList->Height > AHeight){AHeight = ImageList->Height + Border*2;}else if(ImageList->Height > AHeight){AHeight = MaxImageHeight + Border*2;}}}Metoda ListMeasureHeight() jest nieco bardziej skomplikowana, bowiem opróczrozmiarów obrazka nale¿y jeszcze wzi¹æ pod uwagê wysokoœæ wypisywanego tekstu,która okreœla dolne ograniczenie na wysokoœæ komórki.Metoda ListDrawValue()Jak mo¿na siê spodziewaæ, jest to najbardziej skomplikowana metoda naszegoedytora.Jest ona odpowiedzialna za ca³oœæ reprezentacji ka¿dej z pozycjirozwijalnej listy, a wiêc przede wszystkim za poprawne narysowanie wszystkichobrazków.Jej treœæ przedstawia wydruk 8.22.Wydruk 8.22
[ Pobierz całość w formacie PDF ]