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


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


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($80000000then
          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


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





DELPHI FAQ




EOMY TOP 100      Рейтинг@Mail.ru      Rambler's Top100