#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. Это точно соответствует идее определения одинаковой функциональности в одном месте. Спасибо! Это выглядит как правильный и быстрый подход.