Delphi 如何改变TDBNavigator组件的行为?

Delphi 如何改变TDBNavigator组件的行为?,delphi,components,vcl,Delphi,Components,Vcl,我想将标准DBNavigator栏上的insert按钮的行为从dataset insert更改为append 我可以在BeforeAction事件中捕获按钮单击,执行附加操作,等等;然后在OnClick事件中中止原始插入,但这似乎有点像黑客。还有更好的主意吗?我使用的是D6(时钟速度为500000公里,但仍然很强劲…) 谢谢你的建议 问候, 菲尔 您可以从TDBNavigator派生自己的类并重写BtnClick方法。 或者,如果要快速修复,可以在运行时更改“插入”按钮的单击处理程序,例如: t

我想将标准DBNavigator栏上的insert按钮的行为从dataset insert更改为append

我可以在BeforeAction事件中捕获按钮单击,执行附加操作,等等;然后在OnClick事件中中止原始插入,但这似乎有点像黑客。还有更好的主意吗?我使用的是D6(时钟速度为500000公里,但仍然很强劲…)

谢谢你的建议

问候,


菲尔

您可以从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;
类型
THackDBNavigator=class(TDBNavigator);
过程TForm1.DBNavigatorInsertClick(发送方:ToObject);
变量
DBNavigator:TDBNavigator;
开始
DBNavigator:=((发送方作为TControl)。父方作为TDBNavigator);
如果已分配(DBNavigator.DataSource)和(DBNavigator.DataSource.State dsInactive),则
开始
如果已分配(DBNavigator.BeforeAction),则
DBNavigator.BeforeAction(DBNavigator,nbInsert);
DBNavigator.DataSource.DataSet.Append;
如果已分配(DBNavigator.OnClick),则
OnClick(DBNavigator,nbInsert);
结束;
结束;
过程TForm1.FormCreate(发送方:TObject);
开始
THackDBNavigator(DBNavigator1)。按钮[nbInsert]。OnClick:=DbNavigatorInserClick;
结束;

在大多数数据库中,insert和append之间没有区别。执行实际的物理插入意味着实际移动所有数据,从插入新行的位置开始,向下移动一行的大小,然后将新行写入新打开的位置。这将是非常缓慢的,因为所有的磁盘活动

数据库改为执行追加操作,将数据写入物理文件的末尾,索引顺序控制行在文件中正确位置的显示方式

因此,对于大多数意图和目的,您可能已经得到了一个追加而不是插入,无论您使用哪种方法或DBNavigator上的按钮是什么。是索引让它看起来不一样


您可以通过创建一个没有索引的数据库来检查其有效性,并尝试执行几次插入和追加操作,每次操作后仔细检查数据。

@TOndrej:太好了!我没有欣赏过这种技巧。谢谢

@Ken White:我理解你的观点,但对我的用户来说,这在视觉上是有区别的——DBNavigator控制DBGrid,在大多数情况下,其中有大量未使用的行。让新记录出现在网格底部,而不是当前记录所在位置的正上方,似乎更为一致。但是谢谢你的回答

问候,,
菲尔

如果您使用网格组件插入/附加数据,至少从UI的角度来看,两者之间肯定有区别。但这是因为它实际上不是插入到数据库中,而是插入到网格中。Phil,你在问题中没有提到任何关于DBGrid的东西。在这种情况下,由于外观问题,TOndrej的答案更好;我有一个错误消息:error:为调用“dbNavigatorInserClick”指定的参数数目错误。任何提示?对于Lazarus,可以使用
{$mode delphi}
@
操作符:
THackDBNavigator(DBNavigator1)。按钮[nbInsert]。OnClick:=@dbNavigatorInserClick