Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Free и nil - как корректнее совместить?   Найти похожие ветки 

 
RomeoGolf ©   (2004-05-16 17:49) [0]

Когда форма(не главная) больше не нужна, в обработчике onClose пишу:
Action:=caFree;
что, если верить справочной системе, дает следующее: The form is closed and all allocated memory for the form is freed.
Однако объект при этом не становится равным nil, и это понятно.
Вопрос в том, как корректнее получить этот самый nil.
Присваивать nil вручную? Так с self"ом это дело не проходит, а прямо указывать имя формы - некрасиво, особенно если у нее несколько экземпляров.
Использовать FreeAndNil(Obj)? А как правильно? Поэкспериментировал, пока ничего путевого не получил.
Подозреваю, что решение очевидно, а я просто торможу.
Поделитесь, пожалуйста, кто как с этим справляется.


 
begin...end ©   (2004-05-16 17:56) [1]

ИМХО, FreeAndNil


 
RomeoGolf ©   (2004-05-16 18:15) [2]

Но методом объекта гасить сам объект нельзя, насколько я понимаю. Так как же правильно использовать FreeAndNil(Obj)?


 
begin...end ©   (2004-05-16 18:24) [3]

А FreeAndNil - это метод объекта?


 
Гаврила ©   (2004-05-16 18:26) [4]

У тебя, например, есть глобальная переменная Form2, которой ты хочешь присвоить nil. Если ты работаешь только через нее, так и пиши в ее обработчике OnClose
Form2:=nil;
Action:=caFree;


 
jack128 ©   (2004-05-16 18:27) [5]

Вообще не используй глобальные переменные, тогда и не будет проблем с их об"nil"иванием ;-)


 
Ihor Osov'yak ©   (2004-05-16 18:29) [6]

либо отказываться от переменной, ссылающейся на экземпляр формы, либо в
onClose или деструкторе устанавливать в nil соотв. ссылку, либо слать нотификационное сообщение постоянно присутствующему окну, например главной форме, чтобы в обработчике сообщений делалась очистка соотв. ссылки.
Я даю предпочтение первому варианту, очень редко использую третий или его варианты, второй - можно считать, что не использую


 
RomeoGolf ©   (2004-05-16 18:30) [7]

Закрываю форму, при этом имею метод объекта TForm1.FormClose. Там пишу Action:=caFree;. А если напишу FreeAndNil(self)- будет все хорошо?


 
Anatoly Podgoretsky ©   (2004-05-16 18:31) [8]

Не используй повторно переменные и не будет головной боли, да и переменные не нужн, все формы находятся в массиве Screen.Forms


 
jack128 ©   (2004-05-16 18:36) [9]


> FreeAndNil(self)- будет все хорошо?
нет, все будет очень плохо. Вызывать деструкторы в методе объекта - это вообще плохо


 
RomeoGolf ©   (2004-05-16 18:38) [10]


> RomeoGolf ©   (16.05.04 18:30) [7]

это было по поводу
> begin...end ©   (16.05.04 17:56) [1]

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


 
Гаврила ©   (2004-05-16 18:42) [11]


> А если напишу FreeAndNil(self)- будет все хорошо?

все будет плохо по причине двойного разрушения объекта,
более того, self - неявная переменная, и от ее обниливания ничего не изменится, так как она потеряется при выходе из метода.
Оптимальный вариант - не использовать глобальные переменные, несмотря на то, что среда сразу их создает при создании в дизайнере новой формы. Создала - сразу удаляй глобальнуй переменную, и работай сам с экземпляром


 
KSergey ©   (2004-05-16 18:42) [12]

Есть вопрос к автору: зачем в его случае нужна установка ссылки на форму равная nil? Фотрма - модальная или немодальная?


 
GuAV ©   (2004-05-16 18:45) [13]


> Вызывать деструкторы в методе объекта - это вообще плохо


> обработчике onClose пишу

Более того, вызывать деструктор в событиях назначеных на объект - плохо.


 
Гаврила ©   (2004-05-16 18:49) [14]


> Вызывать деструкторы в методе объекта - это вообще плохо


В общем случае - не плохо
Смотрим метод Free )))

