![]() |
| ||
|
|
Новости |
Поиск |
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.
Anatoly Podgoretsky (2008-08-22 07:50:00) [141]
> Если форма существует, то Form1 не nil? Если не существует,
> то nil. Какие еще варианты развития событий?
Form1 := nil
@!!ex (2008-08-22 07:33:00) [142]> 1. На фига там нужно поле типа "указатель на указатель",
> а не просто "указатель"? (мелочь, но все же).
А нафига там нужен указатель??
Нам надо ссылку обнулить или где?
> 2. Каким образом это поле позволяет проверить существование
> формы? Никаким.
>
> > А вот когда выяснится, что нужно две TForm1 будет СТОЛЬКО
> граблей
Если форма существует, то Form1 не nil? Если не существует, то nil. Какие еще варианты развития событий?
> 4. Не выяснится. Сабж читайте. Весь смысл в том и есть,
> что вторая форма не допускается.
Вы не могли бы процитировать сообщение, где автор на это указывает? Помойму вы малость сами тему не читали... Нет ни слова о том, что форма должна быть одна. Собственно если бы речь шла об одной форме, то к вашему коду никаких претензий не было бы.
> 5. Мы вообще пишем, или только вид делаем? Вы понимаете,
> что Ваш код ничего не дает и неверен в самом своем принципе?
Позволяет обнулить ссылки указывающие на объект?
В примере только одну, если ввести массив, то все.
Что не нравится, можно поконкретнее?
Юрий Зотов (2008-08-22 06:13:00) [143]Если поставить супернадежность и принципы ООП самоцелью, то класс формы надо просто сделать синглтоном - и всех дел.
implementation
var
_Instance: TObject;
class function TForm1.NewInstance: TObject;
begin
if _Instance = nil then
_Instance := inherited NewInstance;
Result := _Instance;
end;
procedure TForm1.FreeInstance;
begin
inherited;
_Instance := nil;
end;
Только всегда ли нужна стрельба из пушек? Иногда бывает вполне достаточно и рогатки.
{RASkov} (2008-08-22 02:03:00) [144]> Уже забыл, кажется именно так реализован какой-то рабочий класс в VCL (TPrinter?, TClipboard?)
Оба. Printer и Clipboard - это по сути не переменные, а функции... А реализация их проста:
var FClipboard: TClipboard;
function Clipboard: TClipboard;
begin
if FClipboard = nil then FClipboard := TClipboard.Create;
Result := FClipboard;
end;
Принтер точно так же....
{RASkov} (2008-08-22 01:30:00) [145]> [41] Loginov Dmitry © (21.08.08 21:05)
> Круто! Избавляемся от одной глобальной переменной, добавляем другую :)
Вся разница в том, что ее "нилить" не нужно.... т.е. безболезненно ее можно "занилить"(сбросить в False) например на OnClose....
Так что, ничего это и не круто, а тоже самое почти, может только чуть проще... :)
McSimm (2008-08-22 00:42:00) [146]
> А лучше не обнулять, а если обнулять, то не нулем.
так память же перевыделится кому-нибудь ?
на вероятностях проверка получается.
Вариант с глобальной переменной отлично подходит. Чтобы спокойней было - спрятать переменную в модуле формы и опубликовать там же функцию ее возвращающую с проверкой.
Уже забыл, кажется именно так реализован какой-то рабочий класс в VCL (TPrinter?, TClipboard?)
Anatoly Podgoretsky (2008-08-21 22:10:00) [147]> @!!ex (21.08.2008 20:52:40) [40]
А лучше не обнулять, а если обнулять, то не нулем.
Юрий Зотов (2008-08-21 21:09:00) [148]> @!!ex © (21.08.08 20:52) [40]
> а нет там усложнения.
Точно нет? А я-то на Ваш код глядел-глядел - и никак не мог сообразить:
1. На фига там нужно поле типа "указатель на указатель", а не просто "указатель"? (мелочь, но все же).
2. Каким образом это поле позволяет проверить существование формы? Никаким.
> А вот когда выяснится, что нужно две TForm1 будет СТОЛЬКО граблей
3. Еще раз: каким образом Ваш код от этих граблей спасает? Никаким.
4. Не выяснится. Сабж читайте. Весь смысл в том и есть, что вторая форма не допускается.
> Мы все таки с использованием ООП пишем, или только вид делаем?
5. Мы вообще пишем, или только вид делаем? Вы понимаете, что Ваш код ничего не дает и неверен в самом своем принципе ?
Loginov Dmitry (2008-08-21 21:05:00) [149]
> "единичность формы"(если именно ее преследует автор) можно
> будет сделать "такой же" глобальной переменной, только например
> Булевого типа.... и делов.
Круто! Избавляемся от одной глобальной переменной, добавляем другую :)
> ога, я понял, потому что Self и Form1 это две большие разницы
> и заниливание одного из этих указателей ничего не даст.
По значению то же самое, но не по адресу.
> TForm1(Sender) := nil;
> end;
> не спасет?
обнулится локальная переменная, или регистр, а дальше что?
> 1. глобальные переменные - MD
Application, Screen - тоже глобальные переменные. Долой их?
Не вижу ничего плохого в глобальных переменных, если с помощью них удается решить поставленную задачу, не ухудшая надежность и читабельность кода, и не нанося ущерба его дальнейшему сопровождению.
> 2. формы в длл - MD.
если DLL и ЕХЕ скопилены с пакетами, то очень даже не MD.
> Что бы определить существует форма или нет, глобальных переменных
> для этого не надо, а надо использовать Screen.Forms
зачем усложнять и вносить заведомые тормоза? Если форма не модальная и может существовать не более чем в одном экземпляре, то глобальная переменная, автоматически предлагаемая Delphi, имхо, самое оно! Для модальных же форм смысла в каких-либо глобальных переменных гораздо меньше, почти всегда достаточно
with TForm.Create() do
try
ShowModal;
finally
Free;
end;
Для дочених форм MDI глобальные переменные и вовсе недопустимы.
@!!ex (2008-08-21 20:52:00) [150]> 1. Чему будет равно поле формы после ее уничтожения?
Согласен, лучше обнулять на уничтодение, а не на закрытие.
> 1. Не нужно усложнять то, что можно сделать просто.
а нет там усложнения. А вот когда выяснится, что нужно две TForm1 будет СТОЛЬКО граблей...
Мы все таки с использованием ООП пишем, или только вид делаем?
Германн (2008-08-21 20:07:00) [151]
> Leonid Troyanovsky © (21.08.08 20:03) [38]
>
>
> > ЛшдлуттнСфе (21.08.08 18:17) [36]
>
> Любвиобилен.
>
Чего ещё можно ждать от кота?
:)
Leonid Troyanovsky (2008-08-21 20:03:00) [152]
> ЛшдлуттнСфе (21.08.08 18:17) [36]
Любвиобилен.
--
Regards, LVT.
Сергей М. (2008-08-21 18:38:00) [153]
> я не лесбиян, я просто люблю девушек
Девушкам-то "вкайф", а каковО тому, о ком идет "любовь" ?
Им-то, знаешь ли, кАково)
ЛшдлуттнСфе (2008-08-21 18:17:00) [154]
> Leonid Troyanovsky © (21.08.08 17:55) [35
а я не лесбиян, я просто люблю девушек...
Leonid Troyanovsky (2008-08-21 17:55:00) [155]
> ЛшдлуттнСфе (21.08.08 17:20) [34]
> не по существу, но я люблю глобальные переменные.
А я - лесбиян, люблю девушек.
--
Regards, LVT.
ЛшдлуттнСфе (2008-08-21 17:20:00) [156]не по существу, но я люблю глобальные переменные.
Vlad Oshin (2008-08-21 16:56:00) [157]
> ничтожная козявка (21.08.08 16:50) [32]
Тоже читал. Собственно:
Вот это впечатляет:
С пакетами первый раз компилим и без пакетов второй раз
В DLL экспортируется следующая функция:
function GetObjectClass : TClass ;
begin
Result := TObject ;
end ;
В главном файле приложения результат функции сравнивается с ожидаемым:
var Result : AnsiString ;
begin
if GetObjectClass = TObject
then Result := 'MainProject.TObject = DllProject.TObject'
else Result := 'MainProject.TObject <> DllProject.TObject' ;
MessageBox ( 0, PChar ( Result ), PChar ( 'Линковка' ), MB_OK ) ;
end.
ничтожная козявка (2008-08-21 16:50:00) [158]
> Vlad Oshin © (21.08.08 16:45) [31]
спасибо, нашел уже
тут тоже пишут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274
Vlad Oshin (2008-08-21 16:45:00) [159]
> тогда в чем соль?
http://softwarer.ru/packages.html
Amoeba (2008-08-21 16:39:00) [160]
> ничтожная козявка (21.08.08 16:37) [29]
>
> тогда в чем соль?
В отсутствии множества граблей.