2014-11-05 7 views
7

Sto scrivendo questa domanda per Delphi 2007, ma sono abbastanza sicuro che questo è un problema comune in tutti i tipi di lingue.Mantieni i valori dall'evento beforepost all'evento postpost

Quindi, ho un progetto in cui ho bisogno di mantenere informazioni sul vecchio e nuovo valore di determinati campi (che sono dati nell'evento BeforePost del set di dati con cui sto lavorando) e li uso nell'evento AfterPost.

Per ora, ho utilizzato variabili globali, ma nel progetto ce ne sono già talmente tante che questo sta diventando un problema reale quando si tratta di gestire la documentazione e/oi commenti.

Fondamentalmente, sto chiedendo se esiste un modo migliore (in Delphi 2007 o in generale) per mantenere le informazioni dall'evento BeforePost di un set di dati e recuperarle nell'evento AfterPost.

+0

No. Questo non sarà possibile (ovviamente dipende sull'attuazione del 'TDataSet' del discendente , ma con il significato no). Tra questi eventi il ​​set di dati svuota i buffer di campo e si aggiorna con il nuovo stato inviato, quindi lo stato precedente dovrebbe essere perso. – TLama

+0

Che tipo di TDataSet stai usando? La ragione che ti chiedo è che questo tipo di cose diventa molto più semplice se ti capita di usare TClientDataSets. – MartynA

+3

Btw, quello che ho detto non intendeva contraddire @TLama. È solo che i TClientDataSet temporanei forniscono metodi molto utili per preservare i dati del dataset tra gli eventi che si verificano sul set di dati principale ... +1 per l'interessante q, btw. – MartynA

risposta

0

prima creare una nuova sorgente di dati personalizzati

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; 

e dopo l'applicazione di override dei dati di origine

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

Ciao @AngelsGR! La ringrazio per la risposta! Sfortunatamente, dato che questo è un po 'un vecchio argomento per me, non riesco nemmeno a verificarlo. Ho cambiato lavoro e non uso più Delphi. Forse qualcun altro oltre a me potrebbe confermare che questo funziona! Non posso contrassegnarlo come la risposta per ora. – KeineMaster

+0

ops, non ho visto che fai questa domanda prima di 10 mesi !! – AngelsGR