Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
14-1083774019
RealRascal
2004-05-05 20:20
2004.05.30
Геометрия


4-1082205614
вразлет
2004-04-17 16:40
2004.05.30
BIOS


11-1074414351
Insurge
2004-01-18 11:25
2004.05.30
Не компилиркет проект с MCK...


3-1084283007
TransparentGhost
2004-05-11 17:43
2004.05.30
Нужно ли в FIB вызывать UnPrepare если меняется SQL-запрос?


9-1065360927
greenrul
2003-10-05 17:35
2004.05.30
Ищем народ для разработки коммерческой игры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский