2013-10-16 6 views
6

चाहिए इस काम परियोजना स्रोत से एक संकलक निर्देश को हटा रहा है या मैंने कुछ गलत कर रहा हूँ?जोड़ें इकाई इस तरह

मैं अपने प्रोजेक्ट स्रोत में इस कोड है:

{$IFDEF DEBUG} 
    ADebugUnit, 
    {$ELSE} 
    ARelaseUnit, 
    {$ENDIF} 

मैं जब डिबग मोड में ADebugUnit प्रयोग की जाने वाली, लेकिन जब रिलीज़ मोड में संकलन प्रयोग की जाने वाली AReleaseUnit चाहते हैं। जब मैं प्रोजेक्ट में एक नई इकाई जोड़ने का चयन करता हूं तो यह बहुत अच्छा काम करता है। जब मैं ऐसा करता हूं तो यह मूल रूप से कोड को संसाधित करेगा और केवल उस यूनिट को बनाए रखेगा जो कि वर्तमान में कॉन्फ़िगरेशन की गई कॉन्फ़िगरेशन से संबंधित है।

उदाहरण के लिए, करने के लिए बस ऊपर कोड में परिवर्तन अपने प्रोजेक्ट के लिए एक नई इकाई को जोड़ने के बाद तो विन्यास डीबग पर सेट है:

ADebugUnit, 

या मेरी विन्यास रिलीज के लिए निर्धारित है अगर यह करने के लिए बदल जाएगा एक नई इकाई जोड़ने के बाद निम्नलिखित:

ARelaseUnit, 

मुझे हमेशा एक नई इकाई जोड़ने के बाद इसे सशर्त बयान में बहाल करना होगा। क्या नया यूनिट हस्तक्षेप किए बिना इसे पूरा करने का कोई तरीका है?

+0

मैं अपनी खुद की .dpr फ़ाइल लिखता हूं और आईडीई द्वारा किए गए परिवर्तनों को पूर्ववत करता हूं। वीसीएस मदद करता है। कुछ चीजों को .dpr फ़ाइल में सशर्त होने की आवश्यकता है। –

+1

दुर्भाग्य से आईडीई हमेशा एक साफ नौकरी नहीं करता है, और अक्सर पूरी परियोजना फ़ाइल को नष्ट कर देता है। मैंने यह भी देखा है कि यह 'उपयोग' खंड को और नीचे कॉपी करता है, इसलिए इसे डुप्लिकेट किया गया था। –

+0

मैं यह बताना चाहता हूं कि हमारे पास डेल्फी एक्सई 5 की एक प्रति है जिसका हम मूल्यांकन कर रहे हैं और इसे उस माहौल में आज़माया है और यह इस तथ्य में अपेक्षित है कि मैं परियोजना स्रोत में सशर्त शामिल कर सकता हूं और ऐड यूनिट का उपयोग कर सकता हूं आईडीई में विकल्प और यह सशर्त कंपाइलर निर्देशों को नहीं हटाएगा। डेल्फी एक्सई 2 में काम करने की उम्मीद है, लेकिन ऐसा नहीं है। –

उत्तर

2

आईडीई डीपीआर फ़ाइल की ज्यादा का मालिक है। सावधान रहें कि आप इसके साथ क्या करते हैं, या आप जो भी देखा है (या बदतर - परिवर्तनों की प्रकृति के आधार पर आप जोखिम लेते हैं, आईडीई कभी-कभी फ़ाइल को संकलित करने की इजाजत नहीं दे सकता है!)।

अन्य बातों के अलावा, क्या इसका मतलब है कि आप सशर्त डीपीआर फ़ाइल में इकाइयों को शामिल नहीं कर सकते हैं। आपको जो भी समस्या हल करने की कोशिश कर रहे थे, उसे आपको एक और समाधान मिलना होगा।

उदाहरण के लिए, हो सकता है आप इकाई कहीं और से के बजाय अपनी परियोजना डीपीआर फ़ाइल में इस्तेमाल कर सकते हैं।

या शायद आप दोनों इकाइयों को एक में समेकित कर सकते हैं, और उसके बाद इसके सामग्री सशर्त रूप से संकलित किए गए हैं।

या हो सकता है आप बस डिबग कोड हर समय के बाद से है कि संभावना है कि आप एक ही कोड आप परीक्षण किया जहाज बढ़ जाती है इस्तेमाल कर सकते हैं।

या, यदि इस समस्या को केवल जब आप "इकाई जोड़ें" संवाद का उपयोग होता है, तो आप उस संवाद त्याग और मैन्युअल रूप से डीपीआर फ़ाइल को संपादित कर सकते हैं। एक परियोजना में एक इकाई जोड़ने के पीछे कोई अन्य जादू नहीं है, सिवाय इसके कि क्लॉज को फिर से लिखा जाता है, जैसा आपने देखा है।

+0

