9

मैं सिर्फ

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

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

की कोशिश की और रनटाइम के दौरान एक beep, लेकिन नहीं सुनने के लिए उम्मीद। निम्नलिखित परीक्षण काम करता है, हालांकि:

if IsConsole then 
    beep; 

संकलन-समय परीक्षण क्यों काम नहीं करता है? जहां तक ​​मैं this doc से समझ सकता हूं, यह निश्चित रूप से काम करना चाहिए।

उत्तर

9

आपके द्वारा चुने गए लिंकर विकल्पों में से "सांत्वना आवेदन उत्पन्न" अगर , 'कंसोल' परिभाषित किया गया है।

+3

ओह, हाँ, यह भी बेहतर है। लेकिन जब आप नया/कंसोल एप्लिकेशन चुनते हैं तो दुनिया में डिफ़ॉल्ट रूप से यह विकल्प क्यों नहीं है ?! –

+2

@Andreas - यह '$ APPTYPE CONSOLE' से अलग है, आप एक जीयूआई एप्लिकेशन के लिए लिंकर विकल्प भी चुन सकते हैं और I/O को कंसोल विंडो पर रीडायरेक्ट कर सकते हैं। –

+0

Sertac, मुझे आपकी टिप्पणी समझ में नहीं आ रही है। कंपाइलर निर्देश आईडीई विकल्प से अलग कैसे है, सिवाय इसके कि उत्तरार्द्ध स्पष्ट रूप से CONSOLE को स्वचालित रूप से परिभाषित करता है? या तो एक पीई हेडर सेट करता है जो उपप्रणाली का उपयोग करने के लिए इंगित करता है, है ना? एंड्रियास, कंपाइलर विकल्पों में परिभाषित प्रतीकों की सूची में मैन्युअल रूप से CONSOLE जोड़ने से रोकने के लिए कुछ भी है? –

3

$APPTYPE निर्देश नियंत्रण करता है कि Win32 कंसोल या ग्राफ़िकल UI अनुप्रयोग उत्पन्न करना है या नहीं, यह संकलक निर्देश नहीं है।

{$ifdef}{$define name} कथन द्वारा निर्धारित उपयोगकर्ता परिभाषित संकलक निर्देशों के लिए परीक्षण।

{$define KeepDlibTempFiles} 

'IsConsole' को स्थिर करने के लिए उपयोग किया जा सकता है (जैसा कि आप पहले से ही पाए गए हैं)।

+0

मैं असहमत हूं। उपयोगकर्ता परिभाषित निर्देशों के लिए $ IFDEF परीक्षण * पूर्वनिर्धारित लोगों के अलावा (उदाहरण के लिए delphibasics.co.uk/RTL.asp?Name=$IfDef देखें), और CONSOLE उन लोगों में से एक माना जाता है, docwiki.embarcadero के अनुसार .com/RADStudio/en/Conditional_compilation_ (डेल्फी) इसके अतिरिक्त, मैं ** चाहता हूं कि संकलन-समय (सशर्त संकलन) पर चेक करें, रनटाइम पर नहीं (जो लगभग हमेशा समय की बर्बादी है, क्योंकि एक कंसोल ऐप बजाय कभी-कभी रनटाइम के दौरान एक जीयूआई ऐप में खुद को बदलता है ...)। –

+1

@Andreas Rejbrand: हाँ, लेकिन कम से कम डेल्फी सहायता फ़ाइल कंसोल का उल्लेख पूर्व परिभाषित संकलक निर्देश के रूप में नहीं करती है। – Edelcom

+1

मैं "डेल्फी सहायता फ़ाइल" के रूप में docwiki.embarcadero.com/RADStudio/en/Conditional_compilation_(Delphi) पर विचार करूंगा। –

3

यह * .dpr फ़ाइल में काम नहीं करता है, लेकिन यह एक इकाई में ठीक है (कंसोल से MakeBeep फोन * .dpr):

unit Unit1; 

interface 

uses 
    SysUtils; 

procedure MakeBeep; 

implementation 

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

काफी सच है; यह काम करता हैं। लेकिन यह देखते हुए कि अधिकांश (छोटे) डेल्फी कंसोल अनुप्रयोग सीधे * .dpr फ़ाइल में लिखे जाते हैं, यह बदतर है कि परीक्षण वहां काम नहीं करता है। खैर, * .dpr फ़ाइल में आप शायद जानते हैं कि यह कितना एपटाइप है, लेकिन मेरे मामले में मुझे एक अलग इकाई में एक रेखांकित प्रक्रिया में सशर्त संकलन हुआ, जो स्पष्ट रूप से उसी चीज की मात्रा में है जब तक संकलक निर्देश चला जाता है । क्या यह दस्तावेज है, या क्या हमें इसे "बग" कहा जाना चाहिए? –

+0

ठीक है, मैं बस इनलाइनिंग को हटा दूंगा। मैं रन-टाइम के कुछ अतिरिक्त नैनोसेकंड के साथ रह सकता हूं। –

+0

@Andreas Rejbrand - मुझे नहीं लगता कि यह दस्तावेज है। और मुझे नहीं पता कि संकलक डेवलपर्स इसके बारे में क्या सोचते हैं - क्या यह एक बग या सुविधा है। – kludg

1

आसान समाधान:

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



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

इसलिए जब भी आप आप आवेदन एक कंसोल तुम सिर्फ {$ MakeConsoleApp परिभाषा} में {} या बदल जाएगा नहीं दिखा बनाना चाहते {। $ MakeConsoleApp परिभाषा}

4

http://docwiki.embarcadero.com/RADStudio/XE3/en/Conditional_compilation_(Delphi) के अनुसार बीटीडब्ल्यू अब कंसोल एप्लिकेशन संकलित करते समय "कंसोल" सशर्त प्रतीक पूर्वनिर्धारित है, इसलिए {$ IFDEF CONSOLE} कम से कम XE2 और XE3 के लिए काम करेगा।

XE और पुराने संस्करणों के लिए ऐसी कोई जानकारी नहीं है।

संबंधित मुद्दे