Nouveau

Comment personnaliser le DBNavigator

Comment personnaliser le DBNavigator

"Ok, le DBNavigator fait son travail de navigation dans les données et de gestion des enregistrements. Malheureusement, mes clients veulent une expérience plus conviviale, comme des graphiques et des…"

Cette enquête a été réalisée par un développeur de Delphi à la recherche d'un moyen d'accroître la puissance du composant DBNavigator.

Le DBNavigator est un excellent composant: il fournit une interface de type magnétoscope pour la navigation dans les données et la gestion des enregistrements dans les applications de base de données. La navigation dans les enregistrements est fournie par les boutons Premier, Suivant, Précédent et Dernier. La gestion des enregistrements est assurée par les boutons Modifier, Publier, Annuler, Supprimer, Insérer et Actualiser. Dans un composant, Delphi fournit tout ce dont vous avez besoin pour exploiter vos données.

Toutefois, comme l’a également déclaré l’auteur de la demande par courrier électronique, le DBNavigator ne dispose pas de certaines fonctionnalités telles que des glyphes personnalisés, des légendes de boutons et d’autres.

Un DBNavigator plus puissant

De nombreux composants Delphi ont des propriétés et des méthodes utiles qui sont marquées comme invisibles ("protégées") par un développeur Delphi. Espérons que, pour accéder à ces membres protégés d'un composant, une technique simple appelée "piratage protégé" peut être utilisée.

Tout d'abord, vous allez ajouter une légende à chaque bouton de DBNavigator, puis vous ajouterez des graphiques personnalisés et, enfin, vous activerez OnMouseUp pour chaque bouton.

Du "DBNavigator" ennuyeux à l'un des:

  • Graphiques standard et légendes personnalisées
  • Seulement des légendes
  • Graphiques personnalisés et légendes personnalisées

Let's Rock 'n' Roll

Le DBNavigator a une propriété protégée Buttons. Ce membre est un tableau de TNavButton, un descendant de TSpeedButton.

