将参数传递给delphi TFrame

时间:2009-03-05 14:16:48

标签: delphi constructor tframe

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

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

一种很好的方法是,如果可以在读取dfm文件时注册工厂来创建组件。然后,在工厂创建时,可以将所需参数传递给TFrame构造函数。有没有办法实现这个目标?

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

5 个答案:

答案 0 :(得分:4)

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

由于设计时要求,所有组件都需要能够存在,其部分或全部属性仍为默认值。这并不意味着组件在处于该状态时必须执行有用的操作,但它们确实需要能够无限期地保持该状态。例如,可以将组件放在表单上,​​保存表单,然后关闭Delphi,以便稍后恢复表单设计。该组件应该允许自己保存和恢复,即使其所有属性尚未设置为最终用途。

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

答案 1 :(得分:1)

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

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

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

inherited;
Initialise(foo, bar);

答案 2 :(得分:0)

你能创建/注册你自己的tFrame组件吗? 把它放在表格上 - 它的创造可以传递任何东西。

答案 3 :(得分:0)

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

我通常会创建自己的构造函数。我不喜欢在设计时创建框架。

答案 4 :(得分:0)

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

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

例:
TAddress - 一个用来保存地址通常元素的类 TAddressFra - 带有可视控件的框架,用于显示地址

  • 使用值
  • 填充TAddress的实例
  • 创建TAddressFra
  • 的实例
  • 使用TAddressFra.address实例
  • 分配TAddress属性
  • 使用setAddress(o_address : TAddress)过程将TAddress属性的值分配给TAddressFra
  • 上的相应可视组件