Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2010, 10:23   #1
Lion-Tiger
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 43
По умолчанию Добавление ScrollBar'ов к компоненту

Здравствуйте ПРОграммисты

Я создаю компонент, который будет служить для отображения музыкальных файлов, как в Total Commander'е, только колонок больше: Исполнитель, Альбом, Длительность и т п....

Ближе к делу =)

Создаю новый компонент, от TCustomControl, прописал практически весь функционал, и теперь осталось прорисовать сам компонент...
Это будет представлять из себя таблицу, вверху колонки, ниже идут поля, со значениями к каждой колонке (что-то я совсем очевидные вещи описываю Оо), поля должны прокручиваться, как по горизонтали, так и по вертикали, колонки наверху фиксированы и скролятся только по горизонтали вместе с полями.

Теперь самый главный вопрос, как приделать СкроллБары к моему компоненту, так чтобы они реагировали, как я хочу, тоесть прокручивали не все, что есть на компоненте, а только то, что я хочу??

я пробовал в процедуре Paint запускать SetScrollInfo вот так:
Код:
procedure TLTFieldBox.Paint;
var
   .... 
   info:TScrollInfo;
begin
   ....
   FillChar(info, SizeOf(info), 0);
   with info do
   begin
       cbsize := SizeOf(info);
       fmask  := SIF_ALL;
       nMin:=0;
       nMax:=colleft-Width; //colleft - начало прорисовки колонок; Width - ширина компонента
       nPage :=Width;
       nPos:=0;
   end;
   SetScrollInfo(Self.Handle, SB_HORZ, info, True);
end;
этот фрагмент выполняется, когда ширина всех колонок больше, чем ширина компонента.
но, про проверке скроллы не появляются!
В чем проблема? Или как нужно правильно добавлять скроллы?

Зарание спасибо

Последний раз редактировалось Lion-Tiger; 07.07.2010 в 10:59.
Lion-Tiger вне форума Ответить с цитированием
Старый 07.07.2010, 11:51   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а в CreateParams определены скролы?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.07.2010, 12:03   #3
Lion-Tiger
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 43
По умолчанию

Интересное замечание
Вроде нет, а как их определить?))
Lion-Tiger вне форума Ответить с цитированием
Старый 07.07.2010, 12:09   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

переопределите процедуру эту(подробнее в хелпе).
и там задайте в расширенный стиль.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.07.2010, 12:19   #5
Lion-Tiger
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 43
По умолчанию

Отлично, все зароботало, только вот вместо горизонтального скроллбара появляется вертикальный, параметры SetScrollInfo описаны выше
----------------------------------------------------

А нет, все нормально, оказывается SB_VERT - горизонтальный, а SB_HORZ - вертикальный =))
----------------------------------------------------

хмм, наврено все наоборот, как и было, но я заменил в предыдущем коде строку с комментарием на

nmax:=colleft;

при прогоне программы colleft=276 width=200

и теперь показываются два скроллбара и какой я указываю в SB_****, у того полоска становится длиннее (которую двигают).
и еще одно наблюдение, если указывать просто Handle, то эти самые полоски одинаковые, а если Self.Handle, то одна больше другой...

Так и должно быть, или это я что-то не так делаю?
----------------------------------------------------

Вот процедура CreateParams
Код:
procedure TLTFieldBox.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style:=Params.Style or WS_HSCROLL or WS_VSCROLL;
end;

Последний раз редактировалось Lion-Tiger; 07.07.2010 в 12:40.
Lion-Tiger вне форума Ответить с цитированием
Старый 09.07.2010, 07:38   #6
Lion-Tiger
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 43
По умолчанию

Все, отлично, зарботало, надо было самый первый код исправить на
Код:
FillChar(info, SizeOf(info), 0);
      with info do
      begin
        cbsize := SizeOf(info);
        fmask  := SIF_ALL;
        nMin:=0;
        nMax:=colleft; //Вместо colleft-Width
        nPage :=Width;
        nPos:=0;
      end;
      SetScrollInfo(Self.Handle, SB_HORZ, info, True); //Self.Handle вместо простого Handle
nMax должно быть больше, чем nPage, а раньше было меньше, поэтому и не показывалось, в CreateParams ничего не менял и теперь все отлично =))

спасибо, за помощь!!
Lion-Tiger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
по компоненту Chart Smerch66 Общие вопросы Delphi 2 21.04.2010 08:11
Вопрос по компоненту MediaPlayer FanAnnGeL Компоненты Delphi 4 17.02.2010 00:42
Прикрепление формы к компоненту Impuls1989 Компоненты Delphi 2 28.11.2009 23:19
Вопрос по компоненту StringGrid Vla9240 Помощь студентам 2 14.05.2009 22:36
Вопрос по компоненту MonthCalendar AIst Компоненты Delphi 1 02.04.2009 13:25