【问题标题】:Delphi 5 component that will automatically add "db.pas" unit to uses clause?Delphi 5组件会自动将“db.pas”单元添加到uses子句?
【发布时间】:2017-08-27 05:06:36
【问题描述】:

我正在编写自己的组件,我希望它在我将它放在表单上时将 "db" 单元添加到 interface 使用子句,因为它有一个已发布的事件,例如:

TMyDBEvent = procedure(Sender: TObject; DataSet: TDataSet) of object;

TDataSetdb.pas中声明,我需要手动添加这个单元,我想避免。

我见过这个解决方案:

How are Delphi units automatically added when a component is added to a form?

还有这个:

Can I make a custom Delphi component add multiple units to the uses clause?

那个用RegisterSelectionEditor,但是Delphi 5(我知道...)好像没有这个单元。

我有什么选择?

【问题讨论】:

  • 在源代码中搜索导出该功能的单元。在 D6 设计时返工中,事情可能刚刚发生了变化。
  • @DavidHeffernan,我在源代码中没有找到RegisterSelectionEditor
  • 您可以尝试使用相同的名称为组件单元中的类型设置别名:TDataSet = Db.TDataSet; 每当您将组件放在表单上时,Delphi 都应将其单元添加到使用子句中。那么无论您是否在该表单中使用Db,都有一个有效的TDataSet 等效于来自Db 的@。
  • @zig TSelectionEditorRegisterSelectionEditor() 在 Delphi 5 中不可用,它们是在 Delphi 6 中添加的。
  • @CraigYoung,您的解决方法有效。这种类型别名是否有任何副作用/影响/冲突问题?还有其他已知组件使用此技巧吗?

标签: delphi delphi-5 toolsapi


【解决方案1】:

您可以使用相同的名称为组件单元中的类型起别名:

type
  TDataSet = Db.TDataSet;

每当您将组件放在表单上时,Delphi 都应将其单元添加到使用子句中。那么无论您是否在该形式中使用Db,都有一个有效的TDataSet 等效于来自Db 的@。

这种类型别名是否有任何副作用/影响/冲突问题?

从语言的角度来看,没有

通常不建议使用具有相同名称的类型,因为当两段代码(有时甚至在同一个单元中)似乎使用相同的类型时,这可能会导致问题,但它们实际上是不同的类型。 但是,在这种情况下,类型实际上是相同的

从 IDE 的角度来看,不多

  • 一个小问题是 IDE 中的“查找声明”需要一个额外的步骤才能到达底层类型。
  • 另一个问题与代码完成有关。我体验过,当使用这种稍微不寻常的引用技术<unit-name>.<type-name> 时,某些版本的 Delphi 有时会遇到代码补全问题。 (我不记得 Delphi 5 是如何(或什至)受到影响的。)

还有其他已知组件使用此技巧吗?

我不知道有任何组件使用该技术。但是由于各种原因,我在很多场合都使用了别名。主要是为了避免强制对客户端单元产生连锁依赖。

【讨论】:

  • 谢谢。我不确定我是否会在我的组件中实际使用它,但这是一个很好的技巧,似乎可以毫无问题地工作。我认为 D5 中没有其他方法。
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 2014-11-26
  • 2017-04-14
  • 2012-12-29
  • 1970-01-01
  • 2021-12-09
  • 2017-03-02
  • 1970-01-01
相关资源
最近更新 更多