将Dbgrid列宽度值保存到Ini并重新读取它们

时间:2014-05-28 09:13:50

标签: delphi pascal dbgrid

我有继承的表单和一个Ehlib dbgrid用于选择列表记录...表单已经准备好用于很多按钮,我使用这个表单和不同的查询。

喜欢这个......

If Dm.QrTmp.Active then Dm.QrTmp.Active:=False;
Dm.QrTmp.SQL.Clear;
Dm.QrTmp.SQL.Add('  SELECT          ');
Dm.QrTmp.SQL.Add('    ch.cari_RECno AS KayitNo           ');
Dm.QrTmp.SQL.Add('  FROM CARI_HESAPLAR ch   ');
if FrmTmp=nil then FrmTmp:=TFrmTmp.Create(Self);
FrmTmp.StatusBar.Hide;
Dm.QrTmp.Open;
FrmTmp.DbGrid.DataSource:=Dm.DsQrTmp;

此查询已被删除,但我当然使用了很多字段。查询在应用程序中改变了很多时间。

问题是列宽。 Manager想要设置列宽并再次恢复它们。实际上我的网格组件支持保存 - 恢复列属性,但正如您可以看到我的用法我不使用静态列。我也不想使用xgrid.columns [0] .width百分比百分比。

我正在使用ini in may app。

我想在其上添加新的部分并命名为" Gridwidth" ...

[Gridname] Colwidths = x,y,z(它们是宽度值)


我现在逐行编码。


我的写程序是这样的。

With dbgridx do
  begin
    For i:=0 to columns.count-1 
      begin
         widthstr:=widthstr+Column[i].width+',';  
      end;
  end;

Widthstr将是" 15,23,45,67"等...

但我想知道这是否是一个好的解决方案,如果有人知道更好的方法并且有一些好的代码。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

uses
  IniFiles;

const
  SETTINGS_FILE = 'Edijus\Settings.ini';

procedure TForm1.LoadDBGridColumnsWidth(const ADBGrid: TDBGrid);
var
  _MemIniU: TMemIniFile;
  _SettingsPath: string;
  i, j: integer;
  _ParentClass: TWinControl;
begin
  _SettingsPath := GetHomePath + PathDelim + SETTINGS_FILE;
  if (not Assigned(ADBGrid)) or (not Assigned(ADBGrid.DataSource)) or
    (not Assigned(ADBGrid.DataSource.DataSet)) then
    Exit;

  _MemIniU := TMemIniFile.Create(_SettingsPath, TEncoding.UTF8);
  try
    _ParentClass := ADBGrid.Parent;
    while not(_ParentClass is TForm) do
      _ParentClass := _ParentClass.Parent;
    for i := 0 to Pred(ADBGrid.DataSource.DataSet.Fields.Count) do
      for j := 0 to Pred(ADBGrid.Columns.Count) do
      begin
        if (ADBGrid.DataSource.DataSet.Fields[i].FieldName = ADBGrid.Columns[j]
          .FieldName) then
          ADBGrid.Columns[j].Width :=
            _MemIniU.ReadInteger(_ParentClass.Name + '_' + ADBGrid.Name,
            ADBGrid.Columns[j].FieldName, 64);
      end;
  finally
    FreeAndNil(_MemIniU);
  end;
end;

procedure TForm1.SaveDBGridColumnsWidth(const ADBGrid: TDBGrid);
var
  _MemIniU: TMemIniFile;
  _SettingsPath: string;
  i: integer;
  _ParentClass: TWinControl;
begin
  _SettingsPath := GetHomePath + PathDelim + SETTINGS_FILE;
  if (not Assigned(ADBGrid)) or
    (not ForceDirectories(ExtractFilePath(_SettingsPath))) then
    Exit;

  _MemIniU := TMemIniFile.Create(_SettingsPath, TEncoding.UTF8);
  try
    _ParentClass := ADBGrid.Parent;
    while not(_ParentClass is TForm) do
      _ParentClass := _ParentClass.Parent;
    for i := 0 to Pred(ADBGrid.Columns.Count) do
      if (ADBGrid.Columns[i].FieldName <> '') then
        _MemIniU.WriteInteger(_ParentClass.Name + '_' + ADBGrid.Name,
          ADBGrid.Columns[i].FieldName, ADBGrid.Columns[i].Width);

    _MemIniU.UpdateFile;
  finally
    FreeAndNil(_MemIniU);
  end;
end;