Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建不可见的TComponent派生类来处理大表单的特定部分是否安全?_C++_Builder_Vcl - Fatal编程技术网

C++ 创建不可见的TComponent派生类来处理大表单的特定部分是否安全?

C++ 创建不可见的TComponent派生类来处理大表单的特定部分是否安全?,c++,builder,vcl,C++,Builder,Vcl,在某些情况下,大表单的某些部分应该可以在其他表单中重用。 在这种情况下,推荐的方法是创建从现有VCL类之一派生的新组件。 但要准备在可视化设计器中使用它需要更多的时间。 一个更简单的解决方案是使用中间步骤,在该步骤中,受影响的元素组由新创建的聚合器类处理,聚合器类充当控制器。控制器类不需要拥有这些元素,但可能需要提供自己的方法来处理单击事件 下面是说明所述方法的代码示例。 问题是它有多安全可以吗 窗体在运行时管理其组件时崩溃应用程序 class MyController { public:

在某些情况下,大表单的某些部分应该可以在其他表单中重用。 在这种情况下,推荐的方法是创建从现有VCL类之一派生的新组件。 但要准备在可视化设计器中使用它需要更多的时间。 一个更简单的解决方案是使用中间步骤,在该步骤中,受影响的元素组由新创建的聚合器类处理,聚合器类充当控制器。控制器类不需要拥有这些元素,但可能需要提供自己的方法来处理单击事件

下面是说明所述方法的代码示例。 问题是它有多安全可以吗 窗体在运行时管理其组件时崩溃应用程序

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
的实例。不需要控制器。这完全符合在一个地方定义相同功能的想法。非常感谢。这看起来是正确和快速的方法。