Étant donné que chaque bouton de cette propriété protégée hérite de TSpeedButton, vous pourrez utiliser des propriétés TSpeedButton "standard" telles que: Caption (une chaîne identifiant le contrôle pour l'utilisateur), Glyph (le bitmap qui apparaît sur le bouton), Mise en page (détermine l'emplacement où l'image ou le texte apparaît sur le bouton)…

A partir de l'unité DBCtrls (où DBNavigator est défini), vous "lisez" que la propriété protected Buttons est déclarée comme:

Boutons: tableauTNavigateBtn de TNavButton;

Où TNavButton hérite de TSpeedButton et TNavigateBtn est une énumération, définie comme suit:

TNavigateBtn =
(nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);

Notez que TNavigateBtn contient 10 valeurs, chacune identifiant un bouton différent sur un objet TDBNavigator. Voyons maintenant comment pirater un DBNavigator:

DBNavigator amélioré

Commencez par configurer un formulaire Delphi d'édition de données simple en plaçant au moins un objet DBNavigator, un objet DBGrid, un objet DataSoure et un jeu de données de votre choix (ADO, BDE, dbExpres,…). Assurez-vous que tous les composants sont "connectés".

Deuxièmement, piratez DBNavigator en définissant une classe "factice" héritée, au-dessus de la déclaration de formulaire, comme suit:

type THackDBNavigator = classe(TDBNavigator);
type
TForm1 = classe(TForm)

Ensuite, pour pouvoir afficher des légendes et des graphiques personnalisés sur chaque bouton de DBNavigator, vous devez configurer des glyphes. Vous pouvez utiliser le composant TImageList et affecter 10 images (.bmp ou .ico), chacune représentant une action d'un bouton particulier d'un DBNavigator.

Troisièmement, dans l'événement OnCreate pour Form1, ajoutez un appel tel que:

procédure TForm1.FormCreate (Sender: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
fin;

Assurez-vous d’ajouter la déclaration de cette procédure dans la partie privée de la déclaration de formulaire, comme suit:

type
TForm1 = classe(TForm)

procédure privée SetupHackedNavigator (const Navigateur: TDBNavigator;
const Glyphes: TImageList);

Quatrièmement, ajoutez la procédure SetupHackedNavigator. La procédure SetupHackedNavigator ajoute des graphiques personnalisés à chaque bouton et attribue une légende personnalisée à chaque bouton.

les usages Boutons; // !!! n'oublie pas
procédure TForm1.SetupHackedNavigator
(const Navigateur: TDBNavigator;
const Glyphes: TImageList);
const
Légendes: tableauTNavigateBtn de ficelle =
('Initial', 'Précédent', 'Plus tard', 'Final', 'Ajouter',
«Effacer», «corriger», «envoyer», «retirer», «relancer»);
(*
Légendes: arrayTNavigateBtn of string =
('First', 'Prior', 'Next', 'Last', 'Insert',
'Supprimer', 'Modifier', 'Publier', 'Annuler', 'Actualiser');

en Croatie (localisé):
Légendes: arrayTNavigateBtn of string =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
«Obrisi», «Promjeni», «Spremi», «Odustani», «Osvjezi»);
*)
var
btn: TNavigateBtn;
commencer btn: = Low (TNavigateBtn) à Haut (TNavigateBtn) faire avec THackDBNavigator (Navigator) .Buttonsbtn dobegin// à partir du tableau de légendes const
Légende: = Captionsbtn;
// le nombre d'images dans la propriété Glyph
NumGlyphs: = 1;
// Supprime l'ancien glyphe.
Glyphe: = néant;
// Assigne le personnalisé
Glyphs.GetBitmap (Integer (btn), Glyph);
// gylph au-dessus du texte
Mise en page: = blGlyphTop;
// expliqué plus tard
OnMouseUp: = HackNavMouseUp;
fin;
fin; (* SetupHackedNavigator *)

Ok, expliquons. Vous parcourez tous les boutons du DBNavigator. Rappelez-vous que chaque bouton est accessible à partir de la propriété array Buttons array, d'où la nécessité de la classe THackDBNavigator. Étant donné que le type du tableau Buttons est TNavigateBtn, vous passez du "premier" bouton (à l'aide de la fonction Low) au "dernier" (à l'aide de la fonction High). Pour chaque bouton, vous supprimez simplement le "vieux" glyphe, affectez le nouveau (à partir du paramètre Glyphs), ajoutez la légende du tableau Légendes et marquez la présentation du glyphe.

Notez que vous pouvez contrôler les boutons affichés par un DBNavigator (et non par celui piraté) via sa propriété VisibleButtons. Une autre propriété dont vous voudrez peut-être modifier la valeur par défaut est Hints - utilisez-la pour fournir des astuces d'aide de votre choix pour le bouton de navigateur individuel. Vous pouvez contrôler l'affichage des astuces en modifiant la propriété ShowHints.

C'est ça. C'est pourquoi vous avez choisi Delphi!

Donne m'en plus!

Pourquoi s'arrêter ici? Vous savez que lorsque vous cliquez sur le bouton 'nbNext', la position actuelle du jeu de données est avancée vers l'enregistrement suivant. Et si vous voulez déplacer, disons, 5 enregistrements à l’avance si l’utilisateur maintient la touche CTRL tout en appuyant sur le bouton? Comment sur cela?

Le DBNavigator "standard" n'a pas l'événement OnMouseUp, celui qui porte le paramètre Shift du TShiftState, ce qui vous permet de tester l'état des touches Alt, Ctrl et Shift. Le DBNavigator ne fournit que l'événement OnClick que vous pouvez gérer.

Cependant, le THackDBNavigator peut simplement exposer l'événement OnMouseUp et vous permettre de "voir" l'état des touches de contrôle et même la position du curseur au-dessus du bouton particulier lorsque vous cliquez dessus!

Ctrl + Clic: = 5 lignes d'avance

Pour exposer OnMouseUp, vous affectez simplement votre procédure de gestion d’événements personnalisée à l’événement OnMouseUp pour le bouton du DBNavigator piraté. Cela se fait déjà exactement dans la procédure SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Maintenant, la procédure HackNavMouseUp pourrait ressembler à:

procédure TForm1.HackNavMouseUp
(Sender: TObject; Button: TMouseButton;
Décalage: TShiftState; X, Y: entier);
const MoveBy: entier = 5;
début NE PAS (L'expéditeur est TNavButton) puis Sortie;
Cas TNavButton (Sender) .Index de
nbPrior:
si (ssCtrl dans Shift) puis
TDBNavigator (TNavButton (Sender) .Parent).
DataSource.DataSet.MoveBy (-MoveBy);
nbNext:
si (ssCtrl dans Shift) puis
TDBNavigator (TNavButton (Sender) .Parent).
DataSource.DataSet.MoveBy (MoveBy);
fin;
fin; (* HackNavMouseUp *)

Notez que vous devez ajouter la signature de la procédure HackNavMouseUp dans la partie privée de la déclaration de formulaire (près de la déclaration de la procédure SetupHackedNavigator):

type
TForm1 = classe(TForm)

procédure privée SetupHackedNavigator (const Navigateur: TDBNavigator;
const Glyphes: TImageList);
procédure HackNavMouseUp (Sender: TObject; Button: TMouseButton;
Décalage: TShiftState; X, Y: entier);

Ok, expliquons encore une fois. La procédure HackNavMouseUp gère l'événement OnMouseUp pour chaque bouton DBNavigator. Si l'utilisateur maintient la touche CTRL enfoncée tout en cliquant sur le bouton nbNext, l'enregistrement en cours pour le jeu de données lié est déplacé "MoveBy" (défini comme constant avec la valeur 5).

Quelle? Trop compliqué?

Oui. Vous n'avez pas besoin de tout gâcher si vous ne devez vérifier l'état des touches de commande que lorsque le bouton a été cliqué. Voici comment faire de même dans l'événement "ordinaire" OnClick du DBNavigator "ordinaire":

procédure TForm1.DBNavigator1Click
(Sender: TObject; Button: TNavigateBtn);
une fonction CtrlDown: Boolean;
var
Etat: TKeyboardState;
commencer
GetKeyboardState (État);
Résultat: = ((Statevk_Control And 128) 0);
fin;
const MoveBy: entier = 5;
débutant Bouton de
nbPrior:
si CtrlDown puis
DBNavigator1.DataSource.DataSet.MoveBy (-MoveBy);
nbNext:
si CtrlDown puis
DBNavigator1.DataSource.DataSet.MoveBy (MoveBy);
fin; //Cas
fin; (* DBNavigator2Click *)

C'est tout le monde

Et enfin, le projet est terminé. Ou vous pouvez continuer. Voici un scénario / tâche / idée pour vous:

Supposons que vous souhaitiez qu'un seul bouton remplace les boutons nbFirst, nbPrevious, nbNext et nbLast. Vous pouvez utiliser les paramètres X et Y dans la procédure HackNavMouseUp pour trouver la position du curseur lorsque le bouton a été relâché. Maintenant, à ce seul bouton ("pour les gouverner tous"), vous pouvez attacher une image qui a 4 zones, chaque zone est supposée imiter l'un des boutons que vous remplacez ... Vous avez le point?