Delphi禁用鼠标按钮并再次启用

Delphi禁用鼠标按钮并再次启用,delphi,click,mouse,Delphi,Click,Mouse,我需要在TRichEdit组件的事件onMouseCenter上禁用两个鼠标按钮,并在事件OnMouseLeave上再次启用 设置TRichEdit enabled=false并不能解决我的问题 有什么提示吗?您可以将rich edit子类化,以便截获鼠标按钮向下/向上的消息。然后,您不需要监视鼠标进入、离开控件。例如: type TForm1 = class(TForm) ... private FSaveRichEditProc: TWndMethod; pr

我需要在TRichEdit组件的事件onMouseCenter上禁用两个鼠标按钮,并在事件OnMouseLeave上再次启用

设置TRichEdit enabled=false并不能解决我的问题


有什么提示吗?

您可以将rich edit子类化,以便截获鼠标按钮向下/向上的消息。然后,您不需要监视鼠标进入、离开控件。例如:

type
  TForm1 = class(TForm)
    ...
  private
    FSaveRichEditProc: TWndMethod;
    procedure RichEditWindowProc(var Message: TMessage);
    ..
  end;

  ...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FSaveRichEditProc := RichEdit1.WindowProc;
  RichEdit1.WindowProc := RichEditWindowProc;
end;

procedure TForm1.RichEditWindowProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK,
    WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK,
    WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK:
      begin
        Message.Result := 0;
        Exit;
      end;
  end;
  FSaveRichEditProc(Message);
end;

您可以对rich edit进行子类化,以便截获鼠标按钮向下/向上的消息。然后,您不需要监视鼠标进入、离开控件。例如:

type
  TForm1 = class(TForm)
    ...
  private
    FSaveRichEditProc: TWndMethod;
    procedure RichEditWindowProc(var Message: TMessage);
    ..
  end;

  ...

procedure TForm1.FormCreate(Sender: TObject);
begin
  FSaveRichEditProc := RichEdit1.WindowProc;
  RichEdit1.WindowProc := RichEditWindowProc;
end;

procedure TForm1.RichEditWindowProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK,
    WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK,
    WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK:
      begin
        Message.Result := 0;
        Exit;
      end;
  end;
  FSaveRichEditProc(Message);
end;


嗯,禁用富编辑不会禁用鼠标按钮。或者这可能不是真正的问题。我可以问一下为什么吗?这似乎与Windows应用程序的工作方式背道而驰。这样做的目的(目的)是什么?也许有更好的办法。我不明白为什么人们投票结束,因为“不清楚你在问什么”我很清楚他们在问什么,不清楚的是为什么。我把一张表格一分为二。前半部分是在运行时创建的窗格,其中包含不同数据类型的用户定义字段。另一半是TrichEdit,它包含使用用户在窗格中填充的文件创建的文本。更新richedit的过程在fields onExit事件中激活。如果某个字段已聚焦,并且用户直接单击了TRichedit,则会在lineupdate事件中引发异常。Sertac Akyuz的提示非常有效。谢谢大家!!如果你遇到了一个异常,那么你可能首先做错了什么,然后试图解决症状而不是原因。请显示您的实际代码并解释您的目标,可能有更好的设计来实现它。禁用富编辑不会禁用鼠标按钮。或者这可能不是真正的问题。我可以问一下为什么吗?这似乎与Windows应用程序的工作方式背道而驰。这样做的目的(目的)是什么?也许有更好的办法。我不明白为什么人们投票结束,因为“不清楚你在问什么”我很清楚他们在问什么,不清楚的是为什么。我把一张表格一分为二。前半部分是在运行时创建的窗格,其中包含不同数据类型的用户定义字段。另一半是TrichEdit,它包含使用用户在窗格中填充的文件创建的文本。更新richedit的过程在fields onExit事件中激活。如果某个字段已聚焦,并且用户直接单击了TRichedit,则会在lineupdate事件中引发异常。Sertac Akyuz的提示非常有效。谢谢大家!!如果你遇到了一个异常,那么你可能首先做错了什么,然后试图解决症状而不是原因。请展示您的实际代码并解释您的目标,可能有更好的设计来实现它。更好地使用通知(例如)。@TLama-您仍然需要子类化,而且它似乎需要更多的工作,为什么它更好?没错,但是通知更好,因为它完全是为了“吃事件”用于此控件。@TLama-感谢您提醒双击。我不认为它更好,因为它的目的是这样,而我可以用更少的工作来做同样的事情。我想这又是关于语义的问题了。@TLama-我知道什么时候更好。当您在父级上处理通知时——因为api实际上是要使用的——那么您就不需要另外对控件进行子类化。然而,VCL使控件本身的消息处理变得更容易/更容易,这两种方法都以子类化结束。AAMOF如果您没有像链接一样使用
WM\u NOTIFY
,而是使用
CN\u NOTIFY
。更好地使用通知(例如)。@TLama-您仍然需要子类化,而且它似乎需要更多的工作,为什么会更好呢?没错,但是通知更好,因为它完全是为了“吃事件”的目的用于此控件。@TLama-感谢您提醒双击。我不认为它更好,因为它的目的是这样,而我可以用更少的工作来做同样的事情。我想这又是关于语义的问题了。@TLama-我知道什么时候更好。当您在父级上处理通知时——因为api实际上是要使用的——那么您就不需要另外对控件进行子类化。然而,VCL使控件本身的消息处理变得更容易/更容易,这两种方法都以子类化结束。aa如果您没有像链接一样使用
WM\u NOTIFY
,而是使用
CN\u NOTIFY