Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Создание форм


Автор: Bose 15.6.2006, 15:49
Отлаживая свой проект, возник вопрос, о том, как лучше всего создавать формы, чтобы было проще отследить порядок их освобождения. Посему, решил затеять опрос. Будьте любезны уделить немного времени на ответ, и желательно обьяснение smile  

Автор: Matematik 15.6.2006, 15:54
Одно и тоже

Application.CreateForm(TForm, Form);   
Form := TForm.Create(Application) 
 

Автор: Bose 15.6.2006, 15:54
Мой ответ: 

В крупных MDI приложениях, я стараюсь создавать формы так 
Код

Form := TForm.Create(Application) 

или так 
Код

Form := TForm.Create(Application.MainForm)

А модальные формы(которые освобождаются сразу же после вызова) обычно создаю от активной 
Код

Form := TForm.Create(Self) 


 

Автор: vv3 15.6.2006, 15:56
Owner'ом назначаю главную форму приложения, или ту, которая будет Parent'ом для создаваемой. 

Автор: bems 15.6.2006, 17:03
Цитата(Matematik @  15.6.2006,  15:54 Найти цитируемый пост)
Одно и тоже

Application.CreateForm(TForm, Form);   
Form := TForm.Create(Application) 

Не совсем . Главной формой становиться первая созданная  Application.CreateForm. Если нужно показать форму до главной, то создавать ее нужно ее конструктором. 





А по теме - лучше всего первый вариант (автоматически). Идет все по накатанной и не напрягает мозги. Но как обычно есть интереснейшие исключения.
 

Автор: Alexeis 15.6.2006, 17:23
bems, Вообще-то автоматическое создание это самый нерациональный способ использования ресурсов. Так как большинство форм не работает в один и тотже момент, а ресурсы под них все равно выделяются, кроме того загрузка такого приложения значительно медленее. 

Автор: bems 15.6.2006, 17:35
А такой ресурс как процессорное время?
Если все время что-то создавать/освобождать то это не работа, а сплошное ожидание. Если даже формы и не работают одновременно, то некоторые используются значительно чаще других. Или если форма легкая. Вобщем все зависит от конкретного случая. А если к меня в проекте число форм приближается к 15, то я начинаю задумываться, что я делаю неправильно. 

Автор: Alexeis 15.6.2006, 17:46
bems, Об удалении форм ни кто не говорил, кроме того от метода создания форм общее время загрузки всех форм не меняется, а Маленькие формы тем более создавать автоматически нет смысла, поскольку время их отображения почти совпадает со временем их создания(по крайней мере на взгляд пользователя).
Конечно, если форму один раз запустили, то вероятно ее могут запустить еще раз, а если нет, то длительная загрузка приложения будет лишний раз раздражать пользователя, тогда как быстрое появление главного окна наоборот обрадует и безусловно повысит часоту использования программы. 

Автор: bems 15.6.2006, 17:58
Цитата(alexeis1 @  15.6.2006,  17:46 Найти цитируемый пост)
Конечно, если форму один раз запустили, то вероятно ее могут запустить еще раз, а если нет, то 

то все равно вероятно ее запустят 

Автор: Alexeis 15.6.2006, 18:07
Я же писал
Цитата(alexeis1 @  15.6.2006,  16:46 Найти цитируемый пост)
 от метода создания форм общее время загрузки всех форм не меняется

А что касается 
Цитата(bems @  15.6.2006,  16:58 Найти цитируемый пост)
то все равно вероятно ее запустят 

то это зависит от типа приложения, например в micrsoft Word, за время работы я не вызываю и 5% всех ее форм, но при этом приложение является на мой взгляд очень функциональным и удобным
 

Автор: bems 15.6.2006, 18:15
Отчасти ты прав. Я тут задумался и понял ,что моя точка зрения именно такая потому, что большинство форм кроме главной у меня в основном применяются для изменения каких-то параметров программы и поэтому я объединяю формы с кодом который загружает и сохраняет эти настройки. Потребность загрузить настройки появляется раньше чем показать форму с контролами этих настроек. 

Автор: Alex 16.6.2006, 09:54
Цитата(bems @  15.6.2006,  18:03 Найти цитируемый пост)
А по теме - лучше всего первый вариант (автоматически). Идет все по накатанной и не напрягает мозги. Но как обычно есть интереснейшие исключения.

Мда... не писали Вы под 9x системы и приложение форм на 20 хотя бы тоже не писали, а если и писали, то не задумывались, почему оно так долго стартует...

Цитата(bems @  15.6.2006,  19:15 Найти цитируемый пост)
Я тут задумался и понял ,что моя точка зрения именно такая потому, что большинство форм кроме главной у меня в основном применяются для изменения каких-то параметров программы и поэтому я объединяю формы с кодом который загружает и сохраняет эти настройки. Потребность загрузить настройки появляется раньше чем показать форму с контролами этих настроек. 

Бонально не грамотное построение программы, зачем вам объект формы для загрузки настроек? 

