fdDialog, eine einfache aber flexible Dialog-Unit

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Wie schon angekündigt, möchte ich euch mit diesem Post meine Dialogunit fdDialog Version 1.0 unter der EU public Licence zur Verfügung stellen. Das Programm ist für Windows geschrieben, für Linux müsste es vermutlich ein wenig angepasst werden.

Der Hauptvorteil dieser Unit ist, dass man auch komplizierte Abfragedialoge graphisch im IDE Designer erstellen kann, ohne gleich eine neue Unit für jeden Abfragedialog anlegen zu müssen.

Zwei Features sind in dieser Version noch offen. Die Möglichkeit, Buttons mit Glyphs zu verzieren, habe ich mir für die nächste Programmversion vorgenommen :D
Und die Dialoge haben als Titelleiste eine unnötige leere Zeile - ein kleiner Schönheitsfehler, aber auch das hoffe ich, in absehbarer Zeit in den Griff zu bekommen.

Über Rückmeldungen würde ich mich freuen.

Edit:
Im Zip File ist jetzt auch ein komplettes Demoprojekt mitgepackt.

Edit:
Neue Version mit Demoprojekt und Package
Dateianhänge
fdDialog 1.1.zip
(98.2 KiB) 13-mal heruntergeladen
Zuletzt geändert von braunbär am Sa 12. Dez 2020, 11:52, insgesamt 4-mal geändert.

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

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von wp_xyz »

Ohne deine Arbeit in irgendeiner Form bewerten zu wollen, sollte man vielleicht hinweisen, dass es seit vielen Jahren in der IDE einen "MessageComposer" gibt, mit dem man sich die Parameter der vielen in der LCL vorhandenen Dialoge halb-visuell zusammenklicken kann. Ist allerdings standardmäßig nicht installiert (--> "Package" > "Installierte Packages einrichten" > in der rechten Liste "messagecomposerpkg" markieren > "Auswahl installieren" > "Speichern und IDE kompilieren"). Erscheint als Eintrag im "Quelltext"-Menü.

Ein sehr flexibler, relativ unbekannter Dialog ist weiterhin TTaskDialog mit optionalen zusätzlichen Buttons und Radiobuttons.

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Den message composer kannte ich noch nicht, der schaut ganz interessant aus, kann aber, wenn ich das richtig sehe, pro Dialog auch nur einen String abfragen?
TTaskdialog kenne ich, aber der ist einfach mühsam, und kann auch nur wenige vordefinierte Controls. Zum Vergleich:

Code: Alles auswählen

with TTaskDialog.Create(self) do
    try
      Title := 'Confirm removal';
      Caption := 'Confirm';
      Text := 'Remove selected item?';
      CommonButtons := [];
      with TTaskDialogButtonItem(Buttons.Add) do
      begin
        Caption := 'Remove';
        ModalResult := mrYes;
      end;
      with TTaskDialogButtonItem(Buttons.Add) do
      begin
        Caption := 'Keep';
        ModalResult := mrNo;
      end;
      MainIcon := tdiQuestion;
      if Execute then
        if ModalResult = mrYes then
          ShowMessage('Item removed');
    finally
      Free;
    end
gegenüber

Code: Alles auswählen

