9

que acaba de intentar

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

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

y espera a escuchar una beep en tiempo de ejecución, pero no. La siguiente prueba funciona, sin embargo:

if IsConsole then 
    beep; 

¿Por qué no funciona la prueba en tiempo de compilación? Por lo que puedo entender desde this doc, seguramente debería funcionar.

Respuesta

9

Si selecciona "Generar aplicación de consola" de las opciones de enlazador , 'CONSOLA' está definida. solución

+3

Oh, sí, esto es aún mejor. Pero ¿por qué en el mundo no está activada esta opción de forma predeterminada cuando selecciona Nueva/Aplicación de consola? –

+2

@Andreas: es diferente de '$ APPTYPE CONSOLE', también puede seleccionar la opción del vinculador para una aplicación GUI y redirigir las E/S a la ventana de la consola. –

+0

Sertac, no entiendo tu comentario. ¿Cómo difiere la directiva del compilador de la opción IDE, excepto que este último aparentemente define CONSOLE automáticamente? Cualquiera de los dos establece el encabezado PE que indica el subsistema a usar, ¿verdad? Andreas, ¿hay algo que le impida agregar manualmente CONSOLA a la lista de símbolos definidos en las opciones del compilador? –

3

La directiva $APPTYPE controla si generar una consola Win32 o una aplicación gráfica de UI, NO es una directiva de compilación.

{$ifdef} pruebas para las directivas del compilador definidas por el usuario establecidas por {$define name} declaraciones. Como en

{$define KeepDlibTempFiles} 

En lugar de eso, se puede utilizar la 'IsConsole' (como ya ha descubierto).

+0

No estoy de acuerdo. $ IFDEF prueba para directivas definidas por el usuario * además de * predefinidas (ver por ejemplo delphibasics.co.uk/RTL.asp?Name=$IfDef), y se supone que CONSOLE es una de esas, según docwiki.embarcadero .com/RADStudio/es/Conditional_compilation_ (Delphi) Además, ** quiero ** hacer el control en tiempo de compilación (compilación condicional), no en tiempo de ejecución (que casi siempre es una pérdida de tiempo, ya que una aplicación de consola rara vez se cambia a una aplicación GUI durante el tiempo de ejecución ...). –

+1

@Andreas Rejbrand: Sí, pero al menos el archivo de ayuda de Delphi no menciona la consola como una directiva de compilación predefinida. – Edelcom

+1

Consideraría docwiki.embarcadero.com/RADStudio/en/Conditional_compilation_(Delphi) como el "archivo de ayuda de Delphi". –

3

No funciona en el archivo * .dpr, pero está bien en una unidad (MakeBeep llamar desde la consola * .dpr):

unit Unit1; 

interface 

uses 
    SysUtils; 

procedure MakeBeep; 

implementation 

procedure MakeBeep; 
begin 
    {$IFDEF CONSOLE} 
    beep; 
    {$ENDIF} 
end; 
+1

Muy cierto; funciona. Pero dado que la mayoría de las aplicaciones (pequeñas) de la consola Delphi se escriben directamente en el archivo * .dpr, es bastante malo que la prueba no funcione allí. Bueno, en el archivo * .dpr probablemente sepa qué aplicación es, pero en mi caso tuve la compilación condicional en un procedimiento en línea en una unidad diferente, que aparentemente equivale a lo mismo en cuanto a la directiva del compilador. . ¿Está esto documentado, o deberíamos llamarlo un "error"? –

+0

Bueno, eliminaré la línea. Puedo vivir con unos nanosegundos adicionales de tiempo de ejecución. –

+0

@Andreas Rejbrand - No creo que esté documentado. Y no sé qué piensan los desarrolladores del compilador: ¿es un error o una característica? – kludg

1

fácil:

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



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

lo que cada vez que desea hacer que la aplicación no muestra una consola que acaba de cambiar {$ DEFINE MakeConsoleApp} a {} o {. $ DEFINE MakeConsoleApp}

Cuestiones relacionadas