Кто-либо знает прием, как освободить управление в его обработчике событий? Согласно справке Дельфи это не возможно...
Я хочу освободить динамично созданный 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;
Как должен сделать для достижения того же эффекта?
Спасибо
Решение состоит в том, чтобы отправить сообщение в очередь в элемент управления, на который он реагирует уничтожением сам. В соответствии с любым соглашением мы используем 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;
Элемент управления уничтожается, когда приложение в следующий раз перекачивает свою очередь сообщений.
Прежде чем реализовать это, я бы остановился и спросил: « Это действительно лучший подход? »
Вы действительно хотите отредактировать класс управления, который всегда уничтожает себя, когда ввод с клавиатуры приводит к тому, что свойство Text становится пустой строкой?
Не более ли вероятно, что у вас есть конкретная форма / диалог, где требуется это поведение? В таком случае проблем нет ...вы можете освободить элемент управления редактированием в событии KeyUp , обработанном формой, без нарушения прав доступа .