-
Поверьте, велик делать никому не охота, а просто приходится... Причина проста: нужен компонент с нестандартной функциональностью. Точнее с такой, какой готовые варианты и решения не обладают в полной мере.
> Чем твоя задача отличается от [14]?
Тем, что компонент должен быть самодостаточным в своей функциональности.
Требуемый компонент - это не скроллбар. Скроллбар лишь одна из его видимых частей, реализующая определенную функциональность, в данном случае скроллирование видимой области.
-
> EG (23.07.07 18:33) [20]
А почему бы эту прокручиваемую область не сделать в виде агрегированного TScrollBox?
-
Хм... Ни разу не юзал эту вещь... может помочь в моей ситуации?
-
Если компонент оконный, а его прокручиваемая область по своей функциональности ничем не отличается от TScrollBox, то ее и надо делать этим самым TScrollBox-ом.
Компонент в своем конструкторе создает TScrollBox, его Owner-ом и Parent-ом ставит Self, выставляет позицию, размеры и прочие настройки TScrollBox-а. Вот и все.
Еще более простой вариант - взять фрейм, накидать на него все, что нужно, написать в нем необходимый код и зарегистрировать его в качестве компонента.
-
> Если компонент оконный, а его прокручиваемая область по > своей функциональности ничем не отличается от TScrollBox, > то ее и надо делать этим самым TScrollBox-ом
Если нечто выглядит как собака, лает как собака и кусается как собака, то это и есть собака.
Все компоненты с прокручваемой областью наследуются от TScrollingWinControl, все зависит от того, насколько область совпадает с желаемой клиентской областью. Если совпадает, как у TScrollBox/TForm/TFrame то проще наследоваться от них, если несовпадает, то проще создавать вложенный контрол, унаследованный от TScrollingWinControl.
-
> Все компоненты с прокручваемой областью наследуются от TScrollingWinControl, > все зависит от того, насколько область совпадает с желаемой > клиентской областью. Если совпадает, как у TScrollBox/TForm/TFrame > то проще наследоваться от них, если несовпадает, то проще > создавать вложенный контрол, унаследованный от TScrollingWinControl. >
Ну не надо так категорично. :) Не все. (TCustomGrid = class(TCustomControl)) При написании всяких гридов и т.п. особенно, если могут быть фиксируемые столбцы, гораздо логичнее использовать стандартные скроллы. А вот лепить туда вложенный контрол будет уже вырыванием гландов через известное место. :)
-
Макс Черных © (25.07.07 01:46) [25]
Не соглашусь хотя бы по той причине, что CustomGrid - довольно сложный компонент. И писать нечто подобное не для массового использования просто невыгодно.
-
HELP! Подскажите, как сказать системе, что сообщение WMVScroll(var Message: TWMVScroll) обработано? Или я не понимаю, что происходит: обрабатываю это сообщение с флагом SB_LINEUP, а мне после этого тут же валится еще одно сообщение с флагом SB_THUMBPOSITION.
-
На всякие пожарный привожу полный код: procedure TMyDocument.WMVScroll(var Message: TWMVScroll);
var
sbInfo : TSCROLLINFO;
ScrollDY : integer;
YScrollFullLength: integer;
DocumentDY: integer;
begin
case ( Message.ScrollCode ) of
0:
begin
sbInfo.fMask := SIF_POS or SIF_RANGE or SIF_TRACKPOS;
sbInfo.cbSize := sizeof(TSCROLLINFO);
GetScrollInfo( Handle, SB_VERT, sbInfo );
YScrollFullLength := sbInfo.nMax - sbInfo.nMin;
ScrollDY := YScrollFullLength div 100;
DocumentDY := ( ScrollDY * FDocumentHeight ) div YScrollFullLength;
MoveDocumentPosition( 0, DocumentDY );
Repaint();
sbInfo.cbSize := sizeof(TSCROLLINFO);
sbInfo.fMask := SIF_POS;
sbInfo.nPos := sbInfo.nPos - ScrollDY;
SetScrollInfo( Handle, SB_VERT, sbInfo, true );
end;
1:;
2:ShowMessage('');
3:;
else
begin
sbInfo.fMask := SIF_POS or SIF_RANGE or SIF_TRACKPOS;
sbInfo.cbSize := sizeof(TSCROLLINFO);
GetScrollInfo( Handle, SB_VERT, sbInfo );
if ( sbInfo.nPos <> sbInfo.nTrackPos )
then
begin
ScrollDY := sbInfo.nPos - sbInfo.nTrackPos;
YScrollFullLength := sbInfo.nMax - sbInfo.nMin;
DocumentDY := ( ScrollDY * FDocumentHeight ) div YScrollFullLength;
MoveDocumentPosition( 0, DocumentDY );
Repaint();
sbInfo.cbSize := sizeof(TSCROLLINFO);
sbInfo.fMask := SIF_POS;
sbInfo.nPos := sbInfo.nTrackPos;
SetScrollInfo( Handle, SB_VERT, sbInfo, true );
end;
end;
end;
end;
-
-
-
-
"Return Value
If an application processes this message, it should return zero. "
Значений Message.ScrollCode больше, чем Вы обрабатываете
-
> Lacmus © (01.08.07 21:05) [32] > > "Return Value > > If an application processes this message, it should return > zero. " > > Значений Message.ScrollCode больше, чем Вы обрабатываете
Да, я тупой. Спасибо. Помогло.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|