【问题标题】:How to disable FMX ComboBox Mouse Wheel scroll如何禁用 FMX ComboBox 鼠标滚轮滚动
【发布时间】:2025-12-29 14:45:07
【问题描述】:

如何在 FMX TComboBox 上悬停时禁用鼠标滚轮滚动? 我试过重写 MouseWheel 方法,但没有任何运气。我很可能做错了,因为我没有覆盖的经验。参考:MouseWheel

我已经删除了Inherited

type
  TComboBoxOverride = class(TComboBox)
    procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;
  end;

// I've tried changing the control on the class overriding the method. No luck
cbbServerMap: TComboBoxOverride;

{ TComboBoxOverride }

procedure TComboBoxOverride.MouseWheel(Shift: TShiftState; WheelDelta: Integer;
  var Handled: Boolean);
begin
  Handled := True;
end;

我为 VCL 和 DevEx 找到了以下 SO 帖子,但我正在努力将其转换为 FMX,参考:How to suppress mouse wheel in TcxComboBox

TCustomComboBox.MouseWheel 方法上设置断点时,我可以看到它忽略了我的覆盖。

【问题讨论】:

  • 设置句柄为真。
  • 不幸的是,这没有任何作用。
  • 忽略覆盖的唯一方法是组合框控件实际上不是TComboBoxOverride 类型。你确定 fmx 文件中的类是正确的吗?您在此处提供的代码应该可以工作,还有其他事情发生。
  • 我很确定它是正确的。我手动设置它,然后当我点击保存时,IDE 会询问我是否要将其转换回 TComboBox,我说不要将其保留在覆盖范围内。任何人都可以预先制作这个吗?

标签: delphi firemonkey delphi-10.4-sydney


【解决方案1】:

我解决了相同的任务,但滚动框中的备忘录。
我的解决方案是

  1. 在滚动框中处理鼠标滚轮。OnMouseWheel。在那里设置 Handle := true。
  2. 在备忘录的OnMouseWheel中直接调用scrollbox.OnMouseWheel

【讨论】:

  • 你能解释一下你直接调用 onMouseWheel 事件是什么意思吗?在将 Handled 设置为 true 之后,我已经尝试过 cbb1.OnMouseWheel(cbb1, [], 0, Handled);,但是它似乎在应用程序循环时崩溃了
  • 你必须调用父母的处理程序而不是 self ``` 过程 TForm1.Memo1OnMouseWheel(.....);开始滚动框1.OnmouseWheel(.....);结尾; ```