Безопасно ли создавать невидимый производный класс TComponent для обработки определенной части большой формы?

#c #builder #vcl

#c #Конструктор #vcl

Вопрос:

Бывают случаи, когда некоторую часть большой формы следует повторно использовать в других формах. В этом случае рекомендуемый способ — создать новый компонент, производный от одного из существующих классов VCL. Но для подготовки его к использованию в visual designer требуется больше времени. Более простым решением было бы использовать промежуточный шаг, на котором затронутая группа элементов обрабатывается вновь созданным классом-агрегатором, который действует как контроллер. Классу контроллера не обязательно владеть этими элементами, но, возможно, потребуется предоставить свои собственные методы для обработки событий нажатия.

Ниже приведен пример кода, иллюстрирующий описанный подход. Вопрос в том, насколько это безопасно? Может ли это привести к сбою приложения, пока форма управляет своими компонентами во время выполнения?

 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?

Комментарии:

1. Более простым решением является использование TFrame вместо. Вы можете визуально спроектировать его внутри IDE точно так же, как TForm во время разработки, поместить в него любые элементы управления и обработчики событий по мере необходимости, а затем создавать и размещать экземпляры TFrame на своих TForm устройствах по мере необходимости. Контроллер не требуется.

2. Это точно соответствует идее определения одинаковой функциональности в одном месте. Спасибо! Это выглядит как правильный и быстрый подход.