2014-11-05 7 views
7

पर रखें, मैं डेल्फी 2007 के लिए यह प्रश्न लिख रहा हूं, लेकिन मुझे पूरा यकीन है कि यह सभी प्रकार की भाषाओं में एक आम समस्या है।पहले पोस्ट घटना से मूल्यों को बाद के ईवेंट

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

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

असल में, मैं पूछ रहा हूं कि डेटासेट के पहले पोस्ट ईवेंट से जानकारी रखने के लिए और बाद में पोस्टपोस्ट ईवेंट में उन्हें वापस लाने के लिए बेहतर तरीका है (डेल्फी 2007 या सामान्य में)।

+0

नहीं। यही कारण है कि संभव नहीं होगा (निश्चित रूप से यह 'TDataSet' वंशज के कार्यान्वयन पर निर्भर करता , लेकिन अर्थ से नहीं)। उन घटनाओं के बीच डेटासेट फ़ील्ड बफर फ्लश करता है और नए पोस्ट किए गए राज्य के साथ खुद को रीफ्रेश करता है, इसलिए पिछला राज्य खो जाना चाहिए। – TLama

+0

आप किस प्रकार का टीडीटासेट इस्तेमाल कर रहे हैं? कारण मैं पूछता हूं कि यदि आप TClientDataSets का उपयोग कर रहे हैं तो इस तरह की चीजें बहुत सरल हो जाती हैं। – MartynA

+3

बीटीडब्ल्यू, मैंने जो कहा वह @TLama के विरोधाभास का अर्थ नहीं था। यह केवल अस्थायी TClientDataSets आपके मुख्य डेटासेट पर होने वाली घटनाओं के बीच डेटासेट डेटा को संरक्षित करने के बहुत ही आसान तरीके प्रदान करता है ... दिलचस्प q, btw के लिए +1। – MartynA

उत्तर

0

पहले एक नया कस्टम डेटा स्रोत

TDataRecord = array of record 
    FieldName: string; 
    FieldValue: Variant; 
    end; 

    TMyDataSource = class(TDataSource) 
    private 
    LastValues: TDataRecord; 
    procedure MyDataSourceBeforePost(DataSet: TDataSet); 
    procedure SetDataSet(const Value: TDataSet); 
    function GetDataSet: TDataSet; 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    function GetLastValue(FieldName: string): Variant; 
    property MyDataSet: TDataSet read GetDataSet write SetDataSet; 
    end; 

{ TMyDataSource } 

constructor TMyDataSource.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
end; 

destructor TMyDataSource.Destroy; 
begin 
    SetLength(LastValues, 0); 
    inherited Destroy; 
end; 

function TMyDataSource.GetDataSet: TDataSet; 
begin 
    Result := DataSet; 
end; 

procedure TMyDataSource.SetDataSet(const Value: TDataSet); 
begin 
    DataSet := Value; 
    DataSet.BeforePost := MyDataSourceBeforePost; 
end; 

procedure TMyDataSource.MyDataSourceBeforePost(DataSet: TDataSet); 
var 
    i: integer; 
begin 
    SetLength(LastValues, DataSet.FieldCount); 
    for i:=0 to DataSet.FieldCount-1 do 
    begin 
    LastValues[i].FieldName := DataSet.Fields.Fields[i].FieldName; 
    LastValues[i].FieldValue := DataSet.Fields.Fields[i].OldValue; 
    end; 
end; 

function TMyDataSource.GetLastValue(FieldName: string): Variant; 
var 
    i: integer; 
begin 
    Result := Null; 
    for i:=0 to Length(LastValues)-1 do 
    if SameText(FieldName, LastValues[i].FieldName) then 
    begin 
     Result := LastValues[i].FieldValue; 
     break; 
    end; 
end; 

बना सकते हैं और बाद ओवरराइड आवेदन डेटा स्रोत

TForm1 = class(TForm) 
    private 
    MyDataSource: TMyDataSource; 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ADOQuery1.Active := true; 
    MyDataSource := TMyDataSource.Create(Self); 
    MyDataSource.MyDataSet := ADOQuery1; 
    DBGrid1.DataSource := MyDataSource; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    MyDataSource.Free; 
end; 

procedure TForm1.ADOQuery1AfterPost(DataSet: TDataSet); 
var 
    AValue: Variant; 
begin 
    AValue := MyDataSource.GetLastValue('cname'); 
    if not VarIsNull(AValue) then; 
end; 
+0

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

+0

ओप, मैंने नहीं देखा कि आप 10 महीने से पहले यह सवाल करते हैं !! – AngelsGR

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