Tabellenansicht beim Anwendungsstart laden
-
21-12-2019 - |
Frage
Ich möchte, dass meine Anwendung sich daran erinnert, welche ausgewählte Zeile in der Datenbanktabelle verwendet wurde (ausgewählt) wurde, bevor die Anwendung geschlossen wurde, und laden Sie sie dann (lassen Sie sie ausgewählt) Ich muss mir also keine Sorgen machen, wenn jemand versucht, etwas zu ändern.Im Moment verwende ich:
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
Clientdataset1.DisableControls;
try
cxGrid1DBTableView1.DataController.KeyFieldNames := 'ID';
cxGrid1DBTableView1.DataController.LocateByKey('4');
finally
Clientdataset1.EnableControls;
end;
end;
Aber das ist fest codiert.Ich möchte es flexibel.Wie kann ich diese Einstellungen in einer INI -Datei im Ordner application.exe speichern und sie laden, wenn die Anwendung startet?Also zum Beispiel, wenn der Schlüssel '3' war (wenn die App.beendet) Ich lade es das nächste Mal.
Lösung
Benutzen Sie die TDataSet.OnAfterOpen
Und TDataSet.OnBeforeClose
Ereignisse zum Laden und Speichern der gewünschten Werte
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;
Das ist ein sehr einfach Und geradeaus Beispiel und Sie sollten dies nicht in realen Anwendungen implementieren.
In realen Anwendungen delegieren Sie dies an einen Singleton, der sich um das Lesen und Schreiben solcher Anwendungswerte kümmert
// 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;
und bietet Ihnen eine sehr intelligente Lösung
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;