为了避免单例和全局变量,我希望能够将参数传递给TFrame组件。但是,由于TFrame通常在设计时包含在窗体中,因此只能使用默认构造函数。
当然,父窗体可以在创建TFrame之后在OnCreate回调中设置一些属性。然而,这并不能确保属性不会被遗忘,而且依赖项也不像使用构造函数那样清晰。
一种很好的方法是,如果可以在读取dfm文件时注册一个工厂来创建组件。然后,在工厂创建时,可以将所需的参数传递给TFrame构造函数。有没有办法做到这一点?
或者,对于如何将参数传递给TFrame,有人有更好的解决方案吗?
发布于 2009-03-05 18:37:24
所有组件,包括TFrame的后代,都需要能够使用从TComponent继承的构造函数来构造。否则,它们就不能在设计时正确使用。如果设计时使用的限制是您可以接受的,那么您可以重写该构造函数并引发异常。这将防止在设计时将组件放置在窗体上。只需提供一些需要其他参数的其他构造函数。
由于设计时的要求,所有组件都需要能够在其部分或全部属性仍为默认值的情况下存在。这并不意味着组件必须在处于该状态时做有用的事情,但它们确实需要能够无限期地停留在该状态。例如,可以将组件放在窗体上,保存窗体,然后关闭Delphi,以便在以后恢复窗体设计。组件应该允许保存和恢复自己,即使它的所有属性还没有设置为最终使用。
我的首选选项是仅在运行时强制执行组件的规则。在允许使用属性之前,请检查是否已将所有属性设置为合理的值。您可以使用断言来强制正确使用组件。如果你的类的使用者还没有在他们的窗体上设置好你的组件,他们很快就会学会。
发布于 2009-03-06 02:54:58
我通常会添加一个公共的、非虚拟的“初始化”或(初始化到美国人)过程,它需要提供所有参数。然后,这将设置属性。
如果可能,将属性设置为protected或private,这样设置它们的唯一方法就是调用Initialise(AFoo,ABar : integer)。
然后在TFormXXX.FormCreate或TformXXX.Create中,拥有:
inherited;
Initialise(foo, bar);发布于 2009-03-05 14:36:53
你能创建/注册你自己的tFrame组件并把它放在表单上吗?它的create可以传递任何东西给它。
https://stackoverflow.com/questions/614937
复制相似问题