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! :allright:

Re: Dialog - Aktualisieren von Teilen des UI

Verfasst: 10.07.2016 12:53
von mk-soft
Vielleicht kannst du dieses verwenden. Ist nicht XML, finde ich aber sehr gut...

PropertyGadget:
http://www.purebasic.fr/english/viewtop ... ertygadget
http://www.purebasic.fr/english/viewtop ... ertygadget

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! :allright:
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,
mk-soft hat geschrieben:Vielleicht kannst du dieses verwenden. Ist nicht XML, finde ich aber sehr gut...

PropertyGadget:
http://www.purebasic.fr/english/viewtop ... ertygadget
http://www.purebasic.fr/english/viewtop ... ertygadget
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