Вызывать деструктор в событиях - это не то что плохо, это просто поиметь кучу проблем


 
begin...end ©   (2004-05-16 18:52) [15]

А, так он в обработчике хотел это делать...
Тогда, конечно, [1] begin...end © недействительно.


 
Ihor Osov'yak ©   (2004-05-16 18:54) [16]

2 [13] GuAV ©

Дык они ("события, назначеныt на объект")  с методов обьекта и вызываются.. Так что это по большому счету один и тот же вариант..


 
jack128 ©   (2004-05-16 19:00) [17]


> В общем случае - не плохо
> Смотрим метод Free )))
Приведешь еще парачку примеров и я соглашусь ;-) Free все таки исключение из правила. Лично у меня нет никакого желания наткнутьтся на AV в таком невинном коде

 obj := TMyObj.Create;
 try
   obj.SameMehod;
   obj.SameOtherMethod; // тут AV
 finally
 end;

Хотя конечно дело вкуса..


 
jack128 ©   (2004-05-16 19:01) [18]


> finally
  // тут, конечно, Free"каю объект
  Obj.Free;
>  end;


 
RomeoGolf ©   (2004-05-16 19:03) [19]

Ёрничать полезно. Наверное.
Но обычно дельные советы дают те, кто не ёрничает.

Нигде я не писал, что хочу что-то делать в обработчике. Спрашивал - где делать и как.

> Гаврила ©   (16.05.04 18:42) [11]

Это я в курсе, эта строчка была к [1] и [3].


> KSergey ©   (16.05.04 18:42) [12]

Об"nil"ивать надо мне потому что

if not assigned(Form1) then
  Form1:= TForm1.Create(Self);
Form1.Show;

иначе даст ошибку, если удаленная с помощью Free форма снова понадобиться, а не удалять и хранить в памяти форму, которая возможно больше не понадобиться - барство.

Совет не пользоваться глобальными переменными понял, еще раз спасибо.


 
begin...end ©   (2004-05-16 19:35) [20]


> Ёрничать полезно. Наверное.

Это Вы мне, что ли?
Если нет, то дальше не читайте.

> Спрашивал - где делать и как

Перечитайте ещё раз свой вопрос - где и что Вы там спрашивали?
Вы спрашивали, как корректно получить NIL.
Вы считаете, что FreeAndNil сама по себе работает некорректно?
Она работает корректно. Освобождает память и помечает указатель NIL"ом.
Вопрос в том, откуда Вы её собираетесь вызывать.

> Использовать FreeAndNil(Obj)?

Да используйте на здоровье. Только вызывайте его не из методов самого объекта. Так же как и просто Free. Так же как и Destroy. Чтобы не возвратиться из метода хрен знает куда.

Гнать пургу вредно. Наверное.


 
GuAV ©   (2004-05-16 19:36) [21]

2RomeoGolf ©

Неглавная.OnDestroy=(метод главной формы).
он (метод) пусть обниливает.
а переменная - не глобальная, а поле главной.
ЗЫ: не пробовал


 
evvcom ©   (2004-05-17 00:47) [22]

А чем не понравился ответ [4]? Уж форм-то одинаковых десяток плодить, наверное, не хочешь? Ну и оставь тогда глобальную переменную, ее и обниливай.


 
evvcom ©   (2004-05-17 00:57) [23]

Кстати, как я заметил, обычно правильный ответ дается уже в первых 2-3-х постах, реже чуть позднее. Все остальное - флуд, и модераторы по идее имеют полное право отправлять после этого топик в "Потрепаться".



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
1-1084560184
IrBisoff
2004-05-14 22:43
2004.05.30
Последовательное размещение динамического текста в лэйблах


7-1082307115
DK
2004-04-18 20:51
2004.05.30
подавить реакцию Windows на CTRL+ALT+DEL (в XP-ке)


9-1075310465
Crusader
2004-01-28 20:21
2004.05.30
Запара с dxsound


4-1082095485
Def_E
2004-04-16 10:04
2004.05.30
ShellExecute и пути поиска


7-1083153850
CyBeR
2004-04-28 16:04
2004.05.30
Переключение между формами с помощью набора закладок