Форум: "Основная";
Текущий архив: 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.036 c