TDBNavigator ändern?
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
TDBNavigator ändern?
Hallo Leute,
wie kann ich denn die Bilder von dem TDBnavigator ändern? Oder gibt es einen anderen DBNavigator wo das geht? Grüße
wie kann ich denn die Bilder von dem TDBnavigator ändern? Oder gibt es einen anderen DBNavigator wo das geht? Grüße
Re: TDBNavigator ändern?
DBNavigator hat - ich glaube seit v3.0 - eine eigene ImageList (Property Images), der du die Button-Icons zuweisen kannst: https://lazarus-ccr.sourceforge.io/docs ... mages.html beschreibt auch, in welcher Reihenfolge die Bilder in der ImageList vorhanden sein müssen (kurzgefasst: in derselben Reihenfolge in der sie im Default-Navigator vorkommen, beginnend bei Index 0).
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Hallo WP,wp_xyz hat geschrieben: Fr 30. Mai 2025, 20:01 DBNavigator hat - ich glaube seit v3.0 - eine eigene ImageList (Property Images), der du die Button-Icons zuweisen kannst: https://lazarus-ccr.sourceforge.io/docs ... mages.html beschreibt auch, in welcher Reihenfolge die Bilder in der ImageList vorhanden sein müssen (kurzgefasst: in derselben Reihenfolge in der sie im Default-Navigator vorkommen, beginnend bei Index 0).
hmm check das nicht. Finde die Imagelist nicht. Gibt es dazu ein Beispiel? Grüße
Re: TDBNavigator ändern?
Hab's gerade nochmal geprüft: die Images-Property in TDBNavigator gibt es mindestens seit Lazarus v1.8.4, an der Version kann es also nicht liegen. Dann versuche ich es mal so zu erklären:
Du klickst zusätzlich auch eine TImageList-Komponente aufs Formular (Palette "Common Controls"), so wie du sie wahrscheinlich auch schon für Menü oder Toolbar verwendet hast. Doppelklick auf der Komponente öffnet den Imagelist-Editor, mit dem du die gewünschten Icons hinzufügen kannst. Verwende am besten png-Bilder, die haben eingebaute Transparenz (Seit einiger Zeit gibt es dazu eine Menge im Ordner images/general-purpose der Lazarus-Installation). Wegen der Anforderungen des DBNavigator an die Imagelist müssen diese Bilder ganz vorne in der Imagelist stehen (also ab Index 0) und in der Reihenfolge wie sie im Original-DBNavigator vorhanden sind. Falls du bereits eine ImageList auf dem Formular für Menü/Toolbar hast, dann müsstest du die Navigator-Icons ganz nach vorne verschieben, was dann wiederrum die Nummerierung der Toolbar/Menü-Icons durcheinander bringt. Daher am besten eine eigene ImageList für den Navigator verwenden.
Diese ImageList trägst du dann zum Schluss in der Eigenschaft "Images" des Navigators ein.
In der Anlage ein kleines Beispiel.
Du klickst zusätzlich auch eine TImageList-Komponente aufs Formular (Palette "Common Controls"), so wie du sie wahrscheinlich auch schon für Menü oder Toolbar verwendet hast. Doppelklick auf der Komponente öffnet den Imagelist-Editor, mit dem du die gewünschten Icons hinzufügen kannst. Verwende am besten png-Bilder, die haben eingebaute Transparenz (Seit einiger Zeit gibt es dazu eine Menge im Ordner images/general-purpose der Lazarus-Installation). Wegen der Anforderungen des DBNavigator an die Imagelist müssen diese Bilder ganz vorne in der Imagelist stehen (also ab Index 0) und in der Reihenfolge wie sie im Original-DBNavigator vorhanden sind. Falls du bereits eine ImageList auf dem Formular für Menü/Toolbar hast, dann müsstest du die Navigator-Icons ganz nach vorne verschieben, was dann wiederrum die Nummerierung der Toolbar/Menü-Icons durcheinander bringt. Daher am besten eine eigene ImageList für den Navigator verwenden.
Diese ImageList trägst du dann zum Schluss in der Eigenschaft "Images" des Navigators ein.
In der Anlage ein kleines Beispiel.
- Dateianhänge
-
bufds_dbnavigator.zip
- (5.47 KiB) 111-mal heruntergeladen
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Hallo WP,wp_xyz hat geschrieben: Sa 31. Mai 2025, 18:05 Hab's gerade nochmal geprüft: die Images-Property in TDBNavigator gibt es mindestens seit Lazarus v1.8.4, an der Version kann es also nicht liegen. Dann versuche ich es mal so zu erklären:
Du klickst zusätzlich auch eine TImageList-Komponente aufs Formular (Palette "Common Controls"), so wie du sie wahrscheinlich auch schon für Menü oder Toolbar verwendet hast. Doppelklick auf der Komponente öffnet den Imagelist-Editor, mit dem du die gewünschten Icons hinzufügen kannst. Verwende am besten png-Bilder, die haben eingebaute Transparenz (Seit einiger Zeit gibt es dazu eine Menge im Ordner images/general-purpose der Lazarus-Installation). Wegen der Anforderungen des DBNavigator an die Imagelist müssen diese Bilder ganz vorne in der Imagelist stehen (also ab Index 0) und in der Reihenfolge wie sie im Original-DBNavigator vorhanden sind. Falls du bereits eine ImageList auf dem Formular für Menü/Toolbar hast, dann müsstest du die Navigator-Icons ganz nach vorne verschieben, was dann wiederrum die Nummerierung der Toolbar/Menü-Icons durcheinander bringt. Daher am besten eine eigene ImageList für den Navigator verwenden.
Diese ImageList trägst du dann zum Schluss in der Eigenschaft "Images" des Navigators ein.
In der Anlage ein kleines Beispiel.
das ist ja genial. Danke für dein Beispiel und deine echt super Erklärung. Grüße

