我想更改标准DBNavigator栏上插入按钮的行为,从数据集插入中追加。
我可以在BeforeAction事件中捕获按钮单击,执行追加等操作;然后在OnClick事件中中止原始插入,但这似乎有点黑客。有更好的想法吗?我正在使用D6(时钟500,000公里,仍然很强劲......)。
感谢您的任何建议
此致
PhilW。
答案 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。