防止滚动 TVertScrollBox 时触发事件

2024-04-02

通常,当滚动“滚动框”的内容时,滚动框的子组件(例如,滚动框)不会触发任何事件函数。 G。在本机应用程序中。但在 FireMonkey 中,如果 TVertScrollBox 包含像 TRectangle 这样的子元素(我想将其用作自定义菜单的菜单条目),则用手指滚动 Android 上的 TVertScrollBox 有时会触发子元素的事件函数(如 OnClick)这对我和我们的客户来说非常令人困惑 - 他们不想在滚动时点击特定元素。

在本机应用程序中,这种情况永远不会发生。我不知道如何防止这种行为。我尝试将 OnMouseEnter 和 OnMouseLeave 中的所有子元素的 HitTest 属性设置为 FALSE(我还尝试了其他事件),如下所示:

procedure TframeCornerMenu.VertScrollBox1MouseEnter(Sender: TObject);
var
  list: TRectangle;
  i: Integer;
begin
  list := FindComponent('rectMenuList') as TRectangle;
  for i := 0 to list.ChildrenCount - 1 do
  begin
    if list.Children[i] is TRectangle then
      TRectangle(list.Children[i]).HitTest := false;
  end;
end;

但这显然不起作用(也不能),因为用户首先点击位于 TVertScrollBox 顶部的子元素。

这是 FireMonkey 中的错误/未实现的功能吗?我很欣赏解决这个滚动问题的所有想法。如果可能的话,不使用第三方组件。

我使用的是 Delphi 社区版 10.3.2 (26.0.34749.6593)。


这是 FireMonkey 中的错误/未实现的功能吗?

对于这个问题的两个部分都说“不”,尽管将其作为一项功能会很好。这是一种可能的解决方案:

unit MainFrm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.StdCtrls;

type
  TMouseInfo = record
    Down: Boolean;
    DownPt: TPointF;
    Moved: Boolean;
    procedure MouseDown(const X, Y: Single);
    procedure MouseMove(const X, Y: Single);
    procedure MouseUp;
  end;

  TButton = class(FMX.StdCtrls.TButton)
  private
    FMouseInfo: TMouseInfo;
  protected
    procedure Click; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Single); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
  end;

  TfrmMain = class(TForm)
    MessagesMemo: TMemo;
    VertScrollBox: TVertScrollBox;
  private
    procedure ControlClickHandler(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.fmx}

{ TMouseInfo }

procedure TMouseInfo.MouseDown(const X, Y: Single);
begin
  Down := True;
  Moved := False;
  DownPt := PointF(X, Y);
end;

procedure TMouseInfo.MouseMove(const X, Y: Single);
begin
  if Down and not Moved then
    Moved := (Abs(X - DownPt.X) > 10) or (Abs(Y - DownPt.Y) > 10);
end;

procedure TMouseInfo.MouseUp;
begin
  Down := False;
end;

{ TButton }

procedure TButton.Click;
begin
  if not FMouseInfo.Moved then
    inherited;
end;

procedure TButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  inherited;
  FMouseInfo.MouseDown(X, Y);
end;

procedure TButton.MouseMove(Shift: TShiftState; X, Y: Single);
begin
  inherited;
  FMouseInfo.MouseMove(X, Y);
end;

procedure TButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  inherited;
  FMouseInfo.MouseUp;
end;

{ TfrmMain }

constructor TfrmMain.Create(AOwner: TComponent);
var
  I: Integer;
  LButton: TButton;
begin
  inherited;
  for I := 0 to 29 do
  begin
    LButton := TButton.Create(Self);
    LButton.Name := 'Button' + (I + 1).ToString;
    LButton.Width := 120;
    LButton.Height := 32;
    LButton.Position.X := (Width - LButton.Width) / 2;
    LButton.Position.Y := I * 80;
    LButton.OnClick := ControlClickHandler;
    LButton.Parent := VertScrollBox;
  end;
end;

procedure TfrmMain.ControlClickHandler(Sender: TObject);
begin
  MessagesMemo.Lines.Add(TComponent(Sender).Name + ' was clicked');
end;

end.

在这里,我使用通常被称为从 TButton 派生的“插入器”类来重写检测鼠标是否已移动所需的方法,以便仅在鼠标未移动(非常移动)时调用 Click。当按钮接收到 MouseDown 时,会设置 Down 标志并设置位置,然后当接收到 MouseMove 时,它​​会计算它移动了多远。如果太远,当最终调用 Click 时,不会调用继承的方法,因此不会触发 OnClick 事件。

