Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.02.2009, 07:41   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию constructor / destructor

Привет всем!
Чем отличается метод FREE, от метода DESTROY?

И по ходу, главный вопрос:
Код:
var
btn: tButton
.......
procedure Tmain_form.Button5Click(Sender: TObject);
begin
   if btn = nil then
   begin
      btn := tButton.Create(self);
      btn.Left := 10;
      btn.Top := 100;
      btn.Parent := self;
   end
   else
      btn.Free;
end;
Код работет правильно, только при первых 2-х вызовах. И то, после вызова btn.Free почему-то btn ≠ nil. Подскажите, как быть. Может быть надо btn к nil в ручную приравнивать, после вызова btn.Free?

Последний раз редактировалось Altera; 08.02.2009 в 07:47.
Altera вне форума
Старый 08.02.2009, 08:23   #2
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

здесь это описывается
http://articles.org.ru/lection/vved.php
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума
Старый 08.02.2009, 13:51   #3
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
Чем отличается метод FREE, от метода DESTROY?
Метод Free является безопасным, его можно вызывать даже для несуществующего объекта. А внутри Free уже вызывается Destroy, если объект реально существует.

Цитата:
Сообщение от Altera Посмотреть сообщение
И то, после вызова btn.Free почему-то btn ≠ nil. Подскажите, как быть. Может быть надо btn к nil в ручную приравнивать, после вызова btn.Free?
А с чего бы btn стал автоматически равен nil? Объект не может сам себя "обнулить", откуда он знает про переменную, которая на него ссылается? Кстати, таких переменных, ссылающихся на один объект, может быть много.

А код лучше переделать:
Код:
begin
   // Удаление существующей кнопки
   btn.Free;

   // Создание новой кнопки
   btn := tButton.Create(self);
   btn.Left := 10;
   btn.Top := 100;
   btn.Parent := self;
end;
Можно вместо Free использовать FreeAndNil(btn), если нужно сделать btn = nil.
Jeni вне форума
Старый 08.02.2009, 13:56   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Яснышко!
Спасибо всем!
Я понял, значит btn - это указатель на структуру, содержащую поля и методы объекта tButton. Поэтому, при уничтожении объекта, указатель о прежнему содержит то-же самое значение. что и прежде. Можно сделать и так.
btn.free;
btn := nil;
Altera вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
constructor, destructor override. Подправить код. Roof Общие вопросы Delphi 9 31.07.2008 13:41