[ Pobierz całość w formacie PDF ]
.W pierwszymprzypadku metoda ostatecznie zwraca wartość NULL, w drugim natomiast badana jest właściwość onazwie Images komponentu rodzicielskiego dla znalezionego komponentu i zwracana jako wynikmetody po uprzednim rzutowaniu jej na wskaznik TCustomImageList*.Analogiczna metoda dla komponentów  tj.tych obiektów wymienionych w tabeli 8.10, które wywodząsię z klasy TComponent  jest o tyle prostsza, iż opisane przeszukiwanie w ogóle jest niepotrzebne,bowiem już obiekt  bezpośrednio rodzicielski (czyli ten wskazywany przez własciwość Parent) samjest komponentem, więc można od razu skorzystać ze znanych mechanizmów RTTI.Implementacjęfunkcji GetImageList() dla tej klasy obiektów przedstawia wydruk 8.29.Wydruk 8.29.Implementacja metody GetImageList() dla obiektów VCL wywodzących się z klasyTComponentImglist::TCustomImageList*__fastcallTComponentDerivedImageIndexProperty::GetImageList(void){TComponent*Parent=static_cast(GetComponent(0))->GetParentComponent();if(Parent ==0) return 0;PPropInfo PropInfo=Typinfo::GetPropInfo(static_cast(Parent->ClassInfo()),FParentImageListName);if(PropInfo ==0)return 0;return(reinterpret_cast(Typinfo::GetOrdProp(Parent,PropInfo)) 63);}Niestety, implementacje z wydruków 8.28 i 8.29 nie przydadzą się w przypadku trzech spośródwymienionych w tabeli 8.10 klas, z bardzo prozaicznego powodu, jakim jest nieadekwatność nazwywłaściwości wskazującej listę obrazków, domyślnie przyjętej jako Images: dla listy TListColumnwłaściwość ta nosi nazwę SmallImages, dla TMenuItem  SubMenuImages; dla przyciskuTToolButton nazwa Images aktualna jest jedynie wówczas, gdy przycisk jest dostępny(enabled), w przeciwnym wypadku lista obrazków wskazywana jest przez właściwośćDisabledImages.Dla obiektów TListColumn i TMenuItem wystarczy więc prosta zmianałańcucha przypisywanego polu FParentImageListName, dla obiektu TToolButton wymaganajest odmienna postać samej metody (patrz wydruk 8.30).Wydruk 8.30.Poszukiwanie listy obrazków dla komponentu TToolButtonImglist::TCustomImageList* __fastcallTToolButtonImageIndexProperty::GetImageList(void){TToolButton* Component = dynamic_cast(GetComponent(0));if(Component){TToolBar* ParentToolBar = dynamic_cast(Component->Parent);if(ParentToolBar){if(Component->Enabled) return ParentToolBar->Images;else return ParentToolBar->DisabledImages;}}return 0;}Ostatecznie więc obiekty VCL, posiadające właściwość ImageIndex, posługują się (w celu edycji tejwłaściwości) pięcioma edytorami, których drzewo genealogiczne przedstawia rysunek 8.8.Rysunek 8.8.Edytory właściwości ImageIndex obiektów biblioteki VCLTworzenie edytorów komponentówMożliwości IDE w zakresie uatrakcyjniania pracy z komponentami nie kończą się na edytorachwłaściwości.Ingerencja użytkownika sięgać może dalej niż na poziom poszczególnych właściwości:specjalizowane edytory komponentów (bo o nich mowa) umożliwiają określenie zachowania siękomponentu jako całości podczas konfigurowania różnorodnych jego elementów, w szczególnościzmianę domyślnych ustawień w tym względzie.Klasami bazowymi dla tworzenia specjalizowanych edytorów komponentów są TComponentEditori TDefaultEditor; związek między nimi ukazuje rysunek 8.9, gdzie drukiem wytłuszczonymzaznaczono jedyną rzeczywiście zaimplementowaną metodę  Edit(); pozostałe metody klasy 64TComponentEditor posiadają pustą treść bądz ograniczają się jedynie do zwrócenia standardowegowyniku 0 (GetVerbCount()) i w takiej postaci dziedziczone są przez klasę TDefaultEditor.Rysunek 8.9.Dziedziczenie z klasy TComponentEditorStandardowe zachowanie się komponentu w reakcji na dwie najbardziej powszechne operacje dwukrotne kliknięcie lewym przyciskiem myszy oraz kliknięcie prawym  określone przez metody klasTComponentEditor i TDefaultEditor, opisane jest w tabeli 8.11.Tabela 8.11.Obsługa standardowych operacji myszą przez klasy TComponentEditor iTDefaultEditorOperacja Standardowa reakcja Wywoływane metodystandardoweKliknięcie Wyświetlenie menu kontekstowego Najpierw wywoływana jestprawym metoda GetVerbCount() wprzyciskiemcelu określenia liczbydodatkowych opcji menukontekstowego.Tekstowa postać każdej z tychopcji uzyskiwana jest przezwywołanie metodyGetVerb().Przed wyświetleniem każdejopcji wywoływana jest dla niejmetoda PrepareItem() wcelu przeprowadzeniaewentualnych modyfikacji.W przypadku kliknięcia którejś znowo dodanych opcjiwywoływana jest dla niej metodaExecuteVerb(), wykonującaspecjalizowane czynnościzwiązane z opcją.Dwukrotne TComponentEditor: Wywoływana jest metodakliknięcie Edit().Jeżeli do menu kontekstowego dodano jakieślewymopcje (GetVerbCount()>0), wykonywana jestprzyciskiemakcja związana z pierwszym wyświetlanymelementem. 65TDefaultEditor:W oknie edytora kodu tworzony jest szablonfunkcji zdarzeniowej dla jednego ze zdarzeńOnChange, OnCreate lub OnClick zależnieod tego, dla którego z nich najwcześniejdeklarowana jest właściwość zdarzeniowa.Jeżelikomponent nie obsługuje żadnego zwymienionych zdarzeń, wybierana jest pierwszadeklarowana właściwość zdarzeniowa.Jeżelikomponent w ogóle nie posiada właściwościzdarzeniowych, nie jest wykonywana żadna akcja.Analizując tę tabelę, nietrudno zauważyć różnicę pomiędzy implementacjami metody Edit() wobydwu wymienionych klasach.Jeżeli więc nowo tworzony edytor komponentu ma tworzyć szablonjakiejś metody zdarzeniowej w odpowiedzi na dwukrotne kliknięcie, TDefaultEditor z pewnościąstanowić będzie dla niego odpowiedniejszą klasę bazową niż TComponentEditor.Aby prawidłowo zaimplementować poszczególne metody edytora komponentu, należy najpierw poznaćspełniane przez nie zadania; jest to przedmiotem opisu zamieszczonego w tabeli 8.12.Tabela 8.12.Metody wirtualne klas TComponentEditor i TDefaultEditorMetoda Przeznaczenieint GetVerbCount(void)Określa liczbę opcji dodawanych do menukontekstowego [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • hanula1950.keep.pl