सहमत हैं, और यह एक पिटा है। ऐसी कई चीजें हैं जो या तो * .DPR फ़ाइल में काम नहीं कर रही हैं या आईडीई कभी-कभी उन्हें बाहर फेंक देगा। यह उनमें से एक है। एकल सर्वोत्तम सलाह है कि जितना संभव हो सके किसी अन्य इकाई में डालें। – JensG

+0

@Rob - हम मैन्युअल रूप से आवश्यक इकाइयों को जोड़ सकते हैं, इस तरह हम इसके आसपास हो रहे हैं (या तथ्य के बाद इसे ठीक कर रहे हैं)। हालांकि हम सशर्त को पूरी तरह समाप्त करने की तलाश में हैं जो आदर्श समाधान होगा। –

0

रोब के जवाब पर निर्माण करने के लिए, जब भी मुझे ऐसी स्थिति होती है जब मुझे ऐसा कुछ करने की ज़रूरत होती है, तो मैं सभी डीपीआर कोड को दूसरी इकाई में माइग्रेट करता हूं, उदाहरण के लिए AppInit.pas

unit AppInit; 

interface 

uses 
    Vcl.Forms, 
    Unit1, 
{$IFDEF DEBUG} 
    ADebugUnit 
{$ELSE} 
    AReleaseUnit 
{$ENDIF} 
    ; 

procedure RunApp; 

implementation 

procedure RunApp; 
begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.Title := 'Sample Application'; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end; 

end. 

फिर अपनी परियोजना इकाई केवल इस के नीचे की ओर है कि आईडीई तो के रूप में आवेदन की किस प्रकार यह है करने के लिए उलझन में हो जाएगा

program SampleApp; 

uses 
    Vcl.Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    AppInit in 'AppInit.pas'; 

{$R *.res} 

begin 
    RunApp; 
end. 

है, और जब आप Project > Options करने के लिए जाना , कुछ सुविधाएं अक्षम की जाएंगी, जैसे वीसीएल शैलियां। सही कोडिंग के साथ, ऐसी चीजें अभी भी लागू की जा सकती हैं।

पीएस - कृपया इस तथ्य को क्षमा करें कि मैंने यह 100% सीधे स्टैक ओवरफ्लो में लिखा है, इसलिए क्षमा करें अगर मैंने उस कोड में कुछ अपनाना है।

4
समस्या

कि डीपीआर का उपयोग करता है सूची में किसी भी $ ifdef के सम्मान करेंगे नहीं और वास्तव में इन्हें निकाल देगा (जैसा कि आप मिल गया है) जब यह है निश्चित आईडीई आपरेशन के जवाब में उपयोग करता है सूची फिर से लिखते हैं ।

एक विकल्प उन आईडीई संचालनों का उपयोग कभी नहीं करना है, जैसे कि "जोड़ें/निकालें" आदि और केवल डीपीआर उपयोग सूची को मैन्युअल रूप से प्रबंधित करने के लिए।

वैकल्पिक रूप से थोड़ी सी देखभाल के साथ आप जो चाहते हैं उसे प्राप्त करने के लिए इकाई उपनाम का उपयोग करने में सक्षम हो सकते हैं।

दो इकाइयों पर विचार करें जहां पर या तो उपयोग करने के लिए या निर्माण विन्यास (डिबग या विज्ञप्ति) पर निर्भर करता है अन्य इच्छा:

  • DebugUnit.pas
  • ReleaseUnit.pas

में आपके प्रोजेक्ट विकल्प यूनिट एलियास के लिए:

DEBUG विन्यास:

UnitToUse=DebugUnit 

विज्ञप्ति विन्यास:

uses 
    UnitToUse, 

डीपीआर में इस प्रविष्टि का उपयोग कर एक फ़ाइल नाम की पहचान नहीं कर सकते हैं:

UnitToUse=ReleaseUnit 

अपने डीपीआर में उपयोग करता है सूची में एक प्रविष्टि जोड़ें "इन" सिंटैक्स और इसके बजाय प्रोजेक्ट सर्च पथ पर होने वाली वास्तविक इकाइयों पर भरोसा करना चाहिए।

कहीं भी है कि आप सामान्य रूप से, DebugUnit या ReleaseUnit का प्रयोग करेंगे UnitToUse के बजाय देखें। जाहिर है उपनाम के लिए नाम पूरी तरह से आप पर निर्भर है।

यदि दोनों इकाइयों में एक ही इंटरफेस "अनुबंध" है तो आपके निर्माण लक्ष्य कॉन्फ़िगरेशन को बदलकर इन दो इकाइयों के बीच स्विच करेंगे।

वे अलग इंटरफ़ेस अनुबंध है तो आप अभी भी $ ifdef निर्देशों आपके आवेदन कोड में सामग्री के साथ काम करने के लिए उपयोग कर सकते हैं, जो भी इकाई के UnitToUse संदर्भित करता है, के रूप में उपयुक्त है, उदा

uses 
    UnitToUse; 


procedure DoSomethingInvolvingAliasedUnit; 
begin 
    {$ifdef DEBUG} 
    // code which relies on the debug unit 
    {$else} 
    // code which relies on the release unit 
    {$endif} 
end; 
संबंधित मुद्दे