![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
заNILить форму после Close;
ничтожная козявка © (2008-08-21 12:37:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 >
В некой dll есть функция, показывающая форму. Перед созданием формы, она проверяет ее на NIL:
if not Assigned(Form1) then Form1 := TForm1.Create(AOwner);
также требуется, что бы после закрытия (Close) форма была уничтожена:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
Action := caFree;
...
end;
ВОПРОС: как сделать так, чтоб она была не только уничтожена, но и переменная Form1 приняла значение NIL. Т.к. поскольку эта переменная не NIL, при повторной попытке создать форму, ее конструктор
if not Assigned(Form1) then Form1 := TForm1.Create(AOwner);
не вызывается, и в последствии сыпятся AV.
DVM (2008-08-22 14:50:00) [121]А в SysInit сколько глобальных переменнных. Их тоже в классы загонять?
DVM (2008-08-22 14:44:00) [122]
> Leonid Troyanovsky © (22.08.08 14:24) [64]
> Это уже не переменные, а константы.
Но формально, они в разделе var, а не const. Да и нельзя присвоить именно константе из раздела const значение уже во время выполнения программы.
Выходит, с одной стороны:
> > А ООП и глобальные константы совместимы?
>
> Вполне.
Но с другой:
> ведь глобальные переменные и ООП несовместимы.
Anatoly Podgoretsky (2008-08-22 14:38:00) [123]> @!!ex (22.08.2008 14:15:03) [63]
В [1] нет никакой проверки существования формы.
Anatoly Podgoretsky (2008-08-22 14:36:00) [124]> DVM (22.08.2008 14:12:02) [62]
Надо стремиться, см. выше
Anatoly Podgoretsky (2008-08-22 14:35:00) [125]> DVM (22.08.2008 14:11:01) [61]
Нет, есть исключения - глобальные переменные Дельфи, Application и Screen
Из собственных только две - DataModele и MainForm - но это по принципам работы, раньше Дельфи иначе работала, можно было и без CreateForm писать.
Leonid Troyanovsky (2008-08-22 14:24:00) [126]
> DVM © (22.08.08 14:03) [58]
> Там есть множество переменных которые один единственный
> раз должны быть проинициализированы при старте программы
> и в дальнейшем менять ся во время выполнения программы не
> могут. Версия Windows например.
Это уже не переменные, а константы.
Проинициализировать что-либо при старте - это еще тот бином Ньютона.
> Да, но тогда тот же sysutils будет намертво приклеен к TApplication,
> а этот самый TApplication нужен бывает не везде и не всегда.
Это вопрос проектирования.
А Application мог бы пригодиться хоть и в консольном приложении.
> А ООП и глобальные константы совместимы?
Вполне.
--
Regards, LVT.
@!!ex (2008-08-22 14:15:00) [127]> Если Вы с этим не согласны, то докажите, что я не прав.
> Только не надо слов, надо конкретно - Вы же этого хотели?
> Вот и напишите конкретный работающий пример проверки существования
> формы с помощью кода [1].
А я написал, конкретный, работающий пример еще в [1] написал. Автор даже проверил и отписался, что да, действительно работает:
> @!!ex
> Ок, спасибо! Это работает.
DVM (2008-08-22 14:12:00) [128]
> Anatoly Podgoretsky © (22.08.08 14:11) [60]
> да и сам Дельфи далек от классического ООП
Ну раз далек, то и незачем его притягивать за уши к ООП, пытаясь отказаться от глобальных переменных целиком и полностью.
Anatoly Podgoretsky (2008-08-22 14:11:00) [129]> DVM (22.08.2008 14:03:58) [58]
Не совместимы, да и сам Дельфи далек от классического ООП
DVM (2008-08-22 14:11:00) [130]
> Anatoly Podgoretsky © (22.08.08 14:06) [59]
Вы тоже категорически против глобальных переменных?
Я лично, не вижу ничего зазорного, если, скажем в каком то модуле программы будет глобальная переменная MyVar, которая в блоке initialization модуля получает значение из некоторой функции MyVar := MyVARFunc(); Почему я не использую функцию MyVARFunc напрямую вместо переменной? Вызов MyVARFunc может занимать много времени и ресурсов, например.
Другое дело, когда заводятся глобальные переменные для форм. Это мне не нравится.
Anatoly Podgoretsky (2008-08-22 14:06:00) [131]> DVM (22.08.2008 13:37:55) [55]
Русский программист и даже русский человек в состоянии оправдать что угодно.
DVM (2008-08-22 14:03:00) [132]
> Ну, и что там упрощенного, читабельного и лаконичного?
Там есть множество переменных которые один единственный раз должны быть проинициализированы при старте программы и в дальнейшем менять ся во время выполнения программы не могут. Версия Windows например.
> Сделай все эти переменные, скажем, полями TApplication,
> и будет всем хорошо.
Да, но тогда тот же sysutils будет намертво приклеен к TApplication, а этот самый TApplication нужен бывает не везде и не всегда.
> Авторы же явно не стремились к повторному использованию
> кода,
> ведь глобальные переменные и ООП несовместимы.
>
А ООП и глобальные константы совместимы? Да и не ООП единым...
Leonid Troyanovsky (2008-08-22 13:55:00) [133]
> DVM © (22.08.08 13:37) [55]
> и лаконичной. Взгляните на модуль SysUtils, к примеру.
Ну, и что там упрощенного, читабельного и лаконичного?
Сделай все эти переменные, скажем, полями TApplication,
и будет всем хорошо.
Авторы же явно не стремились к повторному использованию кода,
ведь глобальные переменные и ООП несовместимы.
--
Regards, LVT.
Leonid Troyanovsky (2008-08-22 13:49:00) [134]
> Юрий Зотов © (22.08.08 13:34) [54]
> 1. Плагинная архитектура.
> 2. Обновление по сети.
> 3. Повторное использование кода в других приложениях.
Необходимость первого нуждается в отдельном обосновании.
А, в остальном, изволь: пусть это будет, например,
web service & client.
--
Regards, LVT.
DVM (2008-08-22 13:37:00) [135]
> Leonid Troyanovsky © (21.08.08 15:15) [19]
> 1. глобальные переменные - MD,
Это, мягко говоря, чушь. Глобальная переменная, будучи применена в нужное время и в нужном месте нисколько не ухудшает, а наоборот упрощает программу и делает ее более читабельной и лаконичной. Взгляните на модуль SysUtils, к примеру.
Юрий Зотов (2008-08-22 13:34:00) [136]> Приведи три причины необходимости использования
> DLL with BPL with EXE vs EXE
1. Плагинная архитектура.
2. Обновление по сети.
3. Повторное использование кода в других приложениях.
Leonid Troyanovsky (2008-08-22 13:22:00) [137]
> Loginov Dmitry © (21.08.08 21:05) [41]
> Application, Screen - тоже глобальные переменные. Долой
> их?
Я уже не один раз высказывался по этому поводу, не вижу
смысла повторяться.
> Не вижу ничего плохого в глобальных переменных, если с помощью
> них удается решить поставленную задачу, не ухудшая надежность
> и читабельность кода, и не нанося ущерба его дальнейшему
> сопровождению.
Мои соболезнования.
> если DLL и ЕХЕ скопилены с пакетами, то очень даже не MD.
Приведи три причины необходимости использования
DLL with BPL with EXE vs EXE, тогда и обсудим кто MD.
--
Regards, LVT.
Юрий Зотов (2008-08-22 12:40:00) [138]> @!!ex © (22.08.08 07:33) [48]
> Что не нравится, можно поконкретнее?
Можно. Давайте действительно конкретно. Поскольку иначе, как вдруг выяснилось, не получается.
Конкретность № 1.
Я утверждаю, что Ваш код в [1] для сабжа совершенно бесполезен, так как проконтролировать существование формы не позволяет.
Если Вы с этим не согласны, то докажите, что я не прав. Только не надо слов, надо конкретно - Вы же этогохотели? Вот и напишите конкретный работающий пример проверки существования формы с помощью кода [1].
После этого сможем перейти к другим конкретностям. Если, конечно, до них вообще дойдет дело.
Anatoly Podgoretsky (2008-08-22 10:52:00) [139]Не надо контролировать по содержимому глобальной переменной, пример я привел выше, переменная равна nil а форма есть и точно также наоборот.
Есть же гарантирование средство Screen.Forms
ничтожная козявка (2008-08-22 10:48:00) [140]
> @!!ex © (22.08.08 07:33) [48]
> Вы не могли бы процитировать сообщение, где автор на это
> указывает?
форма действительно должна быть одна, на самом деле, хотя я об этом прямо не говорил..
глоб. переменная Form1 у меня одна и перед созданием формы я и произвожу ее проверку на nil чтобы избежать дублей.
синглтону тут действительно самое место, но что-то лень:)) получилось почти тоже самое, только я единственность объекта контролирую не в его конструкторе а за пределами класса вобще, во внешнем коде.. короче я тут рогаткой обошелся :)) за универсальностью буду в других, более важных вещах гоняться:))