Конференция "Компоненты" » Создание компонента со скроллбарами [D7, WinXP]
 
  • EG (20.07.07 18:45) [0]
    Задача: написать визуальный компонент (), видимую область которого можно прокручивать его собственными  скроллбарами.

    Пояснения: компонент наследуется от TCustomControl'a, обладает свойством Align.

    Вопрос: Что нужно сделать, чтобы у компонента появились виндузовские скроллбары? Есть мнение, что это свойство наследуется от WinControl'a, но не открыто...и что копать к тому же надо в сторону WinApi...

    Очень хочется или подробного комментария, или не менее полезную ссылку. Заранее большое спасибо всем отклинувшимся.
  • Dib@zol © (20.07.07 19:02) [1]

    > копать к тому же надо в сторону WinApi...

    эт правильно. Нужно в CreateParams добавить два стилевых флага: WM_HSCROLL и WM_VSCROLL.
  • EG (20.07.07 19:25) [2]

    > Нужно в CreateParams добавить два стилевых флага


    Это как-то так?

    procedure TMyComponent.CreateParams(var Params: TCreateParams);
    begin
     Params.Style := WM_HSCROLL;
    end;



    Ругается, что параметр задан не верно... Не подскажите синтаксис установки параметров?
  • Dib@zol © (20.07.07 19:29) [3]
    Эх... Никада не делал этого раньше... Я про CreateParams только слышал. Ваще мой тебе совет переходи на АПИ. А с этим погоди ща разберёмся.
  • Dib@zol © (20.07.07 19:34) [4]
    Удалено модератором
  • EG (20.07.07 19:42) [5]

    > Тфу ёшкинсвет, не WM_, а WS_ !!!!!!!!!!! Прости великодушно.
    > ..

    Круто! Заработало! Но чуточку не так, как я ожидал... Теперь мой компонент - отдельное окно... летает себе... но скролл появился!

    И чего это он выпал из контейнера...

    Отделение произошло из-за чего? Что не так с Controls'ами?
  • EG (20.07.07 20:00) [6]
    Разобрался! Вернул на место. Люди, не повторяйте моих ошибок!
    Свойство Params.Style задается в предке, не стоит его полностью изменять, если в этом нет нужды.

    Полная картина выглядит так:

    procedure TMyComponent.CreateParams(var Params: TCreateParams);
    begin
     inherited;
     Params.Style := Params.Style + WS_HSCROLL + WS_VSCROLL;
    end;

    Dib@zol ©  - отдельное спасибо!
  • Dib@zol © (20.07.07 20:00) [7]
    Дело вот в этом. Изини, тож забыл :)
    Params.Style := Params.Style + WM_HSCROLL;
  • Dib@zol © (20.07.07 20:01) [8]

    > Люди, не повторяйте моих ошибок!

    Уже повторили :) Надо ж блин, как совпало ;)
  • EG (20.07.07 20:10) [9]
    А вариант с WinApi как бы выглядел?
  • Dib@zol © (20.07.07 20:20) [10]
    var
     ScrollHWND:HWND;
     WP : Pointer;

    ...

    ScrollHWND:=CreateWindow(0, 'STATIC', '', WS_VISIBLE or WS_CHILD or WS_HSCROLL or WS_VSCROLL, 1, 1, 300, 300, Parent, 0, HInstance, nil);
    longInt(WP):=SetWindowLong(ScrollHWND, GWL_WNDPROC, LongInt(@NewWndProc));

    Где Parent - хендл родительского окна. NewWndProc нужно?
  • EG (20.07.07 20:21) [11]

    > NewWndProc нужно?


    Да!
  • Dib@zol © (20.07.07 20:28) [12]
    function NewWndProc(hWnd : HWND; Msg, WParam, LParam : LongInt) : LongInt; stdcall;
    begin
     Result:=0;
     case Msg of

       WM_COMMAND:
         begin
           // Здесь принимаются сообщения от дочерних контролов
         end;

       WM_CTLCOLOR*:
         begin
           // Ответственные за перерисовку (WM_CTLCOLORSTATIC, WM_CTLCOLOREDIT итп)
         end;

       // Да мало ли чего ещё сюда можно напихать! :) Эти - просто примеры.

       else Result:=CallWindowProc(WP, hWnd, Msg, WParam, LParam);
     end;
    end;
  • EG (20.07.07 20:32) [13]
    Огромный Тенкс!!!!

    Я думаю, что тема прикрыта, но не закрыта...
  • Юрий Зотов © (21.07.07 11:57) [14]
    > EG   (20.07.07 20:32) [13]

    Ну, раз тема не закрыта, то предложу еще одно решение - взять стандартный TScrollBox.

    :о)
  • Dib@zol © (21.07.07 12:17) [15]

    > Юрий Зотов ©   (21.07.07 11:57) [14]

    > Задача: написать визуальный компонент
  • {RASkov} © (21.07.07 13:29) [16]
    > [15] Dib@zol ©   (21.07.07 12:17)
    >
    > > Юрий Зотов ©   (21.07.07 11:57) [14]
    >
    > > Задача: написать визуальный компонент

    Зачем его писать, если он уже написан? :)

    > EG
    Чем твоя задача отличается от [14]? Хотя может.... тогда уже наследуйся от него(TScrollBox)...или его предка (скролингвиндов)... имхо.
    Зачем с нуля "велик" делать?
  • Юрий Зотов © (21.07.07 13:49) [17]
    > Dib@zol ©   (21.07.07 12:17) [15]

    Довольно часто ЗАДАЧА возникает лишь по причине незнания того, что она уже давно ЗАДАЧЕЙ вовсе не является.
    :о)
  • Dib@zol © (21.07.07 14:05) [18]
    Удалено модератором
  • Юрий Зотов © (21.07.07 15:24) [19]
    > Dib@zol ©   (21.07.07 14:05) [18]

    Один человек спросил у другого, где можно купить сигарет. Тот ответил, что их можно купить в магазине, который находится в 5 километрах.

    А другой человек сказал, что такой же магазин находится за углом, в 50 метрах. И тогда первый человек возразил: "Ну так или иначе, я поццказал".

    И ведь действительно подсказал. Но лучше бы он этого не делал.
 
Конференция "Компоненты" » Создание компонента со скроллбарами [D7, WinXP]
Есть новые Нет новых   [118451   +44][b:0][p:0.001]