Crea e personalizza i pulsanti con DBNavigator

click fraud protection

"Ok, DBNavigator fa il suo lavoro nella navigazione dei dati e nella gestione dei record. Sfortunatamente, i miei clienti desiderano un'esperienza più user-friendly, come la grafica e le didascalie dei pulsanti personalizzati,... "

Questa inchiesta è arrivata da a Sviluppatore Delphi alla ricerca di un modo per migliorare la potenza del componente DBNavigator.

DBNavigator è un ottimo componente: fornisce un'interfaccia simile a un videoregistratore per la navigazione dei dati e la gestione dei record nelle applicazioni di database. La navigazione della registrazione è fornita dai pulsanti Primo, Successivo, Precedente e Ultimo. La gestione dei record è fornita dai pulsanti Modifica, Pubblica, Annulla, Elimina, Inserisci e Aggiorna. In un componente Delphi fornisce tutto il necessario per operare sui tuoi dati.

Tuttavia, come affermato anche dall'autore della richiesta via e-mail, DBNavigator non dispone di alcune funzionalità come glifi personalizzati, didascalie dei pulsanti e altri.

Un DBNavigator più potente

instagram viewer

Molti componenti di Delphi hanno proprietà e metodi utili che sono contrassegnati come invisibili ("protetti") da uno sviluppatore di Delphi. Eventualmente, per accedere a tali membri protetti di un componente, è possibile utilizzare una semplice tecnica chiamata "hack protetto".

Innanzitutto, aggiungi una didascalia a ogni pulsante DBNavigator, quindi aggiungi grafica personalizzata e infine abiliti OnMouseUp a ciascun pulsante.

Dal "noioso" DBNavigator a uno di:

  • Grafica standard e didascalie personalizzate
  • Solo didascalie
  • Grafica personalizzata e didascalie personalizzate

Let's Rock 'n' Roll

DBNavigator ha una proprietà Buttons protetta. Questo membro è un array di TNavButton, un discendente di TSpeedButton.

Poiché ogni pulsante in questa proprietà protetta eredita da TSpeedButton, se ci mettete le mani sopra, sarete in grado di lavorare con proprietà "standard" di TSpeedButton come: Didascalia (una stringa che identifica il controllo per l'utente), Glifo (la bitmap che appare sul pulsante), Layout (determina dove l'immagine o il testo appaiono sul pulsante)...

Dall'unità DBCtrls (dove è definito DBNavigator) "leggi" che la proprietà Buttons protetta è dichiarata come:

pulsanti: Vettore[TNavigateBtn] di TNavButton;

Dove TNavButton eredita da TSpeedButton e TNavigateBtn è un'enumerazione, definita come:

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

Notare che TNavigateBtn contiene 10 valori, ognuno dei quali identifica un pulsante diverso su un oggetto TDBNavigator. Ora, vediamo come hackerare un DBNavigator:

DBNavigator avanzato

Innanzitutto, imposta un semplice modulo di modifica dei dati Delphi posizionando almeno un DBNavigator, a DBGrid, un DataSoure e un Oggetto del set di dati di tua scelta (ADO, BDE, dbExpres, ...). Assicurarsi che tutti i componenti siano "collegati".

In secondo luogo, hackerare un DBNavigator definendo una classe "fittizia" ereditata, sopra la dichiarazione Form, come:

genere THackDBNavigator = classe(TDBNavigator);
genere
TForm1 = classe(TForm)
...

Successivamente, per poter visualizzare didascalie e grafica personalizzate su ciascun pulsante DBNavigator, dovrai impostarne alcune glifi. È possibile utilizzare il componente TImageList e assegnare 10 immagini (.bmp o .ico), ognuna rappresentante un'azione di un particolare pulsante di un DBNavigator.

Terzo, nel Evento OnCreate per il Form1, aggiungi una chiamata come:

