Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.01.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1285592233
12
2010-09-27 16:57
2011.01.09
Подскажите утилиту форматирования sql запросов. Oracle и/или MS


11-1227534671
Валера
2008-11-24 16:51
2011.01.09
Не могу найти подходящий компонент


2-1287124750
LDV
2010-10-15 10:39
2011.01.09
Выбор структуры для хранения данных


2-1286948561
Олег Крапивин
2010-10-13 09:42
2011.01.09
Ищу документацию на md MailSlot


2-1286912340
v_a_belousov
2010-10-12 23:39
2011.01.09
Получить все объекты на форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский