如何在Borland C ++ Builder上创建一个按钮数组并使用它?

时间:2012-09-07 21:56:54

标签: c++builder

具体问题

如何在Borland C ++ Builder上创建一系列按钮并使用它?

我正在使用Borland C ++ Builder 6和Borland Developer Studio 2006(Turbo C ++ 2006)。

目的

使用带索引的for循环来处理表单上的很多按钮,例如,更改其标题,大小和位置。

我知道如果我有一个名为Button1的按钮,如果我创建了另一个按钮(通过TButton *Button2 = new TButton(Form1)),则在此按钮的点击事件中,我可以将Button1分配给{{1 (Button2)和他们我可以简单地用Button2 = Button1修改Button1的标题。所以我想扩展它,将实际组件的指针分配给数组的元素,使它们与Button2->Caption循环一起使用。

好吧,如果有人找到了将所有按钮作为数组添加到表单上的方法,那就更好了:)

尝试

以下测试将相应的代码放在TForm1 :: Button1Click()上,这是表单上按钮的事件:

  • 测试1

    • 描述:直接创建数组
    • 代码:

      for
    • 结果:编译错误:

      TButton Buttons[3];
      
    • 评论:
      • 我测试了此测试的一些变体(例如> [C++ Error] Unit1.cpp(23): E2248 Cannot find default constructor > to initialize array element of type 'TButton' ,使用TButton Buttons = new TButton[3]函数和其他函数),但所有这些变量都指向calloc没有构造函数的问题参数,即TButton,但只有TButton()TButton (TComponent *AOwner)TButton(void *ParentWindow);
      • 对于数组,任何使用运算符TButton(const TButton &)new构造函数原型的参数的方法吗?
  • 测试2

    • 描述:创建向量
    • 代码:还在单元标题上添加TButton ...

      #include "vector.h"
    • 结果:第3行的调试器异常:

      vector<TButton> Buttons;
      Buttons[0].Caption="it is ok";
      Buttons[1].Caption="mayday, mayday";
      
    • 评论:
      • 是的,我希望它会被提升,但我把它放在有人说如何在创建之后为该向量上的更多元素分配内存,因为> Project Project1.exe raised exception class EAccessViolation > with message 'Acceess violation at address 401075B9 in module > 'vcl60.bpl'. Read of address 00000254'. Proccess stopped. Use > Step or Run to continue. 因test1失败的原因而无效: (

一般问题

如何为任何可视组件执行此操作?

3 个答案:

答案 0 :(得分:3)

由于同样的原因,您的所有尝试都失败了 - 您正在尝试创建实际TButton对象实例的数组/向量,而不是指针的数组/向量到{{1实例。

创建按钮指针的固定长度数组

TButton

创建按钮指针的动态长度数组

TButton* Buttons[3];
...
Buttons[0] = Button1;
Buttons[1] = Button2;
Buttons[2] = Button3;
...
for(index = 0; index < 3; ++index)
{
    TButton *Btn = Buttons[index];
    // use Btn as needed...
}

创建按钮指针的向量:

TButton** Buttons;
...
Buttons = new TButton*[3];
Buttons[0] = Button1;
Buttons[1] = Button2;
Buttons[2] = Button3;
...
for(index = 0; index < 3; ++index)
{
    TButton *Btn = Buttons[index];
    // use Btn as needed...
}
...
delete[] Buttons;

答案 1 :(得分:1)

所有这些都非常好,而且正确。但是我的意思是用户的问题是其他意图。如果对于所有按钮,我们获得每个按钮的索引没有特殊好处-这只是一个真实的方法:单击即可控制所有组件(按钮,面板,形状等),而不用写每个索引一个新代码, 因此,我更改了一些程序的代码:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

typedef TPanel* TPanels;

TPanels Panels[3] = {Panel1, Panel2, Panel3};

int count;

for(count=0;count<3;count++)

Panels[count]->Left=random(100);

}  

人们可以看到index而不是count。当然不要忘记将randomize()插入TForm1

答案 2 :(得分:0)

Miraculous Typedef + Pseudo Array = Solution

  • 神奇的Typedef:

    • 经过几个小时的搜索,我在Stack Overflow和Google搜索之旅中看到typedef,并想到为什么不:

      typedef TButton* TButtons;
      
    • 嗯,它改变了所有的东西,因为我可以执行:

      TButtons Buttons[3];
      
  • 伪阵列:

    • 关于如何为存储在Buttons[3]阵列上的数据分配内存的问题仍然存在,但是在我的问题的第2段目的部分的知识中,我想:忘记新数据,数据在那里,指向那里(所以我称之为构建一个伪数组,因为我只创建了一个指向现有数据的指针数组):

      TButtons Buttons[3] = {Button1, Button2, Button3};
      
    • 当我通常(通过我的鼠标)将它们放在表单上时,Button1Button2Button3已经创建了。

工作示例

  1. 创建一个新的vcl / forms应用程序项目;
  2. 将3个按钮放在左下图(Button1Button2Button3)以显示该解决方案,还有1个很棒的按钮(Button4)如下图所示,采取行动; the figure bellow point 2
  3. 在第四个按钮的点击事件上插入以下代码,即伟大的(Button4);

    typedef TButton* TButtons;
    TButtons Buttons[3] = {Button1, Button2, Button3};
    int index;
    
    for(index=0;index<3;index++)
    {
            Buttons[index]->Caption=(AnsiString)"teste "+index+" - "+(1+random(100));
            Buttons[index]->Left=25+4*random(100);
            Buttons[index]->Top=25+4*random(100);
    }
    
  4. 执行“shazam!”跑去玩... like a game project