Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

Я написал компонент-отладчик, выводящий в дереве все компоненты. Попробуйте этот код. Вызывайте функцию 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;

- Thomas von Stetten

Взято из Советов по Delphi от Валентина Озерова

Сборник Kuliba