Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DBGrid & StringGrid  (Прочитано 20541 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
ymhuk
Помогающий

ru
Offline Offline
Пол: Мужской

« : 21-07-2007 15:32 » 

Возможна ли синхронизация DBGrid и StringGrid по скролу. Т.е. при перемещении скрола у DBGrid нужно чтобы на столько же перемещался скрол у StringGrid. Пока мне эта задача не дается так как у них нет обработчика OnScroll, другого способа я не знаю
Записан

Знаешь мало - поучись, знаешь много - поделись.
zubr
Гость
« Ответ #1 : 21-07-2007 17:01 » 

Перехватывай сообщение WM_VSCROLL и будет тебе счастье.
Записан
ymhuk
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 22-07-2007 19:54 » 

str.Parent:=Form1;
str.DataSource:=DataSource1;
вот где ошибка моя
Записан

Знаешь мало - поучись, знаешь много - поделись.
ymhuk
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 26-07-2007 23:39 » new

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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 07-08-2007 08:31 » 

zubr, спасиб за помощь
Записан

Знаешь мало - поучись, знаешь много - поделись.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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);

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines