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

Показ свойств во время выполнения программы

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

Показ свойств во время выполнения программы

Автор: Thomas von Stetten

Новость: фирма MICROSOFT, для увеличения надёжности работы своего сервера, установила на него операционную систему UNIX.

Я написал компонент-отладчик, выводящий в дереве все компоненты. Попробуйте этот код. Вызывайте функцию DisplayProperties как показано ниже:


DisplayProperties(Form1,                {Вы можете использовать любой компонент}
                  Outline1.Lines,       {Допускается любой TStrings-объект}
                  0);                   {0 - "стартовый", корневой уровень}


DisplayProperties(AObj: TObject; AList: TStrings; iIndentLevel: Integer);
var
  Indent: string;
  ATypeInfo: PTypeInfo;
  ATypeData: PTypeData;
  APropTypeData: PTypeData;
  APropInfo: PPropInfo;
  APropList: PPropList;
  iProp: Integer;
  iCnt: Integer;
  iCntProperties: SmallInt;
  ASecondObj: TObject;

procedure AddLine(sLine: string);
begin
  AList.Add(Indent + #160 + IntToStr(iProp) + ': ' + APropInfo^.Name
    + ' (' + APropInfo^.PropType^.Name + ')' + sLine);
end;

begin

  try
    Indent := GetIndentSpace(iIndentLevel);

    ATypeInfo := AObj.ClassInfo;
    ATypeData := GetTypeData(ATypeInfo);
    iCntProperties := ATypeData^.PropCount;
    GetMem(APropList, SizeOf(TPropInfo) * iCntProperties);
    GetPropInfos(ATypeInfo, APropList);

    for iProp := 0 to ATypeData^.PropCount - 1 do
    begin
      APropInfo := APropList^[iProp];
      case APropInfo^.PropType^.Kind of
        tkInteger:
          AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)));
        tkChar:
          AddLine(' := ' + chr(GetOrdProp(AObj, APropInfo)));
        tkEnumeration:
          begin
            APropTypeData := GetTypeData(APropInfo^.PropType);
            if APropTypeData^.BaseType^.Name <> APropInfo^.PropType^.Name then
              AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)))
            else
              AddLine(' := ' + APropTypeData^.NameList);
          end;
        tkFloat:
          AddLine(' := ' + FloatToStr(GetFloatProp(AObj, APropInfo)));
        tkString:
          AddLine(' := "' + GetStrProp(AObj, APropInfo) + '"');
        tkSet:
          begin
            AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)));
          end;
        tkClass:
          begin
            ASecondObj := TObject(GetOrdProp(AObj, APropInfo));
            if ASecondObj = nil then
              AddLine(' := NIL')
            else
            begin
              AddLine('');
              DisplayProperties(ASecondObj, AList, iIndentLevel + 1);
            end;
          end;
        tkMethod:
          begin
            AddLine('');
          end;
      else
        AddLine(' := >>НЕИЗВЕСТНО<<');
      end;
    end;
  except {Выводим исключение и продолжаем дальше}
    on e: Exception do
      ShowMessage(e.Message);
  end;

  FreeMem(APropList, SizeOf(TPropInfo) * iCntProperties);
end;

function GetIndentSpace(iIndentLevel: Integer): string;
var
  iCnt: Integer;
begin
  Result := '';
  for iCnt := 0 to iIndentLevel - 1 do
    Result := Result + #9;
end;

Это компонент Delphi, который отображает свойства объекта в виде древовидной структуры. Функция DisplayProperties принимает три параметра: AObj, который является объектом для отображения, AList, который является объектом типа TStrings, используемым для хранения значений свойств, и iIndentLevel, который specifies the indentation level for the output.

Функция начинает с получения информации о классе объекта с помощью AObj.ClassInfo. Затем она получает тип данных класса объекта с помощью GetTypeData(ATypeInfo). Количество свойств объекта класса получается из ATypeData^.PropCount.

Затем функция проходит по каждому свойству с помощью цикла for. Для каждого свойства она проверяет тип свойства с помощью APropInfo^.PropType^.Kind и отображает значение свойства соответственно.

Например, если тип свойства является tkInteger, она вызывает GetOrdProp(AObj, APropInfo) для получения целочисленного значения свойства и добавляет строку в формате "Property Name := Value" в AList. Если тип свойства является tkClass, она создает экземпляр класса с помощью TObject(GetOrdProp(AObj, APropInfo)) и рекурсивно вызывает DisplayProperties для отображения его свойств.

Функция также обрабатывает исключения, которые могут возникнуть при выполнении, отображая сообщение об ошибке в окне сообщений.

Процедура AddLine используется для добавления строки в AList. Она принимает строковый параметр sLine, который является текстом, который нужно добавить в список. Функция GetIndentSpace используется для получения пробела indentation на основе iIndentLevel.

Вы можете использовать этот компонент, вызывая DisplayProperties с объектом и объектом типа TStrings, например:

DisplayProperties(Form1, Outline1.Lines, 0);

Это отобразит свойства объекта Form1 в виде древовидной структуры в Outline1.

В статье рассматривается компонент-отладчик, позволяющий выводить свойства объектов в дерево во время выполнения программы на языке Delphi.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:21:46/0.0058550834655762/1