Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2011, 06:22   #1
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
Восклицание ScrollBar в FrameBar?

Привет.

Знаю что у компонента FrameBar есть родной ScrollBar, но я его отключил по той простой причине, что мне необходимо, чтобы ScrollBar был всегда видимый, независимо от того, заходят Fame за пределы FarmeBar по вертикали или нет. Поскольку я не смог найти у встроенного ScrollBar параметра для постоянного активного состояния, решил прикрепить внешний ScrollBar.

И тут то всё девлин!
Как внешний ScrollBar синхронизировать с FrameBar даже примерного представления не имею!

Прошу помощи.

p.s. ну или подскажите как альтернатива, как в FrameBar активировать возможность прокрутки колесиком. просто тогда уберу scrollbar. в понедельник (тобеж завтра) надо сдавать.

Последний раз редактировалось BingoBongo; 01.05.2011 в 06:26.
BingoBongo вне форума Ответить с цитированием
Старый 01.05.2011, 07:51   #2
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

пока нашел только вот это (((

procedure TMainForm.sScrollBar1Scroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
FrameBar1.VertScrollBar.Position := ScrollPos;
end;

но когда я отключаю у FrameBar вертикальный скролл, внешний ScrollBar по этой процедуре не перехватывает событие. (((

шляпа вообщем (

может кто знает как просто на просто активировать колесико во FrameBar?? это было бы такое облегчение.
BingoBongo вне форума Ответить с цитированием
Старый 01.05.2011, 08:15   #3
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

function TControlScrollBar.IsScrollBarVisibl e: Boolean;
var
Style: Longint;
begin
Style := WS_HSCROLL;
if Kind = sbVertical then Style := WS_VSCROLL;
Result := (Visible) and
(GetWindowLong(FControl.Handle, GWL_STYLE) and Style <> 0);
end;

это функция (встроенная) выдает результат видимости родного ScrollBar компонента FrameBar.

Можно как-нибудь используя эту функцию, сделать скролл постоянно активным, а не только когда Frame за пределы видимой части уходят?? ((
BingoBongo вне форума Ответить с цитированием
Старый 01.05.2011, 14:35   #4
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

А зачем вам нужно делать скролбар всегда видимым?
eduard93 вне форума Ответить с цитированием
Старый 01.05.2011, 15:19   #5
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от eduard93 Посмотреть сообщение
А зачем вам нужно делать скролбар всегда видимым?
После того как он появляется, объекты расположенные во вложенном Frame уже не центрованные (они не по центру). Из-за него расстояние справа меньше чем слева.

А вот если он будет постоянным, так и объекты на Frame будут всегда по ровно по-центру.

Я же говорю, вполне сойдет вариант отключить ScrollBar полностью и сделать функциональным колесико мышки. Проблема в том, что я не знаю как колесико сделать активным для FrameBar (
BingoBongo вне форума Ответить с цитированием
Старый 01.05.2011, 20:42   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Метод получается громоздким, но другой мне не известен.

В закладке Additional палитры компонентов есть не визуальный компонет ApplicationEvents.
Его поместить на главную форму и создать процедуру в свойстве OnMessage.

В обработчике событий должен быть такой код:
Код:
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message=WM_MOUSEWHEEL then begin
    //определяется окно, над которым курсор мыши и ему посылается сообщение от колеса
    Msg.hwnd := WindowFromPoint(SmallPointToPoint(TSmallPoint(Msg.lParam)));
    SendMessage(Msg.hwnd, WM_MOUSEWHEEL, Msg.WParam, Msg.LParam);
    Handled := True;
  end;
end;
Тогда фрейм будет получать сообщение от колеса и обрабатывать его.
Во фрейме должен быть обработчик сообщений от колеса:

Код:
//обявления процедуры обработки сообщения в секции private
  procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;

//реализация обработчика:
procedure TFrame4.WMMouseWheel(var Message: TWMMouseWheel);
var D, I : Integer;
begin
  if Message.WheelDelta < 0 then
    D := 5  //кол-во точек на которое смещаются компоненты (значение по своему усмотрению)
  else
    D:= - 5;
  for I := 0 to ControlCount - 1 do
    Controls[I].Top := Controls[I].Top + D;
end;
Теперь можно сделать вертикальный скроллбар невидимым.

Недостатки есть. Если указатель мыши будет на компонентом, который вставлен во фрейм, то фрейм не будет получать сообщение от колеса.

Последний раз редактировалось Прик; 01.05.2011 в 20:47.
Прик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PicShow vs. FrameBar BingoBongo Компоненты Delphi 3 30.04.2011 13:43
Scrollbar bill JavaScript, Ajax 2 10.11.2010 15:16
scrollbar grater83 Общие вопросы Delphi 2 08.10.2009 12:00
ScrollBar Rebel123 Общие вопросы Delphi 2 19.07.2009 11:35