C++ 创建不可见的TComponent派生类来处理大表单的特定部分是否安全?
在某些情况下,大表单的某些部分应该可以在其他表单中重用。 在这种情况下,推荐的方法是创建从现有VCL类之一派生的新组件。 但要准备在可视化设计器中使用它需要更多的时间。 一个更简单的解决方案是使用中间步骤,在该步骤中,受影响的元素组由新创建的聚合器类处理,聚合器类充当控制器。控制器类不需要拥有这些元素,但可能需要提供自己的方法来处理单击事件 下面是说明所述方法的代码示例。 问题是它有多安全可以吗 窗体在运行时管理其组件时崩溃应用程序C++ 创建不可见的TComponent派生类来处理大表单的特定部分是否安全?,c++,builder,vcl,C++,Builder,Vcl,在某些情况下,大表单的某些部分应该可以在其他表单中重用。 在这种情况下,推荐的方法是创建从现有VCL类之一派生的新组件。 但要准备在可视化设计器中使用它需要更多的时间。 一个更简单的解决方案是使用中间步骤,在该步骤中,受影响的元素组由新创建的聚合器类处理,聚合器类充当控制器。控制器类不需要拥有这些元素,但可能需要提供自己的方法来处理单击事件 下面是说明所述方法的代码示例。 问题是它有多安全可以吗 窗体在运行时管理其组件时崩溃应用程序 class MyController { public:
class MyController
{
public:
// for initialization:
TPanel *pnl;
TCheckBox *cb1;
TCheckBox *cb2;
TCheckBox *cb3;
TEdit inpt;
void SetAdditionalParameters(int a, int b, int c)
{
// ... more code (source.cpp) ... //
this->a = a;
this->b = b;
this->c = c;
}
// public interface:
void DoAction1(int param);
void DoAction2(int param);
void DoAction3(int param);
private:
int a, b, c;
// internal functions
void InternalFunc();
// internal event handlers
void __fastcall InternaOnClick(TObject *Sender);
};
class MyBigForm : public Form
{
__published: // IDE-managed Components
TImage *imgBack;
// ... more members ...//
// Elements to be controlled below:
TPanel *pnl;
TCheckBox *cb1;
TCheckBox *cb2;
TCheckBox *cb3;
TEdit inpt;
// end elements to be controlled
public:
__fastcall MyBigForm(TComponent* Owner);
virtual __fastcall ~MyBigForm(void);
bool __fastcall Init()
{
// ... more code ... //
subView.pnl = pnl;
subView.cb1 = cb1;
subView.cb2 = cb2;
subView.cb3 = cb3;
subView.inpt = inpt;
subView.SetAdditionalParameters(1, 2, 3);
// don't care about delegated elements (use MyController interface)
}
private:
MyController subView;
};
更新
正如下面的评论中所指出的,有一种更好的方法——使用TFrame
我是VCL库的新手,我承认如果VCL在运行时重新创建表单组件,我的方法可能会导致崩溃。
因此,我将原来的问题改为:
VCL能否在运行时重新创建从IDE手动添加到表单中的组件?一个更简单的解决方案是使用
TFrame
。您可以在IDE中可视化地设计它,就像设计时的TForm
一样,根据需要将任何控件和事件处理程序放入其中,然后根据需要在TForm
上创建并定位TFrame
的实例。不需要控制器。这完全符合在一个地方定义相同功能的想法。非常感谢。它看起来是正确且快速的方法。一个更简单的解决方案是使用TFrame
。您可以在IDE中可视化地设计它,就像设计时的TForm
一样,根据需要将任何控件和事件处理程序放入其中,然后根据需要在TForm
上创建并定位TFrame
的实例。不需要控制器。这完全符合在一个地方定义相同功能的想法。非常感谢。这看起来是正确和快速的方法。