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

Кто-либо знает прием, как освободить управление в его обработчике событий? Согласно справке Дельфи это не возможно...

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

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;

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

Спасибо

10
задан lyborko 23 March 2010 в 18:24
поделиться

2 ответа

Решение состоит в том, чтобы отправить сообщение в очередь в элемент управления, на который он реагирует уничтожением сам. В соответствии с любым соглашением мы используем 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;

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

15
ответ дан 3 December 2019 в 18:32
поделиться

Прежде чем реализовать это, я бы остановился и спросил: « Это действительно лучший подход? »

Вы действительно хотите отредактировать класс управления, который всегда уничтожает себя, когда ввод с клавиатуры приводит к тому, что свойство Text становится пустой строкой?

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

6
ответ дан 3 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: