2014-11-05 4 views
7

Ich schreibe diese Frage für Delphi 2007, aber ich bin mir ziemlich sicher, dass dies ein allgemeines Problem in allen Sprachen ist.Werte vom Vorpost-Ereignis zum Nachpost-Ereignis beibehalten

Also, ich habe ein Projekt, wo ich Informationen über den alten und neuen Wert bestimmter Felder (die in der BeforePost-Ereignis des Datensatzes, mit dem ich arbeite) geben und sie im AfterPost-Ereignis verwenden müssen.

Für jetzt habe ich globale Variablen verwendet, aber es gibt bereits so viele von ihnen im Projekt, dass dies ein echtes Problem wird, wenn es um die Verwaltung von Dokumenten und/oder Kommentare geht.

Grundsätzlich frage ich, ob es einen besseren Weg gibt (in Delphi 2007 oder allgemein), die Informationen aus dem BeforePost-Ereignis eines Datasets zu behalten und sie im AfterPost-Ereignis zurückzuholen.

+0

Nein, das wird nicht möglich sein (natürlich hängt es von dem 'TDataSet' Nachkommen Implementierung , aber mit Nein). Zwischen diesen Ereignisdatensätzen werden Feldpuffer gelöscht und sie werden mit dem neuen Status aktualisiert, sodass der vorherige Status verloren gehen sollte. – TLama

+0

Welche Art von TDataSet verwenden Sie? Grund, ich frage, ist, dass diese Art von Sachen viel einfacher wird, wenn Sie TClientDataSets verwenden. – MartynA

+3

Btw, was ich sagte, war nicht im Widerspruch zu @TLama. Es ist nur so, dass temporäre TClientDataSets sehr praktische Möglichkeiten bieten, Dataset-Daten zwischen Ereignissen zu speichern, die in Ihrem Hauptdatensatz vorkommen ... +1 für das interessante q, btw. – MartynA

Antwort

0

zunächst eine neue benutzerdefinierte Datenquelle

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; 

und nach Überschreibung Anwendung Datenquelle

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

Hallo @AngelsGR! Vielen Dank für Ihre Antwort! Leider, da dies für mich ein altes Thema ist, kann ich es nicht einmal testen. Ich habe den Job gewechselt und verwende Delphi nicht mehr. Vielleicht könnte jemand anderes als ich bestätigen, dass dies funktioniert! Ich kann das nicht als die Antwort für jetzt markieren. – KeineMaster

+0

ops, ich habe nicht gesehen, dass Sie diese Frage vor 10 Monaten stellen !! – AngelsGR

Verwandte Themen