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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2015, 05:24   #1
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию Удаление компонентов

Здравствуйте!
Как определить, уничтожен ли компонент или нет после вызова Free? При выполнении нижеуказанных кодов программа пишет 'create' после Free. Ведь по логике должно быть 'delete'. Заранее спасибо!
Код:
var Button2:tButton;

procedure TForm1.Button1Click(Sender: TObject);
begin
   If Button2=nil then
      Label1.Caption:='delete' else
      Label1.Caption:='create';
   Button2:=TButton.Create(Application);
   Button2.Parent:=Form1;
   Button2.Free;
   If Button2=nil then
      Label2.Caption:='delete' else
      Label2.Caption:='create';
end;
Код:
var Timer2:tTimer;

procedure TForm1.Button1Click(Sender: TObject);
begin
   If Timer2=nil then
      Label1.Caption:='delete' else
      Label1.Caption:='create';
   Timer2:=TTimer.Create(Application);
   Timer2.Free;
   If Timer2=nil then
      Label2.Caption:='delete' else
      Label2.Caption:='create';
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 06.11.2015, 06:42   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

используй FreeAndNil, а не Free


var Button2:tButton = nil;
ZuBy вне форума Ответить с цитированием
Старый 06.11.2015, 08:16   #3
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Спасибо! Проверил, вроде бы работает!
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 06.11.2015, 11:23   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Вызов деструктора не обнуляет указатель.
Тут важно понять, что переменные объектов/компонентов - это указатели (4 байта/8 байт), содержащие начальный адрес области памяти, где живёт созданный объект. После вызова деструктора этот кусок памяти система забирает себе и получается, что указатель указывает в космос. И самое важное: деструктор объекта не знает и знать не может про твою переменную-указатель (их может быть несколько), соответственно и обнулить он её не может, если только ты не сделал её глобальной и не обнуляешь её прямо внутри конструктора потомка.

Процедура FreeAndNil() сначала обнуляет переданный ей указатель, а потом вызывает деструктор.
Код:
procedure FreeAndNil(var Obj);
{$IF not Defined(AUTOREFCOUNT)}
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
{$ELSE}
begin
  TObject(Obj) := nil;
end;
{$ENDIF}
Советую юзать эту процедуру для глобальных переменных-указателей везде, где только возможно.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое создание и удаление компонентов obsession144 C# (си шарп) 1 01.04.2014 21:27
Удаление компонентов Lokki23 C++ Builder 1 15.02.2014 15:10
удаление компонентов microsoft office NinaSSS Windows 1 17.06.2013 13:00
Удаление компонентов Muniz Компоненты Delphi 5 09.01.2010 19:12
Удаление компонентов SanekIrk Общие вопросы Delphi 8 16.08.2008 09:26