"Okay, der DBNavigator erledigt seine Aufgabe, Daten zu navigieren und Datensätze zu verwalten. Leider möchten meine Kunden benutzerfreundlichere Funktionen wie benutzerdefinierte Schaltflächengrafiken und Beschriftungen."
Diese Anfrage kam von einem Delphi-Entwickler, der nach einer Möglichkeit suchte, die Leistung der DBNavigator-Komponente zu verbessern.
Der DBNavigator ist eine großartige Komponente - er bietet eine VCR-ähnliche Oberfläche zum Navigieren in Daten und Verwalten von Datensätzen in Datenbankanwendungen. Die Datensatznavigation wird über die Schaltflächen Erste, Nächste, Vorherige und Letzte bereitgestellt. Die Datensatzverwaltung wird über die Schaltflächen Bearbeiten, Posten, Abbrechen, Löschen, Einfügen und Aktualisieren bereitgestellt. In einer Komponente bietet Delphi alles, was Sie zum Bearbeiten Ihrer Daten benötigen.
Wie der Autor der E-Mail-Anfrage jedoch ebenfalls feststellte, fehlen dem DBNavigator einige Funktionen wie benutzerdefinierte Glyphen, Schaltflächenbeschriftungen und andere.
Viele Delphi-Komponenten verfügen über nützliche Eigenschaften und Methoden, die für einen Delphi-Entwickler als unsichtbar ("geschützt") gekennzeichnet sind. Um auf solche geschützten Elemente einer Komponente zuzugreifen, kann hoffentlich eine einfache Technik verwendet werden, die als "geschützter Hack" bezeichnet wird.
Zuerst fügen Sie jeder DBNavigator-Schaltfläche eine Beschriftung hinzu, dann fügen Sie benutzerdefinierte Grafiken hinzu und schließlich aktivieren Sie jede Schaltfläche mit OnMouseUp.
Vom "langweiligen" DBNavigator bis zu:
Der DBNavigator verfügt über eine geschützte Buttons-Eigenschaft. Dieser Member ist ein Array von TNavButton, einem Nachkommen von TSpeedButton.
Da jede Schaltfläche in dieser geschützten Eigenschaft von TSpeedButton geerbt wird, können Sie mit "standardmäßigen" TSpeedButton-Eigenschaften arbeiten, z. B .: Caption (eine Zeichenfolge, die das Steuerelement für den Benutzer identifiziert), Glyph (das Symbol) Bitmap, die auf der Schaltfläche angezeigt wird), Layout (legt fest, wo das Bild oder der Text auf der Schaltfläche angezeigt wird)…
Aus der DBCtrls-Unit (in der DBNavigator definiert ist) "lesen" Sie, dass die Eigenschaft protected Buttons wie folgt deklariert ist:
Tasten: Array[TNavigateBtn] von TNavButton;
Wobei TNavButton von TSpeedButton und TNavigateBtn eine Aufzählung ist, definiert als:
TNavigateBtn =
(nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Beachten Sie, dass TNavigateBtn 10 Werte enthält, von denen jeder eine andere Schaltfläche auf einem TDBNavigator-Objekt identifiziert. Nun wollen wir sehen, wie man einen DBNavigator hackt:
Richten Sie zunächst ein einfaches Delphi-Datenbearbeitungsformular ein, indem Sie mindestens ein DBNavigator-, ein DBGrid-, ein DataSoure- und ein Dataset-Objekt Ihrer Wahl (ADO, BDE, dbExpres,…) platzieren. Stellen Sie sicher, dass alle Komponenten "verbunden" sind.
Zweitens, hacken Sie einen DBNavigator, indem Sie eine geerbte "Dummy" -Klasse über der Form-Deklaration definieren, wie:
Art THackDBNavigator = Klasse(TDBNavigator);
Art
TForm1 = Klasse(TForm)
…
Um als Nächstes benutzerdefinierte Beschriftungen und Grafiken auf jeder DBNavigator-Schaltfläche anzeigen zu können, müssen Sie einige Glyphen einrichten. Sie können die TImageList-Komponente verwenden und 10 Bilder (.bmp oder .ico) zuweisen, die jeweils eine Aktion einer bestimmten Schaltfläche eines DBNavigators darstellen.
Drittens fügen Sie im OnCreate-Ereignis für Form1 einen Aufruf wie folgt hinzu:
Verfahren TForm1.FormCreate (Absender: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
Ende;
Stellen Sie sicher, dass Sie die Deklaration dieser Prozedur im privaten Teil der Formulardeklaration hinzufügen, z.
Art
TForm1 = Klasse(TForm)
…
Privatverfahren SetupHackedNavigator (const Navigator: TDBNavigator;
const Glyphen: TImageList);
…
Fügen Sie viertens die SetupHackedNavigator-Prozedur hinzu. Die Prozedur SetupHackedNavigator fügt jeder Schaltfläche benutzerdefinierte Grafiken hinzu und weist jeder Schaltfläche eine benutzerdefinierte Beschriftung zu.
Verwendet Tasten; // !!! vergiss nicht
Verfahren TForm1.SetupHackedNavigator
(const Navigator: TDBNavigator;
const Glyphen: TImageList);
const
Bildunterschriften: Array[TNavigateBtn] der Zeichenfolge =
('Initial', 'Previous', 'Later', 'Final', 'Add'),
'Löschen', 'Korrigieren', 'Senden', 'Zurückziehen', 'Wiederbeleben');
(*
Beschriftungen: Array [TNavigateBtn] von string =
('Erste', 'Vorherige', 'Nächste', 'Letzte', 'Einfügen'),
'Löschen', 'Bearbeiten', 'Posten', 'Abbrechen', 'Aktualisieren');
in Kroatien (lokalisiert):
Beschriftungen: Array [TNavigateBtn] von string =
("Prvi", "Prethodni", "Slijedeci", "Zadnji", "Dodaj"),
"Obrisi", "Promjeni", "Spremi", "Odustani", "Osvjezi");
*)
var
btn: TNavigateBtn;
beginfor btn: = Low (TNavigateBtn) zu Hoch (TNavigateBtn) machen mit THackDBNavigator (Navigator) .Buttons [btn] Dobegin// aus dem Captions const Array
Bildunterschrift: = Bildunterschriften [btn];
// Die Anzahl der Bilder in der Glyph-Eigenschaft
NumGlyphs: = 1;
// Entfernen Sie die alte Glyphe.
Glyphe: = Null;
// Weisen Sie die benutzerdefinierte zu
Glyphs.GetBitmap (Integer (btn), Glyph);
// Gylph über dem Text
Layout: = blGlyphTop;
// später erklärt
OnMouseUp: = HackNavMouseUp;
Ende;
Ende; (* SetupHackedNavigator *)
Ok, lass es uns erklären. Sie durchlaufen alle Schaltflächen im DBNavigator. Denken Sie daran, dass auf jede Schaltfläche über die geschützte Array-Eigenschaft Buttons zugegriffen werden kann, weshalb die Klasse THackDBNavigator erforderlich ist. Da der Typ des Arrays "Buttons" TNavigateBtn ist, wechseln Sie von der Schaltfläche "first" (mit der Funktion "Low") zur Schaltfläche "last" (mit der Funktion "High"). Für jede Schaltfläche entfernen Sie einfach die "alte" Glyphe, weisen die neue zu (aus dem Parameter "Glyphen"), fügen die Beschriftung aus dem Array "Beschriftungen" hinzu und markieren das Layout der Glyphe.
Beachten Sie, dass Sie über die VisibleButtons-Eigenschaft steuern können, welche Schaltflächen von einem DBNavigator (nicht dem gehackten) angezeigt werden. Eine weitere Eigenschaft, deren Standardwert Sie möglicherweise ändern möchten, ist Hints. Verwenden Sie diese Eigenschaft, um Hilfehinweise Ihrer Wahl für die einzelnen Navigatorschaltflächen bereitzustellen. Sie können die Anzeige der Hinweise steuern, indem Sie die ShowHints-Eigenschaft bearbeiten.
Das ist es. Deshalb haben Sie sich für Delphi entschieden!
Warum hier aufhören? Sie wissen, dass beim Klicken auf die Schaltfläche 'nbNext' die aktuelle Position des Datensatzes auf den nächsten Datensatz verschoben wird. Was ist, wenn Sie beispielsweise 5 Datensätze weiter verschieben möchten, wenn der Benutzer die STRG-Taste gedrückt hält, während er die Taste drückt? Wie ist es damit?
Der "Standard" -DBNavigator verfügt nicht über das OnMouseUp-Ereignis, das den Shift-Parameter des TShiftState enthält, mit dem Sie den Status der Alt-, Strg- und Umschalttasten testen können. Der DBNavigator stellt nur das OnClick-Ereignis zur Verfügung, das Sie verarbeiten können.
Der THackDBNavigator kann jedoch einfach das OnMouseUp-Ereignis verfügbar machen und es Ihnen ermöglichen, den Status der Steuertasten und sogar die Position des Cursors über der jeweiligen Schaltfläche zu "sehen", wenn Sie darauf klicken!
Um OnMouseUp verfügbar zu machen, weisen Sie dem OnMouseUp-Ereignis einfach Ihre benutzerdefinierte Ereignisbehandlungsprozedur für die Schaltfläche des gehackten DBNavigators zu. Genau dies ist bereits in der Prozedur SetupHackedNavigator erledigt:
OnMouseUp: = HackNavMouseUp;
Nun könnte die HackNavMouseUp-Prozedur so aussehen:
Verfahren TForm1.HackNavMouseUp
(Absender: TObject; Schaltfläche: TMouseButton;
Shift: TShiftState; X, Y: Ganzzahl);
const MoveBy: Ganzzahl = 5;
beginif NICHT (Absender ist TNavButton) dann Ausgang;
Fall TNavButton (Sender) .Index von
nbPrior:
wenn (ssCtrl in Shift) dann
TDBNavigator (TNavButton (Sender) .Parent).
DataSource.DataSet.MoveBy (-MoveBy);
nbNext:
wenn (ssCtrl in Shift) dann
TDBNavigator (TNavButton (Sender) .Parent).
DataSource.DataSet.MoveBy (MoveBy);
Ende;
Ende; (* HackNavMouseUp *)
Beachten Sie, dass Sie die Signatur der HackNavMouseUp-Prozedur im privaten Teil der Formulardeklaration hinzufügen müssen (in der Nähe der Deklaration der SetupHackedNavigator-Prozedur):
Art
TForm1 = Klasse(TForm)
…
Privatverfahren SetupHackedNavigator (const Navigator: TDBNavigator;
const Glyphen: TImageList);
Verfahren HackNavMouseUp (Absender: TObject; Schaltfläche: TMouseButton;
Shift: TShiftState; X, Y: Ganzzahl);
…
Ok, lassen Sie uns noch einmal erklären. Die HackNavMouseUp-Prozedur behandelt das OnMouseUp-Ereignis für jede DBNavigator-Schaltfläche. Wenn der Benutzer beim Klicken auf die Schaltfläche "nbNext" die STRG-Taste gedrückt hält, wird der aktuelle Datensatz für das verknüpfte Dataset um "MoveBy" -Datensätze (definiert als Konstante mit dem Wert 5) nach vorne verschoben.
Ja. Sie müssen sich nicht damit herumschlagen, wenn Sie nur den Status der Steuertasten überprüfen müssen, als Sie auf die Schaltfläche geklickt haben. Im "normalen" OnClick-Ereignis des "normalen" DBNavigators können Sie dasselbe tun:
Verfahren TForm1.DBNavigator1Klicken Sie
(Absender: TObject; Schaltfläche: TNavigateBtn);
Funktion CtrlDown: Boolean;
var
Zustand: TKeyboardState;
Start
GetKeyboardState (State);
Ergebnis: = ((State [vk_Control] And 128) 0);
Ende;
const MoveBy: Ganzzahl = 5;
Anfänger Taste von
nbPrior:
wenn CtrlDown dann
DBNavigator1.DataSource.DataSet.MoveBy (-MoveBy);
nbNext:
wenn CtrlDown dann
DBNavigator1.DataSource.DataSet.MoveBy (MoveBy);
Ende; //Fall
Ende; (* DBNavigator2Click *)
Und schließlich ist das Projekt abgeschlossen. Oder du kannst weitermachen. Hier ist ein Szenario / eine Aufgabe / eine Idee für Sie:
Angenommen, Sie möchten, dass nur eine Schaltfläche die Schaltflächen nbFirst, nbPrevious, nbNext und nbLast ersetzt. Mit den X- und Y-Parametern in der HackNavMouseUp-Prozedur können Sie die Position des Cursors ermitteln, an der die Schaltfläche losgelassen wurde. An diese eine Schaltfläche ("um alle zu regieren") können Sie ein Bild anhängen, das 4 Bereiche enthält. Jeder Bereich soll eine der Schaltflächen imitieren, die Sie ersetzen?