dlgSetButtons('Remove','Keep');
dlgAddComponent(lblremove);
if Ask('Confirm removal?')=dlgBtn1 then
   msg(Item removed');
mit meiner Dialog-Unit.
lblremove ist dabei ein unsichtbares TLabel am Hauptformular mit der Caption='remove selected item'.

Mit Standardbuttons wird es noch einfacher:

Code: Alles auswählen

if AskYN('Datensatz löschen?') then 
    msg('Datensatz wurde gelöscht');  // natürlich gehört hier auch der Code zum Löschen her
Und einen komplexeren Dialog wie diesen stelle ich einfach direkt graphisch im OI zusammen (ohne die beiden Buttons, die erzeugt und positioniert er automatisch), inklusive der Prüfroutine für die Eingabefelder. Bei einer ungültigen Mitgliedsnummer oder einem ungültigen Datumseingabe kann man den Dialog dann nur über "Abbrechen" verlassen.
Bild

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

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von wp_xyz »

braunbär hat geschrieben:
Mi 2. Dez 2020, 15:00
TTaskdialog kenne ich, aber der ist einfach mühsam
Wenn man alles im Code machen will, ja. Aber im Design-Modus sind es trotzdem nur ein paar Klicks:
- einen TTaskDialog aufs Formular klicken
- Rechtsklick auf den "Buttons"-Node des TaskDialog im Objekt-Baums --> "Add Item"
- "Caption" und "ModalResult" des neuen Buttons im Object-Inspector ausfüllen.
Gewöhnungsbedürftig finde ich die Eigenheit, dass Execute auch dann true zurückliefert, wenn "Cancel" geklickt wurde. Stattdessen muss man ModalResult abfragen.

Deine Unit ist sicher sehr interessant, wenn man viel im Code machen will/muss. Allerdings verstehe ich nicht, warum das alles über die einzige globale Variable "dlg" laufen muss -- aber wahrscheinlich habe ich mich zu wenig mit deiner Unit befasst.

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Deine Unit ist sicher sehr interessant, wenn man viel im Code machen will/muss.
Der Screenshot vom letzten Formular, das du siehst, ist praktisch zur Gänze im der Formularansicht gezeichnet worden, nur die Buttons wurden vom Programm her hinzugefügt. Der Codieraufwand dazu hält sich in Grenzen:

Code: Alles auswählen

  DlgAddControl(pnlAuswahl);                                // Hier wird das Panel ins Formular eingehängt
  DlgSetCanClose(@AuswahlOk);                               // Prüfroutine, die sicherstellt, dass in den Feldern gültige Werte sind
  if Ask('',[dlgOK,dlgCancel])<>dlgOK then exit;            // Dialogaufruf, kein Fragetext, aber zwei Standardbuttons OK und Abbrechen
  ... Hier folgt der Code zum Erstellen der Liste
Einen derartigen Dialog kannst du mit TTaskDialog gar nicht erstellen, und ich vermute, auch mit dem message composer nicht?
Allerdings verstehe ich nicht, warum das alles über die einzige globale Variable "dlg" laufen muss
dlg ist das Dialogformular. Das Formular ist immer das gleiche und wird nach Bedarf mit einer Frage, einem Icon, Buttons und eventuell einem zusätzlichen Control bestückt. Nachdem das zusätzliche Control ein TPanel sein kann, kannst du völlig beliebige und beliebig viele Controls in das Formular setzen.
Die Anordnung der Buttons, des Fragetexts und des Zusatzcontrols erfolgt automatisch, nur die Anordnung der Controls im Panel gestaltest du natürlich selbst im Formulardesigner. Du brauchst aber dafür keine separate Unit, sondern legst das Panel einfach mit der Property visible=false irgendwo auf das Formular, das den Dialog aufruft.
Die Klasseninstanz dlg sollte man überhaupt nicht direkt ansprechen (vielleicht spiele ich mich noch damit, das Formular komplett im Code zu erzeugen, dann kann es ganz in der Implementation section verschwinden). Aufgerufen wird der Dialog nur über eine der fünf Dialogfunktionen.

wennerer
Beiträge: 238
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 19.3 Cinnamon, Lazarus Stable 2.0.10 r63673M FPC 3.2.0
CPU-Target: x86_64-linux-gtk2

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von wennerer »

Hallo braunbär,
ich habe schon mal etwas herum getestet. Bin mir aber nicht so sicher ob ich das alles so im Sinne des Erfinders gemacht habe. Für mich wäre es sehr hilfreich wenn du ein kleines Demo Programm zur Verfügung stellen könntest wo nur ein paar grundlegende Funktionen enthalten sind. Ich tue mich da jedenfalls leichter die Bedienung zu verstehen als wenn ich eine Anleitung lese.
Ist aber ein interessantes Projekt!
Viele Grüße
Bernd

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

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von wp_xyz »

Ich versteh's immer noch nicht. Vielleicht solltest du ein kleines Beispiel-Projekt posten, in dem die Unit zur Anwendung kommt.

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Ok, ich bereite morgen eines vor, in dem ich die verschiedenen Anwendungsmöglichkeiten zeige

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Neues zip-file mit Beispielprojekt ist hochgeladen. :D

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 718
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von fliegermichl »

Ich hab mal bissi damit rumgespielt. Funktioniert super.
Da kann man schon eine ganze Menge mit anstellen ohne jedesmal extra ein Formular für basteln zu müssen.

Einen Vorschlag hätte ich dennoch.
Biete den Dialog doch als Lazarus Package an. Dann muß man den Quellcode nicht in jedes Projekt kopieren in dem man den Dialog verwenden will.

Ansonsten Top!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4367
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von af0815 »

Wenn als Package, dann bitte erst, wenn es auch auf anderen Plattformen auch läuft. Laut der Beschreibung im ersten Post ist es aktuell Windows (32/64 ?) only.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von wp_xyz »

Ich versteh's immer noch nicht. Angenommen ich möchte aus dem Hauptformular heraus einen Dialog ähnlich wie den mit dem "umfangreichem Panel" aus deinem Demo-Projekt aufrufen, wie mache ich das? Soll denn da das "versteckte Panel" auf dem Hauptformular designt werden? Sorry, das halte ich für gar keine gute Idee, vor allem wenn vielleicht zu dem einen Dialog noch ein Dutzend andere dazukommen. Und das "versteckte Panel" aus dem sichtbaren Bereich des Formulars herauszuschieben ist eine sichere Methode, den Kollegen, der nach dir das Programm warten soll, zu verwirren, ganz abgesehen davon, dass die Controls auf dem versteckten Panel weiterhin im Objekt-Inspektor vorkommen..

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

wp_xyz hat geschrieben:
Fr 4. Dez 2020, 12:46
Angenommen ich möchte aus dem Hauptformular heraus einen Dialog ähnlich wie den mit dem "umfangreichem Panel" aus deinem Demo-Projekt aufrufen, wie mache ich das?
Im hochgeladenen Demoprojekts siehst du, wie das geht. Das Panel wird im Form des Hauptfensters unsichtbar angelegt und mit der Prozedur DlgAddControl in den Abfragedialog eingehängt. Dadurch sind sämtliche Ein- und Ausgabekomponenten des Panels mit allen Eingabedaten ohne Zusatzschritte in allen Methoden des Hauptformulars verfügbar, dort werden die Eingabewerte ja auch gebraucht.
vor allem wenn vielleicht zu dem einen Dialog noch ein Dutzend andere dazukommen.
Naja, das Maximum, was ich in meinen Projekten (damals noch mit Delphi) in einer Unit gebraucht habe, waren vier Dialoge mit eigenem Panel, im Schnitt sind es weniger als zwei. Aber das bedeutet, dass in einem großen Projekt sich die Anzahl der Units, die du brauchst, gut und gerne halbiert. Bzw. ist es nach meiner Erfahrung eher umgekehrt, wenn die Möglichkeit nicht besteht, begnügt man sich mit dem, was da ist, ruft zwei mal hinterinander inputbox auf, statt die zwei Eingabefelder gemeinsam in einem Dialog abzufragen und erstellt halt auch sonst nicht ganz so optimale Dialoge, um sich die Inflation an separaten Units zu ersparen. Eine gewisse Bequemlichkeit liegt im Wesen der meisten Programmierer, die ich kennengelernt habe, nicht nur in meinem.
Und das "versteckte Panel" aus dem sichtbaren Bereich des Formulars herauszuschieben ist eine sichere Methode, den Kollegen, der nach dir das Programm warten soll, zu verwirren, ganz abgesehen davon, dass die Controls auf dem versteckten Panel weiterhin im Objekt-Inspektor vorkommen.
Natürlich ist es auch eine Programmiermethode, die der Kollege kennen sollte, oder zumindest kennenlernen sollte, wenn er das Programm in Zukunft wartet. Und es spricht ja nichts dagegen, das Formular zur Designtime größer zu machen und es im Onshow auf die richtige Größe zu setzen - wobei meine normalen Formulare sich ohnehin so gut wie immer ihre Position in einem INi-File oder einer Datenbank merken, sodass man nur beim allerersten Programmstart die Fenstergröße anpassen muss. Wenn er das gar nicht kennt, ist er natürlich verwirrt. Aber sobald man weiß, wie es funktioniert, ist da nichts verwirrendes mehr dran. Abstrakte Methoden, Generics, und hunderterlei andere Konstrukte können einen Programmierer auch verwirren, wenn er sie nicht kennt.
Und natürlich sollen diese Controls auch im OI angezeigt werden. Darin besteht ja der Vorteil von dem Konzept, dass diese Dialoge genauso bequem im OI konfiguriert werden können, wie wenn man den Abfragedialog in einer separaten Unit angelegt hätte. Nur eben viel bequemer, weil du in der Unit, in der du sie brauchst, direkt den Zugriff auf die Ein-Ausgabefelder des Dialogs hast, und eben nicht für jeden etwas komplexeren Abfragedialog eine eigene Unit brauchst (die ihrerseits in Prüffunktinen oft Zugriff auf Daten des Hauptformulars braucht).

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Irgendwie hab ich anscheinend die Antwort nicht abgeschickt, also nochmal :)
fliegermichl hat geschrieben:
Fr 4. Dez 2020, 04:54
Biete den Dialog doch als Lazarus Package an. Dann muß man den Quellcode nicht in jedes Projekt kopieren in dem man den Dialog verwenden will.
Ja, das Package kommt als nächstes dran. Ich habe den Code in Verbindung mit einem Projekt entwickelt, da war es einfacher so. Aber es ist überhaupt kein Problem, es ist ja ein reines Laufzeitpackage.
af0815 hat geschrieben:
Fr 4. Dez 2020, 08:49
Wenn als Package, dann bitte erst, wenn es auch auf anderen Plattformen auch läuft. Laut der Beschreibung im ersten Post ist es aktuell Windows (32/64 ?) only.
Ich habe kein Linux auf meinem Rechner installiert und kenne mich mit Linux nur sehr oberflächlich aus. Einen Apple habe ich schon gar nicht. Im wollte für diese Dialoge eine Form ohne Titelleiste, das scheint nicht plattformunabhängig möglich zu sein. Aber mehr als das ist nicht plattformspezifisch, für jemand, der sich auf Linux halbwegs auskennt, sollte es kein Problem sein, die Unit auch unter Linux lauffähig zu machen, und die entspechenden Defines integriere ich dann gerne in den Quelltext.

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fdDialog, eine einfache aber flexible Dialog-Unit

Beitrag von braunbär »

Es gibt jetzt die Dialogunit in der Version 1.1, herunterzuladen im Eingangbeitrag dieses Threads.

Das Programm sollte jetzt mit Einschränkungen plattformübergreifend lauffähig sein.
Die Dialoge wurden optisch verbessert und in einer reihe von Details überarbeitet. Vor allem funktioniert jetzt in allen Fällen auch das Festlegen eines Default und eines Cancel Buttons - danke speziell an wp_xyz für seine Unterstützung.

Antworten