標準 DBNavigator バーの挿入ボタンの動作を、データセットの挿入から追加に変更したいと考えています。
ボタンのクリックを BeforeAction イベントでトラップしたり、追加を行ったりすることができます。次に、OnClick イベントで元の挿入を中止しますが、これは少しハックのようです。より良いアイデアはありますか?私は D6 を使用しています (時計で 500,000 kms、そしてまだ強くなっています...)。
アドバイスをありがとう
よろしく、
PhilW.
標準 DBNavigator バーの挿入ボタンの動作を、データセットの挿入から追加に変更したいと考えています。
ボタンのクリックを BeforeAction イベントでトラップしたり、追加を行ったりすることができます。次に、OnClick イベントで元の挿入を中止しますが、これは少しハックのようです。より良いアイデアはありますか?私は D6 を使用しています (時計で 500,000 kms、そしてまだ強くなっています...)。
アドバイスをありがとう
よろしく、
PhilW.
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 行のサイズを縮小し、その新しい行を新しく開いた場所に書き込みます。すべてのディスク アクティビティが原因で、これは非常に遅くなります。
代わりに、データベースは物理ファイルの最後にデータを書き込む追加を行います。インデックスの順序は、行がファイル内の正しい場所に配置される方法を制御します。
そのため、使用する方法や DBNavigator のボタンの意味に関係なく、ほとんどの意図と目的のために、挿入ではなく追加を既に取得している可能性があります。それ以外のように見えるのはインデックスです。
インデックスなしでデータベースを作成し、挿入と追加の両方を数回実行して、すべての操作の後にデータを注意深く調べて、有効性を確認できます。