How to free control inside its event handler?

前端 未结 2 428
隐瞒了意图╮
隐瞒了意图╮ 2020-11-30 09:23

Does anybody know the trick, how to free control inside its event handler ? According delphi help it is not possible...

I want to free dynamicaly created TEdit, when

相关标签:
2条回答
  • 2020-11-30 09:51

    The solution is to post a queued message to the control, which it responds to by destroying itself. Ny convention we use CM_RELEASE which is the private message used by TForm in its implementation of the Release method that performs an analogous task.

    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;
    

    The control is destroyed when the application next pumps its message queue.

    0 讨论(0)
  • 2020-11-30 09:57

    Before implementing this I would stop and ask "Is this really the best approach?"

    Do you really want an edit control class that always destroys itself when key input results in the Text property becoming an empty string?

    Is it not more likely to be the case that you have a specific form/dialog where this behaviour is required? In which case, there is no problem... you can free the edit control in the KeyUp event handled by the form without incurring an Access Violation.

    0 讨论(0)
提交回复
热议问题