Проблема Delphi {$ IFDEF CONSOLE} - PullRequest
11 голосов
/ 10 июля 2010

Я только что попробовал

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  {$IFDEF CONSOLE}
    beep;
  {$ENDIF}
end.

и ожидается услышать beep во время выполнения, но нет. Следующий тест работает, хотя:

  if IsConsole then
    beep;

Почему не работает тест на время компиляции? Насколько я понимаю из этого документа , он обязательно должен работать.

Ответы [ 5 ]

9 голосов
/ 10 июля 2010

Если вы выберете «Создать консольное приложение» из опций компоновщика, будет определено «CONSOLE».

4 голосов
/ 14 января 2013

Кстати, в соответствии с http://docwiki.embarcadero.com/RADStudio/XE3/en/Conditional_compilation_(Delphi) теперь условный символ «КОНСОЛЬ» предопределен при компиляции консольного приложения, поэтому {$ IFDEF CONSOLE} будет работать как минимум для XE2 и XE3.

Нетинформация для XE и более старых версий.

4 голосов
/ 10 июля 2010

Не работает в файле * .dpr, но в модуле все нормально (вызов MakeBeep из консоли * .dpr):

unit Unit1;

interface

uses
  SysUtils;

procedure MakeBeep;

implementation

procedure MakeBeep;
begin
  {$IFDEF CONSOLE}
    beep;
  {$ENDIF}
end;
3 голосов
/ 10 июля 2010

Директива $APPTYPE определяет, создавать ли консоль Win32 или приложение с графическим интерфейсом, это НЕ директива компилятора.

{$ifdef} тесты для пользовательских директив компилятора, установленных операторами {$define name}. Как в

{$define KeepDlibTempFiles}

Вместо этого можно использовать IsConsole (как вы уже узнали).

1 голос
/ 15 марта 2011

более простое решение:

program YourProgram;
{$DEFINE MakeConsoleApp}
{$IFDEF MakeConsoleApp}
  {$APPTYPE CONSOLE}
{$ENDIF}



[....]
{$IFDEF MakeConsoleApp} WriteLn('Text in a Console'); {$ENDIF}

, поэтому в любое время, когда вы хотите, чтобы ваше приложение не показывало консоль, вы просто меняете {$ DEFINE MakeConsoleApp} на {} или {. $ DEFINE MakeConsoleApp}

...