You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让父组件获取子组件点击事件?FireMonkey场景相关问题咨询

该场景的两种可行处理方案

方案1:重写Form的预览鼠标事件(优先推荐)

FireMonkey的输入事件路由有前置预览阶段,即使子控件HitTest为True拦截了点击,父窗体的预览类鼠标事件依然会优先触发,完全不受父容器HitTest自动变为False的影响。
你只需要重写Form的PreviewMouseDown或者PreviewMouseClick方法,在里面直接调用公共procedure即可:

type
  TForm1 = class(TForm)
    // 原有组件和方法声明
  protected
    procedure PreviewMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
  end;

procedure TForm1.PreviewMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  inherited;
  // 点击左键时触发公共逻辑,可按需调整触发条件
  if Button = mbLeft then
    CommonProcedure;
end;

这个方案完全无侵入,不需要修改任何子按钮的逻辑,不管窗体上有多少个按钮都可以全局生效,也不会干扰原有按钮的独立点击逻辑。

方案2:批量绑定点击事件(适合需要精准控制触发范围的场景)

如果你只需要点击按钮的时候才触发公共逻辑,点击空白区域不需要触发,可以在Form初始化的时候遍历所有子组件,动态给按钮的OnClick事件加一层 wrapper,不需要手动给每个按钮单独绑定:

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  Ctrl: TControl;
  OrgOnClick: TNotifyEvent;
begin
  for i := 0 to ControlCount - 1 do
  begin
    Ctrl := Controls[i];
    // 替换为你实际使用的矩形按钮类名,比如TRectangle
    if Ctrl is TRectangle then
    begin
      OrgOnClick := Ctrl.OnClick;
      Ctrl.OnClick := procedure(Sender: TObject)
      begin
        // 先执行公共逻辑
        CommonProcedure;
        // 再执行按钮原本的点击逻辑
        if Assigned(OrgOnClick) then
          OrgOnClick(Sender);
      end;
    end;
  end;
end;

如果你的按钮嵌套在其他容器(比如Panel、ScrollBox)里,只需要递归遍历所有子控件即可。

内容的提问来源于stack exchange,提问作者codeGood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:15:01