С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/32: Рейтинг темы: голосов - 32, средняя оценка - 4.59
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164

Прокрутка вкладок PageControl'a

10.05.2012, 22:38. Показов 6178. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем Привет!
Есть PageControl с вкладками расположенными справа, но не простой, а TAdvOfficePager, поскольку вкладок может быть очень много, то все они не умещаются в видимой части формы, и тут "О, Чудо!" на помощь приходит компонент UpDown бережно прикрученный к PageControl'у именно для таких случаев

Вопрос в том, возможно ли вместо UpDown использовать обычный ScrollBox, для этой самой важной цели прокрутки не уместившихся вкладок?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2012, 22:38
Ответы с готовыми решениями:

Параллельная вертикальная прокрутка двух блоков и отдельная горизонтальная прокрутка одного из двух блоков
Всем привет! Помогите решить проблему, пожалуйста. Есть блок div, внутри которого два блока div (в каждом из них по одной таблице),...

стили вкладок
Никак не осилю стили вкладок. Уже почти все получилось остались мелочи, но.. Вот пример страницы...

Переключение вкладок
Помогите, пожалуйста с одним вопросом. Я создала несколько вкладок в Delphi, при запуске программы не происходит смена вкладок при нажатии...

20
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
10.05.2012, 23:53
А в UpDown-е ты сам программируешь сдвиг. Если да - то можно и ScrollBox использовать.
1
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
11.05.2012, 00:02
Не знаю как с TAdvOfficePager (качать не хочу)
а к обычному PageControl можно прикрутить ScrollBar таким образом

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.FormCreate(Sender: TObject);
begin
ScrollBar1.Max:=PageControl1.PageCount;
end;
 
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
if scrollBar1.Position-1<0 then
  PageControl1.ActivePage:=PageControl1.Pages[0]
else
  PageControl1.ActivePage:=PageControl1.Pages[scrollBar1.Position-1] ;
end;
ScrollBox не предстовляю каким боком ты пытаешься прикрутить.
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
11.05.2012, 00:30  [ТС]
Одиночка, у тебя "Сообщений: 666" Пока я ничего не прогрммирую, UpDown это фича компонента
anonimus, Действительно прикручивается, конечно не то, что хотелось бы, но вариант
0
11.05.2012, 00:37

Не по теме:

Уже перескочил.

1
11.05.2012, 00:44  [ТС]

Не по теме:

Ну я на всякий случай плюнул через левое плечо:D

1
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.05.2012, 00:57
Посмотрел я на PageControl в ScrollBox-е. Да, UpDown автоматом выскакивает. Как убрать не знаю. Можно попробовать самому скрывать вкладки, которые выходят за клиентскую область ScrollBox-а. Самому регулировать размеры скролов и показывать/скрывать вкладки в зависимости от их перемещений. Мороки много. Тут простым решением врядли обойдёшься.
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
08.07.2012, 18:38  [ТС]
И снова я со своим кривым PageControl'ом, теперь другая беда, хочу рассчитать размер бегунка(pagesize) скроллбара, но появился другой побочный эффект, а именно при прокрутке скролла вниз все табы убегают вверх и прячутся там
Вложения
Тип файла: zip PageControl.zip (509.4 Кб, 20 просмотров)
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
08.07.2012, 20:28
Не могу установить TMS AdvOfficePager на D7. На настоящий момент выдаёт:
[Error] advofficepagerde.pas(25): Undeclared identifier: 'TDefaultEditor'
и не могу найти в инете, как это обойти. Не знаешь?
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
08.07.2012, 21:38  [ТС]
Да её в инете трудновато найти, я её из пака выдирал, у меня на делфи7 нормально ставится,
вот архив скомпиленый
Вложения
Тип файла: zip AdvPage.zip (454.4 Кб, 26 просмотров)
0
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
09.07.2012, 12:29  [ТС]
Прикрутил скролл, теперь вроде нормально, осталось ползунок расчитать)))
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.AdvOfficePager1Change(Sender: TObject);
begin
  ScrollBar1.Max := AdvOfficePager1.TabScroller.Max;
  ScrollBar1.Position := AdvOfficePager1.ActivePageIndex + 1;
  ScrollBar1.Visible := AdvOfficePager1.TabScroller.Visible;
end;
 
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
  AdvOfficePager1.TabScroller.Position := ScrollBar1.Position;
  AdvOfficePager1.Refresh;
end;
 
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if WheelDelta > 0 then
    begin
      AdvOfficePager1.ScrollLeftBtnClick;
      AdvOfficePager1.Refresh;
      ScrollBar1.Position := AdvOfficePager1.TabScroller.Position;
    end
  else
    begin
      AdvOfficePager1.ScrollRightBtnClick;
      AdvOfficePager1.Refresh;
      ScrollBar1.Position := AdvOfficePager1.TabScroller.Position;
    end;
end;
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
12.07.2012, 19:30
Вот, в принципе, код для расчёта твоего ползунка:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.AdvOfficePager1Change(Sender: TObject);
Var
  TrackHeight: Integer; { the size of the scroll bar track }
  MinHeight: Integer; { the default size of the thumb tab }
begin
  With ScrollBar1 Do
  Begin
    Max := AdvOfficePager1.TabScroller.Max;
    Position := AdvOfficePager1.ActivePageIndex + 1;
    Visible := AdvOfficePager1.TabScroller.Visible;
    MinHeight := GetSystemMetrics(SM_CYVTHUMB); { save default size }
    If Visible Then
    Begin
      TrackHeight := ClientHeight - 2 * GetSystemMetrics(SM_CYVSCROLL);
      PageSize := TrackHeight div (Max - Min + 1);
      if PageSize < MinHeight then PageSize := MinHeight;
    End;
  End;
