Группировка элементов управления
Я использую 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 (или обновление любых других его свойств) автоматически обновит все связанные элементы управления соответствующим образом.