![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конструктор формы и 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 формы...