Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить список всех published свойств (имена и типы)

Delphi , Компоненты и Классы , RTTI



Автор: Ronan van Riet
WEB-сайт: http://www.lmc-mediaagentur.de

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 then
  begin
    GetMem(PropList, Count * SizeOf(Pointer));
    try
      GetPropInfos(Instance.ClassInfo, PropList);
      for I := 0 to Count - 1 do
      begin
        PropInfo := PropList^[I];
        if PropInfo = nil then
          Break;
        if IsStoredProp(Instance, PropInfo) then
        begin
          {
          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 для получения списка всех опубликованных свойств (имен и типов) следующим образом:

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 then
  begin
    GetMem(PropList, Count * SizeOf(Pointer));
    try
      GetPropInfos(Instance.ClassInfo, PropList);
      for I := 0 to Count - 1 do
      begin
        PropInfo := PropList^[I];
        if PropInfo <> nil then
        begin
          if IsPublishedProp(Instance, PropInfo) then
          begin
            AList.Add(Format('%s (%s)', [PropInfo^.Name, GetPropertyTypeName(PropInfo)]));
          end;
        end;
      end;
    finally
      FreeMem(PropList, Count * SizeOf(Pointer));
    end;
  end;
end;

function GetPropertyTypeName(PropInfo: PPropInfo): string;
begin
  case PropInfo^.PropType^.Kind of
    tkInteger: Result := 'Integer';
    tkMethod: Result := 'Method';
    tkClass: Result := 'Class';
    // добавьте больше типов, если необходимо
    else
      Result := GetPropertyTypeName(PropInfo^.PropType);
  end;
end;

В этом измененном варианте я добавил новую функцию GetPropertyTypeName, которая принимает аргумент PPropInfo и возвращает имя типа свойства. Эта функция используется внутри функции GetComponentProperties для получения имени типа для каждого опубликованного свойства.

Функция GetComponentProperties также использует IsPublishedProp вместо IsStoredProp, чтобы учитывать только опубликованные свойства. Вам нужно будет реализовать эту функцию, она должна проверять, является ли свойство опубликованным, проверяя его атрибуты или другие соответствующие информацию.

Вы можете использовать функцию GetComponentProperties следующим образом:

var
  List: TStrings;
begin
  List := TStringList.Create();
  GetComponentProperties(MyInstance, List);
  for I := 0 to List.Count - 1 do
    WriteLn(List[I]);
  FreeAndNil(List);
end.

Это будет печатать список всех опубликованных свойств (имен и типов) объекта MyInstance.

В статье описывается функция GetComponentProperties, которая возвращает список всех published свойств (имена и типы) класса, включая их типы, методы и свойства.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:08:50/0.0033600330352783/0