-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Hallo WP,wp_xyz hat geschrieben: Sa 31. Mai 2025, 18:05 Hab's gerade nochmal geprüft: die Images-Property in TDBNavigator gibt es mindestens seit Lazarus v1.8.4, an der Version kann es also nicht liegen. Dann versuche ich es mal so zu erklären:
Du klickst zusätzlich auch eine TImageList-Komponente aufs Formular (Palette "Common Controls"), so wie du sie wahrscheinlich auch schon für Menü oder Toolbar verwendet hast. Doppelklick auf der Komponente öffnet den Imagelist-Editor, mit dem du die gewünschten Icons hinzufügen kannst. Verwende am besten png-Bilder, die haben eingebaute Transparenz (Seit einiger Zeit gibt es dazu eine Menge im Ordner images/general-purpose der Lazarus-Installation). Wegen der Anforderungen des DBNavigator an die Imagelist müssen diese Bilder ganz vorne in der Imagelist stehen (also ab Index 0) und in der Reihenfolge wie sie im Original-DBNavigator vorhanden sind. Falls du bereits eine ImageList auf dem Formular für Menü/Toolbar hast, dann müsstest du die Navigator-Icons ganz nach vorne verschieben, was dann wiederrum die Nummerierung der Toolbar/Menü-Icons durcheinander bringt. Daher am besten eine eigene ImageList für den Navigator verwenden.
Diese ImageList trägst du dann zum Schluss in der Eigenschaft "Images" des Navigators ein.
In der Anlage ein kleines Beispiel.
ich habe noch eine Frage....wenn ich bei dem DBnavigator zum Beispiel auf minus klicke.- also auf Datensatz löschen.- dann öffnet sich ein Fenster....und fragt auf englisch ob man es wirklich löschen möchte.....wie kann ich das verändern? Hab versucht die Komponente zu finden.- finde sie nicht.- dann bin ich in die .lfm.- da steht auch nix drin. Grüße
- Zvoni
- Beiträge: 396
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: TDBNavigator ändern?
ConfirmDelete auf False setzen?Andy Nightingale hat geschrieben: Mo 2. Jun 2025, 13:24 Hallo WP,
ich habe noch eine Frage....wenn ich bei dem DBnavigator zum Beispiel auf minus klicke.- also auf Datensatz löschen.- dann öffnet sich ein Fenster....und fragt auf englisch ob man es wirklich löschen möchte.....wie kann ich das verändern? Hab versucht die Komponente zu finden.- finde sie nicht.- dann bin ich in die .lfm.- da steht auch nix drin. Grüße
https://lazarus-ccr.sourceforge.io/docs ... elete.html
.. und die Stelle, die du suchst ist in "...\lcl\include\dbcustomnavigator.inc"Indicates if the user is asked to confirm a record deletion.
Declaration
Source position: dbctrls.pp line 1417
public property TDBCustomNavigator.ConfirmDelete : Boolean
read FConfirmDelete
write FConfirmDelete
default True;
Description
When set to True, a dialog is displayed to ask for confirmation of the Delete request.
Zeile 477 ff
Code: Alles auswählen
procedure TDBCustomNavigator.BtnClick(Index: TNavigateBtn);
begin
if (DataSource<>nil) and (DataSource.State<>dsInactive) then begin
if not (csDesigning in ComponentState) and Assigned(BeforeAction) then
BeforeAction(Self,Index);
with DataSource.DataSet do begin
case Index of
nbPrior: Prior;
nbNext: Next;
nbFirst: First;
nbLast: Last;
nbInsert: Insert;
nbEdit: Edit;
nbCancel: Cancel;
nbPost: Post;
nbRefresh: Refresh;
nbDelete:
if (not ConfirmDelete)
or (MessageDlg(rsDeleteRecord, mtConfirmation, mbOKCancel, 0 )<>
mrCancel)
then
Delete;
end;
end;
end;
if not (csDesigning in ComponentState) and Assigned(OnClick) then
OnClick(Self,Index);
end;
Und siehe da: den "rsDeleteRecord" findet man in "...\lcl\lclstrconsts.pas" in Zeile 79
Nun also die Gretchen-Frage: Falls man ConfirmDelete auf True lassen will, wie bekommt man es auf Deutsch hin?
Ich geb dir nen Hinweis: Es gibt nen Ordner "...\lcl\languages"
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: TDBNavigator ändern?
Der dahinter stehende Problem ist, dass die LCL (und viele Packages) generell englische Texte enthalten. Diese sind als Resourcestrings in eigene Units ausgelagert und liegen in sogenannten po-Dateien in übersetzter Form vor. Bei den LCL-Strings heißt die Unit lclstrconsts, und die deutsche Übersetzung heißt lclstrconsts.de.po; sie liegt im Verzeichnis lcl/languages deiner Lazarus-Installation.
Um ein komplett deutsches Programm zu erstellen, bei dem auch die Resource-Strings auf deutsch sind, musst du diese deutsche Sprachdatei in dein Projekt kopieren und die zugehörigen Resourcestrings durch einen Aufruf von TranslateUnitResourceStrings übersetzen lassen (das ist in Unit Translations). Das muss sehr früh erfolgen, bevor irgendwelche Formulare geladen werden, z.B. in der Projekt-Datei oder im Initialization-Abschnitt des Hauptformulars. Dasselbe musst du mit den Resource-/Übersetzungsdateien anderer Packages machen, die dein Projekt verwendet.
Im Anhang ein kleines Beispiel, das ich vor einiger Zeit gemacht habe.
Um ein komplett deutsches Programm zu erstellen, bei dem auch die Resource-Strings auf deutsch sind, musst du diese deutsche Sprachdatei in dein Projekt kopieren und die zugehörigen Resourcestrings durch einen Aufruf von TranslateUnitResourceStrings übersetzen lassen (das ist in Unit Translations). Das muss sehr früh erfolgen, bevor irgendwelche Formulare geladen werden, z.B. in der Projekt-Datei oder im Initialization-Abschnitt des Hauptformulars. Dasselbe musst du mit den Resource-/Übersetzungsdateien anderer Packages machen, die dein Projekt verwendet.
Im Anhang ein kleines Beispiel, das ich vor einiger Zeit gemacht habe.
- Dateianhänge
-
translation_GermanOnly.zip
- (13.84 KiB) 24-mal heruntergeladen
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Hallo Zvoni,Zvoni hat geschrieben: Mo 2. Jun 2025, 14:58ConfirmDelete auf False setzen?Andy Nightingale hat geschrieben: Mo 2. Jun 2025, 13:24 Hallo WP,
ich habe noch eine Frage....wenn ich bei dem DBnavigator zum Beispiel auf minus klicke.- also auf Datensatz löschen.- dann öffnet sich ein Fenster....und fragt auf englisch ob man es wirklich löschen möchte.....wie kann ich das verändern? Hab versucht die Komponente zu finden.- finde sie nicht.- dann bin ich in die .lfm.- da steht auch nix drin. Grüße
https://lazarus-ccr.sourceforge.io/docs ... elete.html.. und die Stelle, die du suchst ist in "...\lcl\include\dbcustomnavigator.inc"Indicates if the user is asked to confirm a record deletion.
Declaration
Source position: dbctrls.pp line 1417
public property TDBCustomNavigator.ConfirmDelete : Boolean
read FConfirmDelete
write FConfirmDelete
default True;
Description
When set to True, a dialog is displayed to ask for confirmation of the Delete request.
Zeile 477 ffda ich ein "rsDeleteRecord" in "MessageDlg" sehe, gehe ich mal von nem Ressource-String aus.Code: Alles auswählen
procedure TDBCustomNavigator.BtnClick(Index: TNavigateBtn); begin if (DataSource<>nil) and (DataSource.State<>dsInactive) then begin if not (csDesigning in ComponentState) and Assigned(BeforeAction) then BeforeAction(Self,Index); with DataSource.DataSet do begin case Index of nbPrior: Prior; nbNext: Next; nbFirst: First; nbLast: Last; nbInsert: Insert; nbEdit: Edit; nbCancel: Cancel; nbPost: Post; nbRefresh: Refresh; nbDelete: if (not ConfirmDelete) or (MessageDlg(rsDeleteRecord, mtConfirmation, mbOKCancel, 0 )<> mrCancel) then Delete; end; end; end; if not (csDesigning in ComponentState) and Assigned(OnClick) then OnClick(Self,Index); end;
Und siehe da: den "rsDeleteRecord" findet man in "...\lcl\lclstrconsts.pas" in Zeile 79
Nun also die Gretchen-Frage: Falls man ConfirmDelete auf True lassen will, wie bekommt man es auf Deutsch hin?
Ich geb dir nen Hinweis: Es gibt nen Ordner "...\lcl\languages"
versteh.- ich möchte aber auch den Text ändern. Was komisch ist, ich habe diese Datei ja in deutsch gealden. Danke dir
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Hallo WP,wp_xyz hat geschrieben: Mo 2. Jun 2025, 16:57 Der dahinter stehende Problem ist, dass die LCL (und viele Packages) generell englische Texte enthalten. Diese sind als Resourcestrings in eigene Units ausgelagert und liegen in sogenannten po-Dateien in übersetzter Form vor. Bei den LCL-Strings heißt die Unit lclstrconsts, und die deutsche Übersetzung heißt lclstrconsts.de.po; sie liegt im Verzeichnis lcl/languages deiner Lazarus-Installation.
Um ein komplett deutsches Programm zu erstellen, bei dem auch die Resource-Strings auf deutsch sind, musst du diese deutsche Sprachdatei in dein Projekt kopieren und die zugehörigen Resourcestrings durch einen Aufruf von TranslateUnitResourceStrings übersetzen lassen (das ist in Unit Translations). Das muss sehr früh erfolgen, bevor irgendwelche Formulare geladen werden, z.B. in der Projekt-Datei oder im Initialization-Abschnitt des Hauptformulars. Dasselbe musst du mit den Resource-/Übersetzungsdateien anderer Packages machen, die dein Projekt verwendet.
Im Anhang ein kleines Beispiel, das ich vor einiger Zeit gemacht habe.
ich verstehe was du meinst. Aber das ist schon geladen. Es zeigt ja auch dies an.-/ ist das ein Fehler im System?? .- Danke dir auch für das tolle BEispiel.- ich schau es mir genauer an:
Re: TDBNavigator ändern?
Ist das ein Dialog von Lazarus? wenn ja: Natürlich, dein Lazarus ist ja auf Deutsch eingestellt, d.h. er verwendet die deutschen Sprachdateien. Das gilt aber nicht für dein Programm, es weiß nicht, welche Sprache bei Lazarus eingestellt war, sondern nimmt für LCL- und andere Package-Strings die englischen Texte.
Heißt das, dass du auch den Text umformulieren willst? Nun, wenn du die lclstrconsts.de.po-Datei so wie oben beschrieben in der Übersetzung verwendest, kann könntest du am einfachsten diese Datei in einen Text-Editor laden, die Stelle suchen und entsprechend abändern. Oder (ungetestet): Du setzt ConfirmDelete auf false, und schreibst einen Handler für das BeforeDelete-Event des Dataset; hier fragst du den User mit deinem Text, ob der Datensatz gelöscht werden soll, und rufst "Abort" auf, falls er das nicht will.
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Hallo Wp,wp_xyz hat geschrieben: Mo 2. Jun 2025, 19:10 Ist das ein Dialog von Lazarus? wenn ja: Natürlich, dein Lazarus ist ja auf Deutsch eingestellt, d.h. er verwendet die deutschen Sprachdateien. Das gilt aber nicht für dein Programm, es weiß nicht, welche Sprache bei Lazarus eingestellt war, sondern nimmt für LCL- und andere Package-Strings die englischen Texte.
Heißt das, dass du auch den Text umformulieren willst? Nun, wenn du die lclstrconsts.de.po-Datei so wie oben beschrieben in der Übersetzung verwendest, kann könntest du am einfachsten diese Datei in einen Text-Editor laden, die Stelle suchen und entsprechend abändern. Oder (ungetestet): Du setzt ConfirmDelete auf false, und schreibst einen Handler für das BeforeDelete-Event des Dataset; hier fragst du den User mit deinem Text, ob der Datensatz gelöscht werden soll, und rufst "Abort" auf, falls er das nicht will.
könnte man auch so einen TDBNavigator selbst programmieren? Grüße
Re: TDBNavigator ändern?
Natürlich. Nimm ein Panel oder einen Frame mit mehreren SpeedButtons. Jeder Speedbutton führt einen Befehl des zugehörigen Dataset aus, z.B. Dataset.First (Springen zum Anfang), Dataset.Prior (um eins zurück), Dataset.Next (um eins vor), Dataset.Last (ans Ende springen), Dataset.Edit (in den Edit-Zustand gehen), Dataset.Append(neuen Datensatz anhängen). Dataset.Delete (Datensatz löschen, mit entsprechender Sicherheitsabfrage), Dataset.Post (Änderungen übernehmen), Dataset.Cancel (Änderungen verwerfen), Dataset.Refresh (Datensatz neu abrufen). Du kannst dir sogar neue Buttons überlegen: Bookmark setzen, Datensatz suchen, filtern, usw.
Im Anhang ist eine einfache DBNavigator-Alternative, die einige dieser Aktionen ausführt. Die Button-Click-Handler sind eigentlich immer Ein-Zeiler, abgesehen von der Standardabfrage, ob der zugeordnete Dataset nil ist. Etwas mehr Aufwand ist nötig, um den Zustand der Buttons richtig anzuzeigen. Wenn man z.B. das "+" für neuen Record geklickt hat, soll man nicht auf Löschen klicken können. Das alles passiert in UpdateBtns.
Das ganze ist in einem Frame untergebracht, das hat gegenüber dem Panel den Vorteil, den Navigator-Code vom Haupt-Code trennen zu können. Die Buttons habe ich mit Childsizing automatisch positioniert, sie können daher nicht verschoben werden, zum Umsortieren im Context-Menü die "Z-Reihenfolge" anpassen. Der Frame wird zur Laufzeit erzeugt, d.h. man sieht den Navigator in der Entwurfsansicht noch nicht. Das ist nötige, weil Frames zur Designzeit etwas störrisch sind.
Im Anhang ist eine einfache DBNavigator-Alternative, die einige dieser Aktionen ausführt. Die Button-Click-Handler sind eigentlich immer Ein-Zeiler, abgesehen von der Standardabfrage, ob der zugeordnete Dataset nil ist. Etwas mehr Aufwand ist nötig, um den Zustand der Buttons richtig anzuzeigen. Wenn man z.B. das "+" für neuen Record geklickt hat, soll man nicht auf Löschen klicken können. Das alles passiert in UpdateBtns.
Das ganze ist in einem Frame untergebracht, das hat gegenüber dem Panel den Vorteil, den Navigator-Code vom Haupt-Code trennen zu können. Die Buttons habe ich mit Childsizing automatisch positioniert, sie können daher nicht verschoben werden, zum Umsortieren im Context-Menü die "Z-Reihenfolge" anpassen. Der Frame wird zur Laufzeit erzeugt, d.h. man sieht den Navigator in der Entwurfsansicht noch nicht. Das ist nötige, weil Frames zur Designzeit etwas störrisch sind.
- Dateianhänge
-
navigator_frame.zip
- (6.69 KiB) 65-mal heruntergeladen
-
- Beiträge: 253
- Registriert: Mo 13. Jan 2025, 12:11
Re: TDBNavigator ändern?
Wow WP,wp_xyz hat geschrieben: Mo 2. Jun 2025, 23:22 Natürlich. Nimm ein Panel oder einen Frame mit mehreren SpeedButtons. Jeder Speedbutton führt einen Befehl des zugehörigen Dataset aus, z.B. Dataset.First (Springen zum Anfang), Dataset.Prior (um eins zurück), Dataset.Next (um eins vor), Dataset.Last (ans Ende springen), Dataset.Edit (in den Edit-Zustand gehen), Dataset.Append(neuen Datensatz anhängen). Dataset.Delete (Datensatz löschen, mit entsprechender Sicherheitsabfrage), Dataset.Post (Änderungen übernehmen), Dataset.Cancel (Änderungen verwerfen), Dataset.Refresh (Datensatz neu abrufen). Du kannst dir sogar neue Buttons überlegen: Bookmark setzen, Datensatz suchen, filtern, usw.
Im Anhang ist eine einfache DBNavigator-Alternative, die einige dieser Aktionen ausführt. Die Button-Click-Handler sind eigentlich immer Ein-Zeiler, abgesehen von der Standardabfrage, ob der zugeordnete Dataset nil ist. Etwas mehr Aufwand ist nötig, um den Zustand der Buttons richtig anzuzeigen. Wenn man z.B. das "+" für neuen Record geklickt hat, soll man nicht auf Löschen klicken können. Das alles passiert in UpdateBtns.
Das ganze ist in einem Frame untergebracht, das hat gegenüber dem Panel den Vorteil, den Navigator-Code vom Haupt-Code trennen zu können. Die Buttons habe ich mit Childsizing automatisch positioniert, sie können daher nicht verschoben werden, zum Umsortieren im Context-Menü die "Z-Reihenfolge" anpassen. Der Frame wird zur Laufzeit erzeugt, d.h. man sieht den Navigator in der Entwurfsansicht noch nicht. Das ist nötige, weil Frames zur Designzeit etwas störrisch sind.
um das als Anfänger zu verstehen benötige ich erstmal ein paar Tage
