Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

заNILить форму после Close;


Страницы:   1 2 3 4 5 6 7 8 9 10

ничтожная козявка ©   (2008-08-21 12:37:00) 

В некой 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]
>
> тогда в чем соль?

В отсутствии множества граблей.


Страницы:   1 2 3 4 5 6 7 8 9 10

Наверх

Титульная страница Поиск, карта сайта Написать письмо