2009-02-11 6 views
6

Ich möchte das Verhalten der Einfüge-Schaltfläche in der Standard-DBNavigator-Leiste ändern, von einem Dataset einfügen, um anzuhängen.Wie ändert man das Verhalten der TDBNavigator Komponente?

Ich konnte die Schaltfläche klicken Sie in das BeforeAction-Ereignis abfangen, tun Sie den Anhang, etc; und dann im OnClick-Ereignis die ursprüngliche Einfügung abbrechen, aber das scheint ein bisschen wie ein Hack zu sein. Irgendwelche besseren Ideen? Ich benutze D6 (500.000 km auf der Uhr und immer noch stark ...).

Vielen Dank für jede Beratung

Grüße,

PhilW.

Antwort

10

Sie können Ihre eigene Klasse von TDBNavigator ableiten und die BtnClick-Methode überschreiben. Oder für eine schnelle und schmutzig zu beheben, können Sie die z.B .: zur Laufzeit Click-Handler einfügen Schaltfläche, die ändern

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; 
+0

In Lazarus, mit FormCreate THackDBNavigator (myDBNavigator) .Buttons [nbInsert] .OnClick: = DBNavigatorInsertClick; Ich habe einen Fehler messsage: Fehler: Falsche Anzahl der Parameter für den Aufruf von "DBNavigatorInsertClick" angegeben. Irgendwelche Tipps? – jcfaria

+0

Mit Lazarus verwenden Sie entweder '{$ mode delphi}' oder den '@' Operator: 'THackDBNavigator (DBNavigator1) .Buttons [nbInsert] .OnClick: = @DBNavigatorInsertClick;' –

+0

Es funktioniert! Vielen Dank. – jcfaria

1

Es gibt keinen Unterschied zwischen dem Einsatz in den meisten Datenbanken und anhängen. Eine tatsächliche physische Einfügung würde bedeuten, alle Daten tatsächlich zu verschieben, beginnend mit dem Platz, an dem die neue Zeile eingefügt werden würde, um die Größe einer Zeile herunterzufahren und dann diese neue Zeile in den neu geöffneten Punkt zu schreiben. Dies wäre wegen der gesamten Plattenaktivität sehr langsam.

Datenbanken verwenden stattdessen einen Append, der die Daten an das Ende der physischen Datei schreibt, und die Indexreihenfolge steuert die Art und Weise, in der die Zeile an der richtigen Stelle in der Datei positioniert wird.

Für die meisten Absichten und Zwecke erhalten Sie wahrscheinlich bereits einen Anhang anstelle einer Einfügung, unabhängig davon, welche Methode Sie verwenden oder was die Schaltfläche im DBNavigator sagt. Es ist der Index, der es anders erscheinen lässt.

Sie können dies auf Gültigkeit prüfen, indem Sie eine Datenbank ohne Index erstellen und versuchen, sowohl ein Einfügen als auch ein Anhängen ein paar Mal durchzuführen und die Daten nach jeder Operation sorgfältig zu untersuchen.

+0

Wenn Sie eine Grid-Komponente verwenden, um Ihre Daten einzufügen/anzuhängen, gibt es definitiv einen Unterschied zwischen den beiden, zumindest vom Standpunkt der Benutzeroberfläche. – onnodb

+0

Das liegt aber daran, dass es nicht wirklich in die Datenbank eingefügt wird, sondern stattdessen in das Raster. Es ist immer noch nur ein Append an die DB. –

0

@TOndrej: Großartig! Ich hatte diese Technik nicht geschätzt. Vielen Dank!

@Ken White: Ich verstehe Ihren Punkt, aber visuell zu meinen Benutzern macht es einen Unterschied - der DBNavigator steuert ein DBGrid, in dem in den meisten Fällen viele ungenutzte Zeilen im Raster vorhanden sind. Es scheint konsistenter zu sein, dass neue Datensätze am unteren Rand des Gitters angezeigt werden und nicht mehr als gerade dort, wo der aktuelle Datensatz gerade ist. Aber danke für deine Antwort.

Grüße, PhilW.

+0

Phil, du hast nichts über ein DBGrid in deiner Frage erwähnt. In diesem Fall ist die Antwort von Tndrej wegen des Erscheinungsbildes * besser. –