Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.53 MB
Время: 0.031 c
1-1082614906
JT
2004-04-22 10:21
2004.05.09
HTML Help


7-1079525450
DuchmanSoft
2004-03-17 15:10
2004.05.09
Мою программу закрывает другая программа


11-1068010080
Gandalf
2003-11-05 08:28
2004.05.09
KOLovrat - как оно?


8-1076781659
VasRog
2004-02-14 21:00
2004.05.09
Как узнать цвет пикселя


3-1081790482
Николай
2004-04-12 21:21
2004.05.09
Проблемы с созданием дистрибутива БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский