2009-10-22 11 views
11

मैं अक्सर डिबगिंग की सहायता के लिए छोटी विधियां करता हूं, जिनका उपयोग वास्तविक प्रोग्राम में नहीं किया जाता है। आम तौर पर मेरे अधिकांश वर्गों में एक एएसस्ट्रिंग-विधि होती है जिसे मैं घड़ियों में जोड़ता हूं। मैं जानता हूँ कि डेल्फी 2010 visualizers है, लेकिन मैं पर 2007मैं लिंकर को डिबगिंग के दौरान आवश्यक फ़ंक्शन को शामिल करने के लिए कैसे मजबूर करूं?

अभी भी कर रहा हूँ इस उदाहरण पर विचार: यदि मैं एक घड़ी के रूप में X.AsString जोड़ने

program Project1; 

{$APPTYPE CONSOLE} 

uses SysUtils; 

type 
    TMyClass = class 
    F : integer; 
    function AsString : string; 
    end; 

function TMyClass.AsString: string; 
begin 
    Result := 'Test: '+IntToStr(F); 
end; 

function SomeTest(aMC : TMyClass) : boolean; 
begin 
    //I want to be able to watch aMC.AsString while debugging this complex routine! 
    Result := aMC.F > 100; 
end; 

var 
    X : TMyClass; 

begin 
    X := TMyClass.Create; 
    try 
    X.F := 100; 
    if SomeTest(X) 
     then writeln('OK') 
     else writeln('Fail'); 
    finally 
    X.Free; 
    end; 
    readln; 
end. 

, मैं सिर्फ मिल "समारोह के नाम से जाना, TMyClass एएसस्ट्रिंग, लिंकर द्वारा समाप्त किया गया था "।

मैं लिंकर को इसे शामिल करने के लिए कैसे मजबूर करूं? मेरी सामान्य चाल प्रोग्राम में कहीं भी विधि का उपयोग करती है, लेकिन क्या ऐसा करने का कोई और शानदार तरीका नहीं है?

उत्तर: जीजे ने इसे करने का सबसे अच्छा तरीका प्रदान किया।

initialization 
    exit; 
    TMyClass(nil).AsString; 

end. 

उत्तर

6

sveinbringsli पूछते हैं: "क्या आपके पास इकाई कार्यों के लिए भी एक युक्ति है?"

डेल्फी संकलक स्मार्ट ... तो तुम कुछ की तरह कर सकते हैं ...

unit UnitA; 

interface 

{$DEFINE DEBUG} 

function AsString: string; 

implementation 

function AsString: string; 
begin 
    Result := 'Test: '; 
end; 

{$IFDEF DEBUG} 
initialization 
    exit; 
    AsString; 
{$ENDIF} 
end. 
+0

+1। मैं आमतौर पर यही करता हूं। इसे प्रारंभिक ब्लॉक में रखें ताकि इसे लिंक नहीं किया जा सके। –

+0

मैं अपने आप से लड़ रहा था कि मुझे किस जवाब को स्वीकार करना चाहिए - यह "प्रकाशित चाल" के साथ आपका एक या आपका दूसरा जवाब है। मैंने इसे चुना क्योंकि यह रिलीज संस्करण को प्रभावित नहीं करेगा। –

+0

हां, और यदि आपके फ़ंक्शन को चर जैसे कुछ पैरामीटर की आवश्यकता है, तो केवल प्रारंभिक अनुभाग में लिखें: "अगर @AsString = nil तब;" इसके बजाय पैरामीटर डालने। –

6

आप फ़ंक्शन प्रकाशित कर सकते हैं।

TMyClass = class 
    F : integer; 
    published 
    function AsString : string; 
    end; 

और 'घड़ी गुण' में पर स्विच 'अनुमति समारोह कॉल'

+0

वाह! मुझे नहीं पता था कि प्रकाशित विधियां इस तरह से काम करती हैं। क्या आपके पास इकाई कार्यों के लिए एक टिप भी है? –

+0

आप "प्रकाशित" भी डाल सकते हैं जैसे: {$ IFDEF DEBUG} प्रकाशित {$ ENDIF} –

0

शायद यह उन्हें कुछ आरंभीकरण खंड में कॉल करने के लिए काम करता है, {ifdef डीबग} या द्वारा सुरक्षित {IFOPT डी +}।

+0

हां, यह काम करेगा, लेकिन मैं एक तरीका खोजना चाहता हूं कि _doesn't_ को वास्तव में कहीं भी फ़ंक्शन को कॉल करने की आवश्यकता न हो। –

+0

बेशक यह अच्छा होगा। लेकिन कम से कम यह एक कामकाज है जो रिलीज संस्करण को बोझ नहीं करता है। (कौन सी जीजे की प्रकाशित चाल होगी, बीटीडब्लू। :-)) –

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

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