DynamicDialogs - komplexe dynamische GUIs einfach erstellen.

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von PureLust »

Sodele ... neue Version mit Font-Unterstützung ist online.

Änderungen:

- Konstante #Blue durch $FF0000 ersetzt um Kompatibilität zu Linux und OSX zu gewährleisten.

Neue Funktionen:

- Font(Name$, Höhe [, Stil]) - setzt den von nun an für neue Gadgets genutzten Font
- FontByID(FontID) - nutzt einen zuvor bereits separat geladenen Font für alle weiteren Gadgets (FontID kann eine Font# oder eine FontID() sein)

- EndFont() oder FontByID() - setzt den verwendeten Font für weitere Gadgets auf Standard zurück

Tipp für die Anwendung: Schaut Euch einfach das Beispiel am Ende des 'plain'-AddOn ('DynamicDialogs_plain.pbi') an.

Alle neuen Funktionen natürlich auch in der 'suffixed' Variante verfügbar (also Font__(), FontByID__(), EndFont__())
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von Bisonte »

Die Dialoglibrary ist für mich zwar immer noch ein Dorf aus dem Gebiet hinter den sieben Bergen, bei den sieb....

:allright:

Eine Bitte hätte ich da noch : Den Downloadlink im ersten Post irgendwie separieren, sodass man diesen schneller finden kann. Danke ;)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von PureLust »

Bisonte hat geschrieben:Eine Bitte hätte ich da noch : Den Downloadlink im ersten Post irgendwie separieren, sodass man diesen schneller finden kann. Danke ;)
Hab den Link im ersten Post jetzt mal ein wenig deutlicher gemacht.
Hättest in meinem letzten Post aber auch einfach auf "... ist online." klicken können. :D
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von ts-soft »

PureLust hat geschrieben:- Konstante #Blue durch $FF0000 ersetzt um Kompatibilität zu Linux und OSX zu gewährleisten.
Kann ich nicht bestätigen :wink: , im HyperlinkGadget macro scheint es noch #Blue zu geben, eben gedownloadet.
Zeile 47 sagt er, aber ist leider durch Makro ganz woanders.

Gruss
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von PureLust »

ts-soft hat geschrieben:Kann ich nicht bestätigen :wink:
Ach ja .... in den AddOns war '#Blue' ja auch noch drin. :oops:
Korrigiert, mit TotalCommander gecheckt und online.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von PureLust »

Neue Version online. ImageIDs für ButtonImage- und Image-Gadgets werden nun direkt unterstützt (was ja über die Dialog-Library nicht geht).

Änderungen / Neuerungen:

- Ab sofort funktionieren die Parameter für 'ImageIDs' bei ButtonImage() und Image()
- Einige kleine Änderungen in den bisherigen Demos (nichts Gravierendes)
- Neue Demo mit Anwendungsbeispielen für Font() & ImagIDs ('Demo_3 - Font & ImageID.pb')

Hinweis:

- Als ImageID kann sowohl die ImageNr# als auch eine ImageID() übergeben werden.
- Bei ButtonImage() ist ein weiterer Parameter für das 2. Image (PressedImage) hinzu gekommen.
. Da sich somit die Anzahl der Parameter geändert hat, müsst Ihr ggfl. für ButtonImage() Euren Code anpassen.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von Andre »

Konnte leider die neuen Verbesserungen (die sehr interessant + nützlich klingen :allright:) noch nicht mit meinem Projekt testen.

Denn im Moment hänge ich leider bei der weiteren Integration des DynamicDialogs Moduls bei einem Fehler "Dialog window not found!" fest, welcher immer ab dem zweiten Öffnen des gleichen Dialog-Fenters auftritt. Ein zweites/drittes/etc. Öffnen kommt hier in relativ kurzen Zeitabständen (5 - 20 sek) vor, da es sich um ein sich selbständig öffnendes & schließendes Info-Fenster mit der Ergebnisauswertung zur letzten Antwort in einem lfd. Quiz handelt.

Und das komische ist, dass der Fehler immer dann auftritt, wenn ich den standardmäßigen Befehlsablauf gemäß DynamicDialogs Beispielen verwende (der bei mir ja auch mit anderen Dialog-Fenstern funktioniert):

