![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы по поводу Scroll-а
faiwer © (2009-09-26 22:44:00)На форме висит скролл бокс, в котором часто меняется содержимое. среди содержимого встречаются TsListBox-ы и TsRichEdit-ы. Но так же много просто элементов аля эдитки, кнопки и прочее. Возникло несколько неприятных трудностей связанных со скролом.
1 Задача: сделать так чтобы можно было колесом мышки прокручивать скроллбокс, при условии что сейчас фокус не находится в компоненте с активным скроллом.
Попробовал это сделать так:
procedure TMainF.BoxMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint; var Handled: Boolean);
var
i: Shortint;
c: TControl;
begin
if (Sender is TsRichEdit) or (Sender is TsListBox) then exit;
if wheeldelta>0 then i:=-1 else i:=1;
(sender as TsScrollBox).VertScrollBar.Position:=(sender as TsScrollBox).VertScrollBar.Position
+ i*150;
end;
"Но тут промашка вышла, тут конечно переборщили" (с) Высоцкий. Проблема в том что у этих самых RichEdit & ListBox далеко не всегда есть активный скролл. А как узнать стандартными методами есть ли у них скролл я не нашёл. По крайней мере свойства IsScrollBarVisible как у них нету.
Вт2 орая промашка в том что если активный элемент какой нибудь TEdit то на любое применение скрола BoxMouseWheel вызывается ажно 5-6 раз подряд (прокручивается от души :D) а если в TEdit или других то 1 раз и всё получается гладко.
3 У меня на форме вообще так устроено:
Box: TsScrollBox => MainP: Panel => а на ней уже всё остальное
MainP.AutoSize=true; и я переодически на ней формы (они умну как модули). И в момент когда MainP увеличивается в размерам, скроллбар не меняется до тех пор пока юзер не ткнёт в какой нибудь елемент с Focus-ом. Есть от этого лекарство? Есть задумка при MainP.OnRezise как нибудь вручную... стоит её реализовывать?
4 И наконец последний вопрос. Можно ли как нибудь добиться чтобы ScrollBox показывал вертикальный скролл всегда, внезависимости от размеров содержимого (у RichEdit такое есть). Если убрать autoscroll то именно так и происходит, только наоброт. Теоритически я могу сам обрабатывать все его движения, только ето мягко говоря, как мне кажется не лучший вариант.
faiwer (2009-09-27 09:13:00) [1]
> ... добился - отказался от СПЛИТТЕРов, ибо ес ...
fxd *
faiwer (2009-09-27 09:12:00) [2]TMenuP
TListP
TMainP <= панелька на которой находится вся правая часть. нужна для других режимов просмотра
|
--- TScrollBox // <= он и скролит
|
---TScrollP // панелька с autosize, которую и нужно скролить
|
---TNameEditP // "модули" которые alTOP друг за другом
---TFotoEditP
---...
faiwer (2009-09-27 09:07:00) [3]0x00FF00, интерфейс я давно перепродумал... во всяком случае как в итоге всё должно выглядеть знаю. А вот как реализовать, пробовал уже разными способами, единственное чего добился - отказался от ов, ибо если у панели стоит autosize то он всё равно не робит, а если autosize не стоит то проблематично следить за размером панели.
Насчёт привести текстовый проект не догнал... в нём 1400+ строк кода. Привожу скриншоты
http://pics.kz/s2/b8/0b/97/c8/b80b97c87a808f62a7388fd971d90e61.jpg
http://pics.kz/s3/c2/a4/ca/55/c2a4ca554abb83b2dfa2cc9bd3d87c27.jpg
Германн (2009-09-27 04:20:00) [4]
> turbouser © (27.09.09 04:00) [4]
>
>
> > Германн © (27.09.09 02:49) [3]
>
>
> > Обычно
>
> Неа. В здесь ни теКстовый проект, ни подсекзка в куда рулить
> - не поможнт.
>
За очепятку извин(и)яюсь.
За "подсекзк"у извиняйся сам.
:)
turbouser (2009-09-27 04:00:00) [5]
> Германн © (27.09.09 02:49) [3]
> Обычно
Неа. В здесь ни теКстовый проект, ни подсекзка в куда рулить - не поможнт.
Германн (2009-09-27 02:49:00) [6]
> 0x00FF00 (27.09.09 00:03) [1]
>
> *задумчиво:*
>
> Хм. А какова задача?
+1
P.S.
Обычно когда "так" задаётся вопрос, то приводится текстовый проект, на котором можно увидеть описанные проблемы.
turbouser (2009-09-27 02:20:00) [7]
> как узнать стандартными методами
нафига? активировать controlonpos и пущай сам wheel обрабатывает.. если умеет :)
0x00FF00 (2009-09-27 00:03:00) [8]*задумчиво:*
Хм. А какова задача?
Не лучше ли ещё раз перепродумать интерфейс, вместо того чтобы вскрывать на заднице вены, пытаясь обойти такие грабли?
Ибо,
> ето мягко говоря, как мне кажется не лучший вариант.