如何改变TDBNavigator组件的行为?

时间:2009-02-11 11:25:46

标签: delphi components vcl

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

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

感谢您的任何建议

此致

PhilW。

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

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

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

因此,对于大多数意图和目的,无论您使用哪种方法或DBNavigator上的按钮说明,您可能已经获得了附加而不是插入。它是使其显示的索引。

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

答案 2 :(得分:0)

@TOndrej:好极了!我没有意识到这种技巧。谢谢!

@Ken White:我理解你的观点,但在视觉上对我的用户来说它有所不同--DBNavigator控制着一个DBGrid,在大多数情况下,网格中有大量未使用的行。将新记录显示在网格底部而不是当前记录位于当前记录之上时,似乎更加一致。但谢谢你的回答。

此致 PhilW。