用鼠标滚轮实现DGBrid滚动条的滚动,该怎么解决
用鼠标滚轮实现DGBrid滚动条的滚动
Procedure TForm2.OnMouseWheel(Var Msg: TMsg;var Handled: Boolean);
begin
if Msg.message=WM_MouseWheel then
begin
if Msg.wParam> 0 then
begin
if DBGrid1.Focused then
SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEUP,0);
end
else
begin
if DBGrid1.Focused then
SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEDOWN,0);
end;
Handled:=True;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Application.OnMessage:=OnMouseWheel;
end;
用上面的代码可以用鼠标滑轮实现在单窗口中DBGrid滚动条的滚动,但如果有多个子窗体存在且每个子窗体内都有DBGrid时就会出错,请问这个时候该怎么改才能实现每个子窗体中的DBGrid滚动条都可随着鼠标滑轮的滚动而滚动呢?
------解决方案--------------------
private
{ Private declarations }
OldGridWnd: TWndMethod;
procedure NewGridWnd(var Message: TMessage);
............
procedure TForm.FormCreate(Sender: TObject);
begin
OldGridWnd := DBGrid1.WindowProc;
DBGrid1.WindowProc := NewGridWnd;
end;
procedure TForm4.NewGridWnd(var Message: TMessage);
var
IsNeg: Boolean;
begin
if Message.Msg = WM_MOUSEWHEEL then
begin
IsNeg := Short(Message.WParamHi) < 0;
if IsNeg then
DBGrid1.DataSource.DataSet.MoveBy(1)
else
DBGrid1.DataSource.DataSet.MoveBy(-1);
end
else
OldGridWnd(Message);
end;
Procedure TForm2.OnMouseWheel(Var Msg: TMsg;var Handled: Boolean);
begin
if Msg.message=WM_MouseWheel then
begin
if Msg.wParam> 0 then
begin
if DBGrid1.Focused then
SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEUP,0);
end
else
begin
if DBGrid1.Focused then
SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEDOWN,0);
end;
Handled:=True;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Application.OnMessage:=OnMouseWheel;
end;
用上面的代码可以用鼠标滑轮实现在单窗口中DBGrid滚动条的滚动,但如果有多个子窗体存在且每个子窗体内都有DBGrid时就会出错,请问这个时候该怎么改才能实现每个子窗体中的DBGrid滚动条都可随着鼠标滑轮的滚动而滚动呢?
------解决方案--------------------
private
{ Private declarations }
OldGridWnd: TWndMethod;
procedure NewGridWnd(var Message: TMessage);
............
procedure TForm.FormCreate(Sender: TObject);
begin
OldGridWnd := DBGrid1.WindowProc;
DBGrid1.WindowProc := NewGridWnd;
end;
procedure TForm4.NewGridWnd(var Message: TMessage);
var
IsNeg: Boolean;
begin
if Message.Msg = WM_MOUSEWHEEL then
begin
IsNeg := Short(Message.WParamHi) < 0;
if IsNeg then
DBGrid1.DataSource.DataSet.MoveBy(1)
else
DBGrid1.DataSource.DataSet.MoveBy(-1);
end
else
OldGridWnd(Message);
end;