Question

J'aimerais que mon application se souvienne de la ligne sélectionnée dans la table de base de données utilisée (sélectionnée) avant que l'application ne soit fermée, puis le chargez (faites-le sélectionner) la prochaine fois que l'application commence. Je n'ai donc pas à m'inquiéter si quelqu'un essaie de changer quoi que ce soit.En ce moment j'utilise :

procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
  Clientdataset1.DisableControls;
  try
    cxGrid1DBTableView1.DataController.KeyFieldNames := 'ID';
    cxGrid1DBTableView1.DataController.LocateByKey('4');
  finally
    Clientdataset1.EnableControls;
  end;
end;

Mais c'est codé en dur.Je le veux flexible.Comment puis-je enregistrer ces paramètres dans un fichier INI situé dans le dossier Application.exe et les charger lorsque l'application démarre?Ainsi, par exemple, si Key était «3» (lorsque l'application.quitté) Je le charge la prochaine fois.

Était-ce utile?

La solution

Utilisez le TDataSet.OnAfterOpen et TDataSet.OnBeforeClose événements pour charger et sauvegarder les valeurs souhaitées

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;

C'est un très simple et direct exemple et vous ne devez pas l’implémenter dans des applications réelles.

Dans les applications réelles, vous déléguerez cela à un singleton qui se charge de lire et d'écrire ces valeurs d'application.

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

et vous offre une solution très 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top