我刚试过
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
{$IFDEF CONSOLE}
beep;
{$ENDIF}
end.
并希望beep
在运行时听到 a,但不是。但是,以下测试有效:
if IsConsole then
beep;
为什么编译时测试不起作用?据我从这个文档中了解到的,它肯定可以工作。
我刚试过
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
{$IFDEF CONSOLE}
beep;
{$ENDIF}
end.
并希望beep
在运行时听到 a,但不是。但是,以下测试有效:
if IsConsole then
beep;
为什么编译时测试不起作用?据我从这个文档中了解到的,它肯定可以工作。
如果从链接器选项中选择“生成控制台应用程序”,则定义了“CONSOLE”。
它在 *.dpr 文件中不起作用,但在一个单元中是可以的(从控制台 *.dpr 调用 MakeBeep):
unit Unit1;
interface
uses
SysUtils;
procedure MakeBeep;
implementation
procedure MakeBeep;
begin
{$IFDEF CONSOLE}
beep;
{$ENDIF}
end;
顺便说一句,根据http://docwiki.embarcadero.com/RADStudio/XE3/en/Conditional_compilation_(Delphi)现在“CONSOLE”条件符号是在编译控制台应用程序时预定义的,因此 {$IFDEF CONSOLE} 至少适用于 XE2 和 XE3 .
XE 和旧版本没有此类信息。
该$APPTYPE
指令控制是否生成 Win32 控制台或图形 UI 应用程序,它不是编译器指令。
{$ifdef}
{$define name}
测试由语句设置的用户定义的编译器指令。如在
{$define KeepDlibTempFiles}
相反,可以使用“IsConsole”(正如您已经发现的那样)。
更简单的解决方案:
program YourProgram;
{$DEFINE MakeConsoleApp}
{$IFDEF MakeConsoleApp}
{$APPTYPE CONSOLE}
{$ENDIF}
[....]
{$IFDEF MakeConsoleApp} WriteLn('Text in a Console'); {$ENDIF}
因此,只要您想让应用程序不显示控制台,您只需将 {$DEFINE MakeConsoleApp} 更改为 { } 或 {.$DEFINE MakeConsoleApp}