डी 2010, विन 7 64 बिट। नमस्ते,

मेरे पास एक अन्य रूटीन में खोले गए TDataSet को संसाधित करने की आवश्यकता के साथ एक बटनक्लिक ईवेंट है... GetDBGenericData.

फ़ंक्शन GetDBGenericData एक TDataSet देता है। यह रूटीन मूल रूप से एक tQuery घटक लेता है, इसकी SQL संपत्ति सेट करता है, और इसे खोलता है। यह तब मेरे बटनक्लिक पर TDataSet देता है।

procedure TForm1.Button2Click(Sender: TObject);
var
DS : TDataSet;
begin

DS := TDataSet.Create(nil);
DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', [] );

while Not DS.EOF do
   begin
   ShowMessage(DS.FieldByName('USERNAME').AsString);
   DS.Next;
   end;

DS.Close;
DS.Free;

मेरी समस्या है - डीएस को समझना। मैं इसे यहां इस रूटीन में बना रहा हूं। मैं इसे एक TDataSet को "असाइन" कर रहा हूं जो एक घटक को इंगित करता है। अगर मैं इसे मुक्त नहीं करता, तो मेरे पास एक स्मृति रिसाव है (जैसा कि यूरेकालॉग द्वारा रिपोर्ट किया गया है)। अगर मैं इसे मुक्त करता हूं, तो अगली बार जब मैं इस दिनचर्या को चलाता हूं तो मुझे एवी मिलता है। (विशेष रूप से GetDBGenericData दिनचर्या के अंदर)।

मुझे लगता है कि जो हो रहा है वह यह है कि डीएस को वापस किए जा रहे टीडाटासेट को (प्रतिलिपि के विपरीत) सौंपा जा रहा है, इसलिए असल में, मैं इस दिनचर्या में दोनों डीएस मुक्त कर रहा हूं, और GetDBGenericData में tQuery, जब मैं एक मुफ्त करता हूं .

मैं लिंकेज को कैसे "तोड़" सकता हूं, और फिर केवल उसी से जुड़ी मेमोरी को हटा सकता हूं जिसे मैं गतिशील रूप से बना रहा हूं।

धन्यवाद, जी एस

2
user1009073 25 अक्टूबर 2011, 03:11

1 उत्तर

सबसे बढ़िया उत्तर

अगर आपके DS वैरिएबल को GetDBGenericData द्वारा एक और TDataSet असाइन किया जा रहा है, तो आपको इसे Create या Free नहीं करना चाहिए। आप इसका उपयोग किसी मौजूदा डेटासेट को संदर्भित करने के लिए कर रहे हैं।

procedure TForm1.Button2Click(Sender: TObject);
var
  DS : TDataSet;
  UserNameField: TField;  // Minor change for efficiency
begin
  DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', [] );

  // Call FieldByName only once; no need to create or
  // free this either.
  UserNameField := DS.FieldByName('USERNAME');

  while not DS.Eof do
  begin
    ShowMessage(UserNameField.AsString);
    DS.Next;
  end;

  // I'd probably remove the `Close` unless the function call
  // above specifically opened it before returning it.
  DS.Close;
end;
5
Ken White 25 अक्टूबर 2011, 03:16