Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.09;
Скачать: CL | DM;

Вниз

RTTI. Как обратиться к потомку, заведомо не зная его класс?   Найти похожие ветки 

 
mfender   (2010-10-18 14:44) [0]

Вот такая ситуация:

type
 TCustomEditor = class(TPanel)
 private
   FPriorCtrl: TDBSpinEdit;
   FArchiveCtrl: TDBCheckBox;
   FFieldCtrl: TWinControl;
 public
   constructor Create(AOwner: TComponent); override;
   procedure Positioning;
 end;

 TStringEditor = class(TCustomEditor)
 private
   FFieldCtrl: TDBEdit;
 public
   constructor Create(AOwner: TComponent); override;
 end;

 TMemoEditor = class(TCustomEditor)
 private
   FFieldCtrl: TDBMemo;
 public
   constructor Create(AOwner: TComponent); override;
 end;

implementation

constructor TCustomEditor.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FPriorCtrl := TDBSpinEdit.Create(Self);
 FPrior.Parent := Self;
 FArchiveCtrl := TDBCheckBox.Create(Self);
 FArchiveCtrl.Parent := Self;
end;

constructor TStringEditor.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FFieldCtrl := TDBEdit.Create(Self);
 FFieldCtrl.Parent := Self;
end;

constructor TStringEditor.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FFieldCtrl := TDBMemo.Create(Self);
 FFieldCtrl.Parent := Self;
end;

procedure TCustomEditor.Positioning;
begin
 FPriorCtrl.Left := .....
 FPriorCtrl.Top := .....
       <et cetera…>
end;


Код сокращён до степени общего понимания. на самом деле там есть ещё published свойства read-only для контролов на панели, есть TDataSource и TDataSet.

Где-то сбоку я создаю в зависимости от надобности либо TStringEditor, либо TMemoEditor. Составляющие контролы созданы, теперь нужно их правильно позиционировать на панели.

Но вот беда: я знаю достоверно, что все они TCustomEditor, но с этим знанием я никогда в жизни не доберусь до FFieldCtrl - в TCustomEditor он не создан (Access Violation). Значит нужно вызывать Positioning из соответствующего наследыша.

Можно, вобщем-то, сверяться с классом путём case of, но это быстрый пример, на самом деле у меня таких сборных компонентов там порядка дюжины, отличающихся только одним FFieldCtrl.

Вот уже и так и сяк голову сломал - застрэлите меня, но я окончательно запутался в попытках при помощи RTTI обратиться к Positioning через наследника TCustomEditor, который мне заранее не известен.

Заранее благодарен за помощь.


 
jack128_   (2010-10-18 14:55) [1]

сделай Positioning виртуальным и перекрой его в потомках.


 
mfender   (2010-10-18 15:00) [2]


> сделай Positioning виртуальным и перекрой его в потомках.

Что мне это даст? Я ж всё равно не смогу обратиться к нему из потомка, не зная потомка.


 
Игорь Шевченко ©   (2010-10-18 15:35) [3]


> Но вот беда: я знаю достоверно, что все они TCustomEditor,
>  но с этим знанием я никогда в жизни не доберусь до FFieldCtrl
>


значит надо сделать свойство FFieldCtrl у TCustomEditor, ссылающееся на виртуальный метод GetFieldCtrl, перекрытый в потомках


 
RWolf ©   (2010-10-18 15:36) [4]

var child:TCustomEditor;

if child is TStringEditor then
 (child as TStringEditor).DoSomething;


 
Игорь Шевченко ©   (2010-10-18 15:56) [5]

RWolf ©   (18.10.10 15:36) [4]

Расстрелять


 
jack128_   (2010-10-18 17:13) [6]


> Что мне это даст? Я ж всё равно не смогу обратиться к нему
> из потомка, не зная потомка.

имелось в виду "обратиться к нему из предка, не зная потомка" ?

а зачем, если мона перекрыть метод?


 
Юрий Зотов ©   (2010-10-18 17:26) [7]

> RWolf ©   (18.10.10 15:36) [4]

Ну не то, чтобы уж совсем расстрелять, но совет и правда не из лучших.

> mfender   (18.10.10 15:00) [2]

type
TCustomEditor = class(TPanel)
private
  FPriorCtrl: TDBSpinEdit;
  FArchiveCtrl: TDBCheckBox;
  FFieldCtrl: TWinControl;
public
  constructor Create(AOwner: TComponent); override;
  procedure Positioning; virtual; abstract;
end;

В каждом потомке перекрываем метод Positioning. Теперь обращаться к нему можно откуда угодно, в том числе и из предка тоже.



Страницы: 1 вся ветка

Текущий архив: 2011.01.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
15-1285524433
TUser
2010-09-26 22:07
2011.01.09
Не все ж на семинары эмберкадеро ходить :)


6-1233302123
vegarulez
2009-01-30 10:55
2011.01.09
Вопрос про TidHttp. Просмотр отправляемого содержимого.


2-1286986134
infectioni
2010-10-13 20:08
2011.01.09
параметры куба


2-1287351196
Германн
2010-10-18 01:33
2011.01.09
Caption на кнопках ToolBar


2-1286783963
Dennis I. Komarov
2010-10-11 11:59
2011.01.09
ReadDirectoryChangesW