Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вы создаете окна в приложении (runtime)? вспомогательные окна 
:(
    Опции темы
 
Каким способом в приложении Delphi вы создаете необходимые вам вспомогательные окна?
Application.CreateForm(TfmFormTest,fmFormTest); [ 10 ]  [30.30%]
fmFormTest:=TfmFormTest.Create(Self); [ 22 ]  [66.67%]
Я - фанат WinAPI и окна всегда создаю с помощью CreateWindow... [ 1 ]  [3.03%]
Всего проголосовавших: 33
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
ama_kid
Дата 31.5.2007, 13:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Очень тут меня заинтересовал вопрос, который вроде бы для себя решил уже давно... Ан нет... 
Суть вопроса в следующем: как вы в своих приложениях создаете необходимые для себя вспомогательные окна в рантайме? Варианты собсно даны выше...
Сам я скажу, что когда-то давно, еще на заре изучения мной дельфей, я писал приложение, несложное для меня в данный момент, но тогда опупеть какое сложное. Там было около 10 окошек, которые я создавал с помощью Application.CreateForm в обработчиках меню и кнопок главной формы... И когда я уже его практически закончил, вдруг понадобилось перед вызовом главной формы сделать вызов вспомогательной настроечной формы... Написав что-то типа Application.CreateForm(fmOptions,TfmOptions); перед созданием главной формы я получил то, что и должен был получить - после закрытия того окошка, приложение завершалось. Щас-то я знаю о наличии свойства FMainForm объекта TApplication, а тогда это меня немало удивило... Погуглив проблему, я принял решение создавать его по другому:
Код

 ...
 begin
  Application.Initialize;
  try
   fmOptions.ShowModal;  
  except
   fmOptions:=TfmOptions.Create(nil);
   fmOptions.ShowModal;
  end;
  Application.CreateForm(TfmMain, fmMain);
  Application.Run;
 end.
Должен сказать, что в тот раз этот кусок кода я втупую передрал с какого-то форума, не особо понимая его смысла... Впоследствии я разобрался что-почем, но привычка создавать формы таким образом настолько у меня укоренилась, что я стал всегда так писать - для всех форм, не являющимися главными... И собственно, уже не один десяток моих приложений работает именно по такой схеме...
И вот не далее как сегодня один из уважаемых мной форумчан по поводу такого кода высказался в отрицательном аспекте. Мне это показалось удивительным, ибо на мой взгляд такой код не несет в себе принципиальных ошибок, использует только разрешенные конструкции и не приводит к утечкам памяти, более того - защищает от них (при корректном использовании). Но мое мнение может быть ошибочным, и не прислушаться к голосу других я не имею права. Что скажет по этому поводу многоуважаемый ALL?

P.S. Понимаю, что вопрос не особо принципиальный - поэтому просьба отнестись к данной теме как к разговору об индивидуальных предпочтениях...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Sunvas
Дата 31.5.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Я создаю воспомагательные формы 2 вариантом, но проголосовал за первый, т.к. в последнее время пишу одноформенные приложения.
Цитата(ama_kid @  31.5.2007,  13:39 Найти цитируемый пост)
один из уважаемых мной форумчан по поводу такого кода высказался в отрицательном аспекте.

Ссылку в студию!


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Snowy
Дата 31.5.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Первый способ использую для обычных окон.
Второй использую исключительно для модальных окошек, которые нужно показать и сразу убить.

Добавлено @ 13:56
ama_kid, а кто будет убивать за тебя форму?
И зачем пытаться вызывать форму, которая заведомо ещё не создана?
PM MAIL   Вверх
ama_kid
Дата 31.5.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(Snowy @  31.5.2007,  13:53 Найти цитируемый пост)
ama_kid, а кто будет убивать за тебя форму?
Сама форма себя убивает... Action:=caFree;



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Snowy
Дата 31.5.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(ama_kid @  31.5.2007,  13:59 Найти цитируемый пост)
Сама форма себя убивает... Action:=caFree;
Это не красиво.
Код должен быть строгим и логичным, а не вызывать сомнения.
Код

 begin
  Application.Initialize;
  with TfmOptions.Create(nil) do
  begin
    ShowModal;
    Free;
  end;
  Application.CreateForm(TfmMain, fmMain);
  Application.Run;
end.
Чётко обозначили создание, работу, убийство.
PM MAIL   Вверх
pseud
Дата 31.5.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



1. Application.CreateForm(TMainForm, MainForm);

использую только для главного окна, иногда для окон, которые присутствуют в приложении в единственном экземпляре и необходимы как и главное коно всегда (например TSettingsForm). И этот код присутствует только в dpr-файле.

2. fmFormTest:=TfmFormTest.Create(Self);
Использую во всех остальных случаях. При чем никогда не использую глобальную переменную fmFormTest: TfmFormTest, чтоб не создавать каши, сугубо через локальные перемнные.
Код

var
  frm: TTestForm;
begin
  frm := TTestForm.Create(Self);
  try
    frm.{Настрока разная}
    if frm.ShowModal = mrOK then
      {чего-нибудь};
  finally
    frm.Free;
  end;
end;


иногда даже так
Код

  with TTestForm.Create(Self) do
  try
    {Настрока разная}
    ShowModal = mrOK then
      {чего-нибудь};
  finally
    Free;
  end;


3. Последнее время делаю окна самостоятельные с отображением на таскбаре винды. Т.е. не MDI приложение, не модальное, а что-то типа MSOutlook'а. Работаю через "фабрику форм". Ну и соответсвенно метод фабрики что-то типа:
Код

var
  frm: TMyForm;
begin
  {ищу не создана ли такая форма уже}
  {если создана то}
  {показываю и Exit}
  frm := TMyForm.Create(Self{, другие параметры});
  if frm <> nil then
  begin
    frm.Name = {Генерю для дальнейшей удобной работы};
    frm.Show
  end else
    TException.Create('Ругаюсь');
end;


Это сообщение отредактировал(а) pseud - 31.5.2007, 14:13


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
ama_kid
Дата 31.5.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(Snowy @  31.5.2007,  14:12 Найти цитируемый пост)
Код должен быть строгим и логичным, а не вызывать сомнения.
Это все прекрасно... Но что делать с формами, которые могут быть в нескольких экземплярах? Или которые должны быть немодальными?

Цитата(pseud @  31.5.2007,  14:12 Найти цитируемый пост)
При чем никогда не использую глобальную переменную
А если между формами могут быть взаимосвязи? Понятно, что это - признак плохого проектирования, но я пару раз реально сталкивался с ситуевиной, когда ну никак... вот надо использовать взаимосвязи и все тут...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Bose
Дата 31.5.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



1) Application.CreateForm(TfmMain, fmMain); использую в основном для главной формы
2) Все модальные создаю приемерно так:
Код

