传递参数给Delphi TFrame

3
为避免使用单例和全局变量,我希望能够向TFrame组件传递参数。然而,由于TFrame通常在设计时包含在表单中,因此只能使用默认构造函数。
当然,父表单可以在TFrame创建后的OnCreate回调中设置一些属性。但是,这并不能确保不会忘记某个属性,并且依赖关系也没有使用构造函数清晰明了。
一种好的方法是,在读取dfm文件时注册一个工厂来创建组件。然后,在由工厂创建时,可以将所需的参数传递给TFrame构造函数。有没有实现这一点的方法?
还是有更好的解决方案可以将参数传递给TFrame吗?

你能解释一下这些参数是从哪里来的吗?如果你有一个工厂创建这些TFrames,它如何知道使用哪些参数? - Uwe Raabe
5个回答

4
所有组件,包括TFrame的后代,都需要能够使用从TComponent继承的构造函数进行构建。否则,在设计时无法正确使用它们。如果你可以接受只在运行时使用的限制,那么你可以重写该构造函数并引发异常,这将防止组件在设计时被放置在窗体上。只需提供其他需要不同参数的构造函数即可。
由于设计时要求,所有组件都需要能够存在于某些或全部属性仍处于默认值的状态下。这并不意味着组件必须在这种状态下执行有用的操作,但它们需要能够无限期地保持在这种状态下。例如,在窗体上放置一个组件,保存该窗体并关闭Delphi,并打算在以后的时间恢复窗体设计。即使所有属性尚未设置为最终使用,组件也应允许自己保存和还原。
我更喜欢只在运行时强制执行组件的规则。在允许使用之前,请检查所有属性是否设置为合理的值。你可以使用断言来强制执行你的组件的正确使用。类的使用者会很快学会如果他们没有完成在窗体上设置你的组件。

我猜这就是“Delphi方式”做事的方法。我试图通过使用工厂(参见http://misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/)将对象创建与应用程序逻辑分离开来。 - ajob

1
通常我会添加一个公共的、非虚拟的“初始化”或(对美国人来说是Initialize)过程,需要提供所有参数。然后这将设置属性。
如果可能的话,将属性设置为受保护或私有,这样它们唯一可以被设置的方式就是从调用Initialize(AFoo, ABar: integer)。
然后在TFormXXX.FormCreate或TformXXX.Create中,加入:
inherited;
Initialise(foo, bar);

0

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

b) 给框架一个公共属性,使用参数数据类型或数据结构传递值到表单上。

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

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

0

你可以创建/注册你自己的tFrame组件,并将其放置在表单上 - 它的创建过程可以传递任何内容。


自定义构造函数在流处理期间不会被调用。只有从 TComponent 继承的 Create(TComponent) 构造函数会被调用。 - Rob Kennedy

0
如果工厂可以提供您需要的参数,为什么不覆盖框架的默认构造函数,然后向工厂类请求参数呢?
我通常会制作自己的构造函数。无论如何,我都不喜欢在设计时创建框架。

“而作为一种工厂类”?那句话没有解析。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接