- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经构建了这个问题的 MCV,并且很高兴上传它。我会先尝试描述问题。
创建一个主窗口并放置一个通过任何可用数据库连接到表的 TDBGrid。窗口的OnShow连接数据库并打开表。
在主窗口上创建一个启动非模式窗口的按钮。
在非模式窗口上创建一个启动模式窗口的按钮。
请仔细按照这些步骤来重现问题。
运行应用程序。
将焦点置于网格中并使用鼠标滚轮上下滚动。
按下该按钮可启动非模式窗口。
当非模式窗口打开时,单击返回主窗口中的网格,然后再次使用鼠标滚轮上下滚动。
当焦点仍位于网格中时,单击非模态窗口上的按钮以启动模态窗口。
当模式窗口打开时,将鼠标悬停在网格上并使用鼠标滚轮。您会看到网格上下滚动。
这种情况不会发生在 Windows 7 上,但会发生在 Windows 10 上。它可能看起来无害,但当您在 3 个窗口上构建了几层父子关系时,它就特别危险。
假设模态窗口包含主窗口的孙子窗口。如果用户启动模式窗口的目的是编辑特定的孙子,并且不小心使用鼠标滚轮并在主窗口上移动祖 parent ,那么他们现在正在编辑他们不打算编辑的孙子。
需要注意的是,在第4步和第5步之间,如果在启动模态窗口之前没有将焦点放在网格中,则不会出现此问题。在显示模态窗口之前,我尝试以编程方式将焦点设置到非模态窗口上的控件中,但没有成功。
最佳答案
这是 VCL 代码中的错误。如评论中所述,要在正常应用程序中重现该问题,需要启用 Windows 10 的非事件窗口滚动功能,或者在早期操作系统中提供类似功能的软件。
但是,无需特殊要求即可演示该问题。这将是比问题中更简单的再现。
在表单上放置一个 stringgrid 和一个按钮,该按钮的点击处理程序中包含以下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Enabled := False;
SetFocusedControl(StringGrid1);
end;
单击按钮并将鼠标悬停在网格上并滚动。由于被禁用,网格不应该滚动,但它确实滚动了。
下面是对问题中的情况的更合适的问题再现。这是因为模式窗口禁用了包含网格的表单,然后该网格会发布鼠标滚轮消息。轮消息是针对没有上述要求的环境合成的。
procedure TForm1.Button1Click(Sender: TObject);
var
Pt: TPoint;
begin
Enabled := False;
Pt := Point(1, 1);
MapWindowPoints(StringGrid1.Handle, HWND_DESKTOP, Pt, 1);
SetFocusedControl(StringGrid1);
Perform(WM_MOUSEWHEEL, MakeWParam(0, WORD(-120)), MakeLParam(Pt.X, Pt.Y));
end;
观察到网格滚动后,按 Ctrl+F2。
问题的根本原因是,VCL在判断某个控件是否为焦点控件以及使其执行鼠标滚轮消息时并不关心该控件是否启用。将鼠标滚轮消息更改为 CM_MOUSEWHEEL
并完全绕过默认窗口过程,VCL 应该执行这些检查。
作为解决方法,您可以在启动模态表单之前将焦点控件设置为不同的控件:
MainForm.SetFocusedControl(MainForm);
OtherForm.ShowModal;
您无法在此处设置 ActiveControl
,因为该控件已进行必要的可见性/状态检查。
如果不想与主窗体耦合,可以在主窗体中放置一个鼠标滚轮消息处理程序:
type
TMainForm = class(TForm)
...
protected
procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
...
procedure TMainForm.WMMouseWheel(var Message: TWMMouseWheel);
begin
if IsWindowEnabled(Handle) then
inherited;
end;
关于delphi - 模态窗口后面的网格滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37328375/
是否有更快的算法来计算 (n! modulo m)。在每个乘法步骤都比减少更快。并且有没有比左右二元法更快的算法来计算 (a^p modulo m)。 这是我的代码:n!模数m ans=1 for(i
我有非常简单的代码循环遍历数组中的元素并检查是否index % 2 == 0。如果是这样,它应该改变颜色。 var e = document.getElementById("list").childN
让我简短一点。我正在计算 alert((Math.pow(7,35))%71) 但它给了我 61,而结果必须是 70。怎么了? 最佳答案 正如其他人之前提到的关于使用 Math.pow(7,35) 的
我试图弄清楚如何在汇编中计算模 10,所以我在 gcc 中编译了以下 c 代码,看看它想出了什么。 unsigned int i=999; unsigned int j=i%10; 令我惊讶的是我得到
例如使用以下输入: int num = -100 int divisor = 10 => -100 mod 10 = 0 (Edge-case: negative numbers as inpu
这个问题在这里已经有了答案: Random float number generation (14 个答案) 关闭 9 年前。 在 C++ 中,我希望得到一个随机 float 。据我所知,典型的随机
我试图找到潜在阶乘素数的除数(n!+-1 形式的数),因为我最近购买了 Skylake-X 工作站,我认为我可以使用 AVX512 指令提高一些速度。 算法简单,主要步骤是对同一个除数重复取模。主要是
我有一个保存角度(以度为单位)的变量,该角度可以是正值也可以是负值。我现在需要确保该数字仅在 0 到 360 之间。该数字是 double 。 执行此操作的好算法是什么?简单地执行角度 % 360 是
我有一个 UInt8 数组,我想计算 CheckSum8 模 256。如果字节总和小于 255,checkSum 函数返回正确的值。 例如 let bytes1 : [UInt8] = [1, 0xa
使用海湾合作委员会: printf("%i \n", -1 % (int)4); printf("%u \n", -1 % (unsigned int)4); 输出: -1 3 我可以跨平台依赖这种行
我无法理解代码中几行的含义。我最近开始学习 C++,并阅读了 Bjarne Stroustrup 的“编程:使用 C++ 的原理和实践”。第四章有个问题让我很困惑,所以我在网上搜索了一个解决方案以供引
我试图解决一个涉及大阶乘模质数的问题,并在另一个人的解决方案中发现了以下算法: long long factMod (long long n, long long p) { long long
我正在尝试计算 𝐹𝑛 模 𝑚,其中 𝑛 可能非常大:高达 10^18,𝐹𝑛 是第 n 个斐波那契数这是我的代码,它适用于小数字,但对于大数字,它会抛出 OutOfMemoryError 或
我有两个以 16 为模的循环整数,因此它们的值介于 0 和 15 之间。 我需要比较两个数字以确定 n_1 是否大于 n_0 n_1 > n_0 很明显,这个没有准确定义,所以我定义n_1如果小于前面
我一直在尝试使用 Java 处理一些更大的值,但遇到了一些我不理解的问题。出于某种原因,Java 似乎喜欢给我垃圾数据(尽管,我更可能告诉它给我垃圾数据) 这是一个片段,为清楚起见进行了编辑:
好吧,我今天做了一个小函数,它应该会生成一个随机字符串。 std::string randString(size_t length) { std::string randStr; fo
Ruby 的负数取模规则不明确。在 IRB 中: -7 % 3 == 2 应该是1!为什么? 最佳答案 因为 -7/3 在 Ruby 的整数除法语义下是 -3。 3*-3 是 -9,所以会留下 2
这个问题在这里已经有了答案: Calculating pow(a,b) mod n (14 个答案) 关闭 6 年前。 在 Javascript 中是否有获取大数模数的技巧。我用 modulo(7,
此代码使用公式 (a^x) % 101 检查值 a 是否唯一映射到值 1 到 100 local function f(a) found = {} bijective = true
在《Core Java Volume1》一书中有一条警告: CAUTION: The right-hand side argument of the shift operators is reduce
我是一名优秀的程序员,十分优秀!