有没有人知道这个技巧,如何在其事件处理程序中自由控制?根据德尔福的帮助,这是不可能的......
当Self.Text =''。
时,我想释放动态创建的TEditTAmountEdit = 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;
应该如何达到同样的效果?
感谢名单
答案 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 事件中的编辑控件,而不会产生访问冲突。