【问题标题】:Passing parameters to a delphi TFrame将参数传递给delphi TFrame
【发布时间】:2010-10-11 12:36:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能解释一下这些参数的来源吗?如果您有一个工厂创建这些 TFrame,它如何知道要使用哪些参数?

标签: delphi constructor tframe


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

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

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

inherited;
Initialise(foo, bar);

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 流式传输期间不调用自定义构造函数。仅调用 Create(TComponent) 构造函数,因为它是从 TComponent 继承的。
    【解决方案4】:

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

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

    【讨论】:

    • “作为工厂级”?那句话没有解析。
    【解决方案5】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多