如何在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失败的原因而无效: (如何为任何可视组件执行此操作?
答案 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)
神奇的Typedef:
经过几个小时的搜索,我在Stack Overflow和Google搜索之旅中看到typedef
,并想到为什么不:
typedef TButton* TButtons;
嗯,它改变了所有的东西,因为我可以执行:
TButtons Buttons[3];
伪阵列:
关于如何为存储在Buttons[3]
阵列上的数据分配内存的问题仍然存在,但是在我的问题的第2段目的部分的知识中,我想:忘记新数据,数据在那里,指向那里(所以我称之为构建一个伪数组,因为我只创建了一个指向现有数据的指针数组):
TButtons Buttons[3] = {Button1, Button2, Button3};
Button1
,Button2
和Button3
已经创建了。Button1
,Button2
,Button3
)以显示该解决方案,还有1个很棒的按钮(Button4
)如下图所示,采取行动;
在第四个按钮的点击事件上插入以下代码,即伟大的(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);
}