Освобождение компонента из его же собственного обработчика
Написал 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);
ifnot 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
потенциально опасен. Указатели нельзя приводить к Integer, лучше к LongInt, так как в будущем LongInt станет 64х разрядным, а Integer останется 32х разарядным.
Ну так он и уточнил.
Это всего лишь частный случай использования PostMessage.
Ну а вообще приём очевидный.
Просто пример, скорее, из разряда FAQ для новичков.
Все с точностью наоборот Integer как раз может менять разрядность, а Longint как был всегда 32-бита, так им и останется (вспомним-ка 16-битный Паскаль!)