"Εντάξει, το DBNavigator κάνει τη δουλειά του να πλοηγεί δεδομένα και τη διαχείριση αρχείων. Δυστυχώς, οι πελάτες μου θέλουν πιο φιλική προς το χρήστη εμπειρία, όπως τα προσαρμοσμένα γραφικά και τις λεζάντες,... "
Αυτή η έρευνα ήρθε από ένα Δελφούς προγραμματιστής αναζητώντας έναν τρόπο ενίσχυσης της ισχύος του στοιχείου DBNavigator.
Το DBNavigator είναι ένα εξαιρετικό στοιχείο - παρέχει μια διασύνδεση τύπου VCR για πλοήγηση σε δεδομένα και διαχείριση αρχείων σε εφαρμογές βάσεων δεδομένων. Η πλοήγηση των εγγραφών παρέχεται από τα πλήκτρα First, Next, Prior και Last. Η διαχείριση εγγραφών παρέχεται από τα κουμπιά Επεξεργασία, Δημοσίευση, Ακύρωση, Διαγραφή, Εισαγωγή και Ανανέωση. Σε μία συνιστώσα, ο Δελφός παρέχει όλα όσα χρειάζεστε για να λειτουργήσετε στα δεδομένα σας.
Ωστόσο, όπως εξήγησε και ο συντάκτης της έρευνας e-mail, ο DBNavigator δεν διαθέτει κάποια χαρακτηριστικά όπως προσαρμοσμένα glyphs, λεζάντες κουμπιών και άλλα.
Ένα πιο ισχυρό DBNavigator
Πολλά στοιχεία των Δελφών έχουν χρήσιμες ιδιότητες και μεθόδους που χαρακτηρίζονται ως αόρατες ("προστατευμένες") σε έναν προγραμματιστή Delphi. Ας ελπίσουμε ότι, για να αποκτήσετε πρόσβαση σε τέτοια προστατευμένα μέλη ενός συστατικού, μπορεί να χρησιμοποιηθεί μια απλή τεχνική που ονομάζεται "προστατευμένο hack".
Αρχικά, θα προσθέσετε μια λεζάντα σε κάθε κουμπί DBNavigator, τότε θα προσθέσετε προσαρμοσμένα γραφικά και, τέλος, θα ενεργοποιήσετε το OnMouseUp για κάθε κουμπί.
Από το "βαρετό" DBNavigator σε:
- Τυπικά γραφικά και προσαρμοσμένες λεζάντες
- Μόνο υπότιτλοι
- Προσαρμοσμένα γραφικά και προσαρμοσμένοι υπότιτλοι
Ας Rock 'n' Roll
Το DBNavigator διαθέτει προστατευμένη ιδιότητα κουμπιών. Αυτό το μέλος είναι μια σειρά TNavButton, απόγονος του TSpeedButton.
Δεδομένου ότι κάθε κουμπί σε αυτήν την προστατευόμενη ιδιότητα κληρονομεί από το TSpeedButton, αν έχετε τα χέρια σας σε αυτό, θα μπορείτε να εργαστείτε με τις "τυπικές" ιδιότητες TSpeedButton όπως: Λεζάντα (μια συμβολοσειρά που προσδιορίζει τον έλεγχο στον χρήστη), Glyph (το bitmap που εμφανίζεται στο κουμπί), Διάταξη (καθορίζει πού εμφανίζεται η εικόνα ή το κείμενο στο κουμπί)...
Από τη μονάδα DBCtrls (όπου ορίζεται το DBNavigator) διαβάζετε ότι η ιδιότητα των προστατευμένων κουμπιών δηλώνεται ως:
Κουμπιά: πίνακας[TNavigateBtn] του TNavButton;
Όπου το TNavButton κληρονομεί από το TSpeedButton και το TNavigateBtn είναι μια απαρίθμηση που ορίζεται ως:
TNavigateBtn =
(nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Σημειώστε ότι το TNavigateBtn περιέχει 10 τιμές, με κάθε προσδιορισμό διαφορετικού κουμπιού σε ένα αντικείμενο TDBNavigator. Τώρα, ας δούμε πώς να hack ένα DBNavigator:
Ενισχυμένο DBNavigator
Αρχικά, ορίστε μια απλή φόρμα επεξεργασίας δεδομένων Delphi τοποθετώντας τουλάχιστον ένα DBNavigator, a DBGrid, ένα DataSoure και a Αντικείμενο αντικειμένων δεδομένων της επιλογής σας (ADO, BDE, dbExpres, ...). Βεβαιωθείτε ότι όλα τα εξαρτήματα είναι "συνδεδεμένα".
Δεύτερον, hack ένα DBNavigator καθορίζοντας μια κληρονομική "ανδρείκελο" κατηγορία, πάνω από τη δήλωση φόρμα, όπως:
τύπος THackDBNavigator = τάξη(TDBNavigator).
τύπος
TForm1 = τάξη(TForm)
...
Στη συνέχεια, για να μπορέσετε να εμφανίσετε προσαρμοσμένες λεζάντες και γραφικά σε κάθε κουμπί DBNavigator, θα πρέπει να ρυθμίσετε μερικά glyphs. Μπορείτε να χρησιμοποιήσετε το στοιχείο TImageList και να αντιστοιχίσετε 10 εικόνες (.bmp ή .ico), το καθένα αντιπροσωπεύει μια ενέργεια ενός συγκεκριμένου κουμπιού ενός DBNavigator.
Τρίτον, στο OnCreate συμβάν για το Form1, προσθέστε μια κλήση όπως:
διαδικασία TForm1.FormCreate (αποστολέας: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
τέλος;
Βεβαιωθείτε ότι προσθέτετε τη δήλωση αυτής της διαδικασίας στο ιδιωτικό μέρος της δήλωσης φόρμας, όπως:
τύπος
TForm1 = τάξη(TForm)
...
ιδιωτική διαδικασία SetupHackedNavigator (const Navigator: TDBNavigator;
const Glyphs: TImageList).
...
Τέταρτον, προσθέστε τη διαδικασία SetupHackedNavigator. Η διαδικασία SetupHackedNavigator προσθέτει προσαρμοσμένα γραφικά σε κάθε κουμπί και εκχωρεί μια προσαρμοσμένη ετικέτα σε κάθε κουμπί.
χρήσεις Κουμπιά? //!!! Μην ξεχνάτε
διαδικασία TForm1.SetupHackedNavigator
(const Navigator: TDBNavigator;
const Glyphs: TImageList).
const
Λεζάντες: πίνακας[TNavigateBtn] της σειράς =
('Αρχικό', 'Προηγούμενο', 'Αργότερα', 'Τελικό', 'Προσθήκη',
"Διαγραφή", "Διόρθωση", "Αποστολή", "Ανάληψη", "Επανάληψη").
(*
Λεζάντες: πίνακας [TNavigateBtn] του string =
(«Πρώτο», «Προηγούμενο», «Επόμενο», «Τελευταίο», «Εισαγωγή»,
'Διαγραφή', 'Επεξεργασία', 'Δημοσίευση', 'Ακύρωση', 'Ανανέωση');
στην Κροατία (εντοπισμένη):
Λεζάντες: πίνακας [TNavigateBtn] του string =
(«Prvi», «Prethodni», «Slijedeci», «Zadnji», «Dodaj»,
Obrisi, Promjeni, Spremi, Odustani, Osvjezi.
*)
var
btn: TNavigateBtn;
beginfor btn: = Χαμηλή (TNavigateBtn) προς το Υψηλή (TNavigateBtn) κάνω με THackDBNavigator (Navigator) .Μπουτόν [btn] dobegin// από τον πίνακα Captions const
Λεζάντα: = Λεζάντες [btn];
// τον αριθμό των εικόνων στην ιδιότητα Glyph
NumGlyphs: = 1;
// Κατάργηση του παλιού glyph.
Glyph: = μηδέν;
// Αντιστοιχίστε την προσαρμοσμένη
Glyphs. GetBitmap (ακέραιος (btn), Glyph);
// gylph πάνω από το κείμενο
Διάταξη: = blGlyphTop;
// εξηγείται αργότερα
OnMouseUp: = HackNavMouseUp;
τέλος;
τέλος; (* SetupHackedNavigator *)
Εντάξει, ας εξηγήσουμε. Μπορείτε να επαναλάβετε όλα τα κουμπιά στο DBNavigator. Θυμηθείτε ότι κάθε κουμπί είναι προσβάσιμο από την προστατευμένη ιδιότητα πίνακα κουμπιών-επομένως την ανάγκη για την κλάση THackDBNavigator. Επειδή ο τύπος του πίνακα των κουμπιών είναι TNavigateBtn, πηγαίνετε από το "πρώτο" (χρησιμοποιώντας το Χαμηλός λειτουργία) στο "τελευταίο" (χρησιμοποιώντας το πλήκτρο Υψηλός λειτουργία) ένα. Για κάθε κουμπί απλώς καταργείτε το "παλιό" glyph, ορίστε το νέο (από την παράμετρο Glyphs), προσθέστε τη λεζάντα από τη συστοιχία Captions και επισημάνετε τη διάταξη του glyph.
Σημειώστε ότι μπορείτε να ελέγξετε ποια κουμπιά εμφανίζονται από ένα DBNavigator (όχι το hacked) μέσω της ιδιότητας του VisibleButtons. Μια άλλη ιδιότητα της οποίας η προεπιλεγμένη τιμή μπορεί να θέλετε να αλλάξετε είναι Συμβουλές - χρησιμοποιήστε την για να δώσετε συμβουλές βοήθειας της επιλογής σας για το μεμονωμένο κουμπί πλοήγησης. Μπορείτε να ελέγξετε την εμφάνιση των συμβουλών με την επεξεργασία της ιδιότητας ShowHints.
Αυτό είναι. Γι 'αυτό έχετε επιλέξει τους Δελφούς!
Δώσμου κι άλλα!
Γιατί να σταματήσετε εδώ; Γνωρίζετε ότι όταν κάνετε κλικ στο κουμπί 'nbNext', η τρέχουσα θέση του συνόλου δεδομένων προχωράει στην επόμενη εγγραφή. Τι γίνεται αν θέλετε να μετακινήσετε, ας πούμε, 5 εγγραφές μπροστά εάν ο χρήστης κρατάει το πλήκτρο CTRL ενώ πατάει το κουμπί; Τι συμβαίνει αυτό;
Το "κανονικό" DBNavigator δεν έχει το γεγονός OnMouseUp-αυτό που μεταφέρει την παράμετρο Shift του TShiftState - επιτρέποντάς σας να ελέγξετε την κατάσταση των πλήκτρων Alt, Ctrl και Shift. Το DBNavigator παρέχει μόνο το γεγονός OnClick για να το χειριστείτε.
Ωστόσο, το THackDBNavigator μπορεί απλά να εκθέσει το συμβάν OnMouseUp και να σας επιτρέψει να "δείτε" την κατάσταση των πλήκτρων ελέγχου και ακόμη και τη θέση του δρομέα πάνω από το συγκεκριμένο κουμπί όταν κάνετε κλικ!
Ctrl + Click: = 5 σειρές μπροστά
Για να εκθέσετε το OnMouseUp, απλώς αναθέτετε τη διαδικασία επεξεργασίας προσαρμοσμένων συμβάντων στο συμβάν OnMouseUp για το κουμπί του hacked DBNavigator. Αυτό ακριβώς γίνεται ήδη στη διαδικασία SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;
Τώρα, η διαδικασία HackNavMouseUp μπορεί να μοιάζει με:
διαδικασία TForm1.HackNavMouseUp
(Αποστολέας: TObject; Κουμπί: TMouseButton;
Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός).
const MoveBy: ακέραιο = 5;
αρχικάΔΕΝ (Ο αποστολέας είναι TNavButton) έπειτα Εξοδος;
υπόθεση TNavButton (αποστολέας) .Index του
nbPrior:
αν (ssCtrl σε Shift) έπειτα
TDBNavigator (TNavButton (αποστολέας). Πατέρας).
Πηγή δεδομένων. DataSet. MoveBy (-MoveBy);
nbNext:
αν (ssCtrl σε Shift) έπειτα
TDBNavigator (TNavButton (αποστολέας). Πατέρας).
Πηγή δεδομένων. DataSet. MoveBy (MoveBy);
τέλος;
τέλος(* HackNavMouseUp *)
Σημειώστε ότι πρέπει να προσθέσετε την υπογραφή της διαδικασίας HackNavMouseUp μέσα στο ιδιωτικό μέρος της δήλωσης φόρμας (κοντά στη δήλωση της διαδικασίας SetupHackedNavigator):
τύπος
TForm1 = τάξη(TForm)
...
ιδιωτική διαδικασία SetupHackedNavigator (const Navigator: TDBNavigator;
const Glyphs: TImageList).
διαδικασία HackNavMouseUp (αποστολέας: TObject; Κουμπί: TMouseButton;
Μετατόπιση: TShiftState; X, Y: ακέραιος αριθμός).
...
Εντάξει, ας εξηγήσουμε, άλλη μια φορά. Η διαδικασία HackNavMouseUp χειρίζεται το συμβάν OnMouseUp για κάθε κουμπί DBNavigator. Εάν ο χρήστης κρατάει το πλήκτρο CTRL κάνοντας κλικ στο κουμπί nbNext, η τρέχουσα εγγραφή για το συνδεδεμένο σύνολο δεδομένων μετακινείται "MoveBy" (ορίζεται ως σταθερή με την τιμή των 5).
Τι? Πολύπλοκα;
Ναι. Δεν χρειάζεται να χάσετε όλα αυτά αν χρειάζεται μόνο να ελέγξετε την κατάσταση των πλήκτρων ελέγχου όταν πατήσετε το κουμπί. Εδώ είναι πώς να κάνετε το ίδιο στο "συνηθισμένο" OnClick συμβάν του "συνήθη" DBNavigator:
διαδικασία TForm1.DBNavigator1Click
(Αποστολέας: TObject; Κουμπί: TNavigateBtn);
λειτουργία CtrlDown: Boolean;
var
Κράτος: TKeyboardState;
ξεκινήσει
GetKeyboardState (Κράτος);
Αποτέλεσμα: = ((Κατάσταση [vk_Control] και 128) 0).
τέλος;
const MoveBy: ακέραιο = 5;
ξεκινήστε Κουμπί του
nbPrior:
αν CtrlDown έπειτα
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
αν CtrlDown έπειτα
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
τέλος; //case
τέλος(* DBNavigator2Click *)
Αυτό ήταν παιδιά
Και τέλος, το έργο έχει ολοκληρωθεί. Ή μπορείτε να συνεχίσετε. Ακολουθεί ένα σενάριο / εργασία / ιδέα για εσάς:
Ας υποθέσουμε ότι θέλετε ένα μόνο κουμπί για να αντικαταστήσετε τα κουμπιά nbFirst, nbPrevious, nbNext και nbLast. Μπορείτε να χρησιμοποιήσετε τις παραμέτρους X και Y μέσα στη διαδικασία HackNavMouseUp για να βρείτε τη θέση του δρομέα όταν το κουμπί απελευθερώθηκε. Τώρα, σε αυτό το κουμπί ("για να τους κυβερνήσεις όλους") μπορείτε να επισυνάψετε μια εικόνα που έχει 4 περιοχές, κάθε περιοχή υποτίθεται ότι μιμείται ένα από τα κουμπιά που αντικαθιστάτε... πήρε το σημείο;