Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перекрыть конструктор, если он не виртуальный?


hex1287 ©   (2007-02-12 12:46:00) 

1. Есть куча классов, все - наследники от TTreeNode.
2. Какой из классов создавать определяется в TTreeView.OnCreateNodeClass в зависимоти от некоторого признака.

необходимо уметь создавать всякие внутренние структуры для каждого из кучи классов, и хочется делать это в конструкторе. Но конструктор у TreeNode не виртуальный. Может можно его как-нить победить, чтобы код в TCustomTreeView.CreateNode:

Result := LClass.Create(Items);

вызывал конструктор наследника, а не TTreeNode?


hex1287   (2007-02-12 17:06:00) [1]


> icWasya ©   (12.02.07 16:43) [6]
> Если D6-D7, то может помочь


О! То что надо. Спасибо!


icWasya   (2007-02-12 16:43:00) [2]

Если D6-D7, то может помочь

type
TMyClass1=class(TTreeNode)
 procedure AfterConstruction;override;
...
end;

TMyClass2=class(TTreeNode)
 procedure AfterConstruction;override;
...
end;

procedure TMyClass1.AfterConstruction;
begin
 inherited;

 ShowMessage('After My Class 1');

end;

procedure TMyClass2.AfterConstruction;
begin
 inherited;

 ShowMessage('After My Class 2');

end;


hex1287   (2007-02-12 14:23:00) [3]


> Плохиш ©   (12.02.07 14:06) [4]


Теорию ООП я знаю, да и вопрос все-таки был другой. У Вас есть ответ или просто пофлудить хочется?
Если я в чем не прав, укажите мне на мою ошибку.


Плохиш   (2007-02-12 14:06:00) [4]


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

Стоит начать изучать теорию ООП, наконец-то.

PS. Я не думаю, что практическая проверка Вашего вопроса заняла бы больше 5-ти минут времени.


hex1287   (2007-02-12 14:03:00) [5]


> Плохиш ©   (12.02.07 13:07) [2]
>  выделенная строка что делает?


Дык, я и говорю, что какой именно класс создавать определяется в TTreeView.OnCreateNodeClass.

Вот пример:



type
TMyClass1=class(TTreeNode)
...
end;

TMyClass2=class(TTreeNode)
...
end;

implementation

procedure TMyForm.MyTreeCreateNodeClass(
 Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
 if FFlag then
   result := TMyClass1
 else
   result := TMyClass2
end;




> Reindeer Moss Eater ©   (12.02.07 12:49) [1]
> А как виртуальность конструктора могла бы
> помочь в создании экземпляра другого класса?


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


Плохиш   (2007-02-12 13:07:00) [6]


> hex1287   (12.02.07 12:46)  


function TCustomTreeView.CreateNode: TTreeNode;
var
 LClass: TTreeNodeClass;
begin
 LClass := TTreeNode;
 if Assigned(FOnCreateNodeClass) then
   FOnCreateNodeClass(Self, LClass);
 Result := LClass.Create(Items);
end;

Как думаешь, выделенная строка что делает?


Reindeer Moss Eater   (2007-02-12 12:49:00) [7]

Но конструктор у TreeNode не виртуальный. Может можно его как-нить победить, чтобы код в TCustomTreeView.CreateNode:

Result := LClass.Create(Items);

вызывал конструктор наследника, а не TTreeNode?


А как виртуальность конструктора могла бы помочь в создании экземпляра другого класса?


Наверх

Титульная страница Поиск, карта сайта Написать письмо