Конференция "Компоненты" » Управление ScollBara'ми в наследнике TCustomControl
 
  • Handbrake (13.10.10 09:49) [0]
    Помогите разобраться. Есть наследник TCustomControl:


    TDesc = class(TCustomControl)
    end;



    Необходимо, чтобы у него было две полосы прокрутки: по правому краю и по нижнему.
    Причем для правого ScrollBara'а свойство Top было равно (очень условно) 24,
    для нижнего ScrollBar'а свойство Left = 40.

    Попробовал так:


    procedure TDesc.CreateParams(var Params: TCreateParams);
    begin
     inherited;
     with Params do
     begin
       Style := Style or WS_HSCROLL or WS_VSCROLL;
     end;
    end;



    Замечательно, только вот не знаю как управлять их размещением:оба ScrollBar'а "стартуют с нуля".
    Условно:


    BottomScrollBar.Left = 0
    RightScrollBar.Top   = 0


    А надо:


    BottomScrollBar.Left = 40
    RightScrollBar.Top   = 24


    Попробовал по-другому:

    Вместо TDesc.CreateParams создаю ScrollBar'ы в конструкторе. Проблем с необходимым мне размещением ,конечно, нет.
    Теперь возникает другая проблема: бегунок мерцает на том ScrollBar'е , который активный. Я хотел бы этого избежать.

    Буду признателен за помощь.
  • DimaBr © (13.10.10 13:40) [1]

    TMyScrollBar = class(StdCtrls.TScrollBar)
     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    end;  

    procedure TMyScrollBar.WMSetFocus(var Message: TWMSetFocus);
    begin
     Message.Result := 1;
    end;

  • Handbrake (13.10.10 15:41) [2]
    To DimaBr ©

    Спасибо! Все работает.

    Тут еще следующая проблема:
    Мне нужно, чтобы при прокрутке колесика мыши в экземпляре класса TDesc происходил вертикальный скроллинг. Без проблем, если сначала активировать вертикальный скроллбар (мышкой). Если же этого не сделать, то прокрутка колесика не перехватывается. Я попробовал следующее. В методе Paint такие строки:


    Var
       Focus:TWMSetFocus;  
    begin
    ...
        TuneRightScrollBarAndSetVisibility;
    ...
        if RightScrollBar.Visible // вертикальный скроллбар
        then
          begin
             Focus.Msg := WM_SETFOCUS;
             Focus.FocusedWnd := RightScrollBar.Handle;
             Self.Perform(Focus.Msg,0,0);
          end;
    ...
    end;



    Вроде работает. А вот корректность такого подхода оценить не могу.
    Ваше мнение?
  • DimaBr © (14.10.10 09:01) [3]
    Вы бы лучше рассказали что за контрол ?
  • Handbrake (14.10.10 10:10) [4]

    > Вы бы лучше рассказали что за контрол ?


    Да просто грид, но слишком специфический (for desktop OLAP), чтобы наследоваться от TDrawGrid/TStringGrid. Иерархические заголовки строк/столбцов, DrillDown/RollUp, balanced, parent-child, ragged hierarchies, подитоги и прочая шняга.
  • DimaBr © (14.10.10 14:53) [5]
    То есть контрол может получать фокус ?
  • Handbrake (14.10.10 15:31) [6]
    По-хорошему, получается должен уметь: например, SelectedCell по клику или нажатии навигационных клавиш.
  • DimaBr © (14.10.10 17:00) [7]
    Вы такой грид будите рисовать очень долго, да и не с таким уровнем знания
  • Handbrake (14.10.10 17:03) [8]
    Ok! Дорогу осилит идущий.
  • DimaBr © (15.10.10 08:33) [9]
    Проще всего (да и лучше) не использовать стандартный ScrollBar, а создать свой скроллер из четырёх TWinControl (сам контрол + 2 кнопки + скроллер). Таким образом вы сможете полностью контролировать отрисовку и нужное вам поведение.
  • Handbrake (16.10.10 12:01) [10]

    > Проще всего (да и лучше) не использовать стандартный ScrollBar, а...


    В моем случае скорее сложнее, да и Ваш совет ([1]) решил все проблемы "на Ура!"
    Я Вам очень признателен за помощь, Вы помогаете далеко не в первый раз.
    Спасибо!
 
Конференция "Компоненты" » Управление ScollBara'ми в наследнике TCustomControl
Есть новые Нет новых   [134466   +3][b:0][p:0.002]