Delphi 5组件将自动添加" db.pas" unit to uses clause?

时间:2017-04-02 07:45:46

标签: delphi delphi-5 toolsapi

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

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(我知道......)似乎没有这个单位。

我有什么选择?

1 个答案:

答案 0 :(得分:2)

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

type
  TDataSet = Db.TDataSet;

每当您将组件放在表单上时,Delphi都应将其单元添加到uses子句中。然后,无论您是否在该表单中使用Db,都有效TDataSetDb中的<unit-name>.<type-name>相当。

  

此类型别名是否会出现任何副作用/影响/冲突问题?

从语言角度来看,没有

一般来说,当2个代码(有时甚至在同一单元内)看起来使用相同的类型时,使用同名的类型会导致问题是不明智的,但它们实际上是内部不同的类型。 但是,在这种情况下,类型实际上是相同

从IDE的角度来看,并不多

  • 一个小问题是IDE中的“查找声明”需要额外的步骤才能达到基础类型。
  • 另一个问题与代码完成有关。我曾经历过,当使用这种稍微不同寻常的引用技术 var userFunc=function (server, options) { return { authenticate: function (request, reply) { console.log('UserAuth'); return reply.continue({ credentials: { user: 'UserAuth' } }); } }; }; server.auth.scheme('UserAuthScheme', userFunc); // here server.auth.strategy('UserAuth', 'UserAuthScheme'); // here server.route([{ method: 'POST', path: '/api/user/loginDetails', config: { auth: 'UserAuth', handler: function (request, reply) { reply('/api/user/loginDetails'); }, validate: { payload: { }, headers: UniversalFunctions.authorizationHeaderObj, failAction: UniversalFunctions.failActionFunction }, plugins: { 'hapi-swagger': { payloadType: 'form', responses: Config.APP_CONSTANTS.swaggerDefaultResponseMessages } } } }]); 时,某些版本的Delphi偶尔会遇到代码完成的困难。 (我不记得Delphi 5是如何(或者甚至是)受到影响的。)
  

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

我不知道使用该技术的任何组件。但是我在很多场合出于各种原因使用了混叠。主要是为了避免对客户端单元施加连锁依赖。