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

Как получить значение свойства в виде варианта по тексту имени свойства?

01.01.2007
unit MorePropInfo;
 
interface
 
uses
 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
 
type
 
TFrmMorePropInfo = class(TForm)
    Button1
: TButton;
    Button2
: TButton;
    ListBox1
: TListBox;
    procedure Button2Click
(Sender: TObject);
 
private
   
{ Private declarations }
 
public
   
{ Public declarations }
 
end;
 
var
 
FrmMorePropInfo: TFrmMorePropInfo;
 
implementation
 
{$R *.DFM}
 
uses
 
TypInfo;
 
procedure
GetPropertyValues(AObj: TObject; AValues: TStrings);
var
  count
: integer;
  data
: PTypeData;
 
default: string;
  i
: integer;
  info
: PTypeInfo;
  propList
: PPropList;
  propInfo
: PPropInfo;
  propName
: string;
  value
: variant;
begin
  info
:= AObj.ClassInfo;
  data
:= GetTypeData(info);
 
GetMem(propList, data^.PropCount * SizeOf(PPropInfo));
 
try
    count
:= GetPropList(info, tkAny,  propList);
   
for i := 0 to count - 1 do
   
begin
      propName
:= propList^[i]^.Name;
      propInfo
:= GetPropInfo(info, propName);
     
if propInfo <> nil then
     
begin
       
case propInfo^.PropType^.Kind of
          tkClass
, tkMethod:
            value
:= '$' + IntToHex(GetOrdProp(AObj, propInfo), 8);
          tkFloat
:
            value
:= GetFloatProp(AObj, propInfo);
          tkInteger
:
            value
:= GetOrdProp(AObj, propInfo);
          tkString
, tkLString, tkWString:
            value
:= GetStrProp(AObj, propInfo);
          tkEnumeration
:
            value
:= GetEnumProp(AObj, propInfo);
         
else
            value
:= '???';
       
end;
       
if propInfo.default = longint($80000000) then
         
default := 'none'
       
else
         
default := IntToStr(propInfo.default);
       
AValues.Add(Format('%s: %s [default: %s]', [propName, value, default]));
       
{$80000000 apparently indicates "no default"}
     
end;
   
end;
 
finally
   
FreeMem(propList, data^.PropCount * SizeOf(PPropInfo));
 
end;
end;
 
 
procedure
TFrmMorePropInfo.Button2Click(Sender: TObject);
var
  count
: integer;
  data
: PTypeData;
  i
: integer;
  info
: PTypeInfo;
  propList
: PPropList;
  propInfo
: PPropInfo;
  propName
: string;
  propVal
: variant;
  tmpS
: string;
begin
  info
:= Button2.ClassInfo;
  data
:= GetTypeData(info);
 
GetMem(propList, data^.PropCount * SizeOf(PPropInfo));
 
try
    count
:= GetPropList(info, tkAny,  propList);
    ListBox1
.Clear;
   
for i := 0 to count - 1 do
   
begin
      propName
:= propList^[i]^.Name;
      propInfo
:= GetPropInfo(info, propName);
     
if propInfo <> nil then
     
begin
       
case propInfo^.PropType^.Kind of
          tkClass
, tkMethod:
            propVal
:= '$' + IntToHex(GetOrdProp(Button2, propInfo), 8);
          tkFloat
:
            propVal
:= GetFloatProp(Button2, propInfo);
          tkInteger
:
            propVal
:= GetOrdProp(Button2, propInfo);
          tkString
, tkLString, tkWString:
            propVal
:= GetStrProp(Button2, propInfo);
          tkEnumeration
:
            propVal
:= GetEnumProp(Button2, propInfo);
         
else
            propVal
:= '...';
       
end;
        tmpS
:= propVal;
        ListBox1
.Items.Add(Format('%s: %s [default: %s]', [propName, tmpS, '$'
                                             
+ IntToHex(propInfo.default, 8)]));
       
{$80000000 apparently indicates "no default"}
     
end;
   
end;
 
finally
   
FreeMem(propList, data^.PropCount * SizeOf(PPropInfo));
 
end;
end;
 
end.

Tip by Ralph Friedman

Взято из https://www.lmc-mediaagentur.de/dpool