Как обратиться к свойству по его имени
Как обратиться к свойству по его имени
Как обратиться к свойству по его имени 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;