delphi – 如何实现IsFirstRecord和IsLastRecord?
发布时间:2020-12-15 09:28:36 所属栏目:大数据 来源:网络整理
导读:我喜欢在用户点击它们时没有意义的情况下禁用控件. 一个特殊情况是一组自定义菜单按钮,用于模拟标准TDBNavigator的第一个,前一个,下一个和最后一个按钮. 当用户单击第一个按钮时,第一个和前一个按钮都被禁用. 当用户然后单击下一个和前一个按钮时,基础TDataS
我喜欢在用户点击它们时没有意义的情况下禁用控件.
一个特殊情况是一组自定义菜单按钮,用于模拟标准TDBNavigator的第一个,前一个,下一个和最后一个按钮. 当用户单击第一个按钮时,第一个和前一个按钮都被禁用. 当用户然后单击下一个和前一个按钮时,基础TDataSet与之前的记录位于同一记录中,但是仍然启用了第一个和前一个按钮. 当前的实现如下所示: NavigationFirstButton.Enabled := not DataSet.IsEmpty and not DataSet.Bof; NavigationPriorButton.Enabled := not DataSet.IsEmpty and not DataSet.Bof; NavigationNextButton.Enabled := not DataSet.IsEmpty and not DataSet.Eof; NavigationLastButton.Enabled := not DataSet.IsEmpty and not DataSet.Eof; Bof和Eof不是禁用按钮的正确方法,因为我必须事先知道当前记录是否是第一个/最后一个记录. 所以我想用IsFirstRecord和IsLastRecord方法重写它: function IsFirstRecord(ADataSet: TDataSet): Boolean; begin Result := ADataSet.RecNo = 0; end; function IsLastRecord(ADataSet: TDataSet): Boolean; begin Result := ADataSet.RecNo = ADataSet.RecordCount - 1; end; 我不认为这是一个好主意,因为我已经看到第一条记录RecNo = 0的情况并非如此. (即过滤后的TADSQuery) IsFirstRecord和IsLastRecord的可靠实现是什么?甚至可以使用当前的TDataSet架构吗? 解决方法
你可以尝试这样的事情:
function IsFirstRecord(ADataSet: TDataSet): Boolean; var BmStr: TBookmarkStr; begin Result := not ADataSet.IsEmpty; if not Result then Exit; Result := ADataSet.Bof; // if ADataSet is already at BOF there is no point to continue if not Result then begin ADataSet.DisableControls; try BmStr := ADataSet.Bookmark; try ADataSet.Prior; Result := ADataSet.Bof; finally ADataSet.Bookmark := BmStr; end; finally ADataSet.EnableControls; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin if IsFirstRecord(ADODataSet1) then ShowMessage('First') else ShowMessage('Not First'); end; 对于IsLastRecord实现,只需替换: ADataSet.Prior -> ADataSet.Next ADataSet.Bof -> ADataSet.Eof (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |