Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339

PageControl создание меню с контекстом справа

18.05.2014, 16:42. Показов 4798. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть PageControl. Мне необходимо чтобы слева были вкладки и в них еще кнопки.
Допустим нажимаю на Диаграммы и справа высвечивались диаграммы, нажимаю на Наряды, высвечивались наряды.
Как это организовать?
Миниатюры
PageControl создание меню с контекстом справа  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2014, 16:42
Ответы с готовыми решениями:

Dreamscene: в контекстом меню не появляется "Set as desktop background"
Добрый день всем. На днях получил новый системник, поставил виндовс 7 64-битную, по привычке скачал и попытался установить Dreamscene...

У меня есть меню, с левой стороны,как вставить картинку или текст справа от меню?
У меня есть меню, с левой стороны,как вставить картинку или текст справа от меню?????????????

Как сделать чтобы в контекстом меню папки было "упорядочить значки" -> "создан"?
Друзья! Открываю папку, на белом фоне (вид настроен "список"): ПКМ->упорядочить значки-> и четыре пункта: -имя -размер ...

31
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 20:59  [ТС]
Студворк — интернет-сервис помощи студентам
В смысле одинаковые? Разные конечно. Это как меню. Там много будет кнопок.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.05.2014, 21:14
C++
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <assert.h>
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
  // Cïèñîê "Èìÿ"= Îáúåêò(TFrame)
  BtnNamesList= new TStringList;
  BtnNamesList->AddObject("Ïåðâûé",NULL);
  BtnNamesList->AddObject("Âòîðîé",NULL);
 
  // Ñîçäàåì êíîïêè
  const int count= BtnNamesList->Count;
  for(int i=0; i<count; ++i)
  {
    TButton* ButtonX= new TButton(TabSheet1);
    ButtonX->Parent= TabSheet1;
    ButtonX->Caption=  BtnNamesList->Strings[i];
    ButtonX->Name="";
    ButtonX->Left= 5;
    ButtonX->Top= 10+i*35;
    ButtonX->Width= 100;
    ButtonX->OnClick= &ButtonXClick;
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ButtonXClick(TObject *Sender)
{
    TButton* ButtonX= static_cast<TButton*>(Sender); // Êíîïêà íà êîòîðóþ íàæàëè
    assert(ButtonX);
 
    int index= BtnNamesList->IndexOf(ButtonX->Caption); // Ÿ èíäåêñ â ñïèñêå
    if(index>=0) // Åñëè èìÿ êíîïêè åñòü â ñïèñêå
    {
      TTabSheet* TabSheetX= NULL;
      TObject* Object= BtnNamesList->Objects[index]; // Áåðåì ñîòâåòâóþùèé îáúåêò(TFrame)
      if(Object) // Åñëè ôðåéì óæå ñîçäàí íàõîäèì åãî âêëàäêó (Object!=NULL)
      {
        TFrame* FrameX = static_cast<TFrame*>(Object);
        assert(FrameX);
        TabSheetX= static_cast<TTabSheet*>(FrameX->Parent);
        assert(TabSheetX);
      }
      else // Åñëè íå ñîçäàí ôðåéì, ñîçäàåì âêëàäêó à íà íåé ôðåéì
      {
        TabSheetX= new TTabSheet(PageControl2);
        TabSheetX->PageControl=  PageControl2;
        TabSheetX->Parent=       PageControl2;
        TabSheetX->Caption=      ButtonX->Caption;
 
        TFrame* FrameX= NULL;
        switch(index) // Êàêîé ôðåéì ñîçäàåì ?
        {
          case 0: FrameX= new TFrame1(TabSheetX); break;
          case 1: FrameX= new TFrame2(TabSheetX); break;
        }
 
        FrameX->Parent= TabSheetX;
        FrameX->Align=  alClient; // Ôðåéì ðàñòÿãèâàåòñÿ ïî âñåé âêëàäêå
        BtnNamesList->Objects[index]= FrameX; // çàäàåì ôðåéì â ñïèñêå
      }
      PageControl2->ActivePage= TabSheetX; // Äåëàåì åãî âêëàäêó àêòèâîé
    }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
  delete BtnNamesList;
}
//---------------------------------------------------------------------------
Вложения
Тип файла: zip Пример с Фреймами.zip (305.4 Кб, 3 просмотров)
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.05.2014, 21:36
Цитата Сообщение от Avazart Посмотреть сообщение
Тут данные будут одинаковые или разные ?
Цитата Сообщение от vetal0007 Посмотреть сообщение
В смысле одинаковые? Разные конечно. Это как меню. Там много будет кнопок.
Я хотел сказать на фреймах будут одинаковые контролы лежать или нет ?
Собственно если одинаковые то можно обойтись одним классом формы.
0
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 21:46  [ТС]
Так даже круче. Спасибо.
Теперь как вкладки создаются и можно вернуться куда надо. Замечательно
Теперь бы разобраться как закрывать фреймы и вкладку...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.05.2014, 21:59
Цитата Сообщение от Avazart Посмотреть сообщение
одним классом формы.
одим классом фрейма

Цитата Сообщение от vetal0007 Посмотреть сообщение
Теперь бы разобраться как закрывать фреймы и вкладку...
Да тут сложнее, думаю самое оптимальное - с помощью всплывающего меню "закрыть": удалить вкладку и обнулить "объект" в списке.
0
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 22:50  [ТС]
Очень тяжело воспринимаю эти динамически созданные объекты.
При создании динамических TabSheet пишу это:
C++
1
TabSheetX->PopupMenu=P1;
Далее в событии OnClick кнопки так удаляется из списка?
C++
1
BtnNamesList->Delete(индекс);
Как узнать индекс?

Добавлено через 42 минуты
Получилось так:
C++
1
2
3
  BtnNamesList->Delete(BtnNamesList->IndexOf(PageControl2->ActivePage->Caption));
  BtnNamesList->AddObject(PageControl2->ActivePage->Caption,NULL);
  delete PageControl2->ActivePage;
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.05.2014, 23:00
C++
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
//---------------------------------------------------------------------------
void __fastcall TMainForm::PageControl2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if( Button == mbRight &&                 // клик правой
      PageControl2->ActivePageIndex>=0 &&  // есть активная вкладка
      Y<= PageControl2->ActivePage->Top)   // клик в области заголовке
  {
    TPoint P;
    GetCursorPos(&P);
    PopupMenu1->Popup(P.x,P.y);  // вызываем меню
  }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::NCloseClick(TObject *Sender)
{ // Пункт меню закрыть
  TTabSheet* TabSheetX= PageControl2->ActivePage;
  assert(TabSheetX);
 
  int ObjectIndex= BtnNamesList->IndexOf(TabSheetX->Caption);
  if(ObjectIndex>=0)
  {
    delete TabSheetX;
    BtnNamesList->Objects[ObjectIndex]= NULL;
  }
}
//---------------------------------------------------------------------------
Вложения
Тип файла: zip Пример с Фреймами.zip (306.6 Кб, 5 просмотров)
1
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 23:11  [ТС]
Нет, все таки тут не правильно:
C++
1
2
BtnNamesList->Delete(BtnNamesList->IndexOf(PageControl2->ActivePage->Caption));
  BtnNamesList->AddObject(PageControl2->ActivePage->Caption,NULL);
Я его удаляю и создаю, а надо обнулить... Как это сделать, ато индексы меняются...

Добавлено через 2 минуты
О! Все отлично, спасибо огромное!

Добавлено через 8 минут
Последний вопрос:
Как сделать чтобы при нажатии правой кнопкой на неактивную вкладку, сначала она активировалась, а потом уже выпадало контекстное меню?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.05.2014, 23:43
Хз, думать надо...
C++
1
 Y<= PageControl2->ActivePage->Top)   // êëèê â îáëàñòè çàãîëîâêå
