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.

È stato utile?

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;
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top