相同活动表单的多个实例

问题描述 投票:0回答:1

我有一个几年前制作的活动表格,编译为 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 是支付解决方案的一部分,由外部组织认证。因此,如果可能的话,我不想乱搞它。但是我可以访问它的代码,并且为了测试我可以更改它。

c++builder
1个回答
0
投票

如果您可以访问表单的

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[]
关闭/销毁方法。

您可以通过它们的指针访问您的窗口(以显示或隐藏它们或其他任何方式)您还应该处理窗口的手动关闭(这样您以后就不会访问死指针)

© www.soinside.com 2019 - 2024. All rights reserved.