Форум: "Основная";
Текущий архив: 2009.11.08;
Скачать: [xml.tar.bz2];
ВнизСинхронизация двух 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c