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)