Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.05.2014, 22:24
Nikkore Nikkore вне форума
Прохожий
 
Регистрация: 11.12.2012
Сообщения: 16
Репутация: 10
По умолчанию Как отловить событие скроллирования TScrollBox'а?

Здравствуйте!

Вот вопрос - как отловить событие скроллирования TScrollBox'а? В Delphi 7 это легко делалось на OnCanResize, а в новых Delphi почему-то не отрабатывается... Как быть?

Спасибо!
Ответить с цитированием
  #2  
Старый 05.05.2014, 22:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А что, в новых делфях сообщения тоже не ловятся? Ловите в WindowProc мессагу WM_VSCROLL -

Цитата:
DRKB: 01226 -
Следующий пример перхватывает сообщения скроллирования в компоненте TScrollBox, тем самым синхронизируя два скролбара. Если один из скролбаров изменяет своё положение, то значение второго скролбара изменяется на такую же величину. Сообщения скролирования перехватываются путём сабклассинга оконной процедуры (WinProc) у скролбара.
Код:
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  
Старый 05.05.2014, 23:25
Nikkore Nikkore вне форума
Прохожий
 
Регистрация: 11.12.2012
Сообщения: 16
Репутация: 10
По умолчанию

Спасибо большое!

Я сделал пока так:

Код:
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. Спасибо за "базу знаний". Непременно изучу!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter