c++ - 创建不可见的 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 手动添加到表单中的吗?
解决方案
推荐阅读
- jenkins-pipeline - 你能帮助解决詹金斯的问题吗
- c# - 如何在linq中获取日期范围内有效的项目
- jquery - 在运行时拖放页面设计
- selenium-webdriver - Pagefactory init 元素函数要在代码中声明一次以进行代码优化
- excel - 在 excel 2016 中计算包含具有特定格式的特定值的单元格
- lambda - 在不启动浏览器的情况下授权 Google Oauth
- ios - 即使我在 iOS 的另一个选项卡中,如何返回根视图控制器?
- django - 用于删除帖子的 Django 测试用例返回 Https 200 而不是 302
- python-3.x - Python Selenium:元素未附加到页面文档
- kotlin - Exposed 中的 default 和 clientDefault 函数有什么不同?