首页 > 解决方案 > 创建不可见的 TComponent 派生类来处理大表单的特定部分是否安全?

问题描述

在某些情况下,大型表单的某些部分应该可以在其他表单中重用。在这种情况下,推荐的方法是创建从现有 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 手动添加到表单中的吗?

标签: c++buildervcl

解决方案


推荐阅读