procedura TForm1.FormCreate (Mittente: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
fine;

Assicurati di aggiungere la dichiarazione di questa procedura nella parte privata della dichiarazione del modulo, come:

genere
TForm1 = classe(TForm)
...
privateprocedure SetupHackedNavigator (const Navigatore: TDBNavigator;
const Glifi: TImageList);
...

In quarto luogo, aggiungere la procedura SetupHackedNavigator. La procedura SetupHackedNavigator aggiunge grafica personalizzata a ciascun pulsante e assegna una didascalia personalizzata a ciascun pulsante.

usi pulsanti; //!!! non dimenticare
procedura TForm1.SetupHackedNavigator
(const Navigatore: TDBNavigator;
const Glifi: TImageList);
const
didascalie: Vettore[TNavigateBtn] di stringa =
("Iniziale", "Precedente", "Dopo", "Finale", "Aggiungi",
'Cancella', 'Correggi', 'Invia', 'Ritira', 'Rianima');
(*
Didascalie: array [TNavigateBtn] di string =
('Primo', 'Precedente', 'Successivo', 'Ultimo', 'Inserisci',
'Elimina', 'Modifica', 'Pubblica', 'Annulla', 'Aggiorna');

in Croazia (localizzato):
Didascalie: array [TNavigateBtn] di string =
("Prvi", "Prethodni", "Slijedeci", "Zadnji", "Dodaj",
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
beginfor btn: = Low (TNavigateBtn) per Alto (TNavigateBtn) fare con THackDBNavigator (Navigator) .Buttons [btn] dobegin// dall'array const delle didascalie
Didascalia: = Didascalie [btn];
// il numero di immagini nella proprietà Glyph
NumGlyphs: = 1;
// Rimuovi il vecchio glifo.
Glifo: = zero;
// Assegna quello personalizzato
Glifi. GetBitmap (intero (btn), glifo);
// gylph sopra il testo
Layout: = blGlyphTop;
// spiegato più avanti
OnMouseUp: = HackNavMouseUp;
fine;
fine; (* SetupHackedNavigator *)

Ok, spieghiamo. Si scorre attraverso tutti i pulsanti nel DBNavigator. Ricorda che ogni pulsante è accessibile dalla proprietà dell'array Buttons protetta, quindi la necessità della classe THackDBNavigator. Poiché il tipo di array Buttons è TNavigateBtn, si passa dal "primo" (usando il Basso funzione) fino all'ultimo "(usando il tasto alto funzione) uno. Per ciascun pulsante, è sufficiente rimuovere il glifo "vecchio", assegnare quello nuovo (dal parametro Glyphs), aggiungere la didascalia dall'array Captions e contrassegnare il layout del glifo.

Si noti che è possibile controllare quali pulsanti vengono visualizzati da un DBNavigator (non quello compromesso) tramite la sua proprietà VisibleButtons. Un'altra proprietà di cui potresti voler cambiare il valore predefinito è Suggerimenti: usala per fornire suggerimenti di aiuto di tua scelta per il pulsante di navigazione individuale. È possibile controllare la visualizzazione dei suggerimenti modificando la proprietà ShowHints.

Questo è tutto. Ecco perché hai scelto Delphi!

Dammi di più!

Perché fermarsi qui? Sai che quando fai clic sul pulsante 'nbSuccessivo' la posizione corrente del set di dati passa al record successivo. Cosa succede se si desidera spostare, diciamo, 5 record in avanti se l'utente tiene premuto il tasto CTRL mentre si preme il pulsante? Che ne dici di quello?

Il DBNavigator "standard" non ha l'evento OnMouseUp, quello che porta il parametro Shift di TShiftState, che consente di verificare lo stato dei tasti Alt, Ctrl e Shift. DBNavigator fornisce solo l'evento OnClick che puoi gestire.

Tuttavia, THackDBNavigator può semplicemente esporre l'evento OnMouseUp e consentire di "vedere" lo stato dei tasti di controllo e persino la posizione del cursore sopra il particolare pulsante quando si fa clic!

Ctrl + clic: = 5 righe avanti

Per esporre OnMouseUp è sufficiente assegnare la procedura di gestione degli eventi personalizzata all'evento OnMouseUp per il pulsante del DBNavigator compromesso. Questo è esattamente fatto nella procedura SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Ora, la procedura HackNavMouseUp potrebbe apparire come:

procedura TForm1.HackNavMouseUp
(Mittente: TObject; Pulsante: TMouseButton;
Maiusc: TShiftState; X, Y: intero);
const MoveBy: intero = 5;
beginifNON (Il mittente è TNavButton) poi Uscita;
Astuccio TNavButton (mittente) .Index di
nbPrior:
Se (ssCtrl in Maiusc) poi
TDBNavigator (TNavButton (Sender) .Parent).
Fonte di dati. DataSet. MoveBy (-MoveBy);
nbNext:
Se (ssCtrl in Maiusc) poi
TDBNavigator (TNavButton (Sender) .Parent).
Fonte di dati. DataSet. MoveBy (MoveBy);
fine;
fine; (* HackNavMouseUp *)

Si noti che è necessario aggiungere la firma della procedura HackNavMouseUp all'interno della parte privata della dichiarazione del modulo (vicino alla dichiarazione della procedura SetupHackedNavigator):

genere
TForm1 = classe(TForm)
...
privateprocedure SetupHackedNavigator (const Navigatore: TDBNavigator;
const Glifi: TImageList);
procedura HackNavMouseUp (Mittente: TObject; Pulsante: TMouseButton;
Maiusc: TShiftState; X, Y: intero);
...

Ok, spieghiamo, ancora una volta. La procedura HackNavMouseUp gestisce l'evento OnMouseUp per ciascun pulsante DBNavigator. Se l'utente tiene premuto il tasto CTRL mentre fa clic sul pulsante nbSuccessivo, il record corrente per il set di dati collegato viene spostato in avanti "MoveBy" (definito come costante con il valore di 5).

Che cosa? Troppo complicata?

Sì. Non è necessario fare confusione con tutto ciò se è necessario controllare lo stato dei tasti di controllo solo quando si è fatto clic sul pulsante. Ecco come fare lo stesso nel "normale" Evento OnClick del "normale" DBNavigator:

procedura TForm1.DBNavigator1Click
(Mittente: TObject; Pulsante: TNavigateBtn);
funzione CtrlDown: booleano;
var
Stato: TKeyboardState;
inizio
GetKeyboardState (stato);
Risultato: = ((State [vk_Control] And 128) 0);
fine;
const MoveBy: intero = 5;
begincase Pulsante di
nbPrior:
Se CtrlDown poi
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
Se CtrlDown poi
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
fine; //case
fine; (* DBNavigator2Click *)

È tutto gente

E infine, il progetto è finito. Oppure puoi andare avanti. Ecco uno scenario / attività / idea per te:

Supponiamo che desideri sostituire un solo pulsante con i pulsanti nbFirst, nbPrevious, nbNext e nbLast. È possibile utilizzare i parametri X e Y all'interno della procedura HackNavMouseUp per trovare la posizione del cursore quando il pulsante è stato rilasciato. Ora, a questo pulsante ("per domarli tutti") puoi allegare un'immagine che ha 4 aree, ogni area dovrebbe supporre di imitare uno dei pulsanti che stai sostituendo... capito?

instagram story viewer