Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.08;
Скачать: CL | DM;

Вниз

Синхронизация двух ScrollBox   Найти похожие ветки 

 
Gurd   (2008-09-26 15:26) [0]

Есть два ScrollBox при изменении 1-го ScrollBar нужно автоматическое изменение 2-го, никак не пойму через что это реализовать, в событиях srollBox нет например  onScroll. Подскажите через что это можно сделать.


 
Vlad Oshin ©   (2008-09-26 15:47) [1]

просто забил тему

http://yandex.ru/yandsearch?rpt=rad&text=%D0%A1%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B2%D1%83%D1%85%20ScrollBox%20


 
{RASkov} ©   (2008-09-26 16:00) [2]

> [1] Vlad Oshin ©   (26.09.08 15:47)
> просто забил тему

Посмотри найденные результаты :)
Все как один.... дурдом)


 
{RASkov} ©   (2008-09-26 16:09) [3]

> [0] Gurd   (26.09.08 15:26)

Лови сообщения WM_H{V}SCROLL у первого и шли их второму....


 
Gurd   (2008-09-26 16:10) [4]

Простите, может я чегото не понимаю но у компонента srollBox нет события  onScroll про которое описано в поисе по яндексу

{это статья из предложенной ссылки}
Решить задачу помогут обработчики событий OnScroll (в данном примере два компонента ScrollBox (ScrollBar1 и ScrollBar2) расположены на форме TMainForm):

procedure TMainForm.ScrollBar1Scroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
 ScrollBar2.Position:=ScrollPos;
end;

procedure TMainForm.ScrollBar2Scroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
 ScrollBar1.Position := ScrollPos;
end;

Или может я не правильно изложил задачу?


 
Vlad Oshin ©   (2008-09-26 16:16) [5]

тогда прошу прощения


 
{RASkov} ©   (2008-09-26 16:17) [6]

> [4] Gurd   (26.09.08 16:10)
> Или может я не правильно изложил задачу?

Скорее всего накопипастили "решений".... Есть и TScrollBox и TScrollBar.... Ужас :)

Попробуй как-нибудь так:
....
private
OldWnd: TWndMethod;
procedure NewWnd(var M: TMessage);
end;
.................

На создании формы:
begin
 OldWnd:=ScrollBox1.WindowProc;
 ScrollBox1.WindowProc:=NewWnd;
.......
end;

procedure TForm.NewWnd(var M: TMessage);
begin
 OldWnd(M);
 if (M.Msg<>WM_VSCROLL) and (M.Msg<>WM_HSCROLL)then Exit;
 ScrollBox2.perform(M.Msg, M.wParam, M.Lparam);
end;


 
Сергей М. ©   (2008-09-26 16:21) [7]

А зачем, собссно, потребовались два контрола ?


 
Vlad Oshin ©   (2008-09-26 16:21) [8]

public
   { Public declarations }
   OldWindowProc: TWndMethod;
   procedure NewWindowProc(var Message: TMessage);
...

procedure TForm1.FormCreate(Sender: TObject);
begin
 OldWindowProc:= ScrollBox1.WindowProc;
 ScrollBox1.WindowProc:= NewWindowProc;
end;

procedure TForm1.NewWindowProc(var Message: TMessage);
begin
 case Message.Msg of
 276: StaticText1.Caption:= "Horz Scroll";
 277: StaticText1.Caption:= "Vert Scroll";
 end;
 OldWindowProc(Message);
end;


 
Gurd   (2008-09-26 16:24) [9]

Спасибо сейчас попробую, кстати нашел статью может кому пригодиться

Как перехватить сообщения прокрутки в TScrollBox?

Следующий пример перехватывает сообщения о прокрутке компонента TScrollBox и
синхронизирует обе линейки прокрутки. Сообщения прокрутки перехватываются с помощью
переопределения окнной процедуры (WinProc) ScrollBox"а.

type
{$IFDEF WIN32}
       WParameter = LongInt;
{$ELSE}
       WParameter = Word;
{$ENDIF}
       LParameter = LongInt;

