如何找到网格列的顺序?

我在连接到具有10个字段的数据库表的表单上有一个网格。第一个字段(隐藏)是ID。第二个字段是First_Name,第三个字段是Last_Name,依此类推。这些列的索引为1到10。现在,如果用户希望在First_Name之前使用Last_Name,则可以抓住该列并将其滑过。现在,“名字”的索引为3,“姓氏”的索引为2。

我需要能够读取列索引的顺序,以便可以将它们写入INI文件。然后,下一次用户打开应用程序时,我可以将网格设置回首选状态。

我正在使用TRxDBGrid使用Lazarus 2.0.6进行此操作。我已经尝试了它的几个属性,但是没有一个显示网格列的顺序。

my183300 回答:如何找到网格列的顺序?

我通常使用Delphi而不是Lazarus,并且一直在尝试将RXDbGrid软件包安装到Lazarus 2.0.6中,以检查我对此的建议答案,到目前为止没有任何运气。但是...

TRxColumn源自DBGrids源文件中的TColumn

TColumn具有公共属性Index,它是一个整数,它是GridGrids集合中列的索引。

由于我无法获得RXDBGrid来安装atm,因此下面的示例使用普通的TDBGrid,但是在进行明显的细节更改时应该可以正常工作。

该示例包含3个字段,ID整数,名称字符串[20]和值整数。

为简单起见,将列顺序保存到TMemo中,而不是保存和加载IniFile,并且要测试LoadColumnInfo,需要在备忘录中更改列顺序。

如您所见,要重新加载网格列顺序,最简单的方法是按左->右顺序保存列标题;并在重新加载保存的信息时使用函数ColumnByName查找正确的列。

uses
  Classes,SysUtils,memds,db,Forms,Controls,Graphics,Dialogs,DBGrids,StdCtrls;

type
  TForm1 = class(TForm)
    btnSaveColumns: TButton;
    btnLoadColumns: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    MemDataset1: TMemDataset;
    Memo1: TMemo;
    procedure btnLoadColumnsClick(Sender: TObject);
    procedure btnSaveColumnsClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    function ColumnByName(const AName: String): TColumn;
    procedure LoadColumnInfo;
    procedure SaveColumnInfo;
  public
  end;
 [...]

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
begin
  MemDataSet1.Open;
  for i := 0 to 5 do
    MemDataSet1.InsertRecord([i,'Name' + IntToStr(i),i]);
end;

procedure TForm1.btnSaveColumnsClick(Sender: TObject);
begin
  SaveColumnInfo;
end;

procedure TForm1.btnLoadColumnsClick(Sender: TObject);
begin
  LoadColumnInfo;
end;

procedure TForm1.SaveColumnInfo;
var
  i : Integer;
  S : String;
begin
  Memo1.Lines.Clear;
  for i := 0 to DBGrid1.Columns.Count - 1 do begin
     S := DBGrid1.Columns[i].Title.Caption;
     Memo1.Lines.Add(S);
  end;
 end;

function TForm1.ColumnByName(const AName : String) : TColumn;
var
  i : integer;
begin
  for i := 0 to DBGrid1.Columns.Count - 1 do begin
    Result := DBGrid1.Columns[i];
    if CompareText(AName,Result.Title.Caption) = 0 then
      exit;
  end;
  Result := Nil;
end;

procedure TForm1.LoadColumnInfo;
var
  i : Integer;
  Index : Integer;
  Column : TColumn;
  S : String;
begin

  for i := 0 to Memo1.Lines.Count - 1 do begin
    S := Memo1.Lines[i];
     Column := ColumnByName(S);
     Assert(Column <> Nil);
     Column.Index := i;
  end;
end;

end.
本文链接:https://www.f2er.com/3085994.html

大家都在问