Seite 1 von 2

Dialog während der Laufzeit erweitern

Verfasst: 23.11.2022 17:25
von Qnode
Hey,

ich arbeite mich gerade an Dialogen ab. Mir geht es darum, sie zur Laufzeit dynamisch zu erweitern. Als Übungsdialog verwende ich das hier:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>

<dialogs>
  <window flags="#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget" width="300" height="300" name="window_1" xpos="0" ypos="0">
    <scrollarea scrolling="vertical" innerheight="5000" name="scrollarea_1">
      <vbox align="" expand="no" name="Datenbereich" id="99">
        <button text="Button 1" name="button_1"/>
        <text text="Ich bin der Text" name="text_1"/>
        <hbox text="Ich bin die HBox">
          <button text="Button 2" name="button_2"/>
          <string text="Hier was eingeben" width="200" name="string_1"/>
        </hbox>
        <button text="Button 1" name="button_1Copy_7"/>
        <button text="Button 1" name="button_1Copy_8"/>
        <button text="Button 1" name="button_1Copy_9"/>
        <button text="Button 1" name="button_1Copy_10"/>
        <button text="Button 1" name="button_1Copy_11"/>
        <button text="Button 1" name="button_1Copy_12"/>
        <button text="Button 1" name="button_1Copy_13"/>
        <button text="Button 1" name="button_1Copy_14"/>
        <button text="Button 1" name="button_1Copy_15"/>
      </vbox> 
    </scrollarea> 
  </window>
</dialogs><!--DDesign0R Definition: PureBasic|0|0|0||-|0-->
Nun will ich den Dialog zur Laufzeit dynamisch erweitern. Klappt mit normalen Gadgets über OpenGadgetList problemlos. Aber was mache ich mit dialogspezifischen Tags wie hbox und vbox, damit das ganze schön resizable ist?

Ich habe es über XML-Manipulation versucht:

Code: Alles auswählen

#Dialog = 0
#Window     = 0
#TreeGadget = 0

#Xml = 0
#Bereich = "99"


