如何在其事件处理程序中自由控制?

时间:2010-03-23 18:24:40

标签: delphi

有没有人知道这个技巧,如何在其事件处理程序中自由控制?根据德尔福的帮助,这是不可能的......

当Self.Text =''。

时,我想释放动态创建的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;

应该如何达到同样的效果?

感谢名单

2 个答案:

答案 0 :(得分:15)

解决方案是将排队的消息发布到控件,它通过销毁自己来响应。在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;

当应用程序接下来泵送其消息队列时,控制将被销毁。

答案 1 :(得分:6)

在实施之前,我会停下来问“这真的是最好的方法吗?

当键输入导致文本属性变为空字符串时,您真的想要一个始终会自行销毁的编辑控件类吗?

是否更有可能出现需要此行为的特定表单/对话框?在这种情况下,没有问题...您可以释放表单处理的 KeyUp 事件中的编辑控件,而不会产生访问冲突