29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339

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

18.05.2014, 16:42. Показов 4811. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение 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) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru