如何为 onclick 事件选择 Delphi 框架而不是其组件?

Posted

技术标签:

【中文标题】如何为 onclick 事件选择 Delphi 框架而不是其组件?【英文标题】:How to select Delphi frame instead of its components for an onclick event? 【发布时间】:2020-02-03 00:15:18 【问题描述】:

我创建了一个 VCL 表单,其中包含 TFrame 的多个副本,每个副本都包含多个 TLabel 组件。

标签占据了框架内的大部分区域,为专门选择框架提供了很少的暴露客户区域。当用户选择一个框架组件并在各种标签标题中显示特定文本时,程序必须采取行动。问题是如果用户点击其中一个标签组件而不是框架中的空白区域,则不会触发OnClick事件。

如果用户单击框架内的任意位置,我如何生成框架的OnClick 事件?

【问题讨论】:

如果您从标签中删除 csCaptureMouse 和 csClickEvents,它们将不会点击。然而,我觉得烦人的父母都不是...... 【参考方案1】:

VCL 在决定它是否是有效目标之前测试图形(非窗口)控件对鼠标事件的响应。您可以使用专门的标签来修改此响应。最简单的方法是在您的框架单元中使用插入器类(如果所有标签的行为都相同)。

type
  TLabel = class(Vcl.StdCtrls.TLabel)
  protected
    procedure CMHitTest(var Message: TCMHitTest); message CM_HITTEST;
  end;

  TMyFrame = class(TFrame)
  ...
  end;

...

procedure TLabel.CMHitTest(var Message: TCMHitTest);
begin
  Message.Result := HTNOWHERE;
end;

【讨论】:

【参考方案2】:

如果您不介意将 Label 的文本设为灰色,则只需将 Labels 的 Enabled 属性设置为 False。这将阻止您的标签捕获任何键盘或鼠标事件,因此所有这些都将到达底层框架。

【讨论】:

【参考方案3】:

只需将相同的OnClick 事件处理程序也分配给内部的每个标签。多个控件可以共享相同的事件处理程序,只要它们具有相同的签名。

【讨论】:

@DavidHeffernan 你介意解释一下我的回答有什么问题吗? 对我要说的每一个标签都这样做是不切实际的。恐怕我无法解释赞成票。 @DavidHeffernan 好吧,这是短时间内唯一的答案。 @JerryDodge 如果运行一组控件是不切实际的,那么序列化一个表单也是不切实际的。

以上是关于如何为 onclick 事件选择 Delphi 框架而不是其组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 DOM 元素生成唯一的 CSS 选择器?

delphi之事件

如何为基于聚合物的网页创建点击事件

关于下拉框的onchange事件和onclick选择value值。

如何在rails中的选择框上调用onClick事件

HTML中的事件属性要怎么理解??