Pergunta

Eu gostaria que minha aplicação para lembrar da linha selecionada na tabela de banco de dados foi usado (selecionado) antes da aplicação ficou fechado e, em seguida, carregá-lo (ter selecionado) na próxima vez que o aplicativo é iniciado.A tabela tem apenas 4 registos e é só de leitura para eu não ter de se preocupar se alguém tenta mudar alguma coisa.Agora eu uso :

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

Mas isso é codificado.Eu quero é flexível.Como posso salvar essas configurações para um arquivo ini, localizado no application.exe pasta e carregá-los quando a aplicação é iniciada ?Assim ,por exemplo,se a tecla '3' (quando o aplicativo.encerrado) eu carregá-lo na próxima vez.

Foi útil?

Solução

Use o TDataSet.OnAfterOpen e TDataSet.OnBeforeClose eventos para carregar e guardar os valores desejados

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;

Este é um muito simples e para a frente exemplo e não deve implementar esta em aplicações reais.

Em aplicações reais, você vai delegar um singleton que cuida da leitura e da escrita, tais aplicação de valores

// 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 dá-lhe uma muito inteligente solução

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top