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

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

Конструктор формы и Reintroduce [D7]


Asdor ©   (2004-06-10 18:11:00) 

Здравстуйте мастера.
Мне нужно сделать предка для форм, которые могут быть как MDIChild, так и обычными. Для этого я в этом предке переопределяю конструктор так:

 TBaseClientForm=Class(TForm)
 public
   Constructor Create(AOwner:TComponent; AFormStyle:TFormStyle=fsMDIChild); reintroduce;
 end;

implementation

constructor TBaseClientForm.Create(AOwner: TComponent;
 AFormStyle: TFormStyle=fsMDIChild);
begin
 inherited Create(AOwner);
 FormStyle:=AFormStyle;
 Visible:=True;
end;

end.


После определения базового класса формы в пакете я добавил ее в репозиторий.

Далее добавляю в проект форму из репозитория как наследника базовой, накладываю на нее то, что мне нужно. Проект собирается с RunTime Packages.

Если форма в проекте создается мной через явный вызов конструктора - то все создается нормально. А если она попадает в список AutoCreatedForms - то она создается минуя мой конструктор. Непонятно почему и как сделать так, чтобы мой конструктор вызывался в этом случае?


Asdor   (2004-06-11 09:38:00) [1]

Понятно, что ничего не понятно... :)

Одну строчку написать не сложно :) просто хотелось, чтобы и AutoCreate работал...

А вот еще тогда вопрос:
Почему в Application.CreateForm сделано все вот так:
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
 Instance: TComponent;
begin
 Instance := TComponent(InstanceClass.NewInstance);
 TComponent(Reference) := Instance;
 try
   Instance.Create(Self);
 except
   TComponent(Reference) := nil;
   raise;
 end;
 if (FMainForm = nil) and (Instance is TForm) then
 begin
   TForm(Instance).HandleNeeded;
   FMainForm := TForm(Instance);
 end;
end;

а не вот так:
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
 Instance: TComponent;
begin
 try
   Instance := TComponent(InstanceClass.Create(Self));
   TComponent(Reference) := Instance;
 except
   TComponent(Reference) := nil;
   raise;
 end;
 if (FMainForm = nil) and (Instance is TForm) then
 begin
   TForm(Instance).HandleNeeded;
   FMainForm := TForm(Instance);
 end;
end;

?


Petr V. Abramov   (2004-06-10 19:45:00) [2]

> после Reintroduce конструктор перестает быть виртуальным методом???
 После Reintroduce это другойметод с тем же именем


jack128   (2004-06-10 18:43:00) [3]


> Потому и сделал конструктор через Reintroduce c дефолтным
> параметром, чтобы нормально вызывался...
если бы дельфи был интерпритатором это может и сработало бы.. ;-)

Как только ты скрыл виртуальный конструктор у своей формы, ты лишил себя возможности AutoCreate'a.  А вообще нафиг он те сдался . Тебе сложно одну строчку написать, что ли ;-))


Asdor   (2004-06-10 18:36:00) [4]

Да смотрел... И в Forms смотрел...
Потому и сделал конструктор через Reintroduce c дефолтным параметром, чтобы нормально вызывался...
Вот только получается, что после Reintroduce конструктор перестает быть виртуальным методом???


jack128   (2004-06-10 18:34:00) [5]


> А если она попадает в список AutoCreatedForms - то она создается
> минуя мой конструктор. Непонятно почему и как сделать так,
> чтобы мой конструктор вызывался в этом случае?
Все как раз понятно.  Глянь в файл проэкта и посмотри как создаются autocreate формы...


Наверх

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