Группировка элементов управления

Я использую C++ Builder 5. Есть ли способ сгруппировать разрозненный набор элементов управления так, чтобы просто вызвать, например, myGroup.Enabled = false; установит всю группу элементов управления enabled свойство ложно? Я не могу использовать GroupBox, так как элементы управления (метки, флажки и т. Д.) Находятся на разных TabPages,

Я спрашиваю, потому что мне не нужно вызывать каждый enabled свойство явно и может сделать это одним простым вызовом.

Если нет, то как я могу создать собственный класс Control для этого?

2 ответа

Решение

Вы можете использовать свойство Tag элементов управления и создать свою собственную группировку.

void TForm1::SetControlState(TWinControl *WinCtrl, const bool IsEnabled, const int TagValue)
{
 // set the enabled property for each control with matching TagValue
 for (int Index = 0; Index < WinCtrl->ControlCount; ++Index)
 {
   if (WinCtrl->Controls[Index]->Tag == TagValue)
   {
     WinCtrl->Controls[Index]->Enabled = IsEnabled;
   }

   // set child controls
   if (WinCtrl->Controls[Index]->InheritsFrom(__classid(TWinControl)))
   {
     TWinControl *TempWinCtrl;
     TempWinCtrl = static_cast<TWinControl *>(WinCtrl->Controls[Index]);
     SetControlState(TempWinCtrl, IsEnabled, TagValue);
   }
 } // end for
}

В качестве альтернативы, если вы хотите включить / отключить все элементы управления за один раз.

void TForm1::SetControlState(TWinControl *WinCtrl, const bool IsEnabled)
{
 // set the enabled property for each control with parent TabSheet
 for (int Index = 0; Index < WinCtrl->ControlCount; ++Index)
 {
   WinCtrl->Controls[Index]->Enabled = IsEnabled;

   // disable child controls
   if (WinCtrl->Controls[Index]->InheritsFrom(__classid(TWinControl)))
   {
     TWinControl *TempWinCtrl;
     TempWinCtrl = static_cast<TWinControl *>(WinCtrl->Controls[Index]);
     SetControlState(TempWinCtrl, IsEnabled);
   }
 } // end for
} 

Примеры:

// disable all controls on the form
SetControlState(Form1, false);

// disable all controls on a tabsheet
SetControlState(TabSheet1, false);

ПРИМЕЧАНИЕ. Приведенный выше код был протестирован с C++Builder 2007

Поскольку элементы управления, которые вы хотите сгруппировать, не находятся в одном и том же контейнере, я предлагаю использовать TAction (посмотрите на компонент TActionList). Все потомки TControl имеют общедоступные (иногда даже опубликованные) Action имущество. Вы можете иметь один и тот же объект TAction, назначенный нескольким элементам управления одновременно. Включение / отключение TAction (или обновление любых других его свойств) автоматически обновит все связанные элементы управления соответствующим образом.

Другие вопросы по тегам