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


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





unit
 PropertyList;

interface


uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;

type

  TMyStream = class
(TFileStream)
  private

  FFred: integer;
  published

  property
 Fred: integer read FFred write FFred;
  end
;
type

  TFrmPropertyList = class
(TForm)
  SpeedButton1: TSpeedButton;
  ListBox1: TListBox;
  procedure
 SpeedButton1Click(Sender: TObject);
private

  { Private declarations }

public

  { Public declarations }

end
;

var

  FrmPropertyList: TFrmPropertyList;

implementation


{$R *.DFM}


uses

  TypInfo;

procedure
 ListProperties(AInstance: TPersistent; AList: TStrings);
var

  i: integer;
  pInfo: PTypeInfo;
  pType: PTypeData;
  propList: PPropList;
  propCnt: integer;
  tmpStr: string
;
begin

  pInfo := AInstance.ClassInfo;
  if
 (pInfo = nilor (pInfo^.Kind <> tkClass) then
    raise
 Exception.Create('Invalid type information');
  pType := GetTypeData(pInfo);  {Pointer to TTypeData}

  AList.Add('Class name: '
 + pInfo^.Name);
  {If any properties, add them to the list}

  propCnt := pType^.PropCount;
  if
 propCnt > 0 then 
  begin

    AList.Add (EmptyStr);
    tmpStr := IntToStr(propCnt) + ' Propert'
;
    if
 propCnt > 1 then
      tmpStr := tmpStr + 'ies'

    else

      tmpStr := tmpStr + 'y'
;
    AList.Add(tmpStr);
    FillChar(tmpStr[1
], Length(tmpStr), '-');
    AList.Add(tmpStr);
    {Get memory for the property list}

    GetMem(propList, sizeOf(PPropInfo) * propCnt);
    try

      {Fill in the property list}

      GetPropInfos(pInfo, propList);
      {Fill in info for each property}

      for
 i := 0 to propCnt - 1 do
        AList.Add(propList[i].Name
 + ': ' + propList[i].PropType^.Name);
    finally

      FreeMem(propList, sizeOf(PPropInfo) * propCnt);
    end
;
  end
;
end
;


function
 GetPropertyList(AControl: TPersistent; AProperty: string): PPropInfo;
var

  i: integer;
  props: PPropList;
  typeData: PTypeData;
begin

  Result := nil
;
  if
 (AControl = nilor (AControl.ClassInfo = nilthen
    Exit;
  typeData := GetTypeData(AControl.ClassInfo);
  if
 (typeData = nilor (typeData^.PropCount = 0then
    Exit;
  GetMem(props, typeData^.PropCount * SizeOf(Pointer));
  try

    GetPropInfos(AControl.ClassInfo, props);
    for
 i := 0 to typeData^.PropCount - 1 do
    begin

      with
 Props^[i]^ do
        if
 (Name = AProperty) then
          result := Props^[i];
    end
;
  finally

    FreeMem(props);
  end
;
end
;


procedure
 TFrmPropertyList.SpeedButton1Click(Sender: TObject);
var

  c: integer;
begin

  ListProperties(self, ListBox1.Items);
  for
 c := 0 to ComponentCount - 1 do
  begin

    ListBox1.Items.Add(EmptyStr);
    ListProperties(Components[c], ListBox1.Items);
  end
;
end
;

end
.




Tip by Ralph Friedman


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





DELPHI FAQ




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