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