[ Pobierz całość w formacie PDF ]
.Kategorie nie muszą być przy tym rozłączne - dana właściwość może należeć do więcej niż jednej kategorii.Deklarację obiektu-filtra TPropertyFilter przedstawia wydruk 8.40.Wydruk 8.40.Deklaracja obiektu TPropertyFilterclass DELPHICLASS TPropertyFilter;class PASCALIMPLEMENTATION TPropertyFilter : public System::TObject{typedef System::TObject inherited;private:Masks::TMask* FMask;TMetaClass*FComponentClass;Typinfo::TTypeInfo *FPropertyType;int FGroup;public:__fastcall TPropertyFilter(const AnsiString APropertyName,TMetaClass* AComponentClass,Typinfo::PTypeInfoAPropertyType);__fastcall virtual ~TPropertyFilter(void);bool __fastcall Match(const AnsiString APropertyName,TMetaClass* AComponentClass,Typinfo::PTypeInfoAPropertyType);__property TMetaClass* ComponentClass = {read=FComponentClass};__property Typinfo::PTypeInfo PropertyType = {read=FPropertyType};};Najważniejszymi elementami obiektu-filtra są trzy następujące pola:lmaska nazwy właściwości (FMask) - określa wzorzec („maskę”), z którym musi być zgodna nazwa właściwości, by można ją było zaliczyć do danej kategorii; znaki posiadające wewnątrz maski specjalne znaczenie wyszczególnione są w tabeli 8.14.Do maski będącej pustym łańcuchem „pasuje” dowolna nazwa właściwości;llklasa komponentu (FComponentClass) - określa metaklasę (TMetaClass*), do której musi należeć typ komponentu zawierającego daną właściwość, by właściwość tę można było zaliczyć do danej kategorii.Wartość 0 oznacza brak ograniczeń na typ komponentu;lltyp właściwości (FPropertyType) - określa typ właściwości (w postaci wskazania na strukturę TTypeInfo) zaliczanej do danej kategorii.Wartość 0 oznacza brak ograniczenia typu właściwości.lZestaw metaznaków maski nazwy i ich znaczenie przedstawia tabela 8.14.Tabela 8.14.Metaznaki używane w masce nazwy właściwościZnakDopasowanie*Zastępuje dowolny ciąg znaków alfanumerycznych.?Zastępuje dowolny, pojedynczy znak alfanumeryczny.[zestaw]Określa podzbiór pasujących znaków alfanumerycznych w postaci przedziału domkniętego, zbioru lub ich kombinacji.Przykładowo [AbcdE0-9] określa dowolny znak ze zbioru AbcdE0123456789.[!zestaw]Określa wszystkie znaki alfanumeryczne z wyjątkiem ich podzbioru specyfikowanego w postaci przedziału domkniętego, zbioru lub ich kombinacji.Przykładowo [!AbcDEf-j] określa wszystkie znaki alfanumeryczne z wyjątkiem AbcDEfghij.Mechanizm dopasowania maski jest wrażliwy na wielkość liter.Szczegółowy opis parametrów funkcji rejestracyjnych wraz przykładami ich użycia przedstawia tabela 8.15.Tabela 8.15.Parametry funkcji rejestrujących właściwości w konkretnych kategoriachParametrZnaczenieTMetaClass* ACategoryClassSpecyfikuje kategorię, której dotyczy rejestrowany filtr, w postaci wartości zwracanej przez operator __classid().Przykład: __classid(TMyCategory).TMetaClass* AComponentClassOkreśla klasę komponentu, do której należeć musi właściwość, by czyniła zadość rejestrowanemu filtrowi.Przykład: __classid(TMyComponent).const AnsiString PropertyNameOkreśla maskę nazwy właściwości.Przykłady:"Shape""OnMouse*""OnKey*".Typinfo::PTypeInfo APropertyTypeOkreśla typ właściwości pasującej do filtra.Przykład:static TTypeInfo IntTypeInfo;IntTypeInfo.Name = "int";IntTypeInfo.Kind = tkInteger;const AnsiString* AFilters,const int AFilters_SizeOkreślają tablicę, zawierającą maski nazw właściwości i rozmiar tej tablicy.W wywołaniu mogą być zastąpione przez makro OPENARRAY.const System::TVarRec* AFilters,const int AFilters_SizeOkreślają tablicę wariantową, specyfikującą zestaw właściwości.Każdy element tej tablicy może być łańcuchem (AnsiString), elementem metaklasy (TMetaClass*) lub wskazaniem na strukturę TTypeInfo.Parametry te mogą być w wywołaniu zastąpione przez makro ARRAYOFCONST.Oto przykład makra określającego trzy maski nazw właściwości:OPENARRAY(AnsiString, "Shape", "OnMouse*", "OnKey*")Zależnie od listy parametrów każda z funkcji rejestrujących (dokładniej: każdy z aspektów przeciążenia tych funkcji) generuje określoną postać filtra.Powiązanie listy parametrów z postacią generowanego filtra przedstawiają tabele 8.16 i 8.17.Tabela 8.16.Filtry generowane przez funkcję RegisterPropertyInCategory()ParametryGenerowany filtr (maska, komponent, właściwość)(TMetaClass*ACategoryClass, const AnsiString APropertyName)(APropertyName,0,0)(TMetaClass*ACategoryClass, TMetaClass*AComponentClass, const AnsiString APropertyName)(APropertyName, AComponentClass,0)(TMetaClass*ACategoryClass, Typinfo::PTypeInfo APropertyType, const AnsiString APropertyName)(APropertyName,0,APropertyType)(TMetaClass*ACategoryClass, Typinfo::PTypeInfo APropertyType, const AnsiString APropertyName)("", 0, APropertyType)Tabela 8.17.Filtry generowane przez funkcję RegisterPropertiesInCategory()ParametryGenerowany filtr (maska, komponent, właściwość)(TMetaClass*ACategoryClass, const System::TVarRec*AFilters, const int AFilters_Size)Jeśli AFilters[i] jest łańcuchem:(AFilters[i],0,0) Jeśli AFilters[i] jest elementem metaklasy: ("", AFilters[i],0)Jeśli AFilters[i] jest wskaźnikiem PTypeInfo:("",0,AFilters[i])(TMetaClass*ACategoryClass, TMetaClass*AComponentClass, const AnsiString*AFilters, const int AFilters_Size)(AFilters[i],AComponentClass,0)(TMetaClass*ACategoryClass, Typinfo::PTypeInfo APropertyType, const AnsiString*AFilters, const int AFilters_Size)(AFilters[i],0,APropertyType)Przykłady wykorzystania funkcji rejestrujących filtry właściwości przedstawia wydruk 8.41.Wydruk 8.41.Przykłady rejestracji właściwości w konkretnych kategoriachnamespace Nameoffilecontainingthisregistration{void __fastcall PACKAGE Register(){// 1 - - Rejestracja pojedynczego filtra w kategorii TMouseCategory
[ Pobierz całość w formacie PDF ]