Новость: фирма 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;
begintry
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 dobegin
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 = nilthen
AddLine(' := NIL')
elsebegin
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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.