Автор: Dynamic 16.6.2006, 11:31
Главная форма - автоматом, как дельфя генерирует
Остальные - в зависимости от предполагаемой частоты использования и области видимости. Например, есть диалоги, запрашивающие какие-то параметры у пользователя при создании отчета - зачем им жить постоянно? делаю примерно так:
Код

function GetReportParam(var aDate: TDate): boolean;
begin
  with TfmReportParam.Create(Application) do
  try
    КомпонентДаты.Date := aDate;
    Result := ShowModal = mrOk;
    if Result then
      aDate := КомпонентДаты.Date;
  finally
    Free;
  end;
end;

Есть формы, которые могут быть вызваны многократно, причем из разных мест программы, например, справочники. Эти я оставляю на auto create form.

Вобщем, все это - дело вкуса и количества форм. 3-5 форм в autocreate не задержат загрузку программы (если, конечно, не содержат в OnCreate "тяжелого" кода). 

Автор: Guedda 16.6.2006, 12:12
Главную форму создаю автоматически. Другие формы просто вызываю.
Код

MyForm2 := TMyForm2.Create(MainForm);
MyForm2.Show; //или ShowModal
 

Автор: Bose 16.6.2006, 19:05
Спасибо за комментарии :-)

Цитата(bems @  15.6.2006,  17:03 Найти цитируемый пост)
А по теме - лучше всего первый вариант (автоматически). Идет все по накатанной и не напрягает мозги. Но как обычно есть интереснейшие исключения.

Одно из исключений - это многоконность. Точнее случай, когда, одна и та же форма нужна в нескольких экземплярах.

Цитата(bems @  15.6.2006,  18:15 Найти цитируемый пост)
Отчасти ты прав. Я тут задумался и понял ,что моя точка зрения именно такая потому, что большинство форм кроме главной у меня в основном применяются для изменения каких-то параметров программы и поэтому я объединяю формы с кодом который загружает и сохраняет эти настройки. Потребность загрузить настройки появляется раньше чем показать форму с контролами этих настроек. 

не очень эффективное решение имхо smile 

По-моему, всё-таки, самый эффективный способ - это создание форм с Owner:=Application или Owner:=Application.MainForm. Особенно если в проекте, классов форм больше 30, и некоторые из них могут открываться в нескольких экземплярах(MDI). 

И ещё возник такой вопрос - что происходит с формой созданной как Form := TForm.Create(nil). Если её не освобождать "ручками", то в какой момент она будет освобождена? 

Автор: Alex 16.6.2006, 19:16
Цитата(Bose @  16.6.2006,  20:05 Найти цитируемый пост)
И ещё возник такой вопрос - что происходит с формой созданной как Form := TForm.Create(nil). Если её не освобождать "ручками", то в какой момент она будет освобождена?  

Если я ничего не путаю, то получается, что owner у нее не задан и она в обще не получит сообщения, о том, что должна уничтожиться и занимаемую ей память уже будет чистить винда сама за приложением, по сути это утечка памяти. 

Автор: Bose 16.6.2006, 19:31
Цитата(Alex @  16.6.2006,  19:16 Найти цитируемый пост)
Если я ничего не путаю, то получается, что owner у нее не задан и она в обще не получит сообщения, о том, что должна уничтожиться и занимаемую ей память уже будет чистить винда сама за приложением, по сути это утечка памяти. 


т.е. Borland Memory managaer её не убъёт при закрытии приложения?  

Автор: Alex 16.6.2006, 20:48
Цитата(Bose @  16.6.2006,  20:31 Найти цитируемый пост)
т.е. Borland Memory managaer её не убъёт при закрытии приложения? 

Утверждать, со 100% уверенностью не могу, но все же мне кажется винда будет убивать их когда будет чистить за приложением, хотя возможно и менеджер памяти Борланд. В любом случаи созданные вами объекты Вы сами и должны уничтожать

Добавлено @ 20:54 
А что касается создания, то я в 99% случаях для модальных форм пишу приблизительно так:
Код

function ShowXXX(...): TModalResult;
begin
  with TfrmXXX.Create(Application) do try
    Result:= ShowModal;
  finally
    Release;
  end;
end;

Хотя в текущем проекте это все обычно оформляется как процедура 

Автор: DragonFire 16.6.2006, 21:14
Пользуюсь окнами а не формами... Создаю при помощи CreateWindowEx... 

Автор: Демо 16.6.2006, 21:15
Цитата(Bose @  16.6.2006,  19:31 Найти цитируемый пост)
т.е. Borland Memory managaer её не убъёт при закрытии приложения?  


Все ресурсы, выделенные в приложении, будут освобождены при завершении процесса.
Одно исключения я знаю - это атомы.

По теме топика - все зависит от контекста программы.  

Автор: Dynamic 19.6.2006, 06:31
Цитата(Bose @  16.6.2006,  19:31 Найти цитируемый пост)
т.е. Borland Memory managaer её не убъёт при закрытии приложения?   

BMM никого и ничего сам не убивает, он управляет памятью, а не приложением.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)