分组控件(Grouping Controls)

2019-10-18 22:41发布

我使用C ++ Builder的5.有没有一种方法来组组不同的控制,以便通过简单地调用,例如, myGroup.Enabled = false; 将设置所有组控件enabled属性设置为false? 我不能用一个组框,因为控件(标签,复选框,等等)都在不同TabPages

我想问的原因是,所以我没有做调用每个控件的enabled明确财产,可以用一个简单的调用做到这一点。

如果没有,我怎么可以创建一个自定义的控制类来做到这一点?

Answer 1:

您可以使用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测试



Answer 2:

既然你要组的控制并不是在同一个容器,那么我建议使用一个TA​​ction(看TActionList组件)。 所有的TControl后代有一个公共的(有时甚至出版) Action特性。 您可以在同一时间分配给多个控件相同TAction对象。 启用/禁用TAction(或更新它的任何其它性质的)将相应地自动更新所有相关联的控件。



文章来源: Grouping Controls