![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
||
|
|
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Очень тут меня заинтересовал вопрос, который вроде бы для себя решил уже давно... Ан нет...
Суть вопроса в следующем: как вы в своих приложениях создаете необходимые для себя вспомогательные окна в рантайме? Варианты собсно даны выше... Сам я скажу, что когда-то давно, еще на заре изучения мной дельфей, я писал приложение, несложное для меня в данный момент, но тогда опупеть какое сложное. Там было около 10 окошек, которые я создавал с помощью Application.CreateForm в обработчиках меню и кнопок главной формы... И когда я уже его практически закончил, вдруг понадобилось перед вызовом главной формы сделать вызов вспомогательной настроечной формы... Написав что-то типа Application.CreateForm(fmOptions,TfmOptions); перед созданием главной формы я получил то, что и должен был получить - после закрытия того окошка, приложение завершалось. Щас-то я знаю о наличии свойства FMainForm объекта TApplication, а тогда это меня немало удивило... Погуглив проблему, я принял решение создавать его по другому:
И вот не далее как сегодня один из уважаемых мной форумчан по поводу такого кода высказался в отрицательном аспекте. Мне это показалось удивительным, ибо на мой взгляд такой код не несет в себе принципиальных ошибок, использует только разрешенные конструкции и не приводит к утечкам памяти, более того - защищает от них (при корректном использовании). Но мое мнение может быть ошибочным, и не прислушаться к голосу других я не имею права. Что скажет по этому поводу многоуважаемый ALL? P.S. Понимаю, что вопрос не особо принципиальный - поэтому просьба отнестись к данной теме как к разговору об индивидуальных предпочтениях... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: 28 Всего: 89 |
Я создаю воспомагательные формы 2 вариантом, но проголосовал за первый, т.к. в последнее время пишу одноформенные приложения.
Ссылку в студию! -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Первый способ использую для обычных окон.
Второй использую исключительно для модальных окошек, которые нужно показать и сразу убить. Добавлено @ 13:56 ama_kid, а кто будет убивать за тебя форму? И зачем пытаться вызывать форму, которая заведомо ещё не создана? |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Сама форма себя убивает... Action:=caFree;
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Это не красиво.
Код должен быть строгим и логичным, а не вызывать сомнения.
|
|||
|
||||
| pseud |
|
||||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
1. Application.CreateForm(TMainForm, MainForm);
использую только для главного окна, иногда для окон, которые присутствуют в приложении в единственном экземпляре и необходимы как и главное коно всегда (например TSettingsForm). И этот код присутствует только в dpr-файле. 2. fmFormTest:=TfmFormTest.Create(Self); Использую во всех остальных случаях. При чем никогда не использую глобальную переменную fmFormTest: TfmFormTest, чтоб не создавать каши, сугубо через локальные перемнные.
иногда даже так
3. Последнее время делаю окна самостоятельные с отображением на таскбаре винды. Т.е. не MDI приложение, не модальное, а что-то типа MSOutlook'а. Работаю через "фабрику форм". Ну и соответсвенно метод фабрики что-то типа:
Это сообщение отредактировал(а) pseud - 31.5.2007, 14:13 -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||||
|
|||||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Это все прекрасно... Но что делать с формами, которые могут быть в нескольких экземплярах? Или которые должны быть немодальными?
А если между формами могут быть взаимосвязи? Понятно, что это - признак плохого проектирования, но я пару раз реально сталкивался с ситуевиной, когда ну никак... вот надо использовать взаимосвязи и все тут... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Bose |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
1) Application.CreateForm(TfmMain, fmMain); использую в основном для главной формы
2) Все модальные создаю приемерно так:
3) Немодальные формы создаю аналогично
формы освобождаются через
4) Через CreateWindow я ещё не создавал ни одного окна и пока что не планирую. Добавлено через 3 минуты и 28 секунд В таких случаях лучше делать связи через свойства(properties). Глобальные переменные в таких случаях способны только добавить путаницы. |
||||||
|
|||||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
||||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Или Name, Tag и т.д... -------------------- ![]() |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
Ну и будешь иметь в проекте несколько форм класса TMyForm, но одна из них будет глобальная MyForm, а к остальным будешь обращаться через <поиск окон> . Согласись каша. Никогда не рекомендую делать TMyForm.Create(nil), т.к. если сами ее не удалите, то останется в памяти до перезагрузки винды (IMHO). Указывайте Self, тогда хотя бы объект, который Self позаботиться об уничтожении. Или Application. Как я уже писал - использую "фабрику форм", она и заботиться обо всем. Кстати, если будете указывать Application, то и проще потом искать форму нужную (если не знаете имени), через Application.Components. Если зоздаете Create(MainForm), то через MainForm.Components и т.д. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
pseud, ндя...
Не соглашусь. Help по TScreen табе в руки ;-)
Это плохой способ. Правильный - через TScreen! |
||||
|
|||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Я раньше тоже так мучался. Пока не узнал, что через Screen.Forms можно добраться почти до любой формы. Так что... |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
Да я тут погорячился. Согласен. Изучил код своей "фабрики форм" и действительно ее метод GetEntityForm работает со Screen. Давно писал... -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 15 Всего: 95 |
Ну это-то не подвергается сомнению
Тут я пожалуй добавлю, что в своих приложениях я всегда все за собой подчищаю и все приложения у меня снабжены модулем MemCheck, который матерится ругательными словами, если остался хоть байт упущенной памяти... Пример в топике написан от руки, просто для того, чтобы показать принципиальное понимание мной изначального вопроса, который звучит так - "что в этом неправильного/некорректного/опасного и т.д.?"... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |