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

lyb*_*rko 10 delphi

有没有人知道这个技巧,如何在其事件处理程序中自由控制?根据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是在执行类似任务TFormRelease方法的实现中使用的私有消息.

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)

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


Del*_*ics 6

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

你真的想要一个编辑控件类,当键输入导致Text属性变成空字符串时,它总是会自行销毁吗?

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

  • 我知道了.但是如果你的组件创建了控件,那么在我看来它也应该负责释放它们.规则似乎由包含*TAmountEdit**控件的控件*设置,而不是由**TAmountEdit**控件本身设置.您的自定义控件将创建一个**TAmountEdit**然后将事件处理程序(它实现)分配给**TAmountEdit**的**OnKeyUp()**事件(请注意,从技术上讲,您的原始问题不是关于处理事件,而是*拦截*一个!). (4认同)
  • 父母释放孩子的问题远比没有任何对象释放自己的问题小,风险小.但这是你的葬礼.:) (2认同)