Dialog während der Laufzeit erweitern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Qnode
Beiträge: 78
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Dialog während der Laufzeit erweitern

Beitrag 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
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Dialog während der Laufzeit erweitern

Beitrag von Andesdaf »

Du kannst nur den Dialog schließen und neu aufbauen. Ein Erweitern während der Laufzeit ist nicht möglich.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Dialog während der Laufzeit erweitern

Beitrag 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.
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: Dialog während der Laufzeit erweitern

Beitrag von Andre »

Hier ist der Thread mit den "Feature Requests" im engl. PB-Forum: https://www.purebasic.fr/english/viewtopic.php?t=64890
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Dialog während der Laufzeit erweitern

Beitrag von jacdelad »

...oder die Fenster und Gadgets "normal" während der Laufzeit erstellen lassen.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
Qnode
Beiträge: 78
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Dialog während der Laufzeit erweitern

Beitrag 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.
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Dialog während der Laufzeit erweitern

Beitrag 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.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Dialog während der Laufzeit erweitern

Beitrag von HeX0R »

Was genau hast Du überhaupt vor?
Wieso sollte ich einen Dialog nachträglich mit weiteren virtuellen Containern bestücken wollen?
Benutzeravatar
Qnode
Beiträge: 78
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: Dialog während der Laufzeit erweitern

Beitrag 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?
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Dialog während der Laufzeit erweitern

Beitrag 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.
Antworten