怎样解决FORM上所有的DBGrid不支持鼠标的上下移动的问题?(50分)

  • 主题发起人 主题发起人 wangxian11
  • 开始时间 开始时间
W

wangxian11

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGrid不支持鼠标的上下移动的解决代码:
自己捕捉WM_MOUSEWHEEL消息处理
private
OldGridWnd : TWndMethod;
procedure NewGridWnd (var Message : TMessage);
public

procedure TForm1.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 TForm1.FormCreate(Sender: TObject);
begin
OldGridWnd := DBGrid1.WindowProc ;
DBGrid1.WindowProc := NewGridWnd;
end;

这些代码是解决一个DBGrid的鼠标的上下移动的问题,怎样使用最简洁的代码一次性实现FORM上所有DBGrid的鼠标的上下移动的问题比如FORM上有10个DBGrid的时候
 
提示方法:
清楚所有窗体内的输入框
For i:=0 to ComponentCount - 1 do
if Components is TEdit then
TEdit(Components).Text := '';
以此类推,可以用于Label,Button等等,那些需要统一更改的属性等内容。
 
to wangxian11:
具体怎么实现我现在也不是能马上解决,能不能考虑使用动态数组对dbgrid进行定义,对动态数组进行这个操作?希望能有高手指点
 
我的想法是将其做成一个通用的“.pas”文件,然后其它的FORM里只要引用一下以后,这个FORM里所有的dbgrid的鼠标上下移动问题就都解决了。
 
OK,正需要這個!
 
还有另外一个办法,修改源代码,这样每次添加一个dbgrid就可以自动支持了。你大概需要的就是这个吧?
 
我知道那也是一种方法,我只想那么做,谢谢:)
 
好的,我看看,刚刚问了一下同事,他说就这样做比较好,免得下次再改了,现在他正帮我改呢,等好了发给你吧
 
你就直接改DBGRID里的代码,或者自己生成一个新控件不就可以达到这个目的了吗??
 
to app2001,
如果一个项目中已经完成,要解决所有DBGRID上下不能移动的问题,如果生成一个新控件是不能解决问题,而直接改DBGRID里的代码到是可以的,不过我这里就想用上面我的方法解决。
 
看看我的解決方案!借花獻佛!
不用重新寫控件,也不用改控件!直接將光色代碼部分加到你的窗體單無中就行.
type
[red] TDBGrid = class(DBGrids.TDBGrid)
private
FOldGridWnd : TWndMethod;
procedure NewGridWnd (var Message : TMessage);
public
constructor Create(AOwner: TComponent); override;
end;[/red]
TXXXForm = class(TForm)
......
end;
{ TDBGrid }
[red]
constructor TDBGrid.Create(AOwner: TComponent);
begin
inherited;
Self.FOldGridWnd := Self.WindowProc;
Self.WindowProc := NewGridWnd;
end;

procedure TDBGrid.NewGridWnd(var Message: TMessage);
var
IsNeg : Boolean;
begin

if Message.Msg = WM_MOUSEWHEEL then
begin
IsNeg := Short(Message.WParamHi) < 0;
if IsNeg then
self.DataSource.DataSet.MoveBy(1)
else
self.DataSource.DataSet.MoveBy(-1)
end
else Self.FOldGridWnd(Message);

end;
[/red]
 
我已经修改好了,不过没有测试。我把方法告诉你

找到那个grids的pas文件,里面修改两个函数(grids是dbgrid的父类,所以函数不需要再另外定义)

function TCustomGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
Result := inherited DoMouseWheelDown(Shift, MousePos);
if not Result then
begin
// Draco Modified
if Self is TCustomDbGrid then
begin
if Assigned(TCustomDbGrid(Self).DataSource) then
if Assigned(TCustomDbGrid(Self).DataSource.DataSet) then
if TCustomDbGrid(Self).DataSource.DataSet.Active then
TCustomDbGrid(Self).DataSource.DataSet.Next;
end
else begin
if Row < RowCount - 1 then Row := Row + 1;
end;
Result := True;
end;
end;


function TCustomGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
Result := inherited DoMouseWheelUp(Shift, MousePos);
if not Result then
begin
// Draco Modified
if Self is TCustomDbGrid then
begin
if Assigned(TCustomDbGrid(Self).DataSource) then
if Assigned(TCustomDbGrid(Self).DataSource.DataSet) then
if TCustomDbGrid(Self).DataSource.DataSet.Active then
TCustomDbGrid(Self).DataSource.DataSet.Prior;
end
else begin
if Row > FixedRows then Row := Row - 1;
end;
Result := True;
end;
end;

你试试看,如果没什么问题告诉我一下,麻烦你
 
TDBGrid = class(DBGrids.TDBGrid)

end;
一定要放在最前面,也可以將紅色部分代碼寫一共用單無中,
然後uses publicunit;
再加上這一句:
TDBGrid = Class(publicunit.TDBGrid);
TXXFrom =Class(TForm)
 
TO P_W_Q,
在本FORM照你上面的很OK了,
怎样做成一个通用的文件还不是很清楚,
我新建了一个MyDBGrid的“Unit”文件,将你最上面的代码写上去,然后在一个新的FORM里去uses MyDBGrid;可是这样还不行,请指点迷津!
 
那當然不行的!
1.先定義公用單元mydbgridunit;
unit mydbgridunit
uses ......;
type
TmyDBGrid = TDBGrid
private
OldGridWnd : TWndMethod;
procedure NewGridWnd (var Message : TMessage);
end;
........

end;
2.然後 uses mydbgridunit,........;


3.在你所有用用到TDBGrid元件的窗體中,加入
type
[red]TDBGrid = class(TmyDBGrid);[/red] //注意位置
Txxform = class(Tform)
....
end;

就這樣搞定,紅色代碼部分必須放在Txxform前面
 
我是这样改控件的:
在 dbgrids 单元里 Tdbgrid 下 private 里先声明:
procedure WMH_MOUSEWHEEL(var Msg: TMessage);message WM_MOUSEWHEEL;

然后下面写过程:
procedure TDBGrid.WMH_MOUSEWHEEL(var Msg: TMessage);
var
IsNeg: boolean;
begin
IsNeg := Short(Msg.WParamHi) < 0;
if IsNeg then
DataSource.DataSet.MoveBy(1)
else
DataSource.DataSet.MoveBy(-1);
end;

测试通过,
 
to:laoyou
你的方法可行,我也改過!
 
出现错误:
[Error] Unit1.pas(10): Undeclared identifier: 'TmyDBGrid'
 
to: wangxian11
這個問題不會你解決不了吧,我都改了用得好好的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
585
import
I
后退
顶部