-
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]) решил все проблемы "на Ура!"
Я Вам очень признателен за помощь, Вы помогаете далеко не в первый раз.
Спасибо!