如何以编程方式检查表单应用程序中的所有复选框?

4
我想在单击按钮时检查所有复选框。所有对象都在Visual Studio 2010 C++的应用程序表单中。问题的关键是每个对象(复选框)都有不同的名称,CheckBox1,CheckBox2等。我创建了一个UnicodeString,其值为“CheckBox”,并且具有从1开始的int值,并将它们组合在第三个变量中以查找对象,这很有效,但我不知道如何检查所有这些框,请帮忙。

Windows 7、64位、Visual Studio 2010(C++)或C++ Builder 2010。


在Win32 API中,复选框没有名称 - 它们有数字ID。我想你正在使用C++ Builder的库(还叫OWL吗?)并将其误认为是WinAPI。请重新标记。 - Seva Alekseyev
是哪一个?C++ Builder还是Visual Studio 2010? - Cody Gray
它们不一样。我对C++ Builder并不是了解得非常透彻,但我知道它提供了一个自定义的包装库来封装Win32 API。如果你正在使用该库,那么你编写的针对它的代码将不能转移到Visual C++。 - Cody Gray
3个回答

2

我曾为另一个组件做过类似的事情,这是我使用C++ Builder完成的方式。

for (int i = 0; i < this->ComponentCount; i++)
{
 TCheckBox *TempCheckBox = dynamic_cast<TCheckBox *>(this->Components[i]);
 if (TempCheckBox)
 {
   TempCheckBox->Checked = true;
 }
}

这将遍历您表单上的所有组件,如果组件是TCheckBox,则会被选中。

1
为什么不把所有复选框添加到一个向量中,然后在必要时遍历它们?这将允许您单独引用每个复选框,但同时又全部引用。
     cliext::vector<System::Windows::Forms::CheckBox^> items;
     items.push_back(checkbox1);
     .
     .
     .
     items.push_back(checkboxN);

包括这个内容也很重要

#include <cliext/vector>

由于标准库中的法向量当前无法支持此控件。


是的,我需要类似的东西,但我必须测试代码。太棒了! - Ivan Pericic
整个意图在于避免明确列出复选框。 - Seva Alekseyev
是的,但如果您扩展应用程序并且某个时刻您不想要程序中的每个复选框都被选中怎么办?您可以将复选框本地化到这个向量中,并在需要此功能时遍历此向量。 - Tim

1
在C++Builder中,您可以将所有的TCheckBox*指针放入一个数组或std::vector中,需要时可以通过循环遍历它们,例如:
TCheckBox* cb[10];

__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner)
{
    cb[0] = CheckBox1;
    cb[1] = CheckBox2;
    ...
    cb[9] = CheckBox10;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for (int i = 0; i < 10; ++i)
        cb[i]->Checked = true;
}

如果您有很多复选框,不想手动填写整个数组,可以使用循环代替:
__fastcall TForm1::TForm1(TComponent *Owner)
    : TForm(Owner)
{
    for (int i = 0; i < 10; ++i)
        cb[i] = (TCheckBox*) FindComponent("CheckBox" + IntToStr(i+1));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接