2012-01-18 8 views
5

संभव डुप्लिकेट:
Reference object instance created using “with” in Delphiआप एक कथन में बनाए गए TQuery ऑब्जेक्ट का संदर्भ कैसे प्राप्त करते हैं?

एक विधि है कि मैं डेल्फी में क्वेरी वस्तुओं बनाने के लिए उपयोग पहले कोड नमूना इस प्रकार है। यह मुझे ऑब्जेक्ट का संदर्भ देता है और फिर ऑब्जेक्ट को फ़ंक्शन पर पास कर सकता है।

procedure SomeProcedure; 
var 
    qry: TQuery; 
begin 
    qry := TQuery.Create(nil); 

    with qry do 
    begin 
    Connection := MyConn; 
    SQL.Text := 'SELECT * FROM PEOPLE'; 
    Open; 

    funcDisplayDataSet(qry); 
    Free; 
    end; 

end; 

क्या यह किसी भी कथन में ऐसा करना संभव है जहां आपकी बनाएं ऑब्जेक्ट के साथ कथन में निहित है?

procedure SomeProcedure; 
begin 
    with TQuery.Create(nil) do 
    begin 
    Connection := MyConn; 
    SQL.Text := 'SELECT * FROM PEOPLE'; 
    Open; 

    funcDisplayDataSet(???); // Here I'm unsure how to pass the object created... 
    Free; 
    end; 
end; 

क्या मैं इस गतिशील वस्तु को 'funcDisplayDataSet (TQuery) जैसे फ़ंक्शन पर पास कर सकता हूं?

मैं सिर्फ अगर यह संभव हो सकता है पता करना चाहते हैं। मैं सारांश की तलाश नहीं कर रहा हूं कि क्यों बयान खराब या अच्छा है। कि चर्चा के साथ StackOver प्रवाह पर अन्य पोस्ट नहीं है। *

+1

+1, हालांकि मुझे लगता है वहाँ इसके लिए कोई तरीका नहीं है कि यह बिल्कुल स्पष्ट/स्पष्ट रूप से, अगर बिल्कुल। यदि समाधान कुछ वूडू साबित होता है जो अगले व्यक्ति को जाना होगा और देखें कि आपने यह कैसे किया है, तो आपको यह नहीं करना चाहिए। –

+0

ही यहाँ सवाल [संदर्भ वस्तु उदाहरण-निर्मित-का उपयोग कर-साथ-इन-डेल्फी] (http://stackoverflow.com/questions/791181/reference-object-instance-created-using-with-in-delphi) , सिकंदर द्वारा प्रदान किए गए एक समाधान के साथ। –

+4

बस एक स्थानीय चर का उपयोग करें और बाहर ले जाएं।यदि आप कुछ बुराई हैक करते हैं, तो बस वहां को रखने के लिए, तो मुझे आपको ट्रैक करना होगा, और आपको पैंट करना होगा। –

उत्तर

6

संभव नहीं है यही कारण है कि सामान्य रूप में, एक साफ ढंग से। आपके विकल्प:

  1. Self लौटने वाले वर्ग में एक विधि जोड़ें।
  2. बंद करो with का उपयोग करने और उदाहरण के लिए एक स्थानीय चर पैदा करते हैं।

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

यही विकल्प 2. इस पत्ते कैसे मैं समस्या का समाधान होगा।

+1

+1 "मैंने क्लास हेल्पर के साथ कोई समस्या हल नहीं की है" –

+0

मैंने कक्षा सहायक के साथ एक समस्या हल की है ... यह 6 घंटे के ठीक समय में 50 घंटे का काम बदल गया ... आपातकाल में, ऐसा था मामला, वे वास्तव में आसान हैं। –

5

एक वर्ग सहायक का उपयोग कर के बारे में क्या?

type 
    TQueryHelper = class helper for TQuery 
    public 
    function Instance: TQuery; 
    end; 


function TQueryHelper.Instance: TQuery; 
begin 
    Result := Self; 
end; 

और यह

With TQuery.Create(nil) do 
    begin 
    SQL.Text:='Select * from OTGH'; 
    ShowMessage(Instance.SQL.Text); 
    end; 
+3

वैसे यह नौकरी करता है लेकिन "साफ" होने की मेरी परीक्षा में विफल रहता है। +1 –

+0

डेविड, मैं 'साथ' कथन के खिलाफ भी हूं, यह सिर्फ questiom का जवाब है ... मैं बस यह जानना चाहता हूं कि यह संभव है या नहीं। – RRUZ

+0

उपरोक्त मेरे लिंक में लगभग समाधान (अलेक्जेंडर द्वारा) जैसा ही है। कक्षा सहायक के बिना, लेकिन अभी भी डेविड के उपाय से "साफ" नहीं है। –

3

with बयान की तरह उपयोग करने के लिए एक संदर्भ है कि आप बयान के बाहर पारित करने के लिए उपयोग कर सकते हैं प्रदान नहीं करता है।

एक TQuery के साथ, आप एक संपत्ति माता-पिता के लिए एक संदर्भ है कि का उपयोग करके इसे चारों ओर हो सकता है: दिलचस्प सवाल के लिए

begin 
    with TQuery.Create(nil) do 
    begin 
    Connection := MyConn; 
    SQL.Text := 'SELECT * FROM PEOPLE'; 
    Open; 
    // Fields have reference to parent component, but your implementation may vary 
    funcDisplayDataSet(TQuery(Fields.Fields[0].GetParentComponent)); 
    Free; 
    end; 
end; 
संबंधित मुद्दे

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