delphi DBGrid1 游标 保持 最后一条  
官方Delphi 学习QQ群: 682628230(三千人)\n
频道

delphi DBGrid1 游标 保持 最后一条


DBGrid1  游标 保持 最后一条


在 Delphi 中,让 DBGrid1 的游标(当前记录)保持在最后一条记录,有以下几种方法:


方法一:使用 Last 方法(最直接)


procedure TForm1.FormShow(Sender: TObject);

begin

  // 打开数据集后,移动到最后一条记录

  ADOQuery1.Open;

  ADOQuery1.Last;

  // DBGrid 会自动显示当前记录的位置

end;


方法二:在数据加载后自动定位到最后


procedure TForm1.LoadData;

begin

  ADOQuery1.SQL.Text := 'SELECT * FROM main ORDER BY ID';

  ADOQuery1.Open;

  

  // 移动到最后一条记录

  if not ADOQuery1.IsEmpty then

    ADOQuery1.Last;

end;


方法三:使用 TDataSet 的 AfterOpen 事件

在数据集的 AfterOpen 事件中编写代码:



procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);

begin

  // 数据集打开后自动定位到最后

  if not DataSet.IsEmpty then

    DataSet.Last;

end;

方法四:使用 TDataSource 的 OnDataChange 事件(确保始终显示最后)


procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);

begin

  // 可选:当数据变化时,自动滚动DBGrid到最后

  // 但需要注意避免循环触发

end;


// 更好的方式:在新增记录后自动滚动到最后

procedure TForm1.ButtonAddClick(Sender: TObject);

begin

  ADOQuery1.Append;

  ADOQuery1.FieldByName('nd').Value := 2026;

  ADOQuery1.FieldByName('m').Value := 3;

  // ... 其他字段赋值

  ADOQuery1.Post;

  

  // 新增后移动到新记录

  ADOQuery1.Last;

end;

方法五:使用 Bookmark(书签)确保定位

如果需要确保记录确实移动到最新插入的记录:



procedure TForm1.InsertAndGoLast;

var

  Bookmark: TBookmark;

begin

  ADOQuery1.Append;

  ADOQuery1.FieldByName('nd').Value := 2026;

  ADOQuery1.FieldByName('m').Value := 3;

  // ... 其他字段赋值

  ADOQuery1.Post;

  

  // 使用书签确保移动到最新记录

  Bookmark := ADOQuery1.GetBookmark;

  try

    ADOQuery1.Last;

    // 如果最后一条不是刚插入的,可以重新定位

    if ADOQuery1.RecNo <> ADOQuery1.RecordCount then

    begin

      ADOQuery1.GotoBookmark(Bookmark);

    end;

  finally

    ADOQuery1.FreeBookmark(Bookmark);

  end;

end;

方法六:保持游标始终在最后(适用于实时刷新)

pascal

procedure TForm1.RefreshAndStayAtLast;

var

  LastID: Integer;

begin

  // 保存当前最后一条记录的ID

  if not ADOQuery1.IsEmpty then

  begin

    ADOQuery1.Last;

    LastID := ADOQuery1.FieldByName('ID').AsInteger;

  end

  else

    LastID := -1;

  

  // 刷新数据

  ADOQuery1.Close;

  ADOQuery1.Open;

  

  // 尝试定位到之前的最后一条记录

  if LastID > -1 then

  begin

    if ADOQuery1.Locate('ID', LastID, []) then

      // 找到了,就保持在那里

    else

      // 如果找不到(比如新增了记录),就移到真正的最后

      ADOQuery1.Last;

  end

  else if not ADOQuery1.IsEmpty then

    ADOQuery1.Last;

end;

方法七:使用 TDBGrid 的 OnDrawColumnCell 确保显示最后(不推荐)

pascal

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;

  DataCol: Integer; Column: TColumn; State: TGridDrawState);

begin

  // 这不是好的做法,仅作为参考

  // 不建议在绘制事件中移动记录

end;

完整示例(最常用)


unit Unit1;


interface


uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, DB, ADODB, Grids, DBGrids;


type

  TForm1 = class(TForm)

    ADOConnection1: TADOConnection;

    ADOQuery1: TADOQuery;

    DataSource1: TDataSource;

    DBGrid1: TDBGrid;

    ButtonLoad: TButton;

    procedure FormShow(Sender: TObject);

    procedure ButtonLoadClick(Sender: TObject);

    procedure ADOQuery1AfterOpen(DataSet: TDataSet);

  private

    { Private declarations }

  public

    { Public declarations }

  end;


var

  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.FormShow(Sender: TObject);

begin

  ButtonLoadClick(Sender);

end;


procedure TForm1.ButtonLoadClick(Sender: TObject);

begin

  ADOQuery1.SQL.Text := 'SELECT * FROM main ORDER BY ID';

  ADOQuery1.Open;

  // 方法1:在代码中直接移动到最后

  if not ADOQuery1.IsEmpty then

    ADOQuery1.Last;

end;


// 方法2:在AfterOpen事件中处理

procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);

begin

  if not DataSet.IsEmpty then

    DataSet.Last;

end;


end.

注意事项

数据集必须打开:只有在数据集打开后,才能使用 Last 方法


空数据集处理:如果数据集为空,调用 Last 会出错,所以需要先判断 IsEmpty


排序影响:Last 是根据数据集的当前排序确定最后一条记录,如果需要按特定字段排序,请在 SQL 中使用 ORDER BY


性能考虑:如果数据量很大,频繁调用 Last 可能影响性能


新增记录:使用 Append 新增记录后,游标会自动移动到新记录,无需额外调用 Last


推荐使用 方法三(AfterOpen 事件)或 方法二(加载后直接调用 Last),这样最简洁且易于维护。



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.046618223190308 seconds