【问题标题】:Delphi 2009 - Detect if component installedDelphi 2009 - 检测是否安装了组件
【发布时间】:2023-03-14 15:19:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 对于您描述的用途,您不需要安装组件。有源代码(首选)或 DCU(不太理想)就足够了。

标签: delphi components delphi-2009


【解决方案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;
      

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

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 2011-03-25
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        相关资源
        最近更新 更多