Charger la vue du tableau au démarrage de l'application
-
21-12-2019 - |
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.
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;