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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2015, 00:00   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию Управление объектами

Всем привет. Ситуация такая:

Есть некий класс, который по сути дела представляет из себя массив объектов класса TPanel.Эти панельки выполняют функции элементов меню.

И вот какая мысля у меня появилась, при выборе одного из пунктов меню ( т.е. при клике на объект класса TPanel) , этот пункт меню (элемент) подсвечивался и подсветка сохранялась бы до тех пор, пока не будет выбран другой элемент меню.

Реализацию подсветки элементов уже сделал, осталось дело за малым )))

Нужно связать эти панельки, чтобы они были не как раздельные элементы, а вместе составляли бы что то по типу меню из RadioButton ...


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


Код:
class TPanelButGroup
{
	private:
		TPanel *but1;
		TPanel *but2;
		TPanel *but3;
		TPanel *but4;
		TPanel *but5;
		TPanel *but6;
	public:
		void CreateButMenu (TForm *par, int i);
};
Каким образом для класса такого типа можно создать обработчик OnClick ( чтобы уже плясать от него и определять, какой элемент выбран ) ?
-Jack- вне форума Ответить с цитированием
Старый 11.09.2015, 06:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сделай массив TPanel *but=new TPanel[6];
И в цикле поназначай при создании им один и тот же обработчик - метод этого класса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2015, 07:42   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Сделай массив TPanel *but=new TPanel[6];
И в цикле поназначай при создании им один и тот же обработчик - метод этого класса.
А зачем вообще так изголяться? Можно и проще поступить. У каждой панели есть свойство Tag. Присвоим каждой панели в тэге свой номер от 1 до 6. Теперь в обработчике TPanel1Click произведём разыменование объекта:
Код:
void __fastcal TForm1::TPanel1Click(TObject *Sender)
{
  int i = ((TPanel *)Sender->Tag;
  // Тут обрабатываем
  switch(i)
  {
   //.....................................
  }
}
Не забываем каждой панели на вкладке Events в событии onClick подключить наш обработчик созданный для первой панели.
Вот, собственно и всё. К стати, панели в этом случае могут иметь различные номера, даже не по порядку.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.09.2015, 08:53   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут switch? Автору надо подсветить текущую панель (Sender) и убрать подсветку у остальных (те, что != Sender. Ну или те, где Tag != Sender->Tag). Поэтому удобно иметь массив со всеми панелями.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2015, 11:05   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Причем тут switch? Автору надо подсветить текущую панель (Sender) и убрать подсветку у остальных (те, что != Sender. Ну или те, где Tag != Sender->Tag). Поэтому удобно иметь массив со всеми панелями.
Да. switch действительно ни при чём. Но и без массива можно обойтись.

Вот Рабочий код и даже с выпадающими менюшками:
Код:
void __fastcall TForm1::PanelFileClick(TObject *Sender)
{
  PanelFile->Color = clRed;
  PanelOptions->Color = clRed;
  PanelHelp->Color = clRed;
  PanelFile->PopupMenu->AutoPopup = false;
  PanelOptions->PopupMenu->AutoPopup = false;
  PanelHelp->PopupMenu->AutoPopup = false;
  ((TPanel *)Sender)->Color = clLime;
  ((TPanel *)Sender)->PopupMenu->AutoPopup = true;
}
Вложения
Тип файла: rar PanelColor.rar (153.3 Кб, 7 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 11.09.2015 в 11:30.
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.09.2015, 11:18   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но и без массива можно обойтись.
Смитт "Улыбатель" Вессон
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2015, 11:22   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну массив все равно удобнее/логичнее, мало ли что еще понадобится сделать с ними, везде придется копипастить, и забывать об этом при добавлении новой.

+ анимация может быть более сложной, чем просто изменение цвета. Тогда надо будет определить что было выбрано, а не просто всем убирать.

И название метода видимо должно было быть что-то типа PanelMenuClick, вы ж не предлагаете создать 6 обработчиков с этим кодом?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2015, 11:35   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Смитт "Улыбатель" Вессон
Не вижу ничего смешного. Тупо всё обнуляем, а потом в выбранном объекте включаем то, что нужно. И не нужны никакие циклы
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И название метода видимо должно было быть что-то типа PanelMenuClick, вы ж не предлагаете создать 6 обработчиков с этим кодом?
И не нужно создавать 6 обработчиков. Я писал выше, создаём обработчик для одной панели, а остальные подключаем к нему в инспекторе объектов на закладке Events.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 11.09.2015 в 11:38.
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.09.2015, 11:39   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Тогда переименовать его надо, это не только PanelFile же.

Ну и даже это проще с массивом, не надо 6 раз (и при добавлении новых) тыкать во всякие закладки Events и выбирать из списка.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2015, 12:09   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Тупо всё обнуляем, а потом в выбранном объекте включаем то, что нужно. И не нужны никакие циклы
Ну если вдруг понадобится мультивыбор? Т.е. закраска и сброс нескольких? Массив надежнее получается. Костыльов меньше буит
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление графическими объектами Fluffy123 Помощь студентам 1 16.11.2010 19:31
Управление объектами через сеть с помошью сокетов: ritm Работа с сетью в Delphi 2 24.02.2010 09:35
Управление динамическими объектами по Handle SibBear Общие вопросы Delphi 3 17.03.2009 19:12
задачка с объектами LyaLyaLya Помощь студентам 9 09.01.2009 02:02
Управление Программно созданными объектами dars73 Помощь студентам 14 19.11.2007 01:42