有两个完全一样的DBGrid控件
如何托动一个DBGrid的滚动条来控制另一个DBGrid的滚动
使两个DBGrid同步显示想法是不是有些怪异
哪位仁兄指点一下
谢了
如何托动一个DBGrid的滚动条来控制另一个DBGrid的滚动
使两个DBGrid同步显示想法是不是有些怪异
哪位仁兄指点一下
谢了
解决方案 »
- delphi 获取浏览器URL地址时出现异常
- 相当好玩的一个游戏:评价一下楼上的昵称
- 工控机能用WinXP做操作系统吗?稳定不?
- 请问:在打印dbchart时,如何改变其在纸上的长、宽度?
- 命令行参数问题 & 程序路径获得问题!
- 数据定位
- 新发布的共享软件,反正不是为了赚钱做广告。。。。。。
- 我想连接局域网内的一个SQL数据库,客户机分步在不同网段,且在这台数据库服务器上没有其用户,我怎样才能连得上呢?
- 动态创建ADOconnection,Adotable如何写代码呢?
- Ado和SQL2000的问题,急,急,急
- 在哪里改变应用程序的图标
- ***** 请问 如何 远程调用COM ?急 *****
不过DBGrid的数据源(DataSource)设置成同一个,就可以自动滚动了。
比如:
adsData: TADODataSet;
dsData: TDataSource;
dgData1: TDBGrid;
dgData2: TDBGrid; dsData.DataSet := adsData;
dgData1.DataSource := dsData;
dgData2.DataSource := dsData;最后,记录集打开后,在一个DBGrid拖动滚动条,另外一个也会跟着滚动。
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, Grids;type
TSyncKind = (skBoth, skVScroll, skHScroll);
TSyncStringGrid = class(TStringGrid)private
FInSync: Boolean;
FsyncGrid: TSyncStringGrid;
FSyncKind: TSyncKind;
{ Private declarations }
procedure WMVScroll(var Msg: TMessage); message WM_VSCROLL;
procedure WMHScroll(var Msg: TMessage); message WM_HSCROLL;protected
{ Protected declarations }public
{ Public declarations }
procedure DoSync(Msg, wParam: Integer; lParam: Longint); virtual;published
{ Published declarations }
property SyncGrid: TSyncStringGrid read FSyncGrid write FSyncGrid;
property SyncKind: TSyncKind read FSyncKind write FSyncKind default skBoth;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Samples', [TSyncStringGrid]);
end;procedure TSyncStringGrid.WMVScroll(var Msg: TMessage);
begin
if not FInSync and Assigned(FSyncGrid) and (FSyncKind in [skBoth, skVScroll]) then
FSyncGrid.DoSync(WM_VSCROLL, Msg.wParam, Msg.lParam);
inherited;
end;procedure TSyncStringGrid.WMHScroll(var Msg: TMessage);
begin
if not FInSync and Assigned(FSyncGrid) and (FSyncKind in [skBoth, skHScroll]) then
FSyncGrid.DoSync(WM_HSCROLL, Msg.wParam, Msg.lParam);
inherited;
end;procedure TSyncStringGrid.DoSync(Msg, wParam: Integer; lParam: Longint);
begin
FInSync := True;
Perform(Msg, wParam, lParam);
FinSync := False;
end;end.{****************************************}{2.}
private
OldGridProc1, OldGridProc2: TWndMethod;
procedure Grid1WindowProc(var Message: TMessage);
procedure Grid2WindowProc(var Message: TMessage);public
{...}procedure TForm1.Grid1WindowProc(var Message: TMessage);begin
OldGridProc1(Message);
if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or Message.msg = WM_Mousewheel)) then
begin
OldGridProc2(Message);
end;
end;procedure TForm1.Grid2WindowProc(var Message: TMessage);
begin
OldGridProc2(Message);
if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or (Message.msg = WM_Mousewheel)) then
begin
OldGridProc1(Message);
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
OldGridProc1 := StringGrid1.WindowProc;
OldGridProc2 := StringGrid2.WindowProc;
StringGrid1.WindowProc := Grid1WindowProc;
StringGrid2.WindowProc := Grid2WindowProc;
end;
首先感谢你的答案。
我试过了{2.}的代码,如果是两个StringGrid控件,结果是正确的
但我换成DBGrid后,就没有任何效果了。
是什么原因?
但不能实现鼠标滚轴同步滚动。 因为DBGrid不支持鼠标滚动。
再次感谢wilowind(无风雪亦飘)