将参数传递给delphi TFrame
-
03-07-2019 - |
题
为了避免单例和全局变量,我希望能够将参数传递给 TFrame 组件。然而,由于 TFrame 通常在设计时包含在表单中,因此只能使用默认构造函数。
当然,在创建 TFrame 后,父窗体可以在 OnCreate 回调中设置一些属性。然而,这并不能确保属性不会被遗忘,并且依赖关系不像使用构造函数那么清晰。
一个很好的方法是,如果可以在读取 dfm 文件时注册一个用于创建组件的工厂。然后,所需的参数可以在工厂创建时传递给 TFrame 构造函数。有办法做到这一点吗?
或者有人对如何将参数传递给 TFrame 有更好的解决方案吗?
解决方案
所有组件,包括后代 TFrame
, ,需要能够使用继承自的构造函数进行构造 TComponent
. 。否则,它们将无法在设计时正确使用。如果您可以接受设计时使用的限制,那么您可以重写该构造函数并引发异常。这将阻止在设计时将组件放置在表单上。只需提供一些需要其他参数的其他构造函数即可。
由于设计时要求,所有组件都需要能够在其部分或全部属性仍为其默认值的情况下存在。这并不意味着组件在处于该状态时必须执行有用的操作,但它们确实需要能够无限期地保持在该状态。例如,应该可以将组件放置在窗体上,保存窗体,然后关闭 Delphi,以便稍后恢复窗体设计。即使尚未设置其所有属性以供最终使用,组件也应允许自身保存和恢复。
我的首选选择是仅在运行时强制执行组件的规则。在允许使用所有属性之前,请检查所有属性是否都设置为合理的值。您可以使用断言来强制正确使用组件。如果您的课程的使用者尚未在其表单上完成您的组件设置,他们将学得很快。
其他提示
我通常会添加一个公共的,非虚拟的“初始化”或(初始化为美国人)程序,要求提供所有参数。然后,这将设置属性。
如果可能,使属性受保护或私有,因此可以设置它们的唯一方法是调用Initialise(AFoo,ABar:integer)。
然后在TFormXXX.FormCreate或TformXXX.Create中,有:
inherited;
Initialise(foo, bar);
你能创建/注册你自己的tFrame组件吗? 把它放在表格上 - 它的创造可以传递任何东西。
如果工厂可以提供您需要的参数,为什么不直接覆盖框架的默认构造函数,并向工厂类询问参数?
我通常会创建自己的构造函数。我不喜欢在设计时创建框架。
a) 框架可以在需要时动态创建,在不需要时销毁
b) 为框架提供一个具有参数数据类型或数据结构的公共属性,并通过该属性将值传递给表单。
例子:
TAddress
- 保存地址常用元素的类。
TAddressFra
- 带有视觉控件的框架,用于显示地址
- 填充一个实例
TAddress
有价值观 - 创建一个实例
TAddressFra
- 分配
TAddressFra.address
财产与TAddress
实例 - 使用程序
setAddress(o_address : TAddress)
分配的值TAddress
属性到相应的视觉组件TAddressFra