Писалось на скорую руку.
Добавлено через 5 минут
Можно так решить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------------------------------------------------------------
void __fastcall TMainForm::PageControl2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if( Button == mbRight)                 // êëèê ïðàâîé
  {
    PageControl2->ActivePageIndex=
      PageControl2->IndexOfTabAt(X,Y);
 
    if(PageControl2->ActivePageIndex>=0)
    {
      if(Y<=PageControl2->ActivePage->Top)
      {
        TPoint P;
        GetCursorPos(&P);
        PopupMenu1->Popup(P.x,P.y);  // âûçûâàåì ìåíþ
      }
    }
  }
}
//---------------------------------------------------------------------------
Добавлено через 15 минут
С другого форума
В пакете AlphaControls есть компонент TsPageControl. Там есть свойство, отвечающее за показ крестика на табшитах.
Так что если используешь альфу то думаю стоит посмотреть в эту сторону.
0
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 23:44  [ТС]
Очень интересно. Нашел. Она закрывает вкладку, но теперь надо объект обнулить.
PageControl2->ActivePage тут уже не прокатит...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.05.2014, 00:01
Цитата Сообщение от vetal0007 Посмотреть сообщение
Нашел.
Ты про TsPageControl ? Там и обработчик должен быть соответствующий.

Кстати вместо набора кнопок я обычно TreeView использую, там есть свойство аналогичное Objects
0
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
20.05.2014, 00:23  [ТС]
Получилось так:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::PageControl2CloseBtnClick(TComponent *Sender, int TabIndex,
          bool &CanClose, TacCloseAction &Action)
{
int ObjectIndex= BtnNamesList->IndexOf(PageControl2->Pages[TabIndex]->Caption);
  if(ObjectIndex>=0)
  {
    BtnNamesList->Objects[ObjectIndex]= NULL;
  }
}
Добавлено через 17 минут
Цитата Сообщение от Avazart Посмотреть сообщение
В пакете AlphaControls есть компонент TsPageControl. Там есть свойство, отвечающее за показ крестика на табшитах.
Ты кстати как мысли прочитал Я в это время пытался кнопку в вкладку впихнуть, а оказывается в AlphaControl это предусмотренно
Вроде все работает отлично, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.05.2014, 00:23

Справа меню, над ним "картинки" нажимая на которые меню меняется на другое содержимое
не очень понимаю на чем работает меню ( http://wpnew.ru/ - справо меню, над ним &quot;картинки&quot; нажимая на которые меню меняется на другое...

Создание кастомного Pagecontrol
Всем доброго времени суток ! Появилась идея создать собственный PageControl с собственной отрисовкой вкладок компонента минуя WinApi. ...

Создание скрола в pagecontrol
парни, как в pagecontrol создать бардюр?

Динамическое создание вкладок в PageControl
Я пишу html-редактор..использовал конпонент PageControl..на котором 2 вкладки (визуальный режим и редактирование кода)..тоесь на первой...

Динамическое создание вкладок PageControl и их сохранение
Доброго времени суток, форумцы! Сейчас написана программа по работе с Excel-документами. К сожалению, все статично, все прописано в...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru