powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Параллельная прокрутка гридов
17 сообщений из 17, страница 1 из 1
Параллельная прокрутка гридов
    #38177412
Ehlibovod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется два грида с идентичными полями, но датасеты возвращают в них данные например для разных периодов и
было бы удобно сравнивать значения в этих гридах так, чтобы была возможность "сцепить" прокрутку в обоих гридах
чтобы прокручивая влево/вправо любой из двух гридов, второй автоматом точно так же прокручивался бы,
то есть чтобы поля гридов были друг под другом.
Можно конечно обойтись и одним гридом, но все же это не очень удобно в моем случае.

Вопрос как бы это организовать?
Как-то ловить на окне крутящегося грида сообщения прокрутки и отправлять по hwnd какое-то сообщение окну-гриду который надо тоже крутить? Но как и какие именно сообщения не знаю ) Или может есть вариант попроще.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177723
_Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ehlibovod,

тынц
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177750
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ведь еще будет вопрос о синхронизации ширины колонок...
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177792
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxа ведь еще будет вопрос о синхронизации ширины колонок...Это фигня!
А вдруг будет, как синхронизировать "прокрутку гридов" между WinRT и iOS на разных полушариях
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177805
jserrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ширину колонок легко синхронизировать - отлавливая событие OnColWidthChanged основного грида. В EhLib такое событие есть.

У меня таже самая ситуация: 2 грида. Полностью идентичные. Я их положил один под другим, и у второго скрыл Titles. Все смотриться отлично.
Но как ловить событие горизонтальной прокрутки я так и не докумекал. Даже внешние скролбары встраивал в основной грид. Благо Ehlib их поддерживает. Но все равно ничего не получилось.

Так что вопрос открытый и очень интересный.

Тынц от Дока не в тему.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177844
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jserrg, вы решите для себя, что собираетесь синхронизировать.
"картинки" на экране или курсоры в датасетах?

Или просто master-detail, банальная индексация и пр. дет.сад.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177902
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jserrgТынц от Дока не в тему.
Вообще-то, сначала было желание ткнуть ТС'а носом сюда . В следующий раз так и сделаю...
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38177905
jserrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не. Курсоры тут не причем. Мастер-дитейл тоже не причем.

Я хочу, как и автор темы, прокручивать грид влево-вправо . Горизонтальная прокрутка, а не вертикальная.
Два грида. Одинаковые колонки.
Хочу нажать на горизонтальную скролбар одного грида, и чтоб при этом второй грид тоже поворачивался.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38178271
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jserrgЯ хочу, как и автор темы, прокручивать грид влево-вправо . Горизонтальная прокрутка, а не вертикальная.
Е-мое. Вот о чем. Приношу свои извинения, невнимательно прочел старттопик
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38178628
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокjserrgЯ хочу, как и автор темы, прокручивать грид влево-вправо . Горизонтальная прокрутка, а не вертикальная.
Е-мое. Вот о чем. Приношу свои извинения, невнимательно прочел старттопик

Док! Нормально ты всё прочитал. Просто вопрос "завуалирован"... хи-хи
Это это и выглядит, как "синхронизация картинок". Т.е.
У обоих SrcGrid и DestGrid известны
- ширина всего грида и ширина колонок, их видимость на экране/панельке/окошке и проч. параметры
- положение HScroll;

Остается написать арифметику а-ля
DestGrid.HScrollPosition := Recalculate (SrcGrids.HScrollPosition)
Ну, добавить в Tags прописать структуру, где бы хранились коэффициенты пересчета ширин (экрана/формы/грида/колонок/чёрта лысого). Править её при соответствующих ресайзах/ремувах.
_____________
Это в общем случае.
А для двух Авторских сеток навскидку достаточно одинаковых обработчиков событий.
Типа OnColumnMove, OnColumnChange etc.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38178677
A V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A V
Гость
Ehlibovod,

ну, для обычного TDBGrida можно сделать наследника, в котором перекрыть WMHScroll. Его можно даже не регистрировать в дизайнере, задав классу такое-же имя, т.е что-то типа того:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    FIsBoundScrolling: Boolean;
    FBoundGrid: TDBGrid;
  protected
    procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
  public
    property BoundGrid: TDBGrid read FBoundGrid write FBoundGrid;
  end;

  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    procedure FormCreate(Sender: TObject);
  end;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.BoundGrid := DBGrid2;
  DBGrid2.BoundGrid := DBGrid1;
end;

procedure TDBGrid.WMHScroll(var Msg: TWMHScroll);
begin
  if FIsBoundScrolling then
    exit;
  inherited;
  if Assigned(BoundGrid) then
  begin
    FIsBoundScrolling := True;
    try
      BoundGrid.Dispatch(Msg);
    finally
      FIsBoundScrolling := False;
    end;
  end;
end;


(если такое поведение нужно на разных формах, то юнит, в котором описан измененный TDBGrid, должен в uses идти после DBGrids).
Можно и без наследника, подставив гридам свой WindowProc.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38178709
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно видеть 2 разные конструкции в одном месте. По идее нужно было написать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TDBGrid.WMHScroll(var Msg: TWMHScroll);
begin
  if FIsBoundScrolling then Exit;
  inherited;
  if not Assigned(BoundGrid) then Exit;
.....
end;
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38180103
Ehlibovod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем.
Сделал через переопределение WindowProc и отлов в нем WM_HSCROLL.
Работает нормально.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38180224
jserrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ehlibovod,

Можешь скинуть пример кода? WindowProc переопределял прямо в EhLib-e?

Заранее спасибо.
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38180909
Ehlibovod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вот изврат: :)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
type TfrmSomeForm = class(TForm)
    ....
    procedure NewWndProcGrid1(var Message: TMessage);
    procedure NewWndProcGrid2(var Message: TMessage);
    ....
var
  isSynchLosk: Boolean; // просто переключатель - сцепить/расцепить гриды (цепляем к кнопкам, чекбоксу и т.п.)
  OldWndProcGrid1: TWndMethod;
  OldWndProcGrid2: TWndMethod;
...  
procedure TfrmSomeForm.NewWndProcGrid1(var Message: TMessage);
begin
  if (Message.Msg = WM_HSCROLL) and isSynchLosk then
    OldWndProcGrid2(Message);

  OldWndProcGrid1(Message);
end;

procedure TfrmSomeForm.NewWndProcGrid2(var Message: TMessage);
begin
  if (Message.Msg = WM_HSCROLL) and isSynchLosk then
    OldWndProcGrid1(Message);

  OldWndProcGrid2(Message);
end;  
...
procedure TfrmSomeForm.FormCreate(Sender: TObject);
begin
  ...
  isSynchLosk := True; 
  OldWndProcGrid1     := grdGrid1.WindowProc;
  OldWndProcGrid2     := grdGrid2.WindowProc;
  grdGrid1.WindowProc := NewWndProcGrid1;
  grdGrid2.WindowProc := NewWndProcGrid2;
  ...
end;
...
Рейтинг: 0 / 0
Параллельная прокрутка гридов
    #38184728
jserrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 грида скроляться синхронно. Спасибо всем!

Единственное что дополнительно пришлось сделать - это отключить HorzScrollBar.Tracking у гридов. При этом Tracking (Grid repainting while drugging the thumb tab) все так же продолжает работает. По крайней мере так ведет себя мой EhLib 6.0
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Параллельная прокрутка гридов
    #39455655
jserrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь решение для Ehlib 9.1:
http://forum.ehlib.com/ru/viewtopic.php?f=4&t=2265
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Параллельная прокрутка гридов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]