Конференция "Компоненты" » Создание компонента со скроллбарами [D7, WinXP]
 
  • EG (23.07.07 18:33) [20]
    Поверьте, велик делать никому не охота, а просто приходится...
    Причина проста: нужен компонент с нестандартной функциональностью. Точнее с такой, какой готовые варианты и решения не обладают в полной мере.


    > Чем твоя задача отличается от [14]?


    Тем, что компонент должен быть самодостаточным в своей функциональности.

    Требуемый компонент - это не скроллбар. Скроллбар лишь одна из его видимых частей, реализующая определенную функциональность, в данном случае скроллирование видимой области.
  • Юрий Зотов © (23.07.07 18:43) [21]
    > EG   (23.07.07 18:33) [20]

    А почему бы эту прокручиваемую область не сделать в виде агрегированного TScrollBox?
  • EG (23.07.07 18:45) [22]
    Хм... Ни разу не юзал эту вещь... может помочь в моей ситуации?
  • Юрий Зотов © (23.07.07 19:14) [23]
    Если компонент оконный, а его прокручиваемая область по своей функциональности ничем не отличается от TScrollBox, то ее и надо делать этим самым TScrollBox-ом.

    Компонент в своем конструкторе создает TScrollBox, его Owner-ом и Parent-ом ставит Self, выставляет позицию, размеры и прочие настройки TScrollBox-а. Вот и все.

    Еще более простой вариант - взять фрейм, накидать на него все, что нужно, написать в нем необходимый код и зарегистрировать его в качестве компонента.
  • Игорь Шевченко © (24.07.07 15:24) [24]

    > Если компонент оконный, а его прокручиваемая область по
    > своей функциональности ничем не отличается от TScrollBox,
    >  то ее и надо делать этим самым TScrollBox-ом


    Если нечто выглядит как собака, лает как собака и кусается как собака, то это и есть собака.

    Все компоненты с прокручваемой областью наследуются от TScrollingWinControl, все зависит от того, насколько область совпадает с желаемой клиентской областью. Если совпадает, как у TScrollBox/TForm/TFrame то проще наследоваться от них, если несовпадает, то проще создавать вложенный контрол, унаследованный от TScrollingWinControl.
  • Макс Черных © (25.07.07 01:46) [25]

    > Все компоненты с прокручваемой областью наследуются от TScrollingWinControl,
    >  все зависит от того, насколько область совпадает с желаемой
    > клиентской областью. Если совпадает, как у TScrollBox/TForm/TFrame
    > то проще наследоваться от них, если несовпадает, то проще
    > создавать вложенный контрол, унаследованный от TScrollingWinControl.
    >

    Ну не надо так категорично. :) Не все. (TCustomGrid = class(TCustomControl)) При написании всяких гридов и т.п. особенно, если могут быть фиксируемые столбцы, гораздо логичнее использовать стандартные скроллы. А вот лепить туда вложенный контрол будет уже вырыванием гландов через известное место. :)
  • Игорь Шевченко © (25.07.07 09:42) [26]
    Макс Черных ©   (25.07.07 01:46) [25]

    Не соглашусь хотя бы по той причине, что CustomGrid - довольно сложный компонент. И писать нечто подобное не для массового использования просто невыгодно.
  • EG (01.08.07 19:50) [27]
    HELP!
    Подскажите, как сказать системе, что сообщение

    WMVScroll(var Message: TWMVScroll)



    обработано?

    Или я не понимаю, что происходит: обрабатываю это сообщение с флагом SB_LINEUP, а мне после этого тут же валится еще одно сообщение с флагом SB_THUMBPOSITION.
  • EG (01.08.07 19:58) [28]
    На всякие пожарный привожу полный код:

    procedure TMyDocument.WMVScroll(var Message: TWMVScroll);
    var
     sbInfo : TSCROLLINFO;
     ScrollDY : integer;
     YScrollFullLength: integer;
     DocumentDY: integer;
    begin

     case ( Message.ScrollCode ) of
     {lineUp}
       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;
     {lineDown}
       1:;
     {PageUp}
       2:ShowMessage('');
     {PageDown}
       3:;
     {THUMBPOSITION}
     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;

  • Lacmus © (01.08.07 20:40) [29]
  • EG (01.08.07 20:52) [30]

    > Lacmus ©   (01.08.07 20:40) [29]
    >
    > http://msdn2.microsoft.com/en-us/library/ms651284.aspx


    Может я тупой, но ненашел там ответа
  • EG (01.08.07 20:52) [31]

    > Lacmus ©   (01.08.07 20:40) [29]
    >
    > http://msdn2.microsoft.com/en-us/library/ms651284.aspx


    Может я тупой, но не нашел там ответа...
  • Lacmus © (01.08.07 21:05) [32]
    "Return Value

    If an application processes this message, it should return zero. "

    Значений Message.ScrollCode больше, чем Вы обрабатываете
  • EG (02.08.07 18:16) [33]

    > Lacmus ©   (01.08.07 21:05) [32]
    >
    > "Return Value
    >
    > If an application processes this message, it should return
    > zero. "
    >
    > Значений Message.ScrollCode больше, чем Вы обрабатываете


    Да, я тупой. Спасибо. Помогло.
  • bogdan10110 © (18.07.08 12:01) [34]
    Удалено модератором
  • DimaBr © (18.07.08 13:47) [35]
    Удалено модератором
  • имя (28.03.12 19:13) [36]
    Удалено модератором
  • имя (28.03.12 19:13) [37]
    Удалено модератором
 
Конференция "Компоненты" » Создание компонента со скроллбарами [D7, WinXP]
Есть новые Нет новых   [118230   +17][b:0][p:0.002]