2009-02-11 8 views
6

Je voudrais changer le comportement du bouton d'insertion sur la barre DBNavigator standard, d'une insertion de jeu de données à ajouter.Comment changer le comportement du composant TDBNavigator?

Je pourrais piéger le clic de bouton dans l'événement BeforeAction, faire l'append, etc; puis dans l'événement OnClick, annulez l'insertion d'origine, mais cela semble un peu un hack. De meilleures idées? J'utilise D6 (500 000 kms sur l'horloge, et ça continue tout de même fort ...).

Merci pour tout conseil

Cordialement,

PhilW.

Répondre

10

Vous pouvez dériver votre propre classe à partir de TDBNavigator et remplacer la méthode BtnClick. Ou, pour une solution rapide et sale, vous pouvez changer le gestionnaire de clic du bouton d'insertion lors de l'exécution, par exemple .:

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

Dans Lazarus, en utilisant sur FormCreate THackDBNavigator (myDBNavigator) .Buttons [nbInsert] .OnClick: = DBNavigatorInsertClick; J'ai un message d'erreur: Erreur: Nombre incorrect de paramètres spécifiés pour l'appel à "DBNavigatorInsertClick". Un conseil? – jcfaria

+0

Avec Lazarus, utilisez '{$ mode delphi}' ou l'opérateur '@': 'THackDBNavigator (DBNavigator1) .Buttons [nbInsert] .OnClick: = @DBNavigatorInsertClick;' –

+0

Cela fonctionne! Merci. – jcfaria

1

Il n'y a pas de différence dans la plupart des bases de données entre l'insert et ajoutez. Faire une insertion physique réelle signifierait réellement déplacer toutes les données, en commençant par l'endroit où la nouvelle rangée serait insérée, la taille d'une rangée, puis en écrivant cette nouvelle rangée dans la nouvelle place ouverte. Ce serait très lent à cause de toute l'activité du disque. À la place, les bases de données font un append, qui écrit les données à la fin du fichier physique, et l'ordre de l'index contrôle la façon dont la ligne semble être positionnée à l'endroit correct dans le fichier. Donc, dans la plupart des cas, vous obtenez probablement déjà un append à la place d'un insert, quelle que soit la méthode utilisée ou ce que dit le bouton sur le DBNavigator. C'est l'indice qui le fait apparaître autrement.

Vous pouvez vérifier cela pour la validité en créant une base de données sans index, et essayez de faire à la fois un insert et un append plusieurs fois, en examinant soigneusement les données après chaque opération.

+0

Si vous utilisez un composant de grille pour insérer/ajouter vos données, il y a certainement une différence entre les deux, au moins du point de vue de l'interface utilisateur. – onnodb

+0

Mais c'est parce que ce n'est pas réellement l'insertion dans la base de données, mais la grille à la place. C'est toujours juste un appendice à la DB physiquement. –

0

@TOndrej: Excellent! Je n'avais pas apprécié cette technique. Merci!

@Ken White: Je comprends votre point de vue, mais visuellement à mes utilisateurs cela fait une différence - le DBNavigator contrôle un DBGrid où, dans la majorité des cas, il y a beaucoup de lignes inutilisées dans la grille. Il semble plus cohérent d'avoir de nouveaux records au bas de la grille plutôt que juste au-dessus, là où le record actuel est à ce moment-là. Mais merci pour votre réponse.

Cordialement, PhilW.

+0

Phil, vous n'avez rien mentionné à propos d'un DBGrid dans votre question. Dans ce cas, la réponse de TOndrej * est * meilleure à cause du problème d'apparence. –

Questions connexes