我有一个几年前制作的活动表格,编译为 ocx。它安装在工具面板上。
我只在每个主应用程序上使用它的一个实例,并且运行良好。
现在我需要在同一主应用程序中使用此活动表单的多个实例。因此,我将其中几个从工具面板拖放到我的主应用程序中。但是无论我从应用程序使用哪个活动表单(它有一个我打开的内置表单),它的相同实例都会出现。这不是我想要的。
我不知道活动表单是否应该以不同的方式创建,或者我是否应该使用与主应用程序不同的方式使用它。
活动窗体用c++builder XE搭建,主应用用XE6搭建。
这是我创建实例的方式:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ActXList = new TList;
TMyActX *TempActX;
for(int i=0; i<10; i++)
{
TempActX = new TMyActX(Owner);
TempActX->Parent = this; //Tried also with NULL and a new TForm(this), same result
ActXList->Add(TempActX);
TempActX->Init(i); //This adds i to a string in the created instance
}
MyActX1->Init(20); //Adds 20 to a string in the design time created instance
MyActX2->Init(21); //Adds 21 to a string in the instance
}
在这里我打开不同的实例:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyActX *TempActX;
//A Combobox chooses the instance to show
if(ComboBox1->ItemIndex < 10)
{
TempActX = (TMyActX *)ActXList->Items[ComboBox1->ItemIndex];
TempActX->ShowForm();
}
else if(ComboBoxTerminaler->ItemIndex == 10)
MyActX1->ShowForm();
else if(ComboBoxTerminaler->ItemIndex == 11)
MyActX2->ShowForm();
//No matter which instance is chosen to be shown,
//the label with the init-string shows "0 1 2 3...9 20 21" for all of them
}
为了测试,整数 i 被添加到 ->Init() 中的标签中。 TMyActX 有一个显示标签的内部表单。如果我从(使用任何创建的实例)打开它,标签显示“0 1 2 3 4 ...”。因此我得出的结论是 ->Init() 调用相同的实例,并且无论我使用哪个创建的实例打开它,都会打开相同的表单。
如果我在设计时将两个实例放到我的主窗体中,也会发生同样的事情。如果我打开 ocx-form 会显示相同的标签。
我使用 ocx 的原因是 ocx 是支付解决方案的一部分,由外部组织认证。因此,如果可能的话,我不想乱搞它。但是我可以访问它的代码,并且为了测试我可以更改它。
如果您可以访问表单的
TForm
类,那么只需在运行时创建新实例,例如:
TForm *win[10];
for (int i=0;i<10;i++) win[i]=new TForm(this);
其中
this
是指向由 IDE 创建的父 VCL 窗体的指针。这对我有用,但我不使用 ocx,而是我在每个窗口中包含 3 个文件(*.h,*.cpp,*.dfm)
但是我绑定到 BDS2006,所以在较新版本的构建器上,事情可能会有点不同......
不要忘记,要完成这项工作,您的表单中不能有全局变量,并且在应用程序关闭时有适当的
win[]
关闭/销毁方法。
您可以通过它们的指针访问您的窗口(以显示或隐藏它们或其他任何方式)您还应该处理窗口的手动关闭(这样您以后就不会访问死指针)