2009-12-31 21 views
12

मैंने पिछले हफ्ते कुछ देखा जो मुझे उम्मीद नहीं थी, और नीचे वर्णित होगा। मैं उत्सुक हूं कि ऐसा क्यों होता है। क्या यह टीडीएटीसेट क्लास, टीडीबीजीड का एक आर्टिफैक्ट, या कुछ और आंतरिक है?डीबीजीड में कॉलम चलाना प्रतीत होता है संलग्न डेटासेट फ़ील्ड

खुले क्लाइंटडेटासेट में फ़ील्ड का क्रम बदल गया। विशेष रूप से, मैंने FieldDefs का उपयोग करके अपनी संरचना को परिभाषित करने के बाद CreateDatatSet को कॉल करके कोड में क्लाइंटडेटासेट बनाया है। इस क्लाइंटडेटासेट की संरचना में पहला फ़ील्ड StartOfWeek नामक दिनांक फ़ील्ड था। केवल कुछ ही क्षण बाद, कोड जो मैंने लिखा था, जो माना जाता है कि StartOfWeek फ़ील्ड शून्य स्थान पर था, ClientDataSet.Fields [0], विफल रहा, क्योंकि StartOfWeek फ़ील्ड क्लाइंटडेटासेट में पहला फ़ील्ड नहीं था।

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

क्या हुआ जादू नहीं था। खेतों ने खुद को स्थिति नहीं बदल दी, न ही उन्होंने मेरे कोड में किए गए किसी भी चीज़ के आधार पर बदल दिया। ClientDataSet में फ़ील्ड को भौतिक रूप से बदलने के लिए खेतों के कारण क्या हुआ था कि उपयोगकर्ता ने डीबीजीड्रिड में कॉलम का क्रम बदल दिया था, जिस पर क्लाइंटडेटासेट संलग्न था (निश्चित रूप से डेटासोर्स घटक के माध्यम से)। मैंने डेल्फी 7, ​​डेल्फी 2007 और डेल्फी 2010 में इस प्रभाव को दोहराया।

मैंने एक बहुत ही सरल डेल्फी एप्लिकेशन बनाया जो इस प्रभाव को प्रदर्शित करता है। इसमें एक डीबीजीड, डेटासोर्स, दो क्लाइंटडेटासेट्स और दो बटन के साथ एक ही फॉर्म होता है। इस फार्म की OnCreate ईवेंट हैंडलर निम्नलिखित

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    with ClientDataSet1.FieldDefs do 
    begin 
    Clear; 
    Add('StartOfWeek', ftDate); 
    Add('Label', ftString, 30); 
    Add('Count', ftInteger); 
    Add('Active', ftBoolean); 
    end; 
    ClientDataSet1.CreateDataSet; 
end; 

Button1, जो लेबल किया गया है दिखाएँ ClientDataSet संरचना की तरह लग रहा है, तो निम्न ऑनक्लिक ईवेंट हैंडलर में शामिल है।

procedure TForm1.Button1Click(Sender: TObject); 
var 
    sl: TStringList; 
    i: Integer; 
begin 
    sl := TStringList.Create; 
    try 
    sl.Add('The Structure of ' + ClientDataSet1.Name); 
    sl.Add('- - - - - - - - - - - - - - - - - '); 
    for i := 0 to ClientDataSet1.FieldCount - 1 do 
     sl.Add(ClientDataSet1.Fields[i].FieldName); 
    ShowMessage(sl.Text); 
    finally 
    sl.Free; 
    end; 
end; 

चलती फ़ील्ड प्रभाव का प्रदर्शन करने के लिए, इस एप्लिकेशन को चलाएं और क्लाइंटडेटासेट संरचना दिखाए गए बटन पर क्लिक करें। आप यहाँ दिखाया गया है ऐसा ही कुछ देखना चाहिए:

The Structure of ClientDataSet1 
- - - - - - - - - - - - - - - - - 
StartOfWeek 
Label 
Count 
Active 

