在写一个简单的数据库连接操作的时候,突然想起来用鼠标滚轮操作DBGrid的选中项
发现DBGrid不太好用后,改用DBGridEh。
DBGridEh中是支持鼠标滚轮翻页的,但是却没有鼠标滚轮响应事件。
自己用event添加后,在事件响应时取DBGridEh的选中项,发现全部都是事件响应“时”所在的位置,而鼠标滚轮滚动结束后已经大大偏离了那个位置。
求解
发现DBGrid不太好用后,改用DBGridEh。
DBGridEh中是支持鼠标滚轮翻页的,但是却没有鼠标滚轮响应事件。
自己用event添加后,在事件响应时取DBGridEh的选中项,发现全部都是事件响应“时”所在的位置,而鼠标滚轮滚动结束后已经大大偏离了那个位置。
求解
添加ApplicationEvents控件,在事件拦截中Msg=VK_MOUSEWHEEL拦截事件
在事件响应中直接调用Grid绑定的ADOQuery的Dataset.FieldByName('')取相应的字段
取出来的却是MOUSEWHEEL发生时所选中的行,而不是MOUSEWHEEL结束时Dataset选中的行
var Handled: Boolean);
begin
if (DBGrid1.Focused) And (Msg.message = WM_MOUSEWHEEL) then
begin
if Msg.wParam > 0 then
SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_UP, 0)
else
SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_DOWN, 0);
Handled := True;
end;
end;
我说的就是用ApplicationEvents添加了event响应后发现响应的是mousewheel的开始而不是结束
var Handled: Boolean);
begin
if (DBGrid1.Focused) And (Msg.message = WM_MOUSEWHEEL) then
begin
if Msg.wParam > 0 then
begin
SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_UP, 0);
Adoquery.FieldByName('').as...;//在这里不就取到移动后的相应字段的值了?因为执行这句是在SendMessage语句之后,也就是数据集的指针移动之后
end
else
begin
SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_DOWN, 0);
Adoquery.FieldByName('').as...;//
end;
Handled := True;
end;
end;
说多了打击你