Dialog - Aktualisieren von Teilen des UI

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Dialog - Aktualisieren von Teilen des UI

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Dialog - Aktualisieren von Teilen des UI

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Dialog - Aktualisieren von Teilen des UI

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
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: Dialog - Aktualisieren von Teilen des UI

Beitrag 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.
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
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Dialog - Aktualisieren von Teilen des UI

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
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: Dialog - Aktualisieren von Teilen des UI

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dialog - Aktualisieren von Teilen des UI

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Dialog - Aktualisieren von Teilen des UI

Beitrag 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.
Zuletzt geändert von alen am 11.07.2016 10:56, insgesamt 1-mal geändert.
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Benutzeravatar
alen
Beiträge: 107
Registriert: 09.04.2007 17:38
Computerausstattung: Main Hardware: AMD Ryzen 5 1600 - 6 Core / Gigabyte B450 Aorus Pro / Sapphire RX580 8GB
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64 on various Hardware Platforms
Wohnort: Duisburg
Kontaktdaten:

Re: Dialog - Aktualisieren von Teilen des UI

Beitrag 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
---
Main Hardware: AMD Ryzen 5 1600 - 6 Core / Asus B350M-A / Nvidia GTX650
PB 5.61 and earlier @ Manjaro Linux XFCE x64/ Fedora Linux Cinnamon x64 / Windows 10 x64
on various Hardware Platforms (Notebook and Desktop)
Antworten