TDBNavigator ändern?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

TDBNavigator ändern?

Beitrag von Andy Nightingale »

Hallo Leute,

wie kann ich denn die Bilder von dem TDBnavigator ändern? Oder gibt es einen anderen DBNavigator wo das geht? Grüße

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBNavigator ändern?

Beitrag von wp_xyz »

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).

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

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).
Hallo WP,
hmm check das nicht. Finde die Imagelist nicht. Gibt es dazu ein Beispiel? Grüße

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBNavigator ändern?

Beitrag von wp_xyz »

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.
Dateianhänge
bufds_dbnavigator.zip
(5.47 KiB) 111-mal heruntergeladen

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

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.
Hallo WP,
das ist ja genial. Danke für dein Beispiel und deine echt super Erklärung. Grüße :D

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

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.
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

Benutzeravatar
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?

Beitrag von Zvoni »

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
ConfirmDelete auf False setzen?
https://lazarus-ccr.sourceforge.io/docs ... elete.html
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.
.. und die Stelle, die du suchst ist in "...\lcl\include\dbcustomnavigator.inc"
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;
da ich ein "rsDeleteRecord" in "MessageDlg" sehe, gehe ich mal von nem Ressource-String aus.
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.

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBNavigator ändern?

Beitrag von wp_xyz »

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.
Dateianhänge
translation_GermanOnly.zip
(13.84 KiB) 24-mal heruntergeladen

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Mo 2. Jun 2025, 14:58
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
ConfirmDelete auf False setzen?
https://lazarus-ccr.sourceforge.io/docs ... elete.html
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.
.. und die Stelle, die du suchst ist in "...\lcl\include\dbcustomnavigator.inc"
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;
da ich ein "rsDeleteRecord" in "MessageDlg" sehe, gehe ich mal von nem Ressource-String aus.
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"
Hallo Zvoni,

versteh.- ich möchte aber auch den Text ändern. Was komisch ist, ich habe diese Datei ja in deutsch gealden. Danke dir

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

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.
Hallo WP,
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:
d.png
d.png (12.59 KiB) 273 mal betrachtet

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBNavigator ändern?

Beitrag von wp_xyz »

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.
wp_xyz hat geschrieben: Mo 2. Jun 2025, 16:57 ich möchte aber auch den Text ändern
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.

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

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.
wp_xyz hat geschrieben: Mo 2. Jun 2025, 16:57 ich möchte aber auch den Text ändern
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.
Hallo Wp,
könnte man auch so einen TDBNavigator selbst programmieren? Grüße

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBNavigator ändern?

Beitrag von wp_xyz »

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.
Dateianhänge
navigator_frame.zip
(6.69 KiB) 65-mal heruntergeladen

Andy Nightingale
Beiträge: 253
Registriert: Mo 13. Jan 2025, 12:11

Re: TDBNavigator ändern?

Beitrag von Andy Nightingale »

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.
Wow WP,
um das als Anfänger zu verstehen benötige ich erstmal ein paar Tage :D Aber echt super.- vielen Dank dafür.

Antworten