【问题标题】:How do I reference successive components (button1, button2, etc.)?如何引用连续的组件(button1、button2 等)?
【发布时间】:2012-07-03 13:21:53
【问题描述】:

我需要获取按钮后的数字以在 for 循环中递增。例如,button1 变成了 button2,等等。我尝试附加一个递增的变量,但 C++ Builder 给出了一个错误,提示“Button 不是 TMain 的成员”。有没有办法实现最终目标或解决这个问题?

【问题讨论】:

  • 具体说明您需要什么。你需要用像“button1”“button2”这样的文本来制作按钮,还是需要像这样制作带有names的按钮,或者你需要搜索具有这样名称的现有按钮?
  • 对不起,我希望标题是这样的,这样它就可以从表格中获取一个单词,并且我将它放在一个循环中,以便表格继续进入下一条记录,但只有第一个按钮里面有一个词

标签: c++ variables c++builder member


【解决方案1】:

您不能在运行时从其他人​​那里构造新的标识符。编译器是正确的,Button 确实不是您的 TMain 类的成员。

相反,构建所需组件的字符串名称,然后调用表单的FindComponent 方法以获取具有该名称的组件。

for (int i = 1; i <= 2; ++i) {
  std::string name = "Button" + IntToStr(i);
  TButton* button = dynamic_cast<TButton*>(this->FindComponent(name));
}

这需要相应地设置按钮的Name 属性。

另一种解决方案是放弃组件名称并将对象放入适当的容器中,例如vector。例如,您可以覆盖 Loaded 方法(您可以确保所有表单的组件都已创建)并在那里填充一个向量:

void TMain::Loaded() {
  TForm::Loaded();
  this->m_buttons.push_back(Button1);
  this->m_buttons.push_back(Button2);
}

现在,当您想要迭代按钮时,只需迭代矢量即可:

for (std::vector<TButton*>::const_iterator it = m_buttons.begin();
     it != m_buttons.end();
     ++it) {
  // ...
}

【讨论】:

  • 好的,您的第一个解决方案摆脱了我原来的问题,但是如何将表格中的数据分配给按钮的标题?我确实有这个,“Main->Button->Caption=Table2->FieldByName ("ItemName")->AsString;”但这仅适用于称为按钮的一个按钮。同样使用该解决方案,它说变量按钮已声明但从未使用过。
  • 这很简单。我向您展示了如何获取指向名为“Button1”或“Button2”的按钮控件的指针并将其存储在名为button 的变量中。所以使用该变量来分配每个按钮的标题:button-&gt;Caption = Table2-&gt;FieldByName("ItemName")-&gt;AsString。使用我的第二个示例:(*it)-&gt;Caption = ...。我不确定您所说的“原始问题”是什么意思。您的问题中描述的唯一问题是关于Button 不是会员的问题。我向您展示了它不需要,因为您可以通过其他方式访问按钮。
  • 啊,非常感谢!它已排序,我会确保记住这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多