Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проверить существование свойства


Автор: Beltar 23.5.2008, 10:04
Имеем экземпляр класса.
В него заносится неизвестный наследник. Я знаю, что некоторые наследники имеют полезное мне свойство. Вроде можно проверить, что мой экземпляр принадлежит к классу имеющему такое свойство через FieldAddres, но можно ли как-нибудь к этому свойству обратиться?



Автор: Alexeis 23.5.2008, 10:07
  Только если это published свойство. См. TypInfo.pas

Автор: Felan 23.5.2008, 11:49
А что, операторы is и as и поля ClassName и ClassType не подходят?
Как раз и определишь, что именно за наследник там находится.

Автор: pseud 23.5.2008, 14:40
вот пример выставления строкового свойства
но учти!
как сказал Alexeis выставляемое свойство должно быть published

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure SetStringProperty(ABindingControl: TControl;
      ABindingProperty: string; AValue: string);
  end;

var
  Form1: TForm1;

implementation

uses
  TypInfo;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetStringProperty(Edit1, 'Text', 'значение');
end;

procedure TForm1.SetStringProperty(ABindingControl: TControl;
  ABindingProperty: string; AValue: string);
var
  pProperty: PPropInfo;
begin
  pProperty := GetPropInfo(ABindingControl, ABindingProperty);
  if pProperty <> nil then
  begin
    if pProperty.PropType^.Kind in [tkString, tkLString, tkWString] then
      SetStrProp(ABindingControl, ABindingProperty, AValue);
  end;
end;

end.



Автор: Beltar 23.5.2008, 15:02
ClassName и ClassType позволяют явно привести тип на этапе компиляции, но если у меня базовый тип TFather 

Код

type
TChild=class(TFather)
  published
  NewField:Integer; 


То записать
Код

var F:TFather
begin
F:=TChild.Create;
(F as F.ClassType).NewField;
end


Не получится. Откуда компилятору знать, будет-ли NewField у класса. Х) Потому и спрашиваю.
Про то, что published я в хелпе по FieldAddress сам прочитал, сильно удивился, почему так.

Пошел я пока с работы домой, приду разберусь с примером выше.

Автор: pseud 23.5.2008, 15:15
Цитата(Beltar @  23.5.2008,  15:02 Найти цитируемый пост)
Откуда компилятору знать, будет-ли NewField у класса


но ты же пишешь 

Код

F := TChild.Create;


следовательно вполне правомерно можешь писать

Код

TChild(F).NewField :=  ...

Автор: Beltar 25.5.2008, 11:52
Цитата

но ты же пишешь 
Код

F := TChild.Create

  


У меня классы вообще-то компоненты. И в общем случае я не знаю каким будет TChild.

Ладно, с GetPropInfo вроде как все или почти все понятно. Thx.

Автор: Felan 26.5.2008, 07:39
Как это? Совсем неизвестный?
Ты же все равно должен знать, какой он может быть. Значит можно попробовать все, и на нужном остановится... Ну через Try...Except хотябы...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)