Delphi 2009 - определить, установлен ли компонент - PullRequest
2 голосов
/ 09 февраля 2010

У меня есть код, которым я делюсь с другим разработчиком. У меня есть хороший модуль отладки, который я оставляю в модульных тестах, но у него его нет, так что это битва за постоянное добавление и удаление кода.

Было бы неплохо, если бы мы могли использовать условие (очень похожее на версию Delphi или Unicode), например

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

Полагаю, я мог бы установить свой идеал для определения чего-либо, но мне интересно, есть ли способ определить, установлен ли компонент .....

Ответы [ 3 ]

10 голосов
/ 10 февраля 2010

Попробуйте (это должно работать во всех версиях начиная с Delphi 6):

{$IF DECLARED(TMyComponent)}
{$IFEND}

Затем вы можете просто обновить список использований, чтобы сделать этот компонент видимым или нет.

2 голосов
/ 10 февраля 2010

Вы можете заставить его использовать компонентный модуль, который имеет только реализации заглушки. например:

type
  TMyComponent = class
    procedure DoSomething();
  end;

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

Если вы хотите использовать разные имена модулей, вы можете использовать опцию псевдонимов модулей из Delphi, которая находится в опциях вашего проекта -> Каталоги и условия -> Псевдонимы модулей: добавить псевдоним для UnitMyComponent -> UnitDummyMyComponent.

Теперь вы можете использовать код, который хотя бы свободен от ifdef!

0 голосов
/ 10 февраля 2010

Не совсем 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;

Если вы хотите отключить этот код отладки, удалите специальный модуль из проекта.

...