【问题标题】:Delphi disable mouse buttons and enable againDelphi禁用鼠标按钮并再次启用
【发布时间】:2014-06-20 17:40:59
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 好吧,禁用富编辑不会禁用鼠标按钮。或者这可能不是真正的问题。
  • 请问为什么?这似乎与 Windows 应用程序的工作方式完全背道而驰。这样做的目的(目标)是什么?可能有更好的方法。
  • 我不明白为什么人们投票结束时“不清楚你在问什么”,我很清楚要问什么,但不清楚是为什么。
  • 我有一个分成两半的表格。前半部分是在运行时创建的面板,其中包含不同数据类型的用户定义字段。另一半是 TrichEdit,其中包含使用用户在面板上填写的文件创建的文本。在 onExit Event 字段上激活更新 Richedit 的过程。如果一个字段被聚焦并且用户直接单击 TRichedit,则会在 lineupdate 事件上引发异常。 Sertac Akyuz 的提示效果很好。谢谢大家!!
  • 如果您遇到异常,那么您可能首先做错了什么,然后尝试解决症状而不是原因。请展示您的实际代码并说明您的目标,可能有更好的设计来实现它。

标签: delphi click mouse


【解决方案1】:

您可以对丰富的编辑进行子类化,以便拦截鼠标按钮向下/向上消息。然后你就不需要看鼠标进出控件了。示例:

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;

【讨论】:

  • 更好地使用EN_MSGFILTER通知(例如this way)。
  • @TLama - 你仍然需要子类化,而且看起来工作量更大,为什么更好?
  • 没错,但是通知更好,因为它正是为了这个控件的“事件吃”
  • @TLama - 感谢提醒双击。我不同意它更好,因为它的目的是,而我可以用更少的工作来做同样的事情。我猜这又是关于那个语义
  • @TLama - 什么时候更好,我可以看到。当您在父级上处理通知时 - 因为 api 确实是打算使用的 - 那么您不需要另外对控件进行子类化。然而,VCL 使它更容易/促进了在控件本身上处理消息,然后这两种方法都以子类化结束。 AAMOF 你没有像你链接的那样使用WM_NOTIFY,而是CN_NOTIFY
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 2020-11-08
  • 2016-07-15
相关资源
最近更新 更多