【问题标题】:Load table view on application start在应用程序启动时加载表视图
【发布时间】:2014-01-09 05:32:56
【问题描述】:

我希望我的应用程序记住数据库表中选定的行是 在应用程序关闭之前使用(选择),然后在下一次加载它(选择它) 应用程序启动。该表只有 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' (当应用程序退出时)我下次加载它。

【问题讨论】:

  • 如果您在TDataset.OnAfterOpen 中加载值,那么您应该将值保存在TDataset.OnBeforeClose ;o)
  • 首先将您的数据从表格中分离出来。使用数据模块。在数据模块上,您有一个 Oncreate 和一个 onDestroy。在这些事件中,您可以使用 TRegistryIniFile 来存储和保存参数。
  • 将ini文件放入%AppData%路径。但是使用注册表更简单:您不会想到将文件放在哪里,因此它不会以只读文件夹结尾
  • @user763539 你不需要保存网格视图,你应该保存选定的行ID(主键)
  • @Ravaut123,datamodule.OnCreate 不是执行此操作的正确事件。它不保证 DataSet 已经打开。我还将使用带有 DataSet1AfterOpen 的标志(例如 DataSet.Tag)来指示它是第一次打开,因为它可以在应用程序生命周期内多次打开/关闭。

标签: delphi devexpress delphi-xe4 tcxgrid


【解决方案1】:

使用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;

【讨论】:

  • @kobik 我将这些单例作为类属性而不创建实际对象:-)
  • @Sir Rufo - 无法编译您的“LIni.WriteString('MyDataSet', 'ID', DataSet.FieldByName('ID').AsString), []);” Delphi 编译器不消化最后一个逗号....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多