СообЧа > База Знаний > Программирование > Delphi

Вопрос

Как обратиться к свойству по его имени?

Ответ

type
  TForm1 = class(TForm)
      Button1: TButton;
procedure Button1Click(Sender: TObject);
  private
 f1 : Integer; // Это приватное поле хранит значение
  published
 {К свойству p1 мы будем обращаться по его имени}
 property p1 : Integer read f1 write f1;
  end;

var
    Form1: TForm1;

implementation

{$R *.DFM}

uses
    TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
    PInfo : PPropInfo;
begin
p1 := GetTickCount; // Здесь свойству что-то присвоили
PInfo:= GetPropInfo(TForm1.ClassInfo, 'p1'); // Получаем описание свойства
// из описания класса
    if PInfo = nil then
   raise Exception.Create('Property not exist');
Caption := IntToStr(GetOrdProp(Form1, PInfo)); // Получаем значение свойства
end;

uses
    TypInfo;

function ObjPropInfo(AObject: TObject; const PropName: String): PPropInfo;
begin
 Result := GetPropInfo(AObject.ClassInfo, PropName);
    if Result = nil then
  raise Exception.Create('Property not exist');
end;

procedure SetOrdProperty( AObject: TObject; const PropName:String; const Value: Longint);
begin
 SetOrdProp(AObject, ObjPropInfo(AObject, PropName), Value);
end;

function GetOrdProperty(AObject: TObject; const PropName:String):Longint;
{см. также TypInfo: GetStrProp, GetFloatProp, GetEnumValue etc.}
begin
 Result:= GetOrdProp(AObject, ObjPropInfo(AObject, PropName));
end;

procedure SetStrProperty( AObject: TObject; const PropName:String; const Value: String);
begin
 SetStrProp(AObject, ObjPropInfo(AObject, PropName), Value);
end;

procedure SetFloatProperty( AObject: TObject; const PropName:String; const Value: Extended);
begin
 SetFloatProp(AObject, ObjPropInfo(AObject, PropName), Value);
end;

procedure SetVariantProperty( AObject: TObject; const PropName:String; const Value: Variant);
begin
SetVariantProp(AObject, ObjPropInfo(AObject, PropName), Value);
end;

procedure SetMethodProperty( AObject: TObject; const PropName:String; const Value: Pointer);
var
    AMethod: TMethod;
begin
    AMethod.Code := Value;
    AMethod.Data := AObject;
 SetMethodProp(AObject, ObjPropInfo(AObject, PropName), AMethod);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    AFont: TFont;
begin
 SetOrdProperty(Button1, 'Width', 100); // целое
    AFont := TFont.Create;
    AFont.Style := [fsBold];
 SetOrdProperty(Button1, 'Font', Longint(AFont)); // объект
    AFont.Free;
SetMethodProperty(Button1, 'OnClick', @TForm1.Button2Click); // метод
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    ShowMessage((Sender as TButton).Caption);
end;

Leonid Troyanovsky



Copyright © 2000-2004 Сообщество Чайников
Контактная информация