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

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

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

В общем есть PageControl. Мне необходимо чтобы слева были вкладки и в них еще кнопки.
Допустим нажимаю на Диаграммы и справа высвечивались диаграммы, нажимаю на Наряды, высвечивались наряды.
Как это организовать?
0
Миниатюры
PageControl создание меню с контекстом справа  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2014, 16:42
Ответы с готовыми решениями:

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

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

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

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

31
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.05.2014, 16:51 2
Добавь справа набор панелей, каждая из которых будет соответствовать своей кнопке. Кнопки переключают свойство Visible панелей.
1
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
18.05.2014, 16:55  [ТС] 3
Дело в том что панелей тогда будет очень много. Как это более грамотно сделать?

Добавлено через 2 минуты
Может можно справа поставить еще 1 PageControl и както запредить показывать вкладки? А переключать их программно. Такое возможно?
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.05.2014, 17:08 4
Панелей много будет, а вкладок будет не много, да?
То на то и выйдет, просто чтоб не париться с количествами надо панели или вкладки доп-пэйчконтрола создавать и заполнять кодом. Если какие-то из вкладок кодом заполнять нецелесообразно, создай для них фреймы.
1
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
18.05.2014, 17:17  [ТС] 5
С фреймами не работал, пока.
Допустим создаю я куча фреймов. Как при нажатии на кнопку вывести фрейм в панель? так можно?

Добавлено через 4 минуты
Дело в том, что использование фреймов самый оптимальный вариант, т.к. в каждой фрейме будет уйма кода и компонентов.
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.05.2014, 17:20 6
Лучший ответ Сообщение было отмечено vetal0007 как решение

Решение

Можно, конечно. Кодом создаешь заранее подготовленный объект фрейма, ставишь ему панель Parent'ом - и вуаля.
Можешь то же самое и с вкладками pagecontrol сделать, не суть. Скрытие вкладок - Все формы в одном окне

Добавлено через 1 минуту
В случае с фреймами, кстати, достаточно одной панели для размещения их всех. Ну, по очереди, разумеется.
1
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
18.05.2014, 18:26  [ТС] 7
Вот только не пойму одно. Допустим нажал одну кнопку. В панели появился фрейм, нажимаю вторую и в панел появился 2й фрейм, а 1й остался. Так?

Добавлено через 11 минут
Можно как-то удалить все компоненты, которые находятся в Панели?

Добавлено через 33 минуты
Как добавить фрейм, созданный ранее программно?

Добавлено через 8 минут
Короче получилось сделать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::sBitBtn3Click(TObject *Sender)
{
Frame1 = new TFrame1(Form1);
Frame1->Parent = sPanel1;
Frame2->Free();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::sBitBtn4Click(TObject *Sender)
{
Frame2 = new TFrame2(Form1);
Frame2->Parent = sPanel1;
Frame2->Left=100;
Frame1->Free();
}
Но при повторном нажатии на одну и ту же кнопку выскакивет ошибка, что нельзя создать еще 1 фрейм с таким же названием. Короче как-то очень тяжело...

Добавлено через 6 минут
Как сделать проверку? Типо если есть фрейм с таким названием, то ничего не делать, иначе создать фрейм.
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.05.2014, 19:49 8
Лучший ответ Сообщение было отмечено vetal0007 как решение

Решение

Во-первых, есть метод FindComponent() - позволяет найти компонент по имени. Конечно, желательно-таки задавать имя при создании нового фрейма, будет проще.
Если же указатели на фреймы сохраняются, то достаточно делать как-то так:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::sBitBtn3Click(TObject *Sender)
{
  if( ! Frame1 )
  {
    Frame1 = new TFrame1(Form1);
    Frame1->Parent = sPanel1;
  }
}
И нет нужды удалять фреймы каждый раз при отображении следующего, можно их просто скрывать. А очистку делать уже тогда, когда фреймы не нужны - при закрытии вмещающего окна или вроде того. Если же их действительно может много накопиться, то делать очистку по накоплению некоторого количества созданных фреймов.

Хотя, такой подход, как ты пытаешься использовать, потребует очень много писанины. Лучше всего обзавестись табличкой соответствия кнопок( по их именам или указателям на них ) и фреймов( аналогично ). Тогда в любой момент можно будет узнать, какой фрейм отображается, с какой кнопкой он связан или получить список всех уже созданных фреймов.

Добавлено через 1 минуту
Да, и кроме того не понадобится тьма обработчиков для кнопок - достаточно будет одного...
1
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
18.05.2014, 21:44  [ТС] 9
Все ровно как-то не так...
То нажимаешь и ошибка вылетает, то нажимаешь, а фрейм не переключается...

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
void __fastcall TForm1::sBitBtn4Click(TObject *Sender)
{
  if( ! Frame2 )
  {
    Frame2 = new TFrame2(Form1);
    Frame2->Parent = sPanel1;
    Frame2->Width=sPanel1->Width;
    Frame2->Height=sPanel1->Height;
  }
  else {Frame2->Show();}
  if (Frame1) Frame1->Hide();
  if (Frame3) Frame1->Hide();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::sBitBtn6Click(TObject *Sender)
{
  if( ! Frame3 )
  {
    Frame3 = new TFrame3(Form1);
    Frame3->Parent = sPanel1;
    Frame3->Width=sPanel1->Width;
    Frame3->Height=sPanel1->Height;
  }
  else {Frame3->Show();}
  if (Frame1) Frame1->Hide();
  if (Frame2) Frame2->Hide();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::sBitBtn3Click(TObject *Sender)
{
  if( ! Frame1 )
  {
    Frame1 = new TFrame1(Form1);
    Frame1->Parent = sPanel1;
    Frame1->Width=sPanel1->Width;
    Frame1->Height=sPanel1->Height;
  }
  else {Frame1->Show();}
  if (Frame2) Frame2->Hide();
  if (Frame3) Frame3->Hide();
}
//---------------------------------------------------------------------------
Скрин1 - Кнопки с Name
Когда нажимаю в такой последовательности:
sBitBtn4
sBitBtn6
sBitBtn4
Вылетает ошибка, изображенная на Скрин2

Когда в такой:
sBitBtn4
sBitBtn3
sBitBtn6
sBitBtn4
То последнее не переключается...
0
Миниатюры
PageControl создание меню с контекстом справа   PageControl создание меню с контекстом справа  
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
18.05.2014, 21:48  [ТС] 10
Все разобрался!=)) Туплю. Пора отдохнуть)
if (Frame3) Frame1->Hide();
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.05.2014, 00:04 11
Капец. На такое непотребство я смотреть не могу.

