Seite 1 von 1

Elementare XML-Frage

Verfasst: 06.09.2017 10:47
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?

Re: Elementare XML-Frage

Verfasst: 06.09.2017 12:17
von Andesdaf
Du kannst jedem Gadget einen Namen vergeben (name='R01C01') und dann per
DialogGadget(#Dialog, "R01C01") dessen Gadget-ID ermitteln.

Re: Elementare XML-Frage

Verfasst: 06.09.2017 15:18
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

Re: Elementare XML-Frage

Verfasst: 07.09.2017 09:23
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?

Re: Elementare XML-Frage

Verfasst: 07.09.2017 09:42
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

Re: Elementare XML-Frage

Verfasst: 07.09.2017 09:45
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.

Re: Elementare XML-Frage

Verfasst: 14.09.2017 11:44
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.

Re: Elementare XML-Frage

Verfasst: 14.09.2017 12:03
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

Re: Elementare XML-Frage

Verfasst: 14.09.2017 16:53
von ProgOldie
@Kiffi
Danke, klappt! (wie üblich bei dir)