ymhuk
|
|
« : 21-07-2007 15:32 » |
|
Возможна ли синхронизация DBGrid и StringGrid по скролу. Т.е. при перемещении скрола у DBGrid нужно чтобы на столько же перемещался скрол у StringGrid. Пока мне эта задача не дается так как у них нет обработчика OnScroll, другого способа я не знаю
|
|
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
zubr
Гость
|
|
« Ответ #1 : 21-07-2007 17:01 » |
|
Перехватывай сообщение WM_VSCROLL и будет тебе счастье.
|
|
|
Записан
|
|
|
|
ymhuk
|
|
« Ответ #2 : 22-07-2007 00:46 » |
|
Попробовал перехватывать его, но никак не выходит. По тому принципу как отлавливаются сообщения формы написал для DBGrid, но у меня ноль реакции. В чем ошибка не знаю. Вот фрагменты кода: type TYGrid = class(TDBGrid) procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL; end;
...
var Form1: TForm1; DBGrids: TYGrid;
...
procedure TYGrid.WMHScroll(var Msg: TWMHScroll); begin ShowMessage('Горизонтальная'); end;
procedure TYGrid.WMVScroll(var Msg: TWMVScroll); begin ShowMessage('Вертикальная'); end;
где ошибка???
|
|
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
zubr
Гость
|
|
« Ответ #3 : 22-07-2007 05:27 » |
|
Не знаю, все должно работать. Вот мой код, все работает: unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DBGrids, DB, DBTables;
type TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
TDBGrid1 = class(TDBGrid) private procedure WMVScroll(var msg:TWMVScroll);message WM_VSCROLL; end;
var Form1: TForm1;
implementation
{$R *.dfm}
var str:TDBGrid1;
procedure TDBGrid1.WMVScroll(var msg:TWMVScroll); begin inherited; MessageBox(0, 'Ok', '', MB_OK); end;
procedure TForm1.FormCreate(Sender: TObject); begin str:=TDBGrid1.Create(Form1); str.Parent:=Form1; str.DataSource:=DataSource1; end;
end. Естественно, Table1 подключена к БД и активна, а DataSource1 подключен к Table1.
|
|
|
Записан
|
|
|
|
ymhuk
|
|
« Ответ #4 : 22-07-2007 19:54 » |
|
str.Parent:=Form1; str.DataSource:=DataSource1;
вот где ошибка моя
|
|
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
ymhuk
|
|
« Ответ #5 : 23-07-2007 13:30 » |
|
Теперь у меня не выходит передать StringGrid'у на сколько у меня переместился скролл в DBGrid. вот что я написал unit r_;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, DB, Grids, DBGrids, ExtCtrls, ADODB, Menus, ComCtrls, ShellAPI, WinProcs;
type TForm1 = class(TForm) Button2: TButton; Memo1: TMemo; OpenDialog1: TOpenDialog; Memo2: TMemo; TU: TADOTable; Button4: TButton; Timer1: TTimer; DSU: TDataSource; Button5: TButton; Save: TButton; Load: TButton; Panel1: TPanel; Grid2: TStringGrid; grid1: TStringGrid; procedure Button2Click(Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } public { Public declarations } end; TYDBGrid = class(TDBGrid) procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; end; TYGrid = class (TStringGrid) end;
var Form1: TForm1; HPos: Integer;
implementation
{$R *.dfm} var DBGridU: TYDBGrid; Grid3: TYGrid;
procedure TYDBGrid.WMHScroll(var Msg: TWMHScroll); Var ScrollMessage:TWMHScroll; begin inherited; HPos := GetScrollPos(DBGridU.Handle, SB_HORZ); {1 способ} //SendMessage(grid3.handle, WM_HSCROLL, HPos, 0); // {2 способ} //SetScrollPos(Grid3.handle, WM_HSCROLL, HPos, true); end;
procedure TForm1.FormCreate(Sender: TObject); begin DBGridU:=TYDBGrid.Create(Form1); DBGridU.Parent:=Form1; DBGridU.Top:=200; DBGridU.Left:=0; DBGridU.DataSource:=DSU; Grid3:=TYGrid.Create(Form1); Grid3.Parent:=Form1; Grid3.Top:=140; Grid3.Left:=14; Grid3.RowCount:=1; Grid3.DefaultRowHeight:=24; Grid3.Height:=20; Grid3.ScrollBars:= ssHorizontal; Grid3.FixedCols:=0; Grid3.FixedRows:=0; Grid3.BorderStyle:=bsNone; end;
Я пробовал и первый и второй способ ничего не помогает. я не разобрался что означают третьи и четвертые параметры в них. Что они означают? Где можно прочитать про них? Может где еще есть ошибка или я вообще не так передаю сообщение для СтрингГрида
|
|
« Последнее редактирование: 23-07-2007 13:36 от ymhuk »
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
zubr
Гость
|
|
« Ответ #6 : 23-07-2007 20:46 » |
|
1-й способ у тебя неправильно сделан, там вместо HPos, должно быть 2-ное слово, где в качестве старшего слова SB_THUMBPOSITION (смотри описание WM_HSCROLL в MSDN), а в качестве младшего слова - HPos. 2-й способ должен работать: pos:=GetScrollPos(DBGridU.Handle, SB_HORZ); SetScrollPos(Grid3.handle, SB_HORZ, pos, True);(обрати внимание, что не WM_HSCROLL, а SB_HORZ).
|
|
|
Записан
|
|
|
|
ymhuk
|
|
« Ответ #7 : 24-07-2007 18:54 » |
|
zubr, сэнкс. второй способ вроде как заработал, но почему вместе с ползунком скрола не передвигается текст содержащийся в СтрингГриде? как вообще такое возможно, мож еще какой параметр надо передать
|
|
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
zubr
Гость
|
|
« Ответ #8 : 25-07-2007 08:15 » |
|
Сделай так: pos:=GetScrollPos(DBGrid1.Handle, SB_HORZ); pos:=pos shl 16; pos:=pos+SB_THUMBPOSITION; StringGrid1.Perform(WM_HSCROLL, pos, 0);
|
|
|
Записан
|
|
|
|
ymhuk
|
|
« Ответ #9 : 26-07-2007 23:39 » |
|
zubr, спасибо заработало. И еще одна просьба, если не сложно можно коментарии к этим строчкам, не охото тупо копировать код, так ничему не научишься.
|
|
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
zubr
Гость
|
|
« Ответ #10 : 27-07-2007 07:43 » |
|
pos:=GetScrollPos(DBGrid1.Handle, SB_HORZ);//получаем позицию скролла DBGrid pos:=pos shl 16;//помещаем значение позиции скролла в старшее слово переменной pos pos:=pos+SB_THUMBPOSITION;//помещаем в младшее слово переменной pos SB_THUMBPOSITION (см. MSDN WM_HSCROLL) StringGrid1.Perform(WM_HSCROLL, pos, 0);//посылаем в StringGrid1 сообщение WM_HSCROLL (аналог SendMessage)
|
|
|
Записан
|
|
|
|
ymhuk
|
|
« Ответ #11 : 07-08-2007 08:31 » |
|
zubr, спасиб за помощь
|
|
|
Записан
|
Знаешь мало - поучись, знаешь много - поделись.
|
|
|
Sla
|
|
« Ответ #12 : 07-08-2007 09:01 » |
|
pos:=GetScrollPos(DBGrid1.Handle, SB_HORZ);//получаем позицию скролла DBGrid pos:=pos shl 16;//помещаем значение позиции скролла в старшее слово переменной pos pos:=pos+SB_THUMBPOSITION;//помещаем в младшее слово переменной pos SB_THUMBPOSITION (см. MSDN WM_HSCROLL) StringGrid1.Perform(WM_HSCROLL, pos, 0);//посылаем в StringGrid1 сообщение WM_HSCROLL (аналог SendMessage)
с точки зрения читабельности нормально, чесслово я бы сделал, после отладки, бы так: StringGrid1.Perform(WM_HSCROLL, GetScrollPos(DBGrid1.Handle, SB_HORZ) shl 16 +SB_THUMBPOSITION, 0);
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|