9

Je viens d'essayer

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

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

et devrait entendre un beep lors de l'exécution, mais pas. Le test suivant fonctionne cependant:

if IsConsole then 
    beep; 

Pourquoi le test de compilation ne fonctionne-t-il pas? Autant que je peux comprendre de this doc, cela devrait fonctionner.

Répondre

9

Si vous sélectionnez "Générer application console" des options de l'éditeur de liens , "CONSOLE" est défini.

+3

Oh, oui, c'est encore mieux. Mais pourquoi dans le monde n'est pas cette option par défaut lorsque vous sélectionnez Nouvelle application/console ?! –

+2

@Andreas - Il est différent de '$ APPTYPE CONSOLE', vous pouvez également sélectionner l'option de l'éditeur de liens pour une application graphique et rediriger les E/S vers une fenêtre de console. –

+0

Sertac, je ne comprends pas votre commentaire. Comment la directive du compilateur diffère-t-elle de l'option IDE, sauf que cette dernière définit apparemment CONSOLE automatiquement? L'un ou l'autre définit l'en-tête PE indiquant le sous-système à utiliser, n'est-ce pas? Andreas, y a-t-il quelque chose pour vous empêcher d'ajouter manuellement CONSOLE à la liste des symboles définis dans les options du compilateur? –

3

La directive $APPTYPE détermine s'il faut générer une console Win32 ou une application graphique d'interface utilisateur, ce n'est PAS une directive de compilation.

{$ifdef} Tests pour les directives de compilation définies par l'utilisateur définies par les instructions {$define name}. Comme dans

{$define KeepDlibTempFiles} 

À la place le 'IsConsole' peut être utilisé (comme vous l'avez déjà découvert).

+0

Je ne suis pas d'accord. $ Test IFDEF pour les directives définies par l'utilisateur * en plus des * prédéfinies (voir par exemple delphibasics.co.uk/RTL.asp?Name=$IfDef), et CONSOLE est censé en faire partie, selon docwiki.embarcadero .com/RADStudio/fr/Conditional_compilation_ (Delphi) En outre, je ** veux ** faire la vérification à la compilation (compilation conditionnelle), pas au moment de l'exécution (qui est presque toujours une perte de temps, depuis une application de console plutôt rarement se transforme en une application graphique pendant l'exécution ...). –

+1

@Andreas Rejbrand: Oui, mais au moins le fichier d'aide Delphi ne mentionne pas la console comme étant une directive de compilation prédéfinie. – Edelcom

+1

Je considérerais docwiki.embarcadero.com/RADStudio/en/Conditional Compilation_(Delphi) comme le "fichier d'aide de Delphi". –

3

Il ne fonctionne pas dans le fichier * .dpr, mais il est OK dans une unité (appel MakeBeep de la console * .dpr):

unit Unit1; 

interface 

uses 
    SysUtils; 

procedure MakeBeep; 

implementation 

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

Tout à fait vrai; Ça marche. Mais étant donné que la plupart des (petites) applications de console Delphi sont écrites directement dans le fichier * .dpr, il est plutôt mauvais que le test ne fonctionne pas. Eh bien, dans le fichier * .dpr, vous savez probablement quel est son apptype, mais dans mon cas, il se trouve que la compilation conditionnelle est dans une procédure inline dans une unité différente, ce qui revient à la même chose dans la mesure où la directive du compilateur . Est-ce documenté, ou devrions-nous l'appeler un "bug"? –

+0

Eh bien, je vais juste enlever l'inline. Je peux vivre avec quelques nanosecondes supplémentaires de temps d'exécution. –

+0

@Andreas Rejbrand - Je ne pense pas que ce soit documenté. Et je ne sais pas ce que les développeurs du compilateur en pensent - c'est un bug ou une fonctionnalité. – kludg

1

solution plus facile:

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



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

donc chaque fois que vous voulez faire votre application montre pas une console vous suffit de changer {$ DEFINE MakeConsoleApp} à {} ou {. $ DEFINE MakeConsoleApp}