我想改变标准的DBNavigator栏上的插入件按钮的行为,来自数据集的插入追加。

我可以捕获在控制器的beforeAction事件按钮点击,执行追加等;然后在onclick事件中止原来的插入,但这似乎有点劈。任何更好的想法?我使用(时钟50万公里,并依然强劲...)D6。

感谢您的任何建议

此致

PhilW。

有帮助吗?

解决方案

您可以从TDBNavigator派生自己的类并重写BtnClick方法。 或者,对于一个快速和肮脏的修复,你可以在运行时,e.g改变插入按钮的点击处理:

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白:我明白你的意思,但在视觉上给我的用户它使一个区别 - 的DBNavigator控制一个DBGrid,其中,在大多数情况下,有很多在电网未使用的行。这似乎是比较一致的有新的记录出现在网格的底部而不是刚好高于以往任何时候都目前的纪录是在那一刻。但感谢你的答案。

此致 PhilW。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top