您可以对 TRectangle 或任何可以接收点击的内容使用相同的技术

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止滚动 TVertScrollBox 时触发事件 的相关文章

  • 如何使用retrofit2进行GET请求?

    我有一个在本地主机上运行的安静的 Web 服务 我想在该剩余 URL 上发出 Retrofit2 GET 请求 MainActivity java private void requestData public static final S
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • BluetoothAdapter.getDefaultAdapter() 不返回 null

    这是我的第一篇文章 所以如果我做了一些愚蠢的事情 请告诉我 这个问题可能看起来与其他帖子类似 但或多或 少与我所看到的所有内容相反 关于该项目的事情 我正在开发 android 4 0 4 4 应用程序 我正在使用蓝牙 我正在运行 andr
  • 如何将 Android Instrumentation 测试推送到模拟器/设备?

    我正在尝试使用 Ubuntu 9 04 中的命令行 shell 在 Android 模拟器上运行 Webkit 布局测试 adb s emulator 5554 shell am instrument w com android dumpr
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • FLAG_ACTIVITY_REORDER_TO_FRONT 被忽略

    我有一个包含项目列表的 FragmentActivity 当应用程序处于后台时 可以推送该项目列表 发生这种情况时 我想创建一个状态栏通知并提醒用户更新 当用户单击通知时 活动应重新排序到前面并显示在屏幕上 同时在列表底部显示新项目 所以我
  • Android 8.1 中 Activity 自行旋转并恢复正常

    我的应用程序在所有 Android 版本上运行良好 但我注意到在 Android 8 1 0 Oreo 中 当我将屏幕从纵向活动转到横向活动时 以及当我按后退按钮时 它会显示异常行为 屏幕自动从横向旋转并恢复正常 看起来 Activity
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • android 多关键词搜索

    我的应用程序包含搜索功能 它将搜索数据库内的内容 我的搜索的弱点是 我只能使用一个标签进行搜索 例如我只能搜索 猫 它会返回我的数据库中包含 猫 一词的内容 因为我正在使用LIKE在 select 语句期间进行查询 如何使用多个标签进行搜索
  • Android httpclient文件上传数据损坏和超时问题

    我在 Android 中上传图像时遇到问题 我正在使用 apache httpmime 4 1 lib 代码是这样的 MultipartEntity reqEntity new MultipartEntity HttpMultipartMo
  • 如何在Android网格视图中设置单元格大小?

    我正在尝试为应用程序制作一个带有大图标的网格视图 但我找不到任何有关修改 Android 上网格布局上的单元格大小的教程 有人可以给我一个例子或相关链接吗 Thanks 就像另一个一样适配器视图 http developer android
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • 如何在 kotlin 中检查 lambda 空值

    在 Kotlin 中如何检查 lambda 是否为空 例如 我有这样的签名 onError Throwable gt Unit 我如何区分它的默认值是应用于主体还是应用于此函数的值 您无法测试 lambda 的主体是否为空 因此它不包含源代
  • 从 sqlite 和 mysql 加载数据微调器

    我试试这个tutorial http nielpoenya blogspot com 2012 08 tutorial android spinner dari database html加载Spinner from sqlite and
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • 如何将最后 N 次提交压缩在一起?

    如何将最后 N 次提交压缩为一次提交 你可以很容易地做到这一点 无需git rebase or git merge squash 在此示例中 我们将压缩最后 3 个提交 如果您想从头开始编写新的提交消息 这就足够了 git reset so
  • java/oops 中静态变量和动态变量有什么区别?

    请有人告诉我 oops 或 java 中 静态变量 和 普通变量 之间的区别 如果可能的话 还有它们的用法 考虑一个具有静态和动态变量的类 动态变量 创建类的实例时 每个对象都有自己的动态变量副本 对于每个对象 该变量的值都将不同 无论在该
  • 使用 Jest 模拟 jsonwebtoken 模块

    我尝试用玩笑来模拟 npm 模块 jsonwebtoken 的验证功能 该函数返回一个已解码的令牌 但我想将此函数的自定义返回传递给我的单元测试 我明确请求在继续请求之前检查访问令牌的有效性 但我想模拟令牌检查的时刻以直接返回用户值 并且轻
  • 使用过滤器或挂钩修改购物车总量

    好吧 我正在尝试编写一个过滤器或挂钩 它将根据购物车中的商品总数来修改购物车的总量 例如 如果购物车中有三件商品 我想从总订单中扣除二十美元 下面是我到目前为止的代码 非常感谢任何帮助 add filter woocommerce cart
  • CookieContainer 错误?

    我很困惑 CookieContainer 如何处理域 所以我创建了这个测试 此测试显示 cookieContainer 不会为 example com 返回任何 cookie 但根据 RFC 它应该返回至少 2 个 cookie 这不是一个
  • SunGridEngine、Condor、Torque 作为 PVM 的资源管理器

    有人知道哪个资源管理器适合 PVM 吗 或者我不应该使用 PVM 而是依赖 MPI 或其任何版本 例如 MPICH 2 还有其他更好的吗 使用 PVM 的主要原因是因为在我之前开始这个项目的人假设使用 PVM 然而 现在这个项目是我的了 他
  • 将内存流中的图像添加到 Excel 文档

    我在内存流中有一个图像 我想将其写入 MS Excel 文档 PIA 仅公开采用文件路径的 AddPicture 方法 有没有办法无需将图像写入光盘即可添加图片 MSDN http msdn microsoft com en us libr
  • 经典 ASP 中的超时问题

    我正在开发一个经典的 ASP 项目 在从数据库填充数据并将其绑定到 UI 中时遇到超时问题 我们得到以下错误 脚本超时 超出了脚本执行的最长时间 您可以通过为 Server Scripttimeout 属性指定新值或更改 IIS 作为管理工
  • 我使用 document.getelementsbyclassname 是否错误?

    当我输入文本框的值必须是 并且颜色必须是红色 我必须对三个文本框使用相同的函数 当我使用 document getelementsbyclassname 时 我的函数将无法工作 难道我做错了什么
  • VS 2008 Web 部署 - 防止文件夹被删除

    我有一个 ASP NET MVC 2 项目 该项目是使用 Web 部署项目 Visual Studio 2008 构建和部署的 该网站的根目录中有一个上传文件夹 用户生成的图像将保存到其中 每当构建运行 使用 team city 时 上传文
  • 使用字典替换列值

    我有这个数据框 其中性别预计为男性或女性 from io import StringIO import pandas as pd audit trail StringIO course id AcademicYear to months T
  • 结构中的字符数组 - 不兼容的赋值? [复制]

    这个问题在这里已经有答案了 我试图找出结构真正的 是什么 并遇到了问题 所以我有两个问题 1 sara 中保存了什么 它是指向结构体第一个元素的指针吗 2 更有趣的问题 为什么它不能编译 GCC 说 test c 10 错误 赋值中的类型不
  • Z-index 在 ie 中不起作用

    我的网页中有多个 div 有这个 javascript 幻灯片放映 我在该幻灯片上放置了一个菜单并将 div 绝对定位 我已使用 z 索引格式化订单 它们在 Firefox 中工作得很好 但在 Internet Explorer 中却不起作
  • 仅使用命令行界面在服务器上打包 Chrome 扩展

    是否可以仅使用 CLI Ubuntu 服务器 在服务器上使用密钥 pem 打包 chrome 扩展 更新 chrome 现在使用版本 3 而 google 发布的脚本仅适用于版本 2 版本 2 的官方打包脚本位于https develope
  • 在 Android Listview 中重用具有 2 种不同布局的视图

    我了解到 为了最大限度地提高 Android 列表视图的效率 您应该只拥有适合屏幕大小的膨胀 行 视图 一旦视图移出屏幕 您应该在您的视图中重复使用它getView方法 检查是否convertView是否为空 但是 当您需要两种不同的列表布
  • foreach 语句无法对“getenumerator”的公共定义类型的变量进行操作

    Task03Entities Entites entities new Task03Entities Entites Creat a object for my entites class Task03BAL BAL bal new Tas
  • PHP:帮助解码恶意代码[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 eval gzuncompress base64 decode eF5Tcffxd3L0CY5WjzcyNDG2NDc3MLGMV4 1d
  • 安装包时非零退出,仅 tidyverse

    我已经在 Ubuntu 上设置了托管 RStudio 并且已经加载了几个没有问题的软件包 包括 caret 和 lubridate 然而 当我尝试安装 tidyverse 时 我得到 gt install packages tidyvers
  • 设置与 Google 表单中的标签不同的值

    有没有办法使用 Google Forms Apps 脚本或 Google Sheets 公式来设置与 Google Forms 上的多项选择中的标签不同的值 我正在寻找类似于 html 的内容
  • 防止滚动 TVertScrollBox 时触发事件

    通常 当滚动 滚动框 的内容时 滚动框的子组件 例如 滚动框 不会触发任何事件函数 G 在本机应用程序中 但在 FireMonkey 中 如果 TVertScrollBox 包含像 TRectangle 这样的子元素 我想将其用作自定义菜单