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.

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top