Seite 1 von 1
Dialog - Aktualisieren von Teilen des UI
Verfasst: 04.07.2016 12:14
von alen
Hallo Community,
ich beschäftige mich noch nicht so sehr lang mit dem genialen neuen Dialog Feature.
An der ein oder anderen Stelle hakt es noch.
Und hier habe ich mal eine Frage in die Runde.
Ich habe mir hier eine UI per XML Definition erstellt und möchte Teile davon, sprich einzelne Gadgets zur Laufzeit aktualisieren.
Inhalte abhängig von Datenbankanfragen einbauen, Resizing etc.
Alles was man so für eine dynamische Anwendung braucht.
Wie ist hier die beste Strategie bzw. Vorgehensweise ? Hat hier jemand schon mal Erfahrungen gemacht ?
Hier gibt es ja den Befehl: RefreshDialog(#Dialog)
In der Anleitung ist die Beschreibung sehr dünn und ohne echte Beispiele.
Kann mir jemand hier mal einen Denkanstoss geben, wie man den Befehl sinnvoll einsetzt.
Oder gibt es einen anderen Weg.
Grüße
Alen
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 05.07.2016 17:20
von Sicro
Schau dir mal die Beispiele unten in der Hilfe bei dem Befehl "OpenXMLDialog" an. Danach wird es dir denk ich klar sein, wie auf die Gadgets zugegriffen wird.
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 06.07.2016 12:51
von alen
Hallo Sicro,
vielleicht habe ich das etwas missverständlich aufgeschrieben.
Es soll nicht nur auf einzelne Gadgets zugegriffem werden, sondern Teile der UI Definition erneuert werden.
Ich ersetze den Teil des ursprünglichen XML Codes über den Platzhalter "<SettingsPlaceHolder/>". Es wird neuer XML Code generiert, durch die Procedure CreatePrefsXML() erzeugt wird.
Also wird der der komplette XML Part
Code: Alles auswählen
...
xml + "<hbox expand='item:2'>" + #CRLF$
xml + " <string name='" + key + "' width='180' text='" + key + "' flags='" + flags + "'/>" + #CRLF$
xml + " <string name='" + value + "' text='" + value + "'/>" + #CRLF$
xml + "</hbox>" + #CRLF$
...
neu erzeugt, im Ursprungs XML Code ersetzt. Anschliessend wird die UI neu erstellt.
Nur das ist eine sehr unschöne Vorgehensweise und nur ein Workaround weil keine bessere Losung in Sicht ist.
Genau hier setzt meine Frage an.
Bekommt man das irgendwie eleganter hin ?
Grüße
Alen
Hier mein Beispielcode:
Code: Alles auswählen
EnableExplicit
Runtime Enumeration Gadget
#XML
#Dialog
#MainWindow
#button_run
#button_quit
EndEnumeration
CompilerIf #PB_Compiler_Unicode
#XmlEncoding = #PB_UTF8
CompilerElse
#XmlEncoding = #PB_Ascii
CompilerEndIf
Global.s XML
Define.l event
Procedure.s CreatePrefsXML()
Protected.l count
Protected.s key, value, xml = ""
Protected.s flags = "#PB_String_BorderLess|#PB_String_UpperCase|#PB_String_ReadOnly"
NewMap conf.s()
For count = 1 To Random(10,3)
conf(Str(Random(10,3))) = Str(Random(1400,3))
Next
ForEach conf()
key = MapKey(conf())
value = conf()
xml + "<hbox expand='item:2'>" + #CRLF$
xml + " <string name='" + key + "' width='180' text='" + key + "' flags='" + flags + "'/>" + #CRLF$
xml + " <string name='" + value + "' text='" + value + "'/>" + #CRLF$
xml + "</hbox>" + #CRLF$
Next
FreeMap(conf())
ProcedureReturn xml
EndProcedure
Procedure CreateDialogFormXML(XML.s)
If CatchXML(#Xml, @XML, StringByteLength(XML), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
ProcedureReturn #True
Else
MessageRequester("XML ERROR", DialogError(#Dialog))
ProcedureReturn #False
EndIf
Else
MessageRequester("XML ERROR","XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")")
ProcedureReturn #False
EndIf
EndProcedure
Procedure RecreateUIfromXML()
FreeDialog(#Dialog)
CreateDialogFormXML(ReplaceString(XML, "<SettingsPlaceHolder/>", CreatePrefsXML(), #PB_String_NoCase))
RefreshDialog(#Dialog)
EndProcedure
Runtime Procedure Quit()
End
EndProcedure
Runtime Procedure RunMe()
RecreateUIfromXML()
EndProcedure
XML = "<window id='#PB_Any' name='test' text='test' minwidth='400' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
" <vbox expand='item:3'>" +
" <hbox>" +
" <button id='#button_run' text='Run Command' onevent='RunMe()'/>" +
" <button id='#button_quit' text='Quit' onevent='Quit()'/>" +
" </hbox>" +
" <SettingsPlaceHolder/>" +
" <editor text='content' height='150'/>" +
" </vbox>" +
"</window>"
If CreateDialogFormXML(XML)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
EndIf
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 06.07.2016 13:00
von ts-soft
Was macht es für einen Sinn, nur Teile der UI in einem dynamischen Dialog zu refreshen? Die Bestandteile sind doch alle voneinander
Abhängig in Größe und Breite, sowie in der Reihenfolge, wie dies geschieht.
RefreshDialog() ist für mich die einzige sinnvolle Option oder ich habe die Fragestellung nicht verstanden.
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 06.07.2016 13:30
von alen
Hallo ts-soft,
das ganze wird benötigt um Preferences - (Keys / Values) aus einer DB auszulesen und in ein Gadget einzusetzen.
Je nach Anzahl der Einträge müsste die UI dann angepasst werden. Größenverhältnisse etc.
Dabei dachte ich an RefreshDialog(#Dialog).
Allerdings habe ich aus der Hilfe von PB kein geeignetes Gadget rausfinden können.
Daher die etwas unbeholfene Krücke um erstmal irgendeinen Ansatz zu haben.
Welche Art von Gadget würde sich da anbieten wenn die Werte des Gadgets editierbar sein sollen ?
Ich wollte eigentlich nur Ideen und Inspirationen sammeln.
Hoffe das ganze wird klarer.
Grüße
Alen
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 10.07.2016 00:08
von Andre
Hallo alen,
ohne jetzt etwas testen zu können, nur mal auf die Schnelle paar Anregungen:
- Mit Hilfe der Dialog-Library kannst du derzeit automatisches Anpassen aller Größen/Positionen durch RefreshDialog() erreichen, z.B. weil du Inhalte von Gadgets veränderst etc.
- Was du derzeit (noch) nicht kannst, ist ganze Gadgets on-the-fly hinzufügen/löschen und dann den Dialog neu berechnen lassen. Das ist ein "Feature-Request", den Fred auch von mir kennt.
- Behelfsweise bleibt dann nur das Neuerstellen der Dialog-Definition und ff. des GUI.
- Eine andere Möglichkeit ist es (verwende ich hier und da in meinem Projekt), einen kleineren Teil des GUI nicht über die Dialog-Lib zu realisieren, sondern hierfür z.B. in der Dialog-Definition einen "Container" einzubauen, innerhalb dessen du z.B. einzelne Gadgets nach der Dialog-Erstellung "händisch" verändern kannst. Das funktioniert auch ganz gut...
- Für das Ausgeben von Daten in Tabellenform eignet sich m.E. das ListIconGadget perfekt. Das ist nur leider (standardmäßig) nicht editierbar. Zumindest für Windows solltest du jedoch entsprechende Beispiele in den Foren (deutsch/englisch) finden, die die auch das ermöglichen. Und das sollte auch problemlos innerhalb eines Dialogs funktionieren.
Mit Beispielen kann ich im Moment leider nicht dienen.
PS: Noch ein Tipp, unbedingt die genialen "DynamicDialogs"-Module von PureLust anschauen, erleichtert das Arbeiten mit Dialogen enorm!

Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 10.07.2016 12:53
von mk-soft
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 11.07.2016 10:51
von alen
Hallo Andre,
danke für die Anregungen, das hat schon mal ein wenig geholfen.
Ich bin mit dem Problem aktuell unter Linux unterwegs.
Da muss ich vorher prüfen ob bestimmte Dinge sich so 1:1 aus Forenbespielen umsetzen lassen.
Grüße
Alen
Andre hat geschrieben:
- Was du derzeit (noch) nicht kannst, ist ganze Gadgets on-the-fly hinzufügen/löschen und dann den Dialog neu berechnen lassen. Das ist ein "Feature-Request", den Fred auch von mir kennt.
Das wäre ein nettes Feature. Aktuell schreibe ich das GUI Fenster neu aber das ganze hat einen Nachteil, das neu erstellte Fenster befindet sich nicht mehr an der Ursprungsposiotion und muss korregiert werden. Auch der erneute Aufbau / Verzögerung ist nicht schön. Aber es ist ein Workaround.
Andre hat geschrieben:
- Eine andere Möglichkeit ist es (verwende ich hier und da in meinem Projekt), einen kleineren Teil des GUI nicht über die Dialog-Lib zu realisieren, sondern hierfür z.B. in der Dialog-Definition einen "Container" einzubauen, innerhalb dessen du z.B. einzelne Gadgets nach der Dialog-Erstellung "händisch" verändern kannst. Das funktioniert auch ganz gut...
Das werde ich auch mal probieren, klingt schonmal ganz praktikabel.
Andre hat geschrieben:
PS: Noch ein Tipp, unbedingt die genialen "DynamicDialogs"-Module von PureLust anschauen, erleichtert das Arbeiten mit Dialogen enorm!

Hier habe ich nicht getestet ob das ganze auch unter Linux funktioniert. Werde ich aber noch nachholen.
Re: Dialog - Aktualisieren von Teilen des UI
Verfasst: 11.07.2016 10:55
von alen
Hallo mk-soft,
Danke für den Tipp. Sieht beides unter Linux funktional ganz gut. Nur die Optik ist gewöhnungsbedürftig.
Ich werde mal damit experementieren.
Grüße
Alen