If LoadXML(#Xml, "E:\PureBasic\Testdialog.xml") And XMLStatus(#Xml) = #PB_XML_Success
  CreateDialog(#Dialog) 
  If OpenXMLDialog(#Dialog, #Xml, "window_1", 300, 300)  
    
      
    ;XML-test
    Neuevbox = CreateXMLNode(XMLNodeFromID(#Xml, #Bereich), "vbox", -1)
    SetXMLAttribute(Neuevbox, "name", "Daten1")
    SetXMLAttribute(Neuevbox, "id", "101")
    ersteZeile = CreateXMLNode(XMLNodeFromID(#Xml, "101"), "hbox", -1)
    SetXMLAttribute(ersteZeile, "id", "102")
    Daten = CreateXMLNode(XMLNodeFromID(#Xml, "102"), "Button", -1)
    SetXMLAttribute(Daten, "text", "Daten 1")    
    RefreshDialog(#Dialog)
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
    
  Else
    Debug "Dialog creation error: " + DialogError(#Dialog)
  EndIf
  
Else
  Debug "XML error on line " + XMLErrorLine(#Xml) + ": " + XMLError(#Xml)
EndIf


Im Library-Viewer sieht man auch, dass die neuen Knoten korrekt eingefügt wurden. Aber sie werden nicht angezeigt. RefreshDialog bringt nichts (hatte ich auch nicht wirklich erwartet). Könnt ihr mir einen Tipp geben?

Besten Dank und habt einen schönen Resttag
Qnode

Re: Dialog während der Laufzeit erweitern

Verfasst: 23.11.2022 20:39
von Andesdaf
Du kannst nur den Dialog schließen und neu aufbauen. Ein Erweitern während der Laufzeit ist nicht möglich.

Re: Dialog während der Laufzeit erweitern

Verfasst: 23.11.2022 22:13
von HeX0R
Jepp, das ist der Grund, weswegen mein DialogDesign0r auch diesen Umweg gehen musste.
Es gibt irgendwo in den Untiefen des englischen Forums einen Feature-Request deswegen.

Re: Dialog während der Laufzeit erweitern

Verfasst: 23.11.2022 22:56
von Andre
Hier ist der Thread mit den "Feature Requests" im engl. PB-Forum: https://www.purebasic.fr/english/viewtopic.php?t=64890

Re: Dialog während der Laufzeit erweitern

Verfasst: 24.11.2022 06:38
von jacdelad
...oder die Fenster und Gadgets "normal" während der Laufzeit erstellen lassen.

Re: Dialog während der Laufzeit erweitern

Verfasst: 24.11.2022 08:58
von Qnode
Alles klar und vielen Dank für die Hinweise. Ich denke, dass das handhabbar ist und muss mir nur noch ausprobieren, wie ich das am besten vorhalte. Man könnte ein Template für den Dialog als Datei hinterlegen und dann die dynamischen Sachen über die XML-Library einbauen. Da habe ich mich jetzt auch schon ganz gut eingelesen. Erscheint mir auf jeden Fall besser, als ein wildes Rumgebastel über Stringverkettungen via CatchXML.

Re: Dialog während der Laufzeit erweitern

Verfasst: 24.11.2022 09:24
von jacdelad
Ähm, mit normal meinte ich ohne XML, also über die Window-/Gadget-Bibliothek. Ich habe noch nie XML-Dialoge benutzt und mir erschließt sich auch nicht, welchen Vorteil die haben.

Re: Dialog während der Laufzeit erweitern

Verfasst: 24.11.2022 09:53
von HeX0R
Was genau hast Du überhaupt vor?
Wieso sollte ich einen Dialog nachträglich mit weiteren virtuellen Containern bestücken wollen?

Re: Dialog während der Laufzeit erweitern

Verfasst: 24.11.2022 12:28
von Qnode
Na klar kann ich meine Fenster auch über die normale Gadget-Bibliothek basteln und da hätte ich die Probleme gar nicht (in meinem Fall die Scrollarea über OpenGadgetList() bestücken). Ich finde Dialoge eine interessante Alternative und wollte einfach mal sehen, was geht. Ich habe auch schon mal mit XAML rumgebastelt und finde die Erstellung über eine Auszeichnungssprache ganz intuitiv. Zumal der DD von HeXOR wirklich eine prima Hilfe ist.

Und warum ich einen Dialog nachträglich mit weiteren virutellen Containern bestücken will? Die Idee ist folgende: Ich habe eine Scrollarea, die mit Daten aus einer LinkesList befüllen werden. Jeder Datensatz enthält drei Informationen, die ich darstellen will und das in zwei Zeilen (aus optischen Gründen). Also wollte ich (nun mal ganz als Dialogpurist) für jeden Datensatz eine vBox einfügen, die zwei Zeilen enthält. Erste Zeile wiederum enthält eine hBox in der zwei der Informationen nebeneinanderstehen, zweite Zeile wird dann von einem Textfeld ausgefüllt, dass die restliche Info enthält. Über die Boxen wollte ich gehen, um die automatische Skalierung ausnutzen zu können. Ich habe doch bei normalen Listengadgets immer nur die Möglichkeit, einen Text pro Zeile zu hinterlegen.

Ich kann auch via OpengadgetList in meinen Dialog normale Containergadgets einfügen und da dann meine Daten anordnen. Ich dachte halt bloß, wenn ich schon mit Dialogen arbeite, dann will ich auch Dialogelemente verwenden. Und da sind hBox und vBox natürlich ein total gängiges Mittel und ich dachte, ich muss nur rausfinden, wie ich sie on the fly implementieren muss.

Verstehe ich jetzt richtig, dass Dialoge eher etwas statisch sind, was ihre Gadgets angeht?

Re: Dialog während der Laufzeit erweitern

Verfasst: 24.11.2022 13:09
von HeX0R
Also ob Dialog oder Window, für das was Du da vorhast hätte ich eher ein Grid Control genommen, anstatt ständig die Fensterstruktur umzubauen, und dann noch in einer Scrollarea.
Leider hat PB kein natives GridGadget, aber es gibt so einige gute im englischen Forum.