Code: Alles auswählen

  ; 1) DynamicDialogs command for creating/opening the Dialog window, based on the previously created XML definition:
  If Not OpenDialogWindow(#QuizShowResultDialog, XML$, #QuizResultWin, "", #PB_Ignore, #PB_Ignore, 100, 200, WindowID(#QuizWin), #DialogError_MsgBox)
    Debug "Error opening the Dialog 'QuizResultWindow'"
    Debug "Error: " + DialogError(#QuizShowResultDialog)
    ;FreeDialog(#QuizShowResultDialog)
    UnuseModule DynamicDialogs			; we don't need the Module-Functions anymore
    ProcedureReturn 
  EndIf
Der gleiche XML-Definitions-Code führt zu keinen Fehlern, wenn ich ihn stattdessen mit folgendem (bis zur Integration von DynamicDialogs verwendeten) Code aufrufe:

Code: Alles auswählen

  ; 2) PB-native creating/opening of the Dialog window, based on the previously - by DynamicDialogs - created XML definition:
  xml = CatchXML(#PB_Any, @XML$, StringByteLength(XML$))
  If Not xml
    Debug "Catching and parsing the XML string failed!"
    Debug "Error: " + DialogError(#QuizShowResultDialog)
    CallDebugger
    FreeDialog(#QuizShowResultDialog)
    ProcedureReturn 
  EndIf   
  Debug "Catched XML string:"
  Debug "--------------------------------------------------------------"
  Debug XML$

  If Not CreateDialog(#QuizShowResultDialog)
    Debug "Dialog creation failed!"
    Debug "Error: " + DialogError(#QuizShowResultDialog)
    CallDebugger
    ProcedureReturn 
  Else
    Debug "Dialog successfully created!"
  EndIf
  
  If Not OpenXMLDialog(#QuizShowResultDialog, xml, "", 0, 0, 300, 200, WindowID(#QuizWin))
    Debug "Open Dialog failed!"
    Debug "Error: " + DialogError(#QuizShowResultDialog)
    CallDebugger
    FreeDialog(#QuizShowResultDialog)
    FreeXML(xml)
    ProcedureReturn 
  Else
    Debug "Dialog successfully opened!"
  EndIf   
Ich bin da gerade etwas ratlos und finde den Fehler nicht. Der zuvor erfolgreich geöffnete Dialog wird jeweils mit

Code: Alles auswählen

FreeDialog(#QuizShowResultDialog)
geschlossen. Daran sollte es also auch nicht liegen...

Kann es manchmal sein, dass OpenDialogWindow(...) irgendetwas macht/speichert, dass sich nicht mit wiederholten Aufrufen verträgt?

Hier der Vollständigkeit halber noch die Dialog-Definition im "DynamicDialogs [plain]" Stil:

Code: Alles auswählen

	UseModule DynamicDialogs			  		; we need the 'main'-Modul for standard functions
	UseModule DynamicDialogs_plain			; we need the 'plain'-Modul for XML-Elements

  SetXMLOutputFormat(#XMLout_Indent, 5)
  SetXMLOutputFormat(#XMLout_AlignLineBreak, #True)
  
  ClearXML()
  
  Window(#QuizResultWin, "", "", #PB_Window_BorderLess|#PB_Window_WindowCentered)   ; there is no window title
    Frame(#QuizResultFrame, "", Language("QuizResultQuestion"))
      vBox(#Expand_No, #alignCenter, 5)
        Text(#QuizResultTitle, "", title$, 0, #PB_Default, #PB_Default, #alignCenter, "", 0, 0, DialogGadgetTextSize(title$, #Font_Big, 0))
        If AnswerStatus = #False   ; If the user gave a false answer, we will additionally display this false answer here:
          Text(#QuizResultFalseAnswer, "", "(" + QuizStatistics()\QuizAnswer$ + ")", 0, #PB_Default, #PB_Default, #alignCenter)
        EndIf
        Empty(#PB_Default, 10)
        Text(#QuizResultAnswer, "", Language("QuizResultCorrectAnswer"))
        If image   ; 1) if there is an image to display:
          hBox(#Expand_No, #alignCenter, 10)
            Empty()   ; ...and some more space
            ; directly including the ImageID doesn't work, so we need to set the image after dialog creation using SetGadgetState()...
            Image(#QuizResultCorrectImage, "", 0, 0, imagewidth, imageheight, #alignCenter, "", 0, 0, "disabled='yes'")   ; flags='#PB_Image_Border'/>"
            If QuizStatistics()\QuizAddInfoAnswer$ <> ""                                                                 ; there was saved a list of all possible answers with their item values (e.g. up-to 5 countries with their area in qkm), 'CRLF$' was used for multiline...
              vBox(#Expand_No, #alignCenter, 5)
            EndIf
            Text(#QuizResultCorrectText, "", QuizAnswers()\Answer, 0, #PB_Default, #PB_Default, #alignCenter, "", 0, 0, DialogGadgetTextSize(QuizAnswers()\Answer, #Font_Big, 10))
            If QuizStatistics()\QuizAddInfoAnswer$ <> ""  ; there was saved a list of all possible answers with their item values (e.g. up-to 5 countries with their area in qkm), 'CRLF$' was used for multiline...
              timer * 3                                   ; triple the time, how long this information window will be displayed....
              Editor(#QuizResultAddInfoAnswer, "", ReplaceString(QuizStatistics()\QuizAddInfoAnswer$, "\n", CRLF$), #PB_Editor_ReadOnly|#PB_Editor_WordWrap)
              ;  XML$ + "          " + DialogCreateEditorGadget(QuizStatistics()\QuizAddInfoAnswer$, #QuizResultAddInfoAnswer) + LF$ +
              EndVBox()
            EndIf
          EndHBox()
        Else       ; 2) if there is no image to display:
          Text(#QuizResultCorrectText, "", QuizAnswers()\Answer, 0, #PB_Default, #PB_Default, #alignCenter, "", 0, 0, DialogGadgetTextSize(QuizAnswers()\Answer, #Font_Big, 10))
        EndIf
        
        ; Now we display the ProgressBar showing the user, how long it will take until the
        ; Quiz continues...
        Empty(#PB_Default, 10)    ; ...and some more space
        Text(#QuizResultTimerText, "", Language("QuizResultGoingOn"))
        ProgressBar(#QuizResultTimerProgress, "", 0, timer, 0, #PB_Default, fontheight)
      EndVBox()
    EndFrame()
  EndWindow()
        
	UnuseModule DynamicDialogs_plain			; we don't need the XML-Elements anymore
	; from now on we really need the functions from the 'main'-Modul 'DynamicDialogs'
	
	XML$ = GetXML()
  Debug XML$
  
  ; 1) DynamicDialogs command for creating/opening the Dialog window, based on the previously created XML definition:
  If Not OpenDialogWindow(#QuizShowResultDialog, XML$, #QuizResultWin, "", #PB_Ignore, #PB_Ignore, 100, 200, WindowID(#QuizWin), #DialogError_MsgBox)
    Debug "Error opening the Dialog 'QuizResultWindow'"
    Debug "Error: " + DialogError(#QuizShowResultDialog)
    ;FreeDialog(#QuizShowResultDialog)
    UnuseModule DynamicDialogs			; we don't need the Module-Functions anymore
    ProcedureReturn 
  EndIf
  
  UnuseModule DynamicDialogs			; we don't need the Module-Functions anymore
Leider nicht direkt lauffähig, da vollständig aus meinem PRojekt übernommen.... sorry!

Vorgenannter Code "produziert" folgenden XML-Code, der beim ersten Anlauf erfolgreich ein Dialog-Fenster öffnet (was dann wie o.g. geschlossen wird), jedoch im zweiten Anlauf beim nächsten zu öffnenden Dialog die o.g. Fehlermeldung bringt:
<window id='6' name='Win_4831624499168' flags='#PB_Window_BorderLess | #PB_Window_WindowCentered'>
<frame id='146' text='Ergebnis der letzten Frage:'>
<vbox expand='no' align='center' spacing='5'>
<singlebox expand='horizontal' align='center' margin='0' colspan='0' rowspan='0'>
<singlebox expand='vertical' align='center' margin='0'>
<text id='147' text='Ihre Antwort war richtig!' width='282' height='31' />
</singlebox>
</singlebox>
<empty height='10'/>
<text id='149' text='Die korrekte Antwort lautete:' margin='0'/>
<hbox expand='no' align='center' spacing='10'>
<empty/>
<singlebox expand='horizontal' align='center' margin='0' colspan='0' rowspan='0'>
<singlebox expand='vertical' align='center' margin='0'>
<image id='151' width='81' height='54' disabled='yes'/>
</singlebox>
</singlebox>
<vbox expand='no' align='center' spacing='5'>
<singlebox expand='horizontal' align='center' margin='0' colspan='0' rowspan='0'>
<singlebox expand='vertical' align='center' margin='0'>
<text id='150' text='Libanon' width='112' height='41' />
</singlebox>
</singlebox>
<editor id='152' text='1. Libanon (594,68 Einwohner je qkm)&#10;2. Kambodscha (86,77 Einwohner je qkm)&#10;3. Norwegen (16,08 Einwohner je qkm)&#10;4. Gabun (6,37 Einwohner je qkm)&#10;' flags='#PB_Editor_ReadOnly | #PB_Editor_WordWrap' margin='0'/>
</vbox>
</hbox>
<empty height='10'/>
<text id='153' text='Gleich geht es weiter...' margin='0'/>
<progressbar id='154' min='0' max='9000' height='20' margin='0'/>
</vbox>
</frame>
</window>

QuizResultWindow dialog freed!

<window id='6' name='Win_721614509551' flags='#PB_Window_BorderLess | #PB_Window_WindowCentered'>
<frame id='146' text='Ergebnis der letzten Frage:'>
<vbox expand='no' align='center' spacing='5'>
<singlebox expand='horizontal' align='center' margin='0' colspan='0' rowspan='0'>
<singlebox expand='vertical' align='center' margin='0'>
<text id='147' text='Ihre Antwort war falsch!' width='274' height='31' />
</singlebox>
</singlebox>
<singlebox expand='horizontal' align='center' margin='0'>
<singlebox expand='vertical' align='center' margin='0'>
<text id='148' text='(Moldawien)'/>
</singlebox>
</singlebox>
<empty height='10'/>
<text id='149' text='Die korrekte Antwort lautete:' margin='0'/>
<hbox expand='no' align='center' spacing='10'>
<empty/>
<singlebox expand='horizontal' align='center' margin='0' colspan='0' rowspan='0'>
<singlebox expand='vertical' align='center' margin='0'>
<image id='151' width='86' height='54' disabled='yes'/>
</singlebox>
</singlebox>
<singlebox expand='horizontal' align='center' margin='0' colspan='0' rowspan='0'>
<singlebox expand='vertical' align='center' margin='0'>
<text id='150' text='Costa Rica' width='135' height='41' />
</singlebox>
</singlebox>
</hbox>
<empty height='10'/>
<text id='153' text='Gleich geht es weiter...' margin='0'/>
<progressbar id='154' min='0' max='3000' height='20' margin='0'/>
</vbox>
</frame>
</window>

Error opening the Dialog 'QuizResultWindow'
Error: Dialog window not found
Wäre für jeglich Ideen & Hilfestellungen dankbar!
Unabhängig davon bieten die o.g. Beispiele evtl. auch "Anschauungsunterricht" für etwas komplexere Dialog-Definitionen mittels DynamicDialogs und integrierten Bedingungen (weil nicht jedes Gadget immer gebraucht wird).
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von PureLust »

Andre hat geschrieben:Kann es manchmal sein, dass OpenDialogWindow(...) irgendetwas macht/speichert, dass sich nicht mit wiederholten Aufrufen verträgt?
Jo, ... ich speichere intern eine Liste der geöffneten Dialoge und Fenster.
Beim erneuten öffnen des selben Fensters kann sich da natürlich was beißen, wenn der Eintrag zuvor nicht entfernt wurde.
Durch den FreeDialog() Befehl von PureBasic wird diese Liste natürlich nicht bereinigt.

Ich guck mal, dass ich Dir da kurzfristig 'ne Möglichkeit schaffen kann die Liste zu leeren.

So als schneller Tipp für jetzt: Gib dem Fenster mal einen Namen, dann sollte es klappen.
(Da muss ich aber definitiv nochmal ran.)
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von Andre »

PureLust hat geschrieben:
Andre hat geschrieben:Kann es manchmal sein, dass OpenDialogWindow(...) irgendetwas macht/speichert, dass sich nicht mit wiederholten Aufrufen verträgt?
Jo, ... ich speichere intern eine Liste der geöffneten Dialoge und Fenster.
Beim erneuten öffnen des selben Fensters kann sich da natürlich was beißen, wenn der Eintrag zuvor nicht entfernt wurde.
Durch den FreeDialog() Befehl von PureBasic wird diese Liste natürlich nicht bereinigt.

Ich guck mal, dass ich Dir da kurzfristig 'ne Möglichkeit schaffen kann die Liste zu leeren.

So als schneller Tipp für jetzt: Gib dem Fenster mal einen Namen, dann sollte es klappen.
(Da muss ich aber definitiv nochmal ran.)
Danke dir für den Tipp und die geplante Verbesserung! :allright:

Habe diese Woche Stress auf Arbeit und komme daher leider nicht vor Freitag Abend zum weiteren Testen....
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Beitrag von Andre »

@PureLust: der Tipp mit dem Vergeben eines 'Name' Parameters in der Fenster-Definition hat geholfen, danke :mrgreen:

Unabhängig davon wäre es (wenn du es nicht anderweitig hin bekommst) vielleicht eine Idee, als Äquivalent zu OpenDialogWindow() eine Art CloseDialogWindow() einzubauen. Diese könnte dann den PB-Befehl FreeDialog() ausführen und zusätzlich die notwendigen internen Bereinigungen (gespeicherte Dialog-Daten) im DynamicDialogs-Modul ausführen.

Ok, im nächsten Schritt geht's dann zum nächsten Testen der neuen Font-Funktionen usw... 8)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten