Как освободить управление внутри своего обработчика событий?

Кто-нибудь знает трюк, как свободно управлять внутри своего обработчика событий? По словам delphi help, это невозможно...

Я хочу освободить динамически созданный TEdit, когда Self.Text = ''.

TAmountEdit = class (TEdit)
.
.
public
  procedure KeyUp(var Key: Word; Shift :TShiftState);
end;

procedure TAmountEdit.KeyUp(var Key: Word; Shift :TShiftState);
begin
inherited;
if Text='' then Free; // after calling free, an exception arises
end;

Как сделать для достижения такого же эффекта?

Thanx

Ответ 1

Решение состоит в том, чтобы отправить сообщение в очередь на элемент управления, на который он отвечает, уничтожив себя. Ny мы используем CM_RELEASE, который является частным сообщением, используемым TForm в его реализации метода Release, который выполняет аналогичную задачу.

interface

type
  TAmountEdit = class (TEdit)
    ...
    procedure KeyUp(var Key: Word; Shift :TShiftState); override;
    procedure HandleRelease(var Msg: TMessage); message CM_RELEASE;
    ...
  end;

implementation

procedure TAmountEdit.KeyUp(var Key: Word; Shift :TShiftState);
begin
  inherited;
  if Text = '' then
    PostMessage(Handle, CM_RELEASE, 0, 0);
end;

procedure TAmountEdit.HandleRelease(var Msg: TMessage);
begin
  Free;
end;

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

Ответ 2

До этого я бы остановился и спросил: "Это действительно лучший подход?"

Вам действительно нужен класс управления редактированием, который всегда разрушается, когда ввод ключа приводит к тому, что свойство Текст становится пустой строкой?

Не вероятнее, что у вас есть конкретная форма/диалог, где это поведение требуется? В этом случае нет проблем... вы можете освободить элемент управления редактирования в событии KeyUp, обработанном формой, без нарушения прав доступа.