如何改变 TDBNavigator 组件的行为?

Posted

技术标签:

【中文标题】如何改变 TDBNavigator 组件的行为?【英文标题】:How to change behaviour of TDBNavigator component? 【发布时间】:2010-10-06 21:19:16 【问题描述】:

我想将标准 DBNavigator 栏上的插入按钮的行为从数据集插入更改为追加。

我可以在 BeforeAction 事件中捕获按钮单击,执行追加等;然后在 OnClick 事件中中止原始插入,但这似乎有点 hack。有更好的想法吗?我正在使用 D6(500,000 公里,并且仍然很强劲......)。

感谢您的建议

问候,

菲尔。

【问题讨论】:

【参考方案1】:

您可以从 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;

【讨论】:

在 Lazarus 中,使用 FormCreate THackDBNavigator(myDBNavigator).Buttons[nbInsert].OnClick:= DBNavigatorInsertClick;我收到一条错误消息:错误:为调用“DBNavigatorInsertClick”指定的参数数量错误。有什么建议吗? 对于 Lazarus,可以使用 $mode delphi@ 运算符:THackDBNavigator(DBNavigator1).Buttons[nbInsert].OnClick := @DBNavigatorInsertClick;【参考方案2】:

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

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

问候, 菲尔W。

【讨论】:

Phil,您在问题中没有提到任何有关 DBGrid 的内容。在这种情况下,TOndrej 的答案更好因为外观问题。【参考方案3】:

在大多数数据库中插入和追加之间没有区别。进行实际的物理插入将意味着实际移动所有数据,从插入新行的位置开始,减小一行的大小,然后在新打开的位置写入新行。由于所有磁盘活动,这将非常慢。

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

因此,对于大多数意图和目的,您可能已经获得了追加而不是插入,无论您使用哪种方法或 DBNavigator 上的按钮说什么。是索引使它以其他方式出现。

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

【讨论】:

如果您使用网格组件来插入/追加数据,那么至少从 UI 的角度来看,两者之间肯定存在差异。 但那是因为它实际上并不是插入到数据库中,而是插入到网格中。它仍然只是物理上对数据库的附加。

以上是关于如何改变 TDBNavigator 组件的行为?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 插件:使用回调来改变插件的行为

将进程附加到列表(但不对其执行任何操作)会改变程序行为

python 装饰器可以用来改变函数返回的函数的行为吗?

Delphi控件-复合控件

如何使 A-Frame 组件相互通信?

state 用作组件中的 props,状态更改不会重新渲染组件