5

当用户单击它们毫无意义时,我喜欢禁用控件。

一个特殊情况是一组自定义菜单按钮,它们模拟标准的第一个、上一个、下一个和最后一个按钮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不是禁用按钮的正确方法,因为我必须事先知道当前记录是否将成为第一条/最后一条记录。

所以我想用IsFirstRecordandIsLastRecord方法重写它:

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架构吗?

4

1 回答 1

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
于 2013-10-31T17:37:30.257 回答