इसके बाद, DBGrid के कॉलम खींचें क्षेत्रों के प्रदर्शन का क्रम फिर से व्यवस्थित करने के लिए। एक बार फिर क्लाइंटडेटासेट संरचना बटन पर क्लिक करें। इस बार आपको लगता है कि करने के लिए कुछ इसी तरह देखेंगे यहाँ दिखाया गया है:

The Structure of ClientDataSet1 
- - - - - - - - - - - - - - - - - 
Label 
StartOfWeek 
Active 
Count 

क्या इस उदाहरण के बारे में उल्लेखनीय बात यह है कि DBGrid के स्तंभ स्थानांतरित किया जा रहा है, लेकिन वहाँ में फील्ड्स की स्थिति पर एक स्पष्ट प्रभाव है ClientDataSet, जैसे कि क्लाइंटडेटासेट.फिल्ड [0] स्थिति में जो फ़ील्ड एक बिंदु पर था, वह क्षणों के बाद आवश्यक नहीं है। और, दुर्भाग्य से, यह स्पष्ट रूप से क्लाइंटडेटासेट समस्या नहीं है। मैंने बीडीई-आधारित टीटीबल्स और एडीओ-आधारित एडोटेबल्स के साथ एक ही परीक्षण किया और उसी प्रभाव को मिला।

यदि आपको किसी डीबीजीड में प्रदर्शित होने वाले क्लाइंटडेटासेट में फ़ील्ड का संदर्भ लेने की आवश्यकता नहीं है, तो आपको इस प्रभाव के बारे में चिंता करने की आवश्यकता नहीं है। आप में से बाकी के लिए, मैं कई समाधानों के बारे में सोच सकता हूं।

