Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ScrollBox, Cинхронизация прокрутки 
:(
    Опции темы
Charly
  Дата 7.11.2003, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.3.2002

Репутация: нет
Всего: нет



Доброго времени суток всем!

Подскажите, плз., как решить такую задачу:
Имеются два объекта TScrollBox - box1 и box2. Они одинаковые по размерам.
Нужно сделать так, чтобы горизонтальной (вертикальной) прокрутке в box1 соответствующий скроллбар в box2 находился в той же позиции.
То же самое и для box2.

То есть нужно сделать синхронную прокрутку для обоих скроллбоксов.

Я понимаю, что надо отловить сообщение о прокрутке. Но как?...

Если не трудно, поделитесь, плз., примером.
PM MAIL ICQ   Вверх
hawkins
Дата 7.11.2003, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 8.9.2003

Репутация: нет
Всего: нет



Как-то сталкивался с такой проблемой. Тоже надо было отловить сообщения
о прокрутке. Вобщем наверное это как-то можно сделать. Если пмотреть конструктор TControlScrollBar , то у этого конструктора есть параметр типа TScrollingWinControl, а у этого типа есть обработчики сообщений WMVScroll и WMHScroll, но они записаны в private, наверное надо вынести их published.
Или можно сделать так: у ScrollBox сделать его ScrollBar-ы невидимыми, а вместо них поставить обычные TScrollBar растянуть их вручную по левой и нижней стороне, а у них есть свои обработчик OnScroll; ну а в обработчике перемещать те обекты которые расположены внутри
ScrollBox-a в соответствии со значением position ScrollBar-ов . Кстати я тогда вместо TScrollBox ставил TPanel. Или как я говорил попробовать вынести обработчики из private в published.


P.S.
The Matrix has you ...

PM MAIL   Вверх
hawkins
Дата 7.11.2003, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 8.9.2003

Репутация: нет
Всего: нет



Для синхронизации есть простой способ : поставить на форму TApplicationEvents и обрабатывать все сообщения поступающие в окно:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin

Box2.VertScrollBar.Position:=Box1.VertScrollBar.Position;
Box1.VertScrollBar.Position:=Box2.VertScrollBar.Position;
Box2.HorzScrollBar.Position:=Box1.HorzScrollBar.Position;
Box1.HorzScrollBar.Position:=Box2.HorzScrollBar.Position;
end;
PM MAIL   Вверх
December
Дата 7.11.2003, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



hawkins Как-то это накладно получается... По-китайски.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Charly
Дата 8.11.2003, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.3.2002

Репутация: нет
Всего: нет



Спасибо всем!
Разобрался на примере синхронизации прокрутки в TListBox. Вот коротенький юнит:

Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   ListBox2: TListBox;
   procedure FormCreate(Sender: TObject);
   private
   { Private declarations }
   lbproc1, lbproc2: TWndMethod;
   procedure NewProc1(var msg: TMessage);
   procedure NewProc2(var msg: TMessage);
 public
   { Public declarations }
 end;


var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.NewProc1;
begin
 case msg.Msg of
   WM_VSCROLL, LB_SETCURSEL,
   WM_KEYFIRST..WM_KEYLAST,
   WM_MOUSEFIRST..WM_MOUSELAST:
     lbproc2(msg);
 end;
 lbproc1(msg);
end;

procedure TForm1.NewProc2;
begin
 case msg.Msg of
   WM_VSCROLL, LB_SETCURSEL,
   WM_KEYFIRST..WM_KEYLAST,
   WM_MOUSEFIRST..WM_MOUSELAST:
     lbproc1(msg);
 end;
 lbproc2(msg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 lbproc1 := ListBox1.WindowProc;
 ListBox1.WindowProc := NewProc1;
 lbproc2 := ListBox2.WindowProc;
 ListBox2.WindowProc := NewProc2;
end;

end.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.