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

Вниз

Конструктор формы и Reintroduce   Найти похожие ветки 

 
Asdor ©   (2004-06-10 18:11) [0]

Здравстуйте мастера.
Мне нужно сделать предка для форм, которые могут быть как 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 - то она создается минуя мой конструктор. Непонятно почему и как сделать так, чтобы мой конструктор вызывался в этом случае?


 
jack128 ©   (2004-06-10 18:34) [1]


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


 
Asdor ©   (2004-06-10 18:36) [2]

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


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


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

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


 
Petr V. Abramov ©   (2004-06-10 19:45) [4]

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


 
Asdor ©   (2004-06-11 09:38) [5]

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

Одну строчку написать не сложно :) просто хотелось, чтобы и 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;

?



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

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

Наверх




Память: 0.48 MB
Время: 0.027 c
8-1081790843
VasRog
2004-04-12 21:27
2004.06.27
Перемещение картинки


3-1086152913
korvin
2004-06-02 09:08
2004.06.27
Заказ имени поля в результате запроса


4-1084888044
Begin
2004-05-18 17:47
2004.06.27
Модальное диалоговое окно и его координаты.


4-1084868096
Vadim X
2004-05-18 12:14
2004.06.27
Как получить время с GMT?


14-1086852593
Pro
2004-06-10 11:29
2004.06.27
Нужна прога типа Диспетчер Задач