![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Вот вопрос - как отловить событие скроллирования 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. Спасибо за "базу знаний". Непременно изучу! |