Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизСобственное создание формы без использования кода в проекте Найти похожие ветки
← →
A. Sonin (2004-04-19 17:53) [0]Здравствуйте, Мастера. Есть проект с большим количеством (порядка 20) форм. Если все формы создаются при запуске приложения (в коде проекта - Application.CreateForm(..., ...)), то все ужасно тормозит и запускается в лучшем случае секунд через 15. Появилась идея (подозреваю, что она не нова) - создавать формы там где это надо, т.е перед выводом. Сначала использовал такую конструкцию:
If AnyForm = Nil Then
AnyForm := TAnyForm.Create(owner);
AnyForm.Show;
Позже пошел стандартным методом:
Application.CreateForm(TAnyForm, AnyForm));
До поры меня это устраивало, но сейчас потребовалось создать универсальную процедуру для выполнения действий описанных выше и еще некоторых других. В отдельном модуле (назовем его для ясности utils) написал следующее:
procedure PrepareToShow(Frm:TForm);
begin
Application.CreateForm(TFrm, Frm));
end;
Вызвал формы так:
PrepareToShow(AnyForm);
AnyForm.Show;
Как я и подозревал это не сработало - Access violation. Голова уже совершенно не соображает, никак не могу понять как же все-таки нужно сделать - грамотно и чтобы работало. Надеюсь на вашу помощь Мастера.
← →
A. Sonin (2004-04-19 17:53) [0]Здравствуйте, Мастера. Есть проект с большим количеством (порядка 20) форм. Если все формы создаются при запуске приложения (в коде проекта - Application.CreateForm(..., ...)), то все ужасно тормозит и запускается в лучшем случае секунд через 15. Появилась идея (подозреваю, что она не нова) - создавать формы там где это надо, т.е перед выводом. Сначала использовал такую конструкцию:
If AnyForm = Nil Then
AnyForm := TAnyForm.Create(owner);
AnyForm.Show;
Позже пошел стандартным методом:
Application.CreateForm(TAnyForm, AnyForm));
До поры меня это устраивало, но сейчас потребовалось создать универсальную процедуру для выполнения действий описанных выше и еще некоторых других. В отдельном модуле (назовем его для ясности utils) написал следующее:
procedure PrepareToShow(Frm:TForm);
begin
Application.CreateForm(TFrm, Frm));
end;
Вызвал формы так:
PrepareToShow(AnyForm);
AnyForm.Show;
Как я и подозревал это не сработало - Access violation. Голова уже совершенно не соображает, никак не могу понять как же все-таки нужно сделать - грамотно и чтобы работало. Надеюсь на вашу помощь Мастера.
← →
pasha_golub © (2004-04-19 17:59) [1]procedure CreateForm(FormClass: TFormClass; var Reference);
А вы передаете один параметр
procedure PrepareToShow(Frm:TForm);
Ясен пень, что что-то тут не то ;-)
← →
pasha_golub © (2004-04-19 17:59) [1]procedure CreateForm(FormClass: TFormClass; var Reference);
А вы передаете один параметр
procedure PrepareToShow(Frm:TForm);
Ясен пень, что что-то тут не то ;-)
← →
VAleksey © (2004-04-19 17:59) [2]Оставим вопрос о том что ты изобретаешь велосипед в стороне.
В твоем случае тебе необходимо передавать в процедуру ссылку на класс создаваемой формы.
← →
VAleksey © (2004-04-19 17:59) [2]Оставим вопрос о том что ты изобретаешь велосипед в стороне.
В твоем случае тебе необходимо передавать в процедуру ссылку на класс создаваемой формы.
← →
WebErr © (2004-04-19 18:02) [3]Вот - вполне работоспособный кусок:
procedure NumProcess;
begin
if not Assigned(NumForm) then
NumForm := TNumForm.Create(Application);
if NumForm.WindowState = wsMinimized then
NumForm.WindowState := wsNormal;
NumForm.Show;
end;
← →
WebErr © (2004-04-19 18:02) [3]Вот - вполне работоспособный кусок:
procedure NumProcess;
begin
if not Assigned(NumForm) then
NumForm := TNumForm.Create(Application);
if NumForm.WindowState = wsMinimized then
NumForm.WindowState := wsNormal;
NumForm.Show;
end;
← →
VAleksey © (2004-04-19 18:03) [4]
TFormClass = class of TForm;
procedure PrepareToShow(FormClass:TFormClass; Frm:TForm);
procedure PrepareToShow(Frm:TForm);
begin
if Not Assigned(Frm) then
begin
Application.CreateForm(FormClass, Frm));
end;
end
.....
// Some where in project ...
PrepareToShow(TMySuperCoolForm,Frm);
Frm.Show;
.....
← →
VAleksey © (2004-04-19 18:03) [4]
TFormClass = class of TForm;
procedure PrepareToShow(FormClass:TFormClass; Frm:TForm);
procedure PrepareToShow(Frm:TForm);
begin
if Not Assigned(Frm) then
begin
Application.CreateForm(FormClass, Frm));
end;
end
.....
// Some where in project ...
PrepareToShow(TMySuperCoolForm,Frm);
Frm.Show;
.....
← →
A. Sonin (2004-04-19 18:07) [5]2 pasha_golub © (19.04.04 17:59) [1]
Говорю же - уже не соображаю. Т.е как я понял нужно сначала регистрировать классы форм, а потом передать _их_ при создании?
2 VAleksey © (19.04.04 17:59) [2]
> Оставим вопрос о том что ты изобретаешь велосипед в стороне.
Поэтому и спрашиваю - как то что я описал сделать грамотно?
← →
A. Sonin (2004-04-19 18:07) [5]2 pasha_golub © (19.04.04 17:59) [1]
Говорю же - уже не соображаю. Т.е как я понял нужно сначала регистрировать классы форм, а потом передать _их_ при создании?
2 VAleksey © (19.04.04 17:59) [2]
> Оставим вопрос о том что ты изобретаешь велосипед в стороне.
Поэтому и спрашиваю - как то что я описал сделать грамотно?
← →
A. Sonin (2004-04-19 18:08) [6]Извиняюсь, когда отправлял свой пост не видел двух предыдущих - щас попробую.
← →
A. Sonin (2004-04-19 18:08) [6]Извиняюсь, когда отправлял свой пост не видел двух предыдущих - щас попробую.
← →
pasha_golub © (2004-04-19 18:10) [7]A. Sonin (19.04.04 18:07) [5]
Вообще, не нужно делать цирка из создания форм. Нужно создавать там где это нужно, а вынос в отдельный модуль ничего не решает.
← →
pasha_golub © (2004-04-19 18:10) [7]A. Sonin (19.04.04 18:07) [5]
Вообще, не нужно делать цирка из создания форм. Нужно создавать там где это нужно, а вынос в отдельный модуль ничего не решает.
← →
A. Sonin (2004-04-19 18:21) [8]2 VAleksey © (19.04.04 18:03) [4]
Пишу так (в utils);
Type
TFormClass=Class Of TForm;
Procedure PrepareFormToShow(FormClass:TFormClass; Frm:TForm);
...
Procedure PrepareFormToShow(FormClass:TFormClass; Frm:TForm);
Begin
If Not Assigned(Frm) Then
Begin
Application.CreateForm(FormClass,Frm);
End;
End;
Потом при вызове формы:
PrepareFormToShow(TAny_frm,Any_frm);
Any_frm.Show;
Acess violation. Проверил вот так:
PrepareFormToShow(TAny_frm,Any_frm);
If Assigned(Any_frm) Then
Any_frm.Show;
Форма не показывается - соответственно она не создана. Что я делаю не так?
← →
A. Sonin (2004-04-19 18:21) [8]2 VAleksey © (19.04.04 18:03) [4]
Пишу так (в utils);
Type
TFormClass=Class Of TForm;
Procedure PrepareFormToShow(FormClass:TFormClass; Frm:TForm);
...
Procedure PrepareFormToShow(FormClass:TFormClass; Frm:TForm);
Begin
If Not Assigned(Frm) Then
Begin
Application.CreateForm(FormClass,Frm);
End;
End;
Потом при вызове формы:
PrepareFormToShow(TAny_frm,Any_frm);
Any_frm.Show;
Acess violation. Проверил вот так:
PrepareFormToShow(TAny_frm,Any_frm);
If Assigned(Any_frm) Then
Any_frm.Show;
Форма не показывается - соответственно она не создана. Что я делаю не так?
← →
A. Sonin (2004-04-19 18:23) [9]pasha_golub © (19.04.04 18:10) [7]
> а вынос в отдельный модуль ничего не решает.
Так надо.
← →
A. Sonin (2004-04-19 18:23) [9]pasha_golub © (19.04.04 18:10) [7]
> а вынос в отдельный модуль ничего не решает.
Так надо.
← →
WebErr © (2004-04-19 18:47) [10]Вот уж не думал, что ЭТО кому-то понадобится!
procedure TNumForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
NumForm := nil;
end;
← →
WebErr © (2004-04-19 18:47) [10]Вот уж не думал, что ЭТО кому-то понадобится!
procedure TNumForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
NumForm := nil;
end;
← →
A. Sonin (2004-04-19 18:57) [11]2 WebErr © (19.04.04 18:47) [10]
Это-то здесь причем?
← →
A. Sonin (2004-04-19 18:57) [11]2 WebErr © (19.04.04 18:47) [10]
Это-то здесь причем?
← →
WebErr © (2004-04-19 19:01) [12]
> If Assigned(Any_frm) Then
> Any_frm.Show;
А вот причём - Когда вы выполняете Assigned нужно чтобы форма была nil если она закрыта! Всё - я домой пошёл...
← →
WebErr © (2004-04-19 19:01) [12]
> If Assigned(Any_frm) Then
> Any_frm.Show;
А вот причём - Когда вы выполняете Assigned нужно чтобы форма была nil если она закрыта! Всё - я домой пошёл...
← →
A. Sonin (2004-04-19 19:04) [13]WebErr © (19.04.04 19:01) [12]
Суть в том, что она еще не создалась через PrepareFormToShow, соответственно она есть nil.
← →
A. Sonin (2004-04-19 19:04) [13]WebErr © (19.04.04 19:01) [12]
Суть в том, что она еще не создалась через PrepareFormToShow, соответственно она есть nil.
← →
Юрий Зотов © (2004-04-19 19:14) [14]> A. Sonin (19.04.04 18:21) [8]
Все верно, только второй параметр должен быть с описателем var - ведь иначе его изменение в процедуре не будет действительно за ее пределами, это же Паскаль. И TFormClass объявлять не надо - он уже объявлен в модуле Forms, так что просто используйте, и все.
← →
Юрий Зотов © (2004-04-19 19:14) [14]> A. Sonin (19.04.04 18:21) [8]
Все верно, только второй параметр должен быть с описателем var - ведь иначе его изменение в процедуре не будет действительно за ее пределами, это же Паскаль. И TFormClass объявлять не надо - он уже объявлен в модуле Forms, так что просто используйте, и все.
← →
A. Sonin (2004-04-19 19:33) [15]2 Юрий Зотов © (19.04.04 19:14) [14]
Огромное Вам спасибо. Единственное, что смущает это то, что приходится вызывать процедуру таким образом:
PrepareFormToShow(TAny_frm,TForm(Any_frm_frm));
Так ли надо делать? Или я опять что-то недопонял?
← →
A. Sonin (2004-04-19 19:33) [15]2 Юрий Зотов © (19.04.04 19:14) [14]
Огромное Вам спасибо. Единственное, что смущает это то, что приходится вызывать процедуру таким образом:
PrepareFormToShow(TAny_frm,TForm(Any_frm_frm));
Так ли надо делать? Или я опять что-то недопонял?
← →
A. Sonin (2004-04-19 19:34) [16]Поправка - TForm(Any_frm)
← →
A. Sonin (2004-04-19 19:34) [16]Поправка - TForm(Any_frm)
← →
Mim1 (2004-04-19 19:39) [17]А ты не говори что второй параметр должен быть tform и не надо будет кастовать
То есть замени
Procedure PrepareFormToShow(FormClass:TFormClass,var Ref:TForm);
на
Procedure PrepareFormToShow(FormClass:TFormClass,var Ref);
← →
Mim1 (2004-04-19 19:39) [17]А ты не говори что второй параметр должен быть tform и не надо будет кастовать
То есть замени
Procedure PrepareFormToShow(FormClass:TFormClass,var Ref:TForm);
на
Procedure PrepareFormToShow(FormClass:TFormClass,var Ref);
← →
A. Sonin (2004-04-19 20:22) [18]> Mim1 (19.04.04 19:39) [17]
Понял. Проблема решена, ОГРОМНОЕ СПАСИБО всем за участие.
← →
A. Sonin (2004-04-19 20:22) [18]> Mim1 (19.04.04 19:39) [17]
Понял. Проблема решена, ОГРОМНОЕ СПАСИБО всем за участие.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.034 c