彻底解决Delphi的DBGrid控件鼠标滚轮问题(转)

摘要:
typeTForm1=类(TForm)过程FormCreate(发件人:TObject);//新添加的鼠标滚轮处理程序public{Publicdeclarations}end;布尔);

Delphi的DBGrid控件对鼠标滚轮的支持有问题,不仅不能连续滚动,显示的内容还会错误。

  在网上找了很多代码段,发现大家都只是针对一个Form页面提出解决方法,而且这些方法都存在一个同样的问题,那就是,如果DBGrid控件里正在进行编辑,则鼠标滚轮根本不起作用。

  结合这些方法,本人提出了一个通用的解决方案,这个方案只需要在应用程序的主Form里加入处理程序就可以达到整个应用程序的所有DBGrid控件都得到支持。

  原理是:当有鼠标滚轮事件发生时判断程序当前激活的界面里激活(或者是获得焦点)的控件类名如果是TDBGrid(当未处于编辑状态时是这个类名)或者是TDBGridInplaceEdit(当DBGrid处于编辑状态时是这个类名)则按加入的程序进行相应的滚动处理。

  具体如下:

  注意,只需要在主Form里按以下加入红色的代码段即可。

  

  

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure OnMouseWheel(var Msg :TMsg;var Handled:Boolean); //新加的鼠标滚轮处理程序
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//新加的鼠标滚轮处理程序

procedure TForm1.OnMouseWheel(var Msg :TMsg;var Handled:Boolean);
begin
try //注意,这里使用容错处理的目的是屏蔽可能引起的错误
if (Msg.message = WM_MouseWheel)
and ((Screen.ActiveForm.ActiveControl.ClassName='TDBGrid')
or (Screen.ActiveForm.ActiveControl.ClassName='TDBGridInplaceEdit')) then begin
if Msg.wParam > 0 then
SendMessage(Screen.ActiveForm.ActiveControl.Handle,
WM_VSCROLL,
SB_PAGEUP, //SB_PAGEUP按页上滚,SB_LINEUP按行上滚
0)
else
SendMessage(Screen.ActiveForm.ActiveControl.Handle,
WM_VSCROLL,
SB_PAGEDOWN, //SB_PAGEDOWN按页下滚,SB_LINEDOWN按行下滚
0);
Handled:= True;
end;
except
end;
end;

//在Form的OnCreate事件里加入以下截获鼠标滚动事件到自己加的处理程序
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=OnMouseWheel;
end;

end.

免责声明:文章转载自《彻底解决Delphi的DBGrid控件鼠标滚轮问题(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#中对Winform中的DataGridView的控制技巧。(单独控制某单元格的按钮不显示、某单元格的ReadOnly)js实现全选和取消全选下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决C#编译中"csc不是内部或外部命令"的问题

安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示“csc不是内部或外部命令,也不是可运行的程序,或批处理文件”。这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了。使用记事本编写一个C#程序,保存后将扩展名改为cs,存储在D...

kettle控件 add a checksum

This step calculates checksums for one or more fields in the input stream and adds this to the output as a new field. 为数据流输入的列计算校验码,并将输出作为新的一列。 wiki中介绍:http://wiki.pentaho.com/dis...

WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (一)

WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (一) 编写人:CC阿爸   2015-1-28   在伍华聪的博客中,看到布局控件"WeifenLuo.WinFormsUI.Docking",发现的确是一个非常棒的开源控件,用过的人都深有体会,该控件之强大、美观、不亚于商业控件。而且控件使用也是比较简单的今天在...

[原创][开源] SunnyUI.Net 常见问题答疑

从码云下载下来的项目,编译直接出错嘛,怎么办? 兄弟,先把码云项目下面的Readme.md仔细看看:SunnyUI.Net, 基于 C# .Net WinForm 开源控件库、工具类库、扩展类库、多页面开发框架源码编译环境: VS2019 动态库应用环境:VS2010及以上,.Net Framework 4.0及以上(不包括.Net Framework...

asp11

AppRelativeTemplateSourceDirectory 获取或设置包含该控件的 Page 或 UserControl 对象的应用程序相对虚拟目录。 1.0 BindingContainer 获取包含该控件的数据绑定的控件。 1.0 ClientID 获取由 ASP.NET 生成的服务器控件标识符。 1.0 Controls 获...

React+AntDesign使用Tree树控件完整展现其中的层级关系,并具有展开收起选择等交互功能

(一)需求展示效果图 1.新增时树形控件展示效果2.编辑时树形控件展示效果 (二)实现代码 1.使用树形控件,选择自己需要实现的功能的相关调用方法跟值 2.触发事件时获取数据及控件展示问题 (三)关于树形结构转化说明 如果后台传过来的树形数据跟展示不同,就需要前台这边自己进行处理 比如这次后台传过来的数据格式: 1.可以通过遍历,点扩展运算符获取数据每...