Оцени такой подход:
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
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
    TPageControl * pgc1;
    TTabSheet * ts1;
    TTabSheet * ts2;
    TButton * btn1;
    TButton * btn2;
    TButton * btn3;
    TButton * btn4;
    TButton * btn5;
    TPanel * pnl_frame_host;
 
    void __fastcall btn1Click( TObject * Sender );
 
private: // User declarations
 
        public : // User declarations
        typedef std::map < String, String > t_btns_to_frames_table;
 
    t_btns_to_frames_table table;
 
    __fastcall TForm1( TComponent * Owner );
    // __fastcall ~TForm1( );
} ;
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
__fastcall TForm1::TForm1( TComponent * Owner ) :
    TForm( Owner )
{
    for ( size_t i( 0 ), i_limit( ComponentCount ); i < i_limit; ++i )
    {
        if ( Components[ i ]->ClassNameIs( "TButton" ) &&
            static_cast < TControl * > ( Components[ i ] )->Parent->ClassNameIs( "TTabSheet" ) )
        {
            TFrame2 * frm = new TFrame2( this );
            TButton * btn = static_cast < TButton * > ( Components[ i ] );
 
            frm->Name = "frame_" + btn->Caption;
            frm->Parent = pnl_frame_host;
            frm->pnl1->Caption = btn->Caption;
            table[ btn->Name ] = frm->Name;
        }
    }
}
 
// ---------------------------------------------------------------------------
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::btn1Click( TObject * Sender )
{
    TButton * btn( static_cast < TButton * > ( Sender ) );
 
    for ( t_btns_to_frames_table::iterator it( table.begin( ) ), end( table.end( ) ); it != end; ++it )
    {
        static_cast < TControl * > ( FindComponent( it->second ) )->Visible = false;
    }
    static_cast < TControl * > ( FindComponent( table[ btn->Name ] ) )->Visible = true;
}
Метод еще можно( и нужно ) усовершенствовать до неузнаваемости, но обрати внимание на основу. Кнопки с фреймами связаны табличкой. Всем кнопкам назначен один обработчик.
1
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 13:04  [ТС] 12
Пока тяжело воспринимаемый код, уже не соображаю) Завтра буду разбираться, спасибо за труды.

Добавлено через 11 часов 5 минут
Так, начал разбираться, создал новый проект для пробы.
Какие библиотеки нужно подключить? Вылетают ошибки тут:
C++
1
typedef std::map < String, String > t_btns_to_frames_table;
и т.д.

Добавлено через 2 минуты
Ага. Подключил #include <map>

Добавлено через 5 минут
Все ровно не сильно понимаю.

Добавлено через 5 минут
Нажимаю на кнопку и вылетает ошибка
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.05.2014, 13:08 13
Какая ошибка?
0
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 13:09  [ТС] 14
Вот такая:
0
Миниатюры
PageControl создание меню с контекстом справа  
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 13:13  [ТС] 15
Я б выложил проект, но у меня стоит AlphaControl. Если у тебя его нету, то компоненты не найдет... И у меня XE2, а у тебя насколько я понял XE3
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.05.2014, 13:15 16
Выход за границы массива, обращение по невалидному указателю и все в таком духе...

Показывай свой код, указывай ошибки и места, на которых они вылетают - это общий такой алгоритм, если хочешь получить помощь эффективно - на будущее. А-то вытаскивать из тебя информацию по одному наводящему за раз ни у кого терпения не хватит.
0
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 13:21  [ТС] 17
Код абсолютно такой же как и у тебя, вплоть до названия переменных. Ошибка вылить при нажатии на btn1, а не при компиляции.
0
Миниатюры
PageControl создание меню с контекстом справа  
Вложения
Тип файла: rar C++ Builder Frame.rar (8.37 Мб, 4 просмотров)
29 / 29 / 3
Регистрация: 11.02.2012
Сообщений: 339
19.05.2014, 13:40  [ТС] 18
Или можешь просто выложить свой проект для наглядности?
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.05.2014, 14:13 19
Обрати внимание, как у меня заполняется таблица соответствия в конструкторе. Для простоты я сделал поиск по именам классов - TButton и TTabSheet. Ты же используешь другие классы контролов, так что таблица просто не заполняется. Помимо этого неплохо бы ввести рантайм-проверку корректности заполнения таблицы. Я привел элементарнейший пример лишь для демонстрации подхода - развивать его уже тебе.
0
Эксперт С++
8342 / 6091 / 607
Регистрация: 10.12.2010
Сообщений: 28,333
Записей в блоге: 29
19.05.2014, 20:08 20
Цитата Сообщение от vetal0007 Посмотреть сообщение
Допустим нажимаю на Диаграммы и справа высвечивались диаграммы, нажимаю на Наряды, высвечивались наряды.
Тут данные будут одинаковые или разные ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2014, 20:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.