function ShowModalForm2: Tmodalresult;
var 
  tmpForm2: Tform2
begin
  tmpForm2:=Tform2.Create(self); //  иногда вместо self пишу nil или Application
  try
    result:=tmpForm2.ShowModal;
  finally
    tmpForm2.Release;
  end;
end;

3) Немодальные формы создаю аналогично
Код

procedure ShowNonModalForm3;
begin
  with Tform2.Create(self) do //  иногда вместо self пишу Application  
     Show;
end;

формы освобождаются через 
Код

  CloseAction := caFree;

4) Через CreateWindow я ещё не создавал ни одного окна и пока что не планирую.

Добавлено через 3 минуты и 28 секунд
Цитата(ama_kid @  31.5.2007,  14:23 Найти цитируемый пост)
А если между формами могут быть взаимосвязи? Понятно, что это - признак плохого проектирования, но я пару раз реально сталкивался с ситуевиной, когда ну никак... вот надо использовать взаимосвязи и все тут...

В таких случаях лучше делать связи через свойства(properties). Глобальные переменные в таких случаях способны только добавить путаницы. 
PM MAIL WWW Skype   Вверх
Snowy
Дата 31.5.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(ama_kid @  31.5.2007,  14:23 Найти цитируемый пост)
Но что делать с формами, которые могут быть в нескольких экземплярах? Или которые должны быть немодальными?
А у таких должен быть Owner.
PM MAIL   Вверх
aktuba
Дата 31.5.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата(Snowy @ 31.5.2007,  15:31)
Цитата(ama_kid @  31.5.2007,  14:23 Найти цитируемый пост)
Но что делать с формами, которые могут быть в нескольких экземплярах? Или которые должны быть немодальными?
А у таких должен быть Owner.