सबसे आसान, हालांकि इस समस्या से बचने के लिए सबसे आसान तरीका यह नहीं है कि उपयोगकर्ता को डीबीजीड में खेतों को पुन: व्यवस्थित करने से रोका जाए। यह DBResizeColumn ध्वज को डीबीजीड की विकल्प संपत्ति से हटाकर किया जा सकता है। हालांकि यह दृष्टिकोण प्रभावी है, यह उपयोगकर्ता के परिप्रेक्ष्य से संभावित मूल्यवान प्रदर्शन विकल्प को समाप्त करता है।इसके अलावा, इस ध्वज को हटाने से न केवल कॉलम रीडरिंग को प्रतिबंधित किया जाता है, यह स्तंभ आकार बदलने से रोकता है। (कैसे स्तंभ का आकार बदलने के विकल्प को हटाए बिना स्तंभ पुनर्व्यवस्था सीमित करने के लिए जानने के लिए, http://delphi.about.com/od/adptips2005/a/bltip0105_2.htm देखें।)

दूसरा वैकल्पिक हल उनके शाब्दिक स्थिति के आधार पर एक डेटासेट के क्षेत्रों की चर्चा करते हुए से बचने के लिए (के बाद से इस समस्या का सार है) है। शब्दों के क्रम में, यदि आपको गणना फ़ील्ड को संदर्भित करने की आवश्यकता है, तो DataSet.Fields का उपयोग न करें [2]। जब तक आप फ़ील्ड का नाम जानते हैं, तो आप डेटासेट.फिल्ल्डबीनाम ('गणना') जैसे कुछ का उपयोग कर सकते हैं।

हालांकि फील्डबीनाम के उपयोग के लिए एक बड़ी कमी है। विशेष रूप से, यह विधि फ़ील्ड नाम के आधार पर एक मिलान की तलाश में डेटासेट की फ़ील्ड्स प्रॉपर्टी के माध्यम से पुनरावृत्ति करके क्षेत्र की पहचान करती है। चूंकि यह हर बार जब आप FieldByName को कॉल करते हैं, तो यह एक ऐसी विधि है जिसे परिस्थितियों से बचा जाना चाहिए जहां फ़ील्ड को कई बार संदर्भित किया जाना चाहिए, जैसे एक लूप में जो एक बड़ी डेटासेट को नेविगेट करता है।

आप क्षेत्र को बार-बार (और कई बार की एक बड़ी संख्या) का उल्लेख करने की जरूरत है, तो निम्नलिखित कोड का टुकड़ा की तरह कुछ का उपयोग करें:

var 
    CountField: TIntegerField; 
    Sum: Integer; 
begin 
    Sum := 0; 
    CountField := TIntegerField(ClientDataSet1.FieldByName('Count')); 
    ClientDataSet1.DisableControls; //assuming we're attached to a DBGrid 
    try 
    ClientDataSet1.First; 
    while not ClientDataSet1.EOF do 
    begin 
     Sum := Sum + CountField.AsInteger; 
     ClientDataSet1.Next; 
    end; 
    finally 
    ClientDataSet1.EnableControls; 
    end; 

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

यह निम्न कोड में प्रदर्शित किया गया है, जो क्लोन क्लाइंटडेटासेट संरचना लेबल वाले बटन के ऑनक्लिक ईवेंट हैंडलर से जुड़ा हुआ है।

यह:

procedure TForm1.Button2Click(Sender: TObject); 
var 
    sl: TStringList; 
    i: Integer; 
    CloneClientDataSet: TClientDataSet; 
begin 
    CloneClientDataSet := TClientDataSet.Create(nil); 
    try 
    CloneClientDataSet.CloneCursor(ClientDataSet1, True); 
    sl := TStringList.Create; 
    try 
     sl.Add('The Structure of ' + CloneClientDataSet.Name); 
     sl.Add('- - - - - - - - - - - - - - - - - '); 
     for i := 0 to CloneClientDataSet.FieldCount - 1 do 
     sl.Add(CloneClientDataSet.Fields[i].FieldName); 
     ShowMessage(sl.Text); 
    finally 
     sl.Free; 
    end; 
    finally 
    CloneClientDataSet.Free; 
    end; 
end; 

आप इस परियोजना चलाने के लिए और बटन दिखाएं नामक क्लोन ClientDataSet संरचना क्लिक करें, तो आप हमेशा ClientDataSet का सच संरचना, जैसा कि यहाँ दिखाया

The Structure of ClientDataSet1 
- - - - - - - - - - - - - - - - - 
StartOfWeek 
Label 
Count 
Active 

परिशिष्ट मिल जाएगा यह ध्यान रखना महत्वपूर्ण है कि अंतर्निहित डेटा की वास्तविक संरचना प्रभावित नहीं होती है। विशेष रूप से, यदि, डीबीजीड में कॉलम के क्रम को बदलने के बाद, आप ClientDataSet की SaveToFile विधि को कॉल करते हैं, सहेजी गई संरचना मूल (वास्तविक आंतरिक) संरचना है। साथ ही, यदि आप एक क्लाइंटडेटासेट की डेटा प्रॉपर्टी को दूसरे में कॉपी करते हैं, तो गंतव्य क्लाइंटडेटासेट भी वास्तविक संरचना दिखाता है (जो उस स्रोत के समान होता है जब स्रोत क्लाइंटडेटासेट क्लोन किया जाता है)।

इसी तरह, टीटीबल और एडोटेबल समेत अन्य परीक्षण किए गए डेटासेट से जुड़े डीबीजीआरआईड्स के कॉलम ऑर्डर में परिवर्तन, वास्तव में अंतर्निहित तालिकाओं की संरचना को प्रभावित नहीं करते हैं। उदाहरण के लिए, एक टीटीबल जो ग्राहक.db नमूना से डेटा प्रदर्शित करता है पैराडाक्स टेबल जो डेल्फी के साथ जहाज वास्तव में उस तालिका की संरचना को नहीं बदलता है (न ही आप इसकी अपेक्षा करेंगे)।

हम इन अवलोकनों से क्या निष्कर्ष निकाल सकते हैं यह है कि डेटासेट की आंतरिक संरचना स्वयं ही बरकरार है। नतीजतन, मुझे यह मानना ​​चाहिए कि कहीं भी डेटासेट की संरचना का द्वितीयक प्रतिनिधित्व है। और, यह या तो डेटासेट (जो कि डेटासेट के सभी उपयोगों की आवश्यकता नहीं है) से जुड़ा हुआ प्रतीत होता है, डीबीजीड से जुड़ा हुआ है (जो डीबीजीड इस सुविधा का उपयोग कर रहा है, लेकिन जो अधिक समझ में नहीं आता है, लेकिन जो नहीं है अवलोकन द्वारा समर्थित है कि टीएफआईल्ड रीडरिंग डेटासेट के साथ ही जारी है), या कुछ और है।

एक और विकल्प यह है कि प्रभाव TGridDataLink से जुड़ा हुआ है, जो कक्षा है जो मल्टीरो-जागरूक नियंत्रण (जैसे डीबीजीआरआईडी) को उनके डेटा जागरूकता प्रदान करती है। हालांकि, मैं इस स्पष्टीकरण को भी अस्वीकार करने के इच्छुक हूं, क्योंकि यह वर्ग ग्रिड से जुड़ा हुआ है, न कि डेटासेट, फिर से प्रभाव डेटासेट क्लास के साथ प्रतीत होता है।

जो मुझे मूल प्रश्न पर वापस लाता है। क्या यह टीडीएटीसेट क्लास, टीडीबीजीड का एक आर्टिफैक्ट, या कुछ और करने के लिए कुछ आंतरिक है?

मुझे यहां कुछ भी तनाव देने की अनुमति दें कि मैंने नीचे दी गई टिप्पणियों में से एक में जोड़ा है। किसी भी चीज़ से अधिक, मेरी पोस्ट डेवलपर्स को जागरूक करने के लिए डिज़ाइन की गई है कि जब वे डीबीजीआरआईड्स का उपयोग कर रहे हैं जिनके कॉलम ऑर्डर को बदला जा सकता है कि उनके टीएफआईल्ड का ऑर्डर भी बदल सकता है। यह आर्टिफैक्ट अस्थायी और गंभीर बग पेश कर सकता है जिसे पहचानना और ठीक करना बहुत मुश्किल हो सकता है। और, नहीं, मुझे नहीं लगता कि यह एक डेल्फी बग है। मुझे संदेह है कि सबकुछ काम कर रहा है क्योंकि इसे काम करने के लिए डिजाइन किया गया था। यह सिर्फ इतना है कि हम में से कई इस बात से अनजान थे कि यह व्यवहार हो रहा था। अब हम जानते हैं।

+3

बहुत जानकारीपूर्ण है, लेकिन यहां कहीं कोई प्रश्न है? –

+0

धन्यवाद @ कैरी, मुझे इसके बारे में कोई जानकारी नहीं है और मैं डेटासेट। फ़ील्ड [x] का निर्माण अक्सर कर रहा हूं। मुझे लगता है कि आपको इसे बग के रूप में Embarcadero वेबसाइट पर रिपोर्ट करनी चाहिए। – Wodzu

+0

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

उत्तर

3

स्पष्ट रूप से व्यवहार डिज़ाइन द्वारा है। वास्तव में यह dbgrid से संबंधित नहीं है। यह केवल फील्ड इंडेक्स सेट करने वाले कॉलम का दुष्प्रभाव है। उदाहरण के लिए, इस कथन,

क्लाइंटडेटासेट 1। फ़ील्ड [0]। इंडेक्स: = 1;

तदनुसार बदलने के लिए "क्लाइंटडेटासेट संरचना" बटन के आउटपुट का कारण बन जाएगा, या तो एक ग्रिड है या नहीं। TField.Index राज्यों के लिए प्रलेखन;

"इंडेक्स के मूल्य को बदलकर डेटासेट में किसी फ़ील्ड की स्थिति का क्रम बदलें। इंडेक्स वैल्यू को बदलना उस क्रम को प्रभावित करता है जिसमें डेटा ग्रिड में फ़ील्ड प्रदर्शित होते हैं, लेकिन भौतिक डेटाबेस टेबल में फ़ील्ड की स्थिति नहीं होती है। "

किसी को यह निष्कर्ष निकालना चाहिए कि रिवर्स भी सच होना चाहिए और ग्रिड में फ़ील्ड के क्रम को बदलने से फील्ड इंडेक्स को बदला जाना चाहिए।


यह कोड TColumn.SetIndex में है। TCustomDBGrid.ColumnMoved स्थानांतरित कॉलम और TColumn के लिए एक नई अनुक्रमणिका सेट करता है। SetIndex उस कॉलम के फ़ील्ड के लिए नई अनुक्रमणिका सेट करता है।

procedure TColumn.SetIndex(Value: Integer); 
[...] 
     if (Col <> nil) then 
     begin 
      Fld := Col.Field; 
      if Assigned(Fld) then 
      Field.Index := Fld.Index; 
     end; 
[...] 
1

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

यह इस प्रकार से संदर्भित किया जाना चाहिए:

qry.Recordset.Fields.Item[0].Value 

इन फ़ील्ड में व्यवहार आप पहले वर्णन किया है से प्रभावित नहीं हैं। इसलिए हम अभी भी अपने सूचकांक द्वारा फ़ील्ड का उल्लेख कर सकते हैं।

इसका परीक्षण करें और मुझे बताएं कि परिणाम क्या था। यह मेरे लिए काम किया।

संपादित करें:

बेशक

यह TClientDataSet के लिए नहीं, केवल एडीओ घटकों के लिए काम करेंगे ...

EDIT2:

कैरी मैं अगर यह अपने प्रश्न के लिए जवाब है पता नहीं है, हालांकि मैं एम्बरकेडेरो मंचों पर लोगों को धक्का दे रहा हूं और वेन निडरी ने मुझे इन सभी क्षेत्रों के आंदोलन के बारे में काफी विस्तृत उत्तर दिया है।

एक लंबी कहानी कम करने के लिए: यदि आप स्पष्ट रूप से टीडीबीजीड में अपने कॉलम को परिभाषित करते हैं, तो फ़ील्ड इंडेक्स नहीं चल रहे हैं! अब थोड़ा और समझ है, है ना?

पढ़ें पूर्ण यहाँ धागा: https://forums.embarcadero.com/post!reply.jspa?messageID=197287

+0

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

+0

लाइनों के बीच पढ़ना, हम निष्कर्ष निकाल सकते हैं कि डीबीजीड इस प्रभाव का स्रोत है, डेटासेट के टीएफआईल्ड के साथ किसी तरह से बातचीत कर रहा है। मैं इस निष्कर्ष के आधार पर आपका उत्तर स्वीकार करने जा रहा हूं। लेकिन मुझे लगता है कि हम अभी भी गहरी खुदाई कर सकते हैं। मैं जिम्मेदार सटीक तंत्र के बारे में और जानना चाहता हूं, क्योंकि यह अन्य छोटे ज्ञात साइड इफेक्ट्स का स्रोत हो सकता है। धन्यवाद, दिमित्री –

1

Wodzu पुनर्क्रमित फील्ड समस्या यह है कि एडीओ डेटासेट के लिए विशिष्ट था के लिए एक समाधान तैनात है, लेकिन वह मुझे एक समाधान है कि इसी तरह, और सभी डेटासेट के लिए उपलब्ध है के लिए नेतृत्व किया है (चाहे वह में ठीक से लागू किया गया है सभी डेटासेट एक और मुद्दा है)। ध्यान दें कि न तो यह जवाब, न ही वोदज़ू, वास्तव में मूल प्रश्न का उत्तर है। इसके बजाए, यह समस्या का समाधान है, जबकि सवाल यह बताता है कि यह आर्टिफैक्ट कहां से उत्पन्न होता है।

समाधान जो वोडज़ू का समाधान मुझे फील्डबीनंबर था, और यह फील्ड संपत्ति का एक तरीका है। FieldByNumber के उपयोग के लिए दो दिलचस्प पहलू हैं। सबसे पहले, आपको अपने डेटासेट की फील्ड प्रॉपर्टी के साथ इसके संदर्भ को अर्हता प्राप्त करनी होगी। दूसरा, फील्ड सरणी के विपरीत, जो शून्य-आधारित इंडेक्सर लेता है, FieldByNumber एक ऐसी विधि है जो TField की स्थिति को इंगित करने के लिए एक-आधारित पैरामीटर लेती है जिसे आप संदर्भित करना चाहते हैं।

निम्नलिखित बटन 1 इवेंट हैंडलर का एक अद्यतन संस्करण है जिसे मैंने अपने मूल प्रश्न में पोस्ट किया था। यह संस्करण FieldByNumber का उपयोग करता है।

procedure TForm1.Button1Click(Sender: TObject); 
var 
    sl: TStringList; 
    i: Integer; 
begin 
    sl := TStringList.Create; 
    try 
    sl.Add('The Structure of ' + ClientDataSet1.Name + 
     ' using FieldByNumber'); 
    sl.Add('- - - - - - - - - - - - - - - - - '); 
    for i := 0 to ClientDataSet1.FieldCount - 1 do 
     sl.Add(ClientDataSet1.Fields.FieldByNumber(i + 1).FieldName); 
    ShowMessage(sl.Text); 
    finally 
    sl.Free; 
    end; 
end; 

नमूना परियोजना के लिए, इस कोड को निम्नलिखित उत्पादन, परवाह किए बिना जुड़े DBGrid में कॉलम के उन्मुखीकरण का निर्माण करता है:

The Structure of ClientDataSet1 using FieldByNumber 
- - - - - - - - - - - - - - - - - 
StartOfWeek 
Label 
Count 
Active 

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

ClientDataSet1.Fields.FieldByNumber(1) 
फील्ड्स सरणी की तरह

, FieldByNumber एक TField संदर्भ देता है: नतीजतन, डेटासेट में पहले क्षेत्र का उल्लेख करने के लिए, आपको निम्न कोड का उपयोग करें। नतीजतन, यदि आप एक विशेष टीएफआईल्ड कक्षा के लिए विशिष्ट विधि का उल्लेख करना चाहते हैं, तो आपको लौटे हुए मूल्य को उचित कक्षा में डालना होगा। उदाहरण के लिए, एक फाइल करने के लिए एक TBlobField की सामग्री को बचाने के लिए, आप निम्न कोड की तरह कुछ करने के लिए हो सकता है:

TBlobField(MyDataSet.Fields.FieldByNumber(6)).SaveToFile('c:\mypic.jpg'); 

ध्यान दें कि मैं सुझाव दे नहीं कर रहा हूँ कि तुम एक डेटासेट पूर्णांक शाब्दिक का उपयोग करने में TFields उल्लेख होना चाहिए। व्यक्तिगत रूप से, TField वैरिएबल का उपयोग जो फ़ील्डबीनाम को एक बार कॉल के माध्यम से प्रारंभ किया जाता है, वह अधिक पठनीय है, और तालिका की संरचना के भौतिक क्रम में परिवर्तनों के प्रति प्रतिरोधी है (हालांकि आपके फ़ील्ड के नामों में बदलावों से प्रतिरक्षा नहीं है!)।

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

+2

यह स्टैक ओवरफ़्लो पर "अब तक का सबसे लंबा डेल्फी प्रश्न" जीतता है। :-) –

+0

@Cary, कृपया मेरा अद्यतन उत्तर देखें। इस "समस्या" के लिए एक और समाधान है। – Wodzu

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