Как освободить управление внутри своего обработчика событий?
Кто-нибудь знает трюк, как свободно управлять внутри своего обработчика событий? По словам 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, обработанном формой, без нарушения прав доступа.