如何让父组件获取子组件点击事件?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
相关产品推荐
相关产品推荐

