function GetComponentProperties(Instance: TPersistent; AList: TStrings):
Integer;
var
I, Count: Integer;
PropInfo: PPropInfo;
PropList: PPropList;
begin
Result := 0;
Count := GetTypeData(Instance.ClassInfo)^.PropCount;
if Count > 0 thenbegin
GetMem(PropList, Count * SizeOf(Pointer));
try
GetPropInfos(Instance.ClassInfo, PropList);
for I := 0 to Count - 1 dobegin
PropInfo := PropList^[I];
if PropInfo = nilthen
Break;
if IsStoredProp(Instance, PropInfo) thenbegin{
case PropInfo^.PropType^.Kind of
tkInteger:
tkMethod:
tkClass:
...
end;
}end;
Result := AList.Add(PropInfo^.Name);
end;
finally
FreeMem(PropList, Count * SizeOf(Pointer));
end;
end;
end;
Переделайте функцию GetComponentProperties для получения списка всех опубликованных свойств (имен и типов) следующим образом:
functionGetComponentProperties(Instance:TPersistent;AList:TStrings):Integer;varI,Count:Integer;PropInfo:PPropInfo;PropList:PPropList;beginResult:=0;Count:=GetTypeData(Instance.ClassInfo)^.PropCount;ifCount>0thenbeginGetMem(PropList,Count*SizeOf(Pointer));tryGetPropInfos(Instance.ClassInfo,PropList);forI:=0toCount-1dobeginPropInfo:=PropList^[I];ifPropInfo<>nilthenbeginifIsPublishedProp(Instance,PropInfo)thenbeginAList.Add(Format('%s (%s)',[PropInfo^.Name,GetPropertyTypeName(PropInfo)]));end;end;end;finallyFreeMem(PropList,Count*SizeOf(Pointer));end;end;end;functionGetPropertyTypeName(PropInfo:PPropInfo):string;begincasePropInfo^.PropType^.KindoftkInteger:Result:='Integer';tkMethod:Result:='Method';tkClass:Result:='Class';// добавьте больше типов, если необходимоelseResult:=GetPropertyTypeName(PropInfo^.PropType);end;end;
В этом измененном варианте я добавил новую функцию GetPropertyTypeName, которая принимает аргумент PPropInfo и возвращает имя типа свойства. Эта функция используется внутри функции GetComponentProperties для получения имени типа для каждого опубликованного свойства.
Функция GetComponentProperties также использует IsPublishedProp вместо IsStoredProp, чтобы учитывать только опубликованные свойства. Вам нужно будет реализовать эту функцию, она должна проверять, является ли свойство опубликованным, проверяя его атрибуты или другие соответствующие информацию.
Вы можете использовать функцию GetComponentProperties следующим образом:
Это будет печатать список всех опубликованных свойств (имен и типов) объекта MyInstance.
В статье описывается функция GetComponentProperties, которая возвращает список всех published свойств (имена и типы) класса, включая их типы, методы и свойства.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.