-1

我希望我的应用程序记住在应用程序关闭之前使用(选择)数据库表中的哪个选定行,然后在下次应用程序启动时加载它(选择它)。该表只有 4 条记录并且是只读的所以如果有人试图改变任何东西,我不必担心。现在我使用:

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

但这是硬编码的。我希望它灵活。如何将这些设置保存到位于 application.exe 文件夹中的 ini 文件并在应用程序启动时加载它们?因此,例如,如果键是“3”(当应用程序退出时)我下次加载它。

4

1 回答 1

4

使用TDataSet.OnAfterOpenTDataSet.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;

这是一个非常简单直接的示例,您不应该在实际应用程序中实现它。

在实际应用程序中,您将把它委托给一个负责读取和写入此类应用程序值的单例

// 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;
于 2014-01-09T11:14:41.207 回答