fdDialog, eine einfache aber flexible Dialog-Unit
-
- Beiträge: 369
- 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
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
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
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
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) 256-mal heruntergeladen
Zuletzt geändert von braunbär am Sa 12. Dez 2020, 11:52, insgesamt 4-mal geändert.
Re: fdDialog, eine einfache aber flexible Dialog-Unit
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.
Ein sehr flexibler, relativ unbekannter Dialog ist weiterhin TTaskDialog mit optionalen zusätzlichen Buttons und Radiobuttons.
-
- Beiträge: 369
- 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
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:
gegenüber
mit meiner Dialog-Unit.
lblremove ist dabei ein unsichtbares TLabel am Hauptformular mit der Caption='remove selected item'.
Mit Standardbuttons wird es noch einfacher:
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.
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
Code: Alles auswählen
dlgSetButtons('Remove','Keep');
dlgAddComponent(lblremove);
if Ask('Confirm removal?')=dlgBtn1 then
msg(Item removed');
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
Re: fdDialog, eine einfache aber flexible Dialog-Unit
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.
-
- Beiträge: 369
- 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
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:Deine Unit ist sicher sehr interessant, wenn man viel im Code machen will/muss.
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
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.Allerdings verstehe ich nicht, warum das alles über die einzige globale Variable "dlg" laufen muss
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.
-
- Beiträge: 524
- Registriert: Di 19. Mai 2015, 20:05
- OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
- CPU-Target: x86_64-linux-gtk2
Re: fdDialog, eine einfache aber flexible Dialog-Unit
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
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
Re: fdDialog, eine einfache aber flexible Dialog-Unit
Ich versteh's immer noch nicht. Vielleicht solltest du ein kleines Beispiel-Projekt posten, in dem die Unit zur Anwendung kommt.
-
- Beiträge: 369
- 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
Ok, ich bereite morgen eines vor, in dem ich die verschiedenen Anwendungsmöglichkeiten zeige
-
- Beiträge: 369
- 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
Neues zip-file mit Beispielprojekt ist hochgeladen.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1436
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: fdDialog, eine einfache aber flexible Dialog-Unit
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!
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!
- af0815
- Lazarusforum e. V.
- Beiträge: 6216
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: fdDialog, eine einfache aber flexible Dialog-Unit
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).
Re: fdDialog, eine einfache aber flexible Dialog-Unit
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..
-
- Beiträge: 369
- 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
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.
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.vor allem wenn vielleicht zu dem einen Dialog noch ein Dutzend andere dazukommen.
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 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.
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).
-
- Beiträge: 369
- 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
Irgendwie hab ich anscheinend die Antwort nicht abgeschickt, also nochmal
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.fliegermichl hat geschrieben: ↑Fr 4. Dez 2020, 04:54Biete den Dialog doch als Lazarus Package an. Dann muß man den Quellcode nicht in jedes Projekt kopieren in dem man den Dialog verwenden will.
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.
-
- Beiträge: 369
- 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
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.
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.