{Declare a variable to hold the window procedure we are replacing}
var
       OldWindowProc : Pointer;

function NewWindowProc(WindowHandle : hWnd;
       TheMessage   : WParameter;
       ParamW : WParameter;
       ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
var
       TheRangeMin : integer;
       TheRangeMax : integer;
       TheRange : integer;
begin
       if TheMessage = WM_VSCROLL then
       begin
               {Get the min and max range of the horizontal scroll box}
               GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax);
               {Get the vertical scroll box position}
               TheRange := GetScrollPos(WindowHandle, SB_VERT);
               {Make sure we wont exceed the range}
               if TheRange < TheRangeMin then
               TheRange := TheRangeMin else
               if TheRange > TheRangeMax then
               TheRange := TheRangeMax;
               {Set the horizontal scroll bar}
               SetScrollPos(WindowHandle, SB_HORZ, TheRange, true);
       end;
       if TheMessage = WM_HSCROLL then
       begin
               {Get the min and max range of the horizontal scroll box}
               GetScrollRange(WindowHandle, SB_VERT, heRangeMin, TheRangeMax);
               {Get the horizontal scroll box position}
               TheRange := GetScrollPos(WindowHandle, SB_HORZ);
               {Make sure we wont exceed the range}
               if TheRange < TheRangeMin then
                       TheRange := TheRangeMin
               else
                       if TheRange > TheRangeMax then
                               TheRange := TheRangeMax;
                       {Set the vertical scroll bar}
                       SetScrollPos(WindowHandle, SB_VERT, TheRange, true);
       end;

       {Call the old Window procedure to allow processing of the message.}
       NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle, TheMessage,
                                       ParamW, ParamL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
       {Set the new window procedure for the control and remember
                               the old window procedure.}
       OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC,
                               LongInt(@NewWindowProc)));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
       {Set the window procedure back to the old window procedure.}
       SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(OldWindowProc));


 
Gurd   (2008-09-26 16:30) [10]


> Сергей М. ©   (26.09.08 16:21) [7]
>
> А зачем, собссно, потребовались два контрола ?

на форме два контрола, верхний не прокручивается ни гориз. , не верт., сам, а нижний прокручивается вертикально сам по себе, а горизонт. вместе с верхом, т.е. своеобразная шапка и верхнего контрола


 
KSergey ©   (2008-09-26 17:15) [11]

В общем-то действительно бывают интерфейсы, где это вполне логично в использовании. Тот же Araxis Merge, например.


 
Gurd   (2008-09-26 17:49) [12]


> {RASkov} ©   (26.09.08 16:17) [6]
>
> Попробуй как-нибудь так:
> ....
> private
> OldWnd: TWndMethod;
> procedure NewWnd(var M: TMessage);
> end;
> .................
>
> На создании формы:
> begin
>  OldWnd:=ScrollBox1.WindowProc;
>  ScrollBox1.WindowProc:=NewWnd;
> .......
> end;
>
> procedure TForm.NewWnd(var M: TMessage);
> begin
>  OldWnd(M);
>  if (M.Msg<>WM_VSCROLL) and (M.Msg<>WM_HSCROLL)then Exit;
>
>  ScrollBox2.perform(M.Msg, M.wParam, M.Lparam);
> end;


Что то ни как не получается в этом примере у меня значение
ScrollBox2.perform(M.Msg, M.wParam, M.Lparam); равняется 0 и ни как не изменяется, прошу помощи, не могу разобраться


 
Vlad Oshin ©   (2008-09-26 17:53) [13]


> ScrollBox2.perform(M.Msg, M.wParam, M.Lparam);

