Carica tabella vista sull'inizio dell'applicazione
-
21-12-2019 - |
Domanda
Vorrei che la mia applicazione ricorda quale riga selezionata nella tabella del database era usato (selezionato) prima che l'applicazione sia stata chiusa e quindi lo carica (ha selezionato) la prossima volta il Avvio dell'applicazione. La tabella ha solo 4 record ed è leggermente letto quindi non devo preoccuparti se qualcuno cerca di cambiare qualsiasi cosa. In questo momento, uso:
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
Clientdataset1.DisableControls;
try
cxGrid1DBTableView1.DataController.KeyFieldNames := 'ID';
cxGrid1DBTableView1.DataController.LocateByKey('4');
finally
Clientdataset1.EnableControls;
end;
end;
.
Ma questo è hardcoded.Lo voglio flessibile. Come posso salvare queste impostazioni in un file INI situato nella cartella Application.exe e caricarli quando inizia l'applicazione?Quindi, ad esempio, se la chiave era '3' (Quando l'app. Exhited) lo carico la prossima volta.
Soluzione
Utilizzare gli eventi TDataSet.OnAfterOpen
e TDataSet.OnBeforeClose
per caricare e salvare i valori desiderati
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
var
LIni : TIniFile;
begin
DataSet.DisableControls;
try
LIni := TIniFile.Create( '<YourIniFileName.ini>' );
try
DataSet.Locate( 'ID', LIni.ReadString( 'MyDataSet', 'ID', '' ), [] );
finally
LIni.Free;
end;
finally
DataSet.EnableControls;
end;
end;
procedure TForm3.ClientDataSet1BeforeClose(DataSet: TDataSet);
var
LIni : TIniFile;
begin
LIni := TIniFile.Create( '<YourIniFileName.ini>' );
try
LIni.WriteString( 'MyDataSet', 'ID', DataSet.FieldByName( 'ID' ).AsString ) );
finally
LIni.Free;
end;
end;
.
Questo è un semplice semplice e Dritto Esempio e non dovresti implementarlo in applicazioni reali.
In applicazioni reali delegherai questo a un singleton che si prende cura della lettura e della scrittura di tali valori di applicazione
// Very simple KeyValue-Store
IKeyValueStore = interface
function GetValue( const Key : string; const Default : string ) : string;
procedure SetValue( const Key : string; const Value : string );
end;
// Global Application Value Store as Singleton
function AppGlobalStore : IKeyValueStore;
.
e ti dà una soluzione molto intelligente
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
DataSet.DisableControls;
try
DataSet.Locate( 'ID', AppGlobalStore.GetValue( 'MyDataSet\ID', '' ), [] );
finally
DataSet.EnableControls;
end;
end;
procedure TForm3.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
AppGlobalStore.SetValue( 'MyDataSet\ID', DataSet.FieldByName( 'ID' ).AsString ), [] );
end;
.