[ Pobierz całość w formacie PDF ]
.// rejestracja edytora dla w³aœciwoœci typu char// rodzimych komponentów VCLRegisterPropertyEditor(VCLCharPropInfo,0,"",__classid(TCharPropertyEditor));// rejestracja edytora dla w³aœciwoœci typu char// komponentów zaimplementowanych w C++RegisterPropertyEditor(TNonVCLTypeInfo::Char(),0,"",__classid(TCharPropertyEditor));Samodzielne tworzenie informacji o typie w³aœciwoœci spoza biblioteki VCLAlternatyw¹ dla uzyskiwania wskaŸnika do ¿¹danej struktury TTypeInfo jestsamodzielne jej stworzenie i pos³ugiwanie siê jej adresem.Egzemplarz strukturymo¿e byæ statyczny, mo¿e te¿ byæ przydzielony dynamicznie; mo¿e te¿ zostaæukryty przed u¿ytkownikiem w ciele funkcji zwracaj¹cej jedynie jego wskaŸnik.Ideê tê ilustruje kod prezentowany na wydruku 10.9.Wydruk 10.9 Tworzenie struktury TTypeInfo//---------------------------------------------------------------------------//// WskaŸnik do struktury udostêpniany przez funkcjê ////---------------------------------------------------------------------------//TTypeInfo* __fastcall AnsiStringTypeInfo(void){static TTypeInfo TypeInfo;TypeInfo.Name = "AnsiString";TypeInfo.Kind = tkLString;return &TypeInfo;}// alboTTypeInfo* __fastcall AnsiStringTypeInfo(void){TTypeInfo* TypeInfo = new TTypeInfo;TypeInfo->Name = "AnsiString";TypeInfo->Kind = tkLString;return TypeInfo;}.//---------------- Wywo³anie funkcji rejestruj¹cej--------------------//RegisterPropertyEditor(AnsiStringTypeInfo(),0 ,"",__classid(TAnsiStringPropertyEditor));//---------------------------------------------------------------------------//// Jawne egzemplarze struktury////---------------------------------------------------------------------------//// statyczny egzemplarz TTypeInfostatic TTypeInfo AnsiStringTypeInfo;TypeInfo.Name = "AnsiString";TypeInfo.Kind = tkLString;RegisterPropertyEditor(&AnsiStringTypeInfo,0 ,"",__classid(TAnsiStringPropertyEditor));// albo// dynamiczny egzemplarz TTypeInfoTTypeInfo* AnsiStringTypeInfo = new TTypeInfo;TypeInfo->Name = "AnsiString";TypeInfo->Kind = tkLString;RegisterPropertyEditor(AnsiStringTypeInfo,0 ,"",__classid(TAnsiStringPropertyEditor));Zwróæ uwagê, i¿ dynamicznie utworzony egzemplarz struktury TTypeInfo nie jestzwalniany po wykorzystaniu (tj.po wywo³aniu funkcji RegisterPropertyEditor()).Funkcja ta nie tworzy bowiem kopii struktury, lecz jedynie zapamiêtuje jejwskaŸnik w jednym z rekordów listy rejestracyjnej:typePPropertyClassRec = ^TPropertyClassRec;TPropertyClassRec = recordGroup: Integer;PropertyType: PTypeInfo;PropertyName: string;ComponentClass: TClass;EditorClass: TPropertyEditorClass;end;.varPropertyClassList: TList = nil;.procedure RegisterPropertyEditor(PropertyType: PTypeInfo; ComponentClass:TClass;const PropertyName: string; EditorClass: TPropertyEditorClass);varP: PPropertyClassRec;beginif PropertyClassList = nil thenPropertyClassList := TList.Create;New(P);P.Group := CurrentGroup;P.PropertyType := PropertyType;P.ComponentClass := ComponentClass;P.PropertyName := '';if Assigned(ComponentClass) then P^.PropertyName := PropertyName;P.EditorClass := EditorClass;PropertyClassList.Insert(0, P);end;Jest to poniek¹d zrozumia³e: informacja o typie rejestrowanego edytorapobierana jest najczêœciej z permanentnie rezyduj¹cych struktur RTTI — opisaneprzed chwil¹ „rêczne” tworzenie struktur TTypeInfo wykonywane jest stosunkoworzadko.Ponadto informacja ta musi byæ pobrana z RTTI, je¿eli rejestrowanyedytor zast¹piæ ma inny edytor zarejestrowany w taki w³aœnie sposób.Zasady zastêpowania edytorów w³aœciwoœciZarejestrowanie nowego edytora w³aœciwoœci wprowadza oczywiœcie pewne zmiany wprzyporz¹dkowaniu okreœlonych edytorów okreœlonym w³aœciwoœciom okreœlonychkomponentów.Mimo oczywistoœci tego faktu rz¹dz¹ce tym zjawiskiem regu³y nie s¹jednak tak oczywiste — wszak konkretny edytor mo¿e byæ przyporz¹dkowany ca³ejgrupie w³aœciwoœci danego typu, byæ mo¿e pochodz¹cych z ró¿nych komponentów.Otó¿ aby nowo rejestrowany edytor zast¹pi³ dotychczasowy edytor dla konkretnejw³aœciwoœci, musi on cechowaæ siê co najmniej takim samym stopniem„specjalizacji” jak edytor istniej¹cy.Je¿eli wiêc na przyk³ad istniejezarejestrowany w IDE edytor dla w³aœciwoœci TShape komponentu TShapeType, pozarejestrowaniu nowego edytora dla w³aœciwoœci typu TShape dowolnego komponentuw³aœciwoœæ TShapeType::TShape obs³ugiwana bêdzie nadal przez edytordotychczasowy, jako ukierunkowany na konkretn¹ klasê komponentu, czyli bardziejspecjalizowany.Nowy edytor uruchamiany bêdzie przez IDE tylko dla w³aœciwoœciTShape tych komponentów, dla których nie istnieje dedykowany (tj.ukierunkowanyna konkretn¹ klasê komponentu) edytor w³aœciwoœci TShape.Wykorzystanie grafiki w edytorach w³aœciwoœciPocz¹wszy od wersji 5 C++Buildera niektóre edytory w³aœciwoœci ilustruj¹wyœwietlane wartoœci stosownymi ikonami, co czyni edycjê bardziej intuicyjn¹ iwygodniejsz¹ dla u¿ytkownika, mog¹cego teraz a priori poznaæ np.wygl¹dwybranego kursora.Edytory te wymienione zosta³y w tabeli 2.4 (w rozdziale 2);te z nich, które wystêpuj¹ na rysunku 10.1, znajduj¹ siê na tle zacienionym.Wzwi¹zku z tym bazowa klasa wszystkich edytorów w³aœciwoœci — TPropertyEditor —wzbogacona zosta³a o szeœæ nowych metod
[ Pobierz całość w formacie PDF ]