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

Вниз

Собственное создание формы без использования кода в проекте   Найти похожие ветки 

 
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);

Ясен пень, что что-то тут не то ;-)


 
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;


 
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:08) [6]

Извиняюсь, когда отправлял свой пост не видел двух предыдущих - щас попробую.


 
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: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;


 
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 если она закрыта! Всё - я домой пошёл...


 
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, так что просто используйте, и все.


 
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)


 
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]

Понял. Проблема решена, ОГРОМНОЕ СПАСИБО всем за участие.



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

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

Наверх




Память: 0.51 MB
Время: 0.029 c
9-1070561177
Omar2002
2003-12-04 21:06
2004.04.11
Батл нет в своей игре!


1-1079728986
Igoryok
2004-03-19 23:43
2004.04.11
Консольное - включить русский


14-1082460600
Gero
2004-04-20 15:30
2004.04.11
"Начинающим"


8-1076758014
iudjen
2004-02-14 14:26
2004.04.11
проиграть файл задним ходом


3-1079100032
Anarki
2004-03-12 17:00
2004.04.11
Длина запроса больше 255 символов