我喜欢禁用控件,因为用户点击它们毫无意义。
一个特殊情况是一组自定义菜单按钮,用于模拟标准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
架构吗?
答案 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