Вопрос

Я хотел бы, чтобы мое приложение помнить, какая выбранная строка в таблице базы данных была используется (выбрано) до закрытия приложения, а затем загрузить его (вы выбрали) в следующий раз Начало приложения. Таблица имеет только 4 записи и читается только так, чтобы я не должен беспокоиться, если кто-то пытается что-нибудь изменить. Прямо сейчас я использую:

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

Но это хардкодируется.Я хочу это гибко. Как я могу сохранить эти настройки в файл INI, расположенный в папке Application.exe и загрузить их, когда начнется приложение?Так, например, если ключ был «3» (Когда приложение. Выйди) я загружаю его в следующий раз.

Это было полезно?

Решение

Используйте мероприятия TDataSet.OnAfterOpen и TDataSet.OnBeforeClose для загрузки и сохранения желаемых значений

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

Это очень простой и промежуток вперед образец, и вы не должны реализовывать это в реальных приложениях.

В реальных приложениях вы будете делегировать это в Singleton, который заботится о чтении и записи таких значений приложений

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

и дает вам очень умное решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top