Pregunta

Me gustaría que mi aplicación recuerde qué fila seleccionada en la tabla de la base de datos se usó (seleccionada) antes de que la aplicación se cerrara y luego la cargue (sea seleccionada) la próxima vez que comience la aplicación. La tabla tiene solo 4 registros y se lee solo Así que no tengo que preocuparme si alguien intenta cambiar algo.Ahora mismo uso:

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

Pero esto está codificado.Lo quiero flexible.¿Cómo puedo guardar estas configuraciones en un archivo INI ubicado en la carpeta Application.exe y cargarlos cuando comience la aplicación?Entonces, por ejemplo, si la clave era '3' (cuando la aplicación.salió) Lo cargo la próxima vez.

¿Fue útil?

Solución

Utilizar el TDataSet.OnAfterOpen y TDataSet.OnBeforeClose eventos para cargar y guardar los valores deseados

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;

Esto es muy simple y directo muestra y no debe implementar esto en aplicaciones reales.

En aplicaciones reales, delegarás esto a un singleton que se encarga de leer y escribir dichos valores de la aplicación.

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

y te da una solución muy inteligente

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top