3

为了避免单例和全局变量,我希望能够将参数传递给 TFrame 组件。但是,由于 TFrame 通常在设计时包含在表单中,因此只能使用默认构造函数。

父窗体当然可以在创建 TFrame 后在 OnCreate 回调中设置一些属性。但是,这并不能确保不会忘记属性,并且依赖关系不像使用构造函数那样清晰。

如果可以在读取 dfm 文件时注册一个用于创建组件的工厂,那么一个不错的方法是。然后可以在工厂创建时将所需的参数传递给 TFrame 构造函数。有没有办法做到这一点?

或者有人对如何将参数传递给 TFrame 有更好的解决方案吗?

4

5 回答 5

4

所有组件,包括 的后代TFrame,都需要能够使用从 继承的构造函数来构造TComponent。否则,它们无法在设计时正确使用。如果您可以接受设计时使用的限制,那么您可以覆盖该构造函数并引发异常。这将阻止组件在设计时放置在表单上。只需提供一些需要其他参数的其他构造函数。

由于设计时的要求,所有组件都需要能够在其部分或全部属性仍为其默认值的情况下存在。这并不意味着组件在处于该状态时必须做有用的事情,但它们确实需要能够无限期地保持在该状态。应该没问题,例如,在表单上放置一个组件,保存表单,然后关闭 Delphi,以便稍后恢复表单设计。组件应该允许自己被保存和恢复,即使它的所有属性还没有设置为最终使用。

我的首选选项是仅在运行时强制执行组件的规则。在允许使用它们之前,检查所有属性是否都设置为合理的值。您可以使用断言来强制正确使用您的组件。如果您的课程的使用者还没有完成在表单上设置您的组件,他们将很快学会。

于 2009-03-05T18:37:24.070 回答
1

我通常会添加一个公共的、非虚拟的“初始化”或(对美国人初始化)程序,它需要提供所有参数。这将设置属性。

如果可能,使属性受保护或私有,因此可以设置它们的唯一方法是调用 Initialise(AFoo, ABar : integer)。

然后在 TFormXXX.FormCreate 或 TformXXX.Create 中,有:

inherited;
Initialise(foo, bar);
于 2009-03-06T02:54:58.240 回答
0

您可以创建/注册您自己的 tFrame 组件并将其放置在表单上吗 - 它的创建可以将任何东西传递给它。

于 2009-03-05T14:36:53.087 回答
0

如果工厂可以提供您需要的参数,您为什么不直接覆盖框架的默认构造函数,并要求工厂类提供参数?

我通常制作自己的构造函数。无论如何,我不喜欢在设计时创建框架。

于 2009-03-05T14:39:22.253 回答
0

a) 框架可以在需要时动态创建,在不需要时销毁

b) 给框架一个具有参数数据类型或数据结构的公共属性,并通过该属性将值传递给表单。

示例:
TAddress- 保存地址的常用元素的类。
TAddressFra- 带有视觉控件的框架以显示地址

  • TAddress用值填充 的实例
  • 创建一个实例TAddressFra
  • 用实例分配TAddressFra.address属性TAddress
  • 使用该过程setAddress(o_address : TAddress)TAddress属性的值分配给相应的可视组件TAddressFra
于 2010-05-02T05:19:12.527 回答