Или Name, Tag и т.д...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
pseud
Дата 31.5.2007, 14:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(pseud @  31.5.2007,  14:12 Найти цитируемый пост)
При чем никогда не использую глобальную переменную 


Цитата(ama_kid @  31.5.2007,  14:23 Найти цитируемый пост)
А если между формами могут быть взаимосвязи? Понятно, что это - признак плохого проектирования, но я пару раз реально сталкивался с ситуевиной, когда ну никак... вот надо использовать взаимосвязи и все тут...


Ну и будешь иметь в проекте несколько форм класса TMyForm, но одна из них будет глобальная MyForm, а к остальным будешь обращаться через <поиск окон> . Согласись каша.

Никогда не рекомендую делать TMyForm.Create(nil), т.к. если сами ее не удалите, то останется в памяти до перезагрузки винды (IMHO).
Указывайте Self, тогда хотя бы объект, который Self позаботиться об уничтожении. Или Application.

Как я уже писал - использую "фабрику форм", она и заботиться обо всем.

Кстати, если будете указывать Application, то и проще потом искать форму нужную (если не знаете имени), через Application.Components.
Если зоздаете Create(MainForm), то через MainForm.Components и т.д.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Snowy
Дата 31.5.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



pseud, ндя...

Цитата(pseud @  31.5.2007,  14:43 Найти цитируемый пост)
если сами ее не удалите, то останется в памяти до перезагрузки винды (IMHO).
Нет. Но это не значит, что убирать за собой не нужно.

Цитата(pseud @  31.5.2007,  14:43 Найти цитируемый пост)
стальным будешь обращаться через <поиск окон> . Согласись каша.
Не соглашусь. Help по TScreen табе в руки ;-)

Цитата(pseud @  31.5.2007,  14:43 Найти цитируемый пост)
 проще потом искать форму нужную (если не знаете имени), через Application.Components
А вот так как раз не надо делать.
Это плохой способ.
Правильный - через TScreen!
PM MAIL   Вверх
Bose
Дата 31.5.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(pseud @  31.5.2007,  14:43 Найти цитируемый пост)
Кстати, если будете указывать Application, то и проще потом искать форму нужную (если не знаете имени), через Application.Components.Если зоздаете Create(MainForm), то через MainForm.Components и т.д.

Я раньше тоже так мучался. Пока не узнал, что через Screen.Forms можно добраться почти до любой формы. Так что... 

Цитата(Snowy @  31.5.2007,  14:52 Найти цитируемый пост)
 Help по TScreen табе в руки ;-)

 smile 
PM MAIL WWW Skype   Вверх
pseud
Дата 31.5.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Snowy @  31.5.2007,  14:52 Найти цитируемый пост)
А вот так как раз не надо делать.
Это плохой способ.
Правильный - через TScreen! 


Да я тут погорячился. Согласен.
Изучил код своей "фабрики форм" и действительно ее метод GetEntityForm работает со Screen. Давно писал...




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
ama_kid
Дата 31.5.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(Snowy @  31.5.2007,  14:31 Найти цитируемый пост)
А у таких должен быть Owner.
Ну это-то не подвергается сомнению smile Я написал nil просто для примера, понятно, что от главного окна я всегда создаю вспомогательное в параметром Self (или другим, необходимым в данный момент)... Я просто к тому, что не всегда имеется возможность вызвать Free непосредственно после вызова команды Show (более того, я не могу сейчас с ходу сообразить пример, когда это возможно), как в случае с ShowModal, поэтому альтернативы оператору Action:=caFree (который "некрасив") пока не вижу (точнее, вижу - вызов Free в другой области видимости, но это для меня практически неприемлимо из религиозных соображений)...
Цитата(pseud @  31.5.2007,  14:43 Найти цитируемый пост)
 т.к. если сами ее не удалите, то останется в памяти
Тут я пожалуй добавлю, что в своих приложениях я всегда все за собой подчищаю и все приложения у меня снабжены модулем MemCheck, который матерится ругательными словами, если остался хоть байт упущенной памяти... Пример в топике написан от руки, просто для того, чтобы показать принципиальное понимание мной изначального вопроса, который звучит так - "что в этом неправильного/некорректного/опасного и т.д.?"...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1398 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.