我想将标准 DBNavigator 栏上的插入按钮的行为从数据集插入更改为追加。
我可以在 BeforeAction 事件中捕获按钮单击,执行附加等;然后在 OnClick 事件中中止原始插入,但这似乎有点 hack。有更好的想法吗?我正在使用 D6(500,000 公里的时钟,并且仍然很强劲......)。
感谢您的任何建议
问候,
菲尔W。
我想将标准 DBNavigator 栏上的插入按钮的行为从数据集插入更改为追加。
我可以在 BeforeAction 事件中捕获按钮单击,执行附加等;然后在 OnClick 事件中中止原始插入,但这似乎有点 hack。有更好的想法吗?我正在使用 D6(500,000 公里的时钟,并且仍然很强劲......)。
感谢您的任何建议
问候,
菲尔W。
您可以从 TDBNavigator 派生您自己的类并覆盖 BtnClick 方法。或者,为了快速而肮脏的修复,您可以在运行时更改插入按钮的单击处理程序,例如:
type
THackDBNavigator = class(TDBNavigator);
procedure TForm1.DBNavigatorInsertClick(Sender: TObject);
var
DBNavigator: TDBNavigator;
begin
DBNavigator := ((Sender as TControl).Parent as TDBNavigator);
if Assigned(DBNavigator.DataSource) and (DBNavigator.DataSource.State <> dsInactive) then
begin
if Assigned(DBNavigator.BeforeAction) then
DBNavigator.BeforeAction(DBNavigator, nbInsert);
DBNavigator.DataSource.DataSet.Append;
if Assigned(DBNavigator.OnClick) then
DBNavigator.OnClick(DBNavigator, nbInsert);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
THackDBNavigator(DBNavigator1).Buttons[nbInsert].OnClick := DBNavigatorInsertClick;
end;
在大多数数据库中插入和追加之间没有区别。进行实际的物理插入将意味着实际移动所有数据,从插入新行的位置开始,减小一行的大小,然后在新打开的位置写入新行。由于所有磁盘活动,这将非常慢。
数据库改为执行追加操作,将数据写入物理文件的末尾,并且索引顺序控制行在文件中正确位置的显示方式。
因此,对于大多数意图和目的,您可能已经获得了追加而不是插入,无论您使用哪种方法或 DBNavigator 上的按钮说什么。它是使它以其他方式出现的索引。
您可以通过创建没有索引的数据库来检查其有效性,并尝试执行几次插入和追加,在每次操作后仔细检查数据。
@TOndrej:太好了!我没有欣赏过这种技术。谢谢!
@Ken White:我理解你的意思,但在视觉上对我的用户来说会有所不同——DBNavigator 控制一个 DBGrid,在大多数情况下,网格中有很多未使用的行。让新记录出现在网格底部而不是刚好在当前记录所在的位置上方似乎更加一致。但是谢谢你的回答。
问候,菲尔W。