【发布时间】:2016-06-27 03:14:26
【问题描述】:
我想在运行时用许多具有相同列表的组合框填写表单。它们还获得相同的事件处理程序,该处理程序取决于Sender 对象的名称。但是,这需要很长时间,我猜我做错了什么。
我正在使用 XE2 Rad Studio C++ Builder 和 VCL GUI。
编辑:这些框包含不同类型的内容,并分布在表单内的几个标签页中。但是,有必要一目了然地显示它选择的至少 80 个。在单击 TLabel 以选择不同的元素时,将它们替换为 TLabel 并创建一个 TCombobox 会更好吗?
代码与此类似:
void __fastcall TForm::TForm(){
int i=0;
TStringList* targetlist = new TStringList();
targetlist->Add("Normal");
targetlist->Add("Inverted");
Vcl::Stdctrls::TComboBox **com = new Vcl::Stdctrls::TComboBox[512];
for(i=0;i<512;++i){
com[i]=new Vcl::Stdctrls::TComboBox(this);
com[i]->Parent=this;
com[i]->Name.printf(L"Combo_%d", i);
com[i]->SetBounds(10, 198 + 20 * i, 130, 200);
com[i]->Items = targetlist;
com[i]->ItemIndex = 0;
com[i]->Style = csDropDownList;
com[i]->OnChange = MyComboTriggerChange;
}
}
在我的机器上一次迭代似乎需要大约 20 毫秒(使用 std::clock 测试),这使得这部分大约需要 10 秒。指针在表单销毁时被删除。为了简化,我只是把他们的声明放在这里。
有没有更好的方法来创建多个组合框?也许克隆它们?
【问题讨论】:
-
很抱歉,一个表单上的 512 个组合框简直太荒谬了。您需要认真重新考虑您的用户界面。它们都包含相同的项目这一事实使它更加可笑。
-
@KenWhite 感谢您的评论!好吧,老实说,有 8 种不同类型的内容,但我在这里简化了一点,因为这对问题无关紧要……表单需要显示很多信息。我可以用标签替换 512 个框,然后在单击标签时显示一个框,但我不确定这会更快...
-
@Julian:当然会。一方面,
TLabel是一个图形控件,因此它不会像TComboBox这样的窗口控件占用那么多资源。 512 图形控件将比 512 窗口控件运行得更快。如果你真的很喜欢冒险,你可以编写自己的自定义图形控件,用单个控件替换这 512 个单独的标签(我曾经这样做是用几个自定义图形控件实例替换数百个彩色TPanel控件,显示多个彩色方块,性能显着提高,同时开销减少了 20 多%)。 -
@Julian:第二,现有的控件可以显示多个项目并在单击时提供对它们的嵌入式编辑,例如
TListView、TStringGrid、TValueListEditor等。
标签: c++ c++builder vcl c++builder-xe2 tcombobox