Delphi 2009 - 检测是不是安装了组件

Posted

技术标签:

【中文标题】Delphi 2009 - 检测是不是安装了组件【英文标题】:Delphi 2009 - Detect if component installedDelphi 2009 - 检测是否安装了组件 【发布时间】:2011-01-14 23:59:31 【问题描述】:

我得到了一些与其他开发人员共享的代码。我有一个很好的调试模块,我在单元测试中省略了它,但他没有这个,所以这是一场不断添加和删除代码的战斗。

如果有一种方法可以使用条件(很像 Delphi 版本或 Unicode),那就太好了

  $IfDef MYComponent
    MyComponent := TMyComponent.Create;
    MyComponent.Logging := true;
  $EndIf

我想我可以将我的 ide 设置为定义一些东西,但我想知道是否有办法检测组件是否已安装.....

【问题讨论】:

对于您描述的用途,您不需要安装组件。有源代码(首选)或 DCU(不太理想)就足够了。 【参考方案1】:

试试这个(它应该适用于 Delphi 6 之后的所有版本):

$IF DECLARED(TMyComponent)
$IFEND

然后您可以简单地更新您的使用列表以使该组件可见或不可见。

【讨论】:

【参考方案2】:

您可以让他使用只有存根实现的组件单元。例如:

type
  TMyComponent = class
    procedure DoSomething();
  end;

procedure TMyComponent.DoSomeThing();
begin
  //no-op
end;

如果您想使用不同的单元名称,您可以使用 Delphi 的单元别名选项,位于项目选项 -> 目录和条件 -> 单元别名:为单元 UnitMyComponent -> UnitDummyMyComponent 添加别名。

您现在可以使用至少没有 ifdef 的代码!

【讨论】:

【参考方案3】:

不完全是 ifdefs,但你可以使用类继承和测试来查看你是否应该采取行动。您仍然希望进行某种代理设置,以便您和其他开发人员都可以编译......只是您的版本具有代理的附加目标。例如:

在两个开发人员所拥有的“共享”单元中会是这样的:

type
  TMyComponent = class
  public
    procedure DoSomething; virtual;
  end;

var
  MyComponent : TMyComponent;

procedure TMyComponent.DoSomething;
begin
  // stubbed
end;

在您的“特殊”单元中,您将拥有以下代码:

type
  TMyRealComponent = Class(tMyComponent)
  public
    procedure DoSomething; override;
  end;

procedure TMyRealComponent.DoSomething;
begin
  // do the real process here
end;

initialization
  MyComponent := TMyRealComponent.Create;
finalization
  if Assigned(MyComponent) then
    MyComponent.Free;
end.

在你的代码中,当你想看看它是否可以做一些你可以写的事情时:

if Assigned(MyComponent) then
  MyComponent.DoSomething;

如果您想禁用此调试代码,请从项目中删除特殊单元。

【讨论】:

以上是关于Delphi 2009 - 检测是不是安装了组件的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 2009:传递组件名称 onclick 事件然后设置属性

你如何找到一个 Delphi 组件来自的包?

用于人脸识别和标记的 Delphi 组件

DELPHI 2009 中的 .NET 组件

Delphi - 如何检测防病毒软件的存在?

Delphi 2009 - 在自定义 Delphi 组件中设置默认属性值