代码之家  ›  专栏  ›  技术社区  ›  Andreas Rejbrand

Delphi{$IFDEF CONSOLE}问题

  •  11
  • Andreas Rejbrand  · 技术社区  · 15 年前

    我只是试过了

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
    
    begin
      {$IFDEF CONSOLE}
        beep;
      {$ENDIF}
    end.
    

    beep 在运行时,但不是。不过,以下测试是可行的:

      if IsConsole then
        beep;
    

    为什么编译时测试不起作用?据我所知 this doc ,它肯定能用。

    5 回复  |  直到 15 年前
        1
  •  9
  •   Sertac Akyuz    15 年前

    如果从链接器选项中选择“生成控制台应用程序”,则会定义“控制台”。

        2
  •  4
  •   kludg    15 年前

    它在*.dpr文件中不工作,但在一个单元中正常(从控制台*.dpr调用MakeBeep):

    unit Unit1;
    
    interface
    
    uses
      SysUtils;
    
    procedure MakeBeep;
    
    implementation
    
    procedure MakeBeep;
    begin
      {$IFDEF CONSOLE}
        beep;
      {$ENDIF}
    end;
    
        3
  •  4
  •   vladon    12 年前

    顺便说一句,根据 http://docwiki.embarcadero.com/RADStudio/XE3/en/Conditional_compilation_(Delphi) 现在“CONSOLE”条件符号是在编译控制台应用程序时预定义的,所以{$IFDEF CONSOLE}至少可以用于XE2和XE3。

    对于XE和旧版本没有这样的信息。

        4
  •  3
  •   Edelcom    15 年前

    这个 $APPTYPE 指令控制是生成Win32控制台还是图形用户界面应用程序,它不是编译器指令。

    {$ifdef} 用户定义的编译器指令集的测试 {$define name} 声明。如在

    {$define KeepDlibTempFiles}
    

    相反,可以使用“IsConsole”(正如您已经发现的那样)。

        5
  •  2
  •   tndza    14 年前

    program YourProgram;
    {$DEFINE MakeConsoleApp}
    {$IFDEF MakeConsoleApp}
      {$APPTYPE CONSOLE}
    {$ENDIF}
    
    
    
    [....]
    {$IFDEF MakeConsoleApp} WriteLn('Text in a Console'); {$ENDIF}
    

    所以,任何时候你想让你的应用程序不显示控制台,你只要改变 {$DEFINE MakeConsoleApp}到{}或{.$DEFINE MakeConsoleApp}