有没有人知道这个技巧,如何在其事件处理程序中自由控制?根据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;
Run Code Online (Sandbox Code Playgroud)
应该怎样做才能达到同样的效果?
感谢名单
kro*_*mon 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;
Run Code Online (Sandbox Code Playgroud)
当应用程序接下来泵送其消息队列时,控制将被销毁.
在实施之前,我会停下来问" 这真的是最好的方法吗? "
你真的想要一个编辑控件类,当键输入导致Text属性变成空字符串时,它总是会自行销毁吗?
是否有可能出现需要此行为的特定表单/对话框的情况?在这种情况下,没有问题...您可以释放由窗体处理的KeyUp事件中的编辑控件,而不会导致访问冲突.