如何实现IsFirstRecord和IsLastRecord?

时间:2013-10-31 13:22:51

标签: delphi delphi-xe2 tdataset

我喜欢禁用控件,因为用户点击它们毫无意义。

一个特殊情况是一组自定义菜单按钮,用于模拟标准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;

BofEof不是禁用按钮的正确方法,因为我必须事先知道当前记录是第一个/最后一个记录。

所以我想用IsFirstRecordIsLastRecord方法重写一下:

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)

IsFirstRecordIsLastRecord的可靠实施是什么?甚至可以使用当前的TDataSet架构吗?

1 个答案:

答案 0 :(得分:5)

您可以尝试这样的事情:

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