end;
Длина рассчитывается как размер полосы скрола, делённый на полное количество строк. Это из описания. Но тут возникла проблема: AdvOfficePager1.TabScroller.Max - всегда равен 1. Поэтому из этого ничего не выйдет. Сначала нужно нормальный мах.
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
12.07.2012, 19:54  [ТС]
Да, я пытался так же рассчитать и в этот же мах и упёрся((((
Там как то видимо надо к Count привязываться))))
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
12.07.2012, 20:14
Поставил так:
Delphi
1
    Max := AdvOfficePager1.AdvPageCount;
Только теперь только после 2 после заполнения страницы рассчитывает размер ползунка. Предполагаю, что это связано с теми двумя, которые стояли изначально. Но нужно проверить.
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
12.07.2012, 20:51  [ТС]
Ну да, я там с ним мучался мучался, сейчас пока забросил
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
12.07.2012, 20:51
По поводу
Ну ты же знаешь что я PageControl мучал, вот представь на нём 100 динамически созданных вкладок в которых ещё куча динамически созданных контролов и к ним надо обращатся)))
Тут всё зависит от того, какая работа будет программно выполняться с этими контролами.
А, предполагаю, однотипные операции с контролами на активной странице. Типа, щелчок по кнопке - на этой же странице записать чего-то в лабел.
Можно, например, установить одинаковые значения в свойствах Tag одинаковым контролам на разных вкладках.
Далее пишем так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function FindControls(Index: Integer):TComponent;
Var
  i : Integer;
Begin
  Result:=Nil;
  With AdvOfficePager1.ActivePage Do
  For i:=0 To ControlCount-1 Do
  If Controls[i].Tag = Index Then
  Begin
     Result:=Controls[i];
     Break;
  End;
End;
 
//Далее для использования просто пишешь:
//Если нужно обратиться к Label в которой Tag = 5
  (FindControls(5) As TLabel).Caption:='!!!!!!!';
//Если нужно обратиться к Edit в котором Tag = 18
  (FindControls(18) As TEdit).Text:='!!!!!!!';
Думаю, можно не проверять на Nil.
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
12.07.2012, 22:41  [ТС]
Это чат, на вкладках комнаты чата, основное обращение это к ричэдиту и эдиту отправки в комнатах)))
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
13.07.2012, 06:43
Тем более. Можно в событии изменения вкладки сделать так:
Delphi
1
2
3
4
5
6
7
8
9
10
Var
  REdit : TRichEdit;
  Edit : TEdit;
 
procedure TForm1.AdvOfficePager1Change(Sender: TObject);
begin
  REdit:=FindControls(1);
  Edit:=FindControls(2);
//Всё остальное...
End;
А дальше обращаться через эти переменные.
1
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
17.07.2012, 07:15
Вот, примерно так как у тебя было задумано, насколько я понимаю:
Меня смутило, правда то, что ты не меняешь активную вкладку при скроллинге, но это твоё дело.
Чтобы отображение не выходило за границы последней страницы вкладок вставил вот такой код:
Delphi
1
2
  If ScrollBar1.Position>(ScrollBar1.Max-ScrollBar1.LargeChange+1) Then
  ScrollBar1.Position:=ScrollBar1.Max-ScrollBar1.LargeChange+1;
в двух местах. Ну и кое какие изменения другие. Например нумерация в скролБаре с 0 до мах-1. Легче сопоставлять с твоим AdvOfficePager1.
Кроме того, не знаю кто сделал тот код для расчёта размера скроллера, но на самомо деле его нужно указывать в количестве позиций на одной странице, которые я подсчитывал пока скролБокс был невидим. Когда он становится видим - это значение и устанавливается в PageSize.
Ну, пиши - если что.
Вложения
Тип файла: rar PageControl.rar (262.4 Кб, 28 просмотров)
1
 Аватар для БогДелфей
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,164
17.07.2012, 13:21  [ТС]
Спасибо))) То что нужно)))
Цитата Сообщение от Одиночка Посмотреть сообщение
Меня смутило, правда то, что ты не меняешь активную вкладку при скроллинге
Например на вкладках, комнаты с личными сообщениями, допустим пользователей 50, при клике на таб личная переписка подгрузится из БД, но размер этой переписки может быть огромен(конечно можно вывести не всю, а часть последних, но пока хочу выводить всю) и загрузка займёт какое то время, конечно не большое, но если бежать по вкладкам сверху вниз то получится эффект торможения, некоторые вкладки моментально проскочит, а на некоторых тормознёт, поэтому удобнее прокрутить вкладки и кликнуть нужную)))
Цитата Сообщение от Одиночка Посмотреть сообщение
Кроме того, не знаю кто сделал тот код для расчёта размера скроллера
Подобный код расчёта скролла я видел на офе embarcadero
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2012, 13:21
Помогаю со студенческими работами здесь

Создание вкладок
Здравствуйте! мне в приложении WPF надо создать панель вкладок и чтобы пользователь мог добавлять новую вкладку в которой будет открываться...

Создание вкладок
Нужно создать вкладки, пример как на скриншоте. Слева - меню, справа - панель, в которой отображаются дополнительные опции. При...

Создание вкладок
нужно создать две вкладки (как на рисунке), но какими библиотеками пользоваться и, собственно, какой командой? с полем memo и временем все...

Создание вкладок
Как в WinForm C# создать вкладки?

Блокировка вкладок
Добрый день! Подскажите как сделать, чтобы при работе в одной вкладке при открытии подчиненной формы, остальные вкладки становились бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru