Советы по Delphi



         

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


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

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

DisplayProperties(AObj:TObject; AList:TStrings; iIndentLevel:Integer);varIndent: String;ATypeInfo: PTypeInfo;ATypeData: PTypeData;APropTypeData: PTypeData;APropInfo: PPropInfo;APropList: PPropList;iProp: Integer;iCnt: Integer;iCntProperties: SmallInt;ASecondObj: TObject;
Procedure AddLine(sLine: String);beginAList.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 beginAPropInfo := APropList^[iProp];case APropInfo^.PropType^.Kind oftkInteger:AddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)));tkChar:AddLine(' := ' + chr(GetOrdProp(AObj, APropInfo)));tkEnumeration: beginAPropTypeData := GetTypeData(APropInfo^.PropType);if APropTypeData^.BaseType^.Name <> APropInfo^.PropType^.Name thenAddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)))elseAddLine(' := ' + APropTypeData^.NameList);end;tkFloat:AddLine(' := ' + FloatToStr(GetFloatProp(AObj, APropInfo)));tkString:AddLine(' := "' + GetStrProp(AObj, APropInfo) + '"');tkSet: beginAddLine(' := ' + IntToStr(GetOrdProp(AObj, APropInfo)));end;tkClass: beginASecondObj := TObject(GetOrdProp(AObj, APropInfo));if ASecondObj = NIL thenAddLine(' := NIL')else beginAddLine('');DisplayProperties(ASecondObj, AList, iIndentLevel+1);end;end;tkMethod: beginAddLine('');end;elseAddLine(' := >>НЕИЗВЕСТНО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;beginResult := '';for iCnt := 0 to iIndentLevel-1 doResult := Result + #9;end;

- Thomas von Stetten [000753]




Содержание  Назад  Вперед