попробуй
SendMessage(ScrollBox2.handle,...

хотя они вроде и одинаковы.. но вдруг


 
{RASkov} ©   (2008-09-26 18:11) [14]

> [12] Gurd   (26.09.08 17:49)
> ScrollBox2.perform(M.Msg, M.wParam, M.Lparam); равняется 0

Из справки:
Return Values
If an application processes this message, it should return zero.

Перевод:
Возвращаемые значения
Если заявление обрабатывает это сообщение, оно должно возвратить ноль.


> [12] Gurd   (26.09.08 17:49)

Что-то не правильно сделал, вот и н6е работает. Я попробывал у меня все ОК.


 
Gurd   (2008-09-26 18:11) [15]

Нет, не то :(


 
{RASkov} ©   (2008-09-26 18:13) [16]

> Из справки:

Справка по WM_H{V}SCROLL


 
Gurd   (2008-09-26 18:23) [17]


> > ScrollBox2.perform(M.Msg, M.wParam, M.Lparam); равняется
> 0
>
> Из справки:
> Return Values
> If an application processes this message, it should return
> zero.


Спасибо, теперь ясно почему ноль :), но не работает и все, я создал новый проект два скрола скопировал все точности и не работает.
Как можно проверить какое сообщение посылает ScrollBox1? Я просто не знаю, что и ковырять потому как вроде все очевидно, но не работает....


 
{RASkov} ©   (2008-09-26 18:24) [18]

> [15] Gurd   (26.09.08 18:11)

Что не то? :) Справка "не катит"?)


 
{RASkov} ©   (2008-09-26 18:25) [19]

> [17] Gurd   (26.09.08 18:23)
> я создал новый проект два скрола скопировал все точности
> и не работает.

А OnCreate Форме сделал? Т.е. добавил данный обработчик?


 
Gurd   (2008-09-26 18:35) [20]

Заработало, проблема была в том что я скролу который надо двикать автоматически назначил visible:= false, когда поставил true заработало. Спасибо.
Но вопрос появился, как сделать с visible:= false :) и возможно ли это


 
{RASkov} ©   (2008-09-26 18:46) [21]

> [20] Gurd   (26.09.08 18:35)
> назначил visible:= false

Я так и подумал :)

> Но вопрос появился, как сделать с visible:= false :) и возможно ли это

Наверное не получится или придется переписывать
procedure TScrollingWinControl.WMHScroll(var Message: TWMHScroll);
begin
 if (Message.ScrollBar = 0) and FHorzScrollBar.Visible then
   FHorzScrollBar.ScrollMessage(Message) else
   inherited;
end;


 
Gurd   (2008-09-26 18:52) [22]

Ок, спасибо Вам за помощь


 
{RASkov} ©   (2008-09-26 19:38) [23]

Странно конечно.... в справке говорится, что если Visible=False, то можно программно управлять положением(Position).... Но что-то тут не так :)
Но при Visible=False и в ИО невозможно изменить Position....
Справка по TControlScrollBar


 
{RASkov} ©   (2008-09-26 20:16) [24]

Вот возможный вариант решения данной "проблемы":
procedure TForm1.NewWnd(var M: TMessage);
var OldPos: Integer;
begin
 OldPos:=ScrollBox1.HorzScrollBar.Position;
 OldWnd(M);
 if (M.Msg<>WM_VSCROLL) and (M.Msg<>WM_HSCROLL)then Exit;
 ScrollBox2.ScrollBy(OldPos - ScrollBox1.HorzScrollBar.Position, 0);
end;

OnCreate для формы тот же...


 
Gurd   (2008-09-29 12:53) [25]

Спасибо, все работает



Страницы: 1 вся ветка

Текущий архив: 2009.11.08;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
2-1253260256
JS
2009-09-18 11:50
2009.11.08
ID добавляемой записи


1-1222428416
Gurd
2008-09-26 15:26
2009.11.08
Синхронизация двух ScrollBox


2-1253279555
ForEvgen
2009-09-18 17:12
2009.11.08
Здравствуйте!Помогите пожалуйста!


2-1253006175
Гость
2009-09-15 13:16
2009.11.08
Проверить создан ли объект


2-1253772111
Sergey2
2009-09-24 10:01
2009.11.08
Vista + TDBGridEh + MsAccess текстовое поле