Elementare XML-Frage

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Elementare XML-Frage

Beitrag von ProgOldie »

Hallo,
ich beschäftige mich das erste Mal mit XML. Hier möchte ich eine Tabelle ausgeben und bearbeiten, deren Spalten unterschiedlich Gadgettypen sein können. Dazu habe ich ein Hilfebeispiel etwas erweitert.

Code: Alles auswählen

;PB 5.60


 #XmlEncoding = #PB_UTF8 
  #Dialog = 0
  #Xml = 0
  
  
  
  Procedure make_Grid(rows.i,cols.i)
    Protected colnr.i,rownr.i
    XML$ = "<window id='#PB_Any' name='test' text='DataGrid' minwidth='500' minheight='200' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>"+
           "<gridbox columns='"+Str(cols)+"'"+">"

    For rownr=1 To rows
      For colnr=1 To cols
        Select colnr
        Case 3
          XML$=XML$+"<button text='"+Str(rownr)+"--"+Str(colnr)+"'"+"/>" 
        Case 5
          XML$=XML$+"<date text='"+Str(rownr)+"--"+Str(colnr)+"'"+"/>"
        Default
          XML$=XML$+"<string text='"+Str(rownr)+"--"+Str(colnr)+"'"+"/>"  
        EndSelect
       Next
    Next
    XML$=XML$+ "</gridbox>"
    XML$=XML$+"</window>"

    If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
      If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
      
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow 
      
    Else  
      Debug "Dialog error: " + DialogError(#Dialog)
    EndIf
  Else
    Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
  EndIf
  EndProcedure
  
 
  make_Grid(8,11); 8 Zeilen mit je 11 Spalten
Wie kann ich nun auf z.B. auf das Element in Zeile 3 und Spalte 7 zugreifen, um dessen Wert auszulesen bzw. zu ändern?
Wie baut man dies in die Eventschleife ein?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Andesdaf
Moderator
Beiträge: 2660
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Elementare XML-Frage

Beitrag von Andesdaf »

Du kannst jedem Gadget einen Namen vergeben (name='R01C01') und dann per
DialogGadget(#Dialog, "R01C01") dessen Gadget-ID ermitteln.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Elementare XML-Frage

Beitrag von Kiffi »

zusätzlich zu Andesdafs Tipp kannst Du alle Events aller Gadgets in eine zentrale Procedure laufen lassen:

Code: Alles auswählen

;PB 5.60

EnableExplicit

#XmlEncoding = #PB_UTF8 
#Dialog = 0
#Xml = 0

Runtime Procedure GadgetEvent()
  Protected colnr.i,rownr.i
  For rownr=1 To 8
    For colnr=1 To 11
      If EventGadget() = DialogGadget(#Dialog, Str(rownr) + "/" + Str(colnr))
        Debug EventType()
        Debug Str(rownr)+"/"+Str(colnr)
        Debug "----"
        Break 2
      EndIf
    Next
  Next
EndProcedure

Procedure make_Grid(rows.i,cols.i)
  
  Protected colnr.i,rownr.i
  
  Protected XML$
  Protected Event
  
  XML$ = "<window id='#PB_Any' name='test' text='DataGrid' minwidth='500' minheight='200' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>"+
         "<gridbox columns='"+Str(cols)+"'"+">"
  
  For rownr=1 To rows
    For colnr=1 To cols
      
      Protected Ident.s = Str(rownr) + "/" + Str(colnr)
      
      Select colnr
        Case 3
          XML$+"<button name='" + Ident + "' text='" + Ident + "' onEvent='GadgetEvent()' />" 
        Case 5
          XML$+"<date name='" + Ident + "' text='" + Ident + "' onEvent='GadgetEvent()' />"
        Default
          XML$+"<string name='" + Ident + "' text='" + Ident + "' onEvent='GadgetEvent()' />"
      EndSelect
    Next
  Next
  XML$=XML$+ "</gridbox>"
  XML$=XML$+"</window>"
  
  If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
    If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
      
      SetGadgetText(DialogGadget(#Dialog, "1/1"), "Tic")
      SetGadgetText(DialogGadget(#Dialog, "2/2"), "Tac")
      SetGadgetText(DialogGadget(#Dialog, "3/3"), "Toe")
      
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow 
      
    Else  
      Debug "Dialog error: " + DialogError(#Dialog)
    EndIf
  Else
    Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
  EndIf
EndProcedure

make_Grid(8,11); 8 Zeilen mit je 11 Spalten
Grüße ... Peter
Hygge
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Elementare XML-Frage

Beitrag von ProgOldie »

Vielen Dank @Andesdaf und @Kiffi
Ich will das durch Einfügen diverser Gadgettypen noch etwas allgemeiner gestalten. Dabei hakt es bei mir an der ComboBox, bei der ich beispielhaft zwei Auswahlen A und B vorgeben will.

Code: Alles auswählen

 For rownr=1 To rows
    For colnr=1 To cols
      
      Protected Ident.s = Str(rownr) + "/" + Str(colnr)
      
      Select colnr
        Case 3  ;button Gadget
          XML$+"<button name='" + Ident + "' text='" + Ident + "' onEvent='GadgetEvent()' />" 
        Case 5  ;calendar Gadget
          XML$+"<date name='" + Ident + "' text='" + Ident + "' onEvent='GadgetEvent()' />"
        Case 8 ;Auswahlfeld
          XML$+"<combobox name='" + Ident + "' text='" + Ident + "' <select size='2'> <option>A</option> <option>B</option></select> onEvent='GadgetEvent()' />"
        Default ;string Gadget
          XML$+"<string name='" + Ident + "' text='" + Ident + "' onEvent='GadgetEvent()' />"
      EndSelect
    Next
  Next
  XML$=XML$+ "</gridbox>"
  XML$=XML$+"</window>"


Was ist bei case 8 falsch? Dort wird ein XML-Fehler 'not well-formed' reklamiert.
Ist combobox für HTML nicht verständlich?
Oder muss ich nachträglich allen Gadgets in Spalte 8 die Items A und B zuweisen?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Elementare XML-Frage

Beitrag von Kiffi »

ProgOldie hat geschrieben:Was ist bei case 8 falsch? Dort wird ein XML-Fehler 'not well-formed' reklamiert.
das ist in der Tat so, denn...

Code: Alles auswählen

<combobox name='...' <select size='2'> <option>A</option> <option>B</option></select> onEvent='GadgetEvent()' />
... ist kein valider XML-Node

Wenn überhaupt, dann müsste es so aussehen:

Code: Alles auswählen

<combobox name='...' onEvent='GadgetEvent()' /><option>A</option> <option>B</option></combobox>
ProgOldie hat geschrieben:Oder muss ich nachträglich allen Gadgets in Spalte 8 die Items A und B zuweisen?
ich befürchte ja.

Anscheinend gibt es keine Möglichkeit, Comboboxen (oder Listviews, ListIcons...) bereits im XML Items hinzuzufügen. Ich lasse mich allerdings gerne eines Besseren belehren.

Grüße ... Peter
Hygge
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Elementare XML-Frage

Beitrag von GPI »

Code: Alles auswählen

         XML$+"<combobox name='" + Ident + "' text='" + Ident + "' <select size='2'> <option>A</option> <option>B</option></select> onEvent='GadgetEvent()' />"
      


Du verschachtelst hier mehrere Tags ineinander ("<combobox <select> >"), das geht in XML nicht. wenn muss du das mit start/endtag versehen (<combobo><select></combobox>). Auch bin ich mir nicht sicher, die Syntax generell falsch ist.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Elementare XML-Frage

Beitrag von ProgOldie »

Das mit XML läuft sehr zufriedenstellend, vor allem schnell genug. Zumindest eine Frage habe ich noch:

Code: Alles auswählen

XML$ = "<window id='#PB_Any' name='test' text='DataGrid' minwidth='500' minheight='200' flags='#PB_Window_ScreenCentered |#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget'>"+
         "<gridbox columns='"+Str(cols+1)+"'"+">" 
Auf die erstellten Gadgets kann ich nachträglich über die CellID gut zugreifen. Nun möchte ich dem Fenster mit CreateMenu() noch ein Menü hinzufügen, weis aber nicht, wie ich das machen soll. Das Ersetzen von #PB_Any durch eine Nummer funktioniert leider nicht.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Elementare XML-Frage

Beitrag von Kiffi »

Code: Alles auswählen

If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
  If CreateMenu(0, WindowID(DialogWindow(#Dialog)))
    [...]
allerdings musst Du danach evtl. die Fensterhöhe anpassen. Ein RefreshDialog scheint da keine Abhilfe zu bringen.

Grüße ... Peter
Hygge
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Elementare XML-Frage

Beitrag von ProgOldie »

@Kiffi
Danke, klappt! (wie üblich bei dir)
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten