|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как отловить событие скроллирования TScrollBox'а?
Здравствуйте!
Вот вопрос - как отловить событие скроллирования TScrollBox'а? В Delphi 7 это легко делалось на OnCanResize, а в новых Delphi почему-то не отрабатывается... Как быть? Спасибо! |
#2
|
||||
|
||||
А что, в новых делфях сообщения тоже не ловятся? Ловите в WindowProc мессагу WM_VSCROLL -
Цитата:
Код:
type {$IFDEF WIN32} WParameter = LongInt; {$ELSE} WParameter = Word; {$ENDIF} LParameter = LongInt; {Объявляем переменную для хранения подменённой оконной процедуры} 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 {Получаем минимальное и максимальное значения scroll box} GetScrollRange(WindowHandle,SB_HORZ,TheRangeMin,TheRangeMax); {Получаем вертикальную позицию scroll box} TheRange := GetScrollPos(WindowHandle, SB_VERT); {Проверим, чтобы не выйти за диапазон} if TheRange < TheRangeMin then TheRange := TheRangeMin else if TheRange > TheRangeMax then TheRange := TheRangeMax; {Устанавливаем горизонтальный scroll bar} SetScrollPos(WindowHandle, SB_HORZ, TheRange, true); end; if TheMessage = WM_HSCROLL then begin {Получаем мин. и макс. диапазон горизонтального scroll box} GetScrollRange(WindowHandle, SB_VERT, TheRangeMin, TheRangeMax); {Получаем позицию горизонтального scroll box} TheRange := GetScrollPos(WindowHandle, SB_HORZ); {Проверим, чтобы не выйти за диапазон} if TheRange < TheRangeMin then TheRange := TheRangeMin else if TheRange > TheRangeMax then TheRange := TheRangeMax; {Устанавливаем вертикальный scroll bar} SetScrollPos(WindowHandle, SB_VERT, TheRange, true); end; { Вызываем старую оконную процедуру } { чтобы обработались сообщения. } NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL); end; procedure TForm1.FormCreate(Sender: TObject); begin { Устанавливаем новую оконную процедуру для контрола } { и запоминаем старую оконную процедуру. } OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(@NewWindowProc))); end; procedure TForm1.FormDestroy(Sender: TObject); begin { Возвращаем обратно старую оконную процедуру. } SetWindowLong(ScrollBox1.Handle,GWL_WNDPROC,LongInt(OldWindowProc)); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Спасибо большое!
Я сделал пока так: Код:
type TScrollBox=Class(VCL.Forms.TScrollBox) procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL; procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; private FOnScrollVert: TNotifyEvent; FOnScrollHorz: TNotifyEvent; public Property OnScrollVert:TNotifyEvent read FOnScrollVert Write FonScrollVert; Property OnScrollHorz:TNotifyEvent read FOnScrollHorz Write FonScrollHorz; end; ... procedure TScrollBox.WMHScroll(var Message: TWMHScroll); begin inherited; if Assigned(FOnScrollHorz) then FOnScrollHorz(Self); end; procedure TScrollBox.WMVScroll(var Message: TWMVScroll); begin inherited; if Assigned(FOnScrollVert) then FOnScrollVert(Self); end; Но все равно, надо еще код для колесика мышки писать. У меня просто в голове не умещается, зачем было отрубать традиционное поведение ScrollBox'а в новых Дельфях? Ведь все же хорошо работало! PS. Спасибо за "базу знаний". Непременно изучу! |