Главная arrow Лаборатория arrow Лаборатория кода arrow Освобождение компонента из его же собственного обработчика  
06.02.2012
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Ссылки
Поиск
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Авторизация





Забыли пароль?
Вы не зарегистрированы. Регистрация
Каталог@Mail.ru - каталог ресурсов интернет
Освобождение компонента из его же собственного обработчика Версия для печати
Рейтинг: / 7
ХудшаяЛучшая 
Написал Yanis   
08.01.2008
VCL-справка по объекту TObject и его методу Free гласит:
Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, don't free a button, or the form that owns the button, in its OnClick event handler.

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

const
   WM_KILL_CONTROL = WM_USER+ 66;
type
  TForm1 = class(TForm)
  ...
  private
    procedure WMKillControl(var msg:TMessage); message WM_KILL_CONTROL;
....
procedure TForm1.WMKillControl(var msg: TMessage);
var
  c : TControl;
begin
  c := TControl(msg.LParam);
  if not Assigned(c) then
    Exit;

  c.Free;
  windows.MessageBeep($FFFFFFFF);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //   Sender.Free;   // würde meistens eine Exception auslösen
  PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer(Sender));
end

Код повзаимствован с форума http://www.delphipraxis.net/.

Добавить новыйПоиск
Alexeis   2008-02-13 17:30:25
В связи будущим расширением Delphi на платформу x64, код

PostMessage(Self.Handle, WM_KILL_CONTROL, 0, Integer(Sender));

потенциально опасен. Указатели нельзя приводить к Integer, лучше к LongInt, так как в будущем LongInt станет 64х разрядным, а Integer останется 32х разарядным.
Coriolis   2008-02-13 18:32:07
Надуманная проблема :)
Coriolis - ЗЫ   2008-02-13 18:37:08
Т.е. это одна из миллиона задачь, которую можно решить через PostMessage.
Отложеное исполнение кода, из Application.Run
Alexeis   2008-02-14 20:09:04
Почему надуманная? Иногда при построении интерфейса удобно удалять компонент изнутри своего обработчика.
Snowy   2008-02-14 20:16:49
Ну так он и уточнил.
Это всего лишь частный случай использования PostMessage.
Ну а вообще приём очевидный.
Просто пример, скорее, из разряда FAQ для новичков.
Igor Skomorokh - re:   2008-02-25 11:43:11
Alexeis написано:
Почему надуманная? Иногда при построении интерфейса удобно удалять компонент изнутри своего обработчика.

Например?

Согласен с тем что надуманая проблема :)
Sergey - А чем не нравится Release?   2008-03-27 16:17:24
А чем не ecnhfbdftn метод Release?
Саня - Все наоборот :)   2008-05-23 13:44:24
Все с точностью наоборот :) Integer как раз может менять разрядность, а Longint как был всегда 32-бита, так им и останется (вспомним-ка 16-битный Паскаль!)
комментарии
Имя:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.   След. >