Seite 1 von 1

GUI dynamisch aus einer XML-Datei erstellen

Verfasst: 12.12.2005 22:50
von Kiffi
Ahoi,

hier ist ein kleiner Code, der veranschaulicht, wie man ein Fenster
dynamisch anhand von Informationen aus einer XML-Datei erstellen und
auswerten kann. Die hier aufgezeigten Methoden zeigen nur einen kleinen
Teil der Möglichkeiten, die sich dem Programmierer aus dieser Art der
Darstellung ergeben.

Vielleicht kann's der ein oder andere gebrauchen...

Hinweis: Der Code benötigt die MSXML3-Lib aus den PBOSL.

Code: Alles auswählen

Structure s_Object
  Type$
  Flags.l
  pos_X.l
  pos_Y.l
  pos_W.l
  pos_H.l
  Title$
  Content$
EndStructure

Gadget.s_Object
Window.s_Object
  
oDoc = MSXML3_CreateDomDocument()

If oDoc
  
  If MSXML3_Load(oDoc, "GuiDefinition.xml")
    
    oNode = MSXML3_SelectSingleNode(oDoc, "window[@name='frmMain']")
    
    If oNode
      
      Window\Title$=MSXML3_GetText(MSXML3_SelectSingleNode(oNode, "title"))
      
      Window\pos_X=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "x"))
      Window\pos_Y=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "y"))
      Window\pos_W=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "w"))
      Window\pos_H=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "h"))
      
      Window\Flags=Val(MSXML3_GetText(MSXML3_SelectSingleNode(oNode, "flags")))
      
      myID = OpenWindow(#PB_Any, Window\pos_X, Window\pos_Y, Window\pos_W, Window\pos_H, Window\Flags, Window\Title$)
      
      MSXML3_SpecialSetNamedAttributeValue(oDoc, oNode, "id", Str(myID))
      
      CreateGadgetList(WindowID())
      
      oNodelist = MSXML3_SelectNodes(oNode, "gadgets/gadget")
      
      If oNodelist
        
        For lCounter = 0 To MSXML3_NodeListGetLength(oNodelist)
          
          oNode = MSXML3_NodeListGetItem(oNodelist, lCounter)
          
          If oNode
            
            Gadget\Content$=MSXML3_GetText(MSXML3_SelectSingleNode(oNode, "content"))
            
            Gadget\pos_X=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "x"))
            Gadget\pos_Y=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "y"))
            Gadget\pos_W=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "w"))
            Gadget\pos_H=Val(MSXML3_SpecialGetNamedAttributeValue(MSXML3_SelectSingleNode(oNode, "position"), "h"))
            
            Window\Flags=Val(MSXML3_GetText(MSXML3_SelectSingleNode(oNode, "flags")))
            
            Select MSXML3_SpecialGetNamedAttributeValue(oNode, "type")
              Case "string"
                myID = StringGadget(#PB_Any, Gadget\pos_X, Gadget\pos_Y, Gadget\pos_W, Gadget\pos_H, Gadget\Content$, Gadget\Flags)
              Case "text"
                myID = TextGadget  (#PB_Any, Gadget\pos_X, Gadget\pos_Y, Gadget\pos_W, Gadget\pos_H, Gadget\Content$, Gadget\Flags)
              Case "button"
                myID = ButtonGadget(#PB_Any, Gadget\pos_X, Gadget\pos_Y, Gadget\pos_W, Gadget\pos_H, Gadget\Content$, Gadget\Flags)
            EndSelect
            
            MSXML3_SpecialSetNamedAttributeValue(oDoc, oNode, "id", Str(myID))
            
            MSXML3_ReleaseObject(oNode)
            
          EndIf
          
        Next lCounter
        
        MSXML3_ReleaseObject(oNodelist)
        
        ; Event-Loop
        
        Repeat
          
          WaitWindowEvent = WaitWindowEvent()
          EventGadgetID   = EventGadgetID()
          
          Select WaitWindowEvent
            
            Case #PB_Event_Gadget
              
              oNode = MSXML3_SelectSingleNode(oDoc, "//gadget[@id='" + Str(EventGadgetID) + "']")
              
              If oNode
                If MSXML3_SpecialGetNamedAttributeValue(oNode, "type")="button"
                  MessageRequester("GuiFromXml", "Button '" + MSXML3_GetText(MSXML3_SelectSingleNode(oNode, "content")) + "' (" + MSXML3_SpecialGetNamedAttributeValue(oNode, "name") + ") clicked")
                EndIf
                MSXML3_ReleaseObject(oNode)
              EndIf
              
          EndSelect
          
        Until WaitWindowEvent=#PB_Event_CloseWindow
        
      EndIf
      
    EndIf
    
  Else
    
    MessageRequester("GuiFromXml", "Couldn't load GuiDefinition.xml")
    
  EndIf
  
  MSXML3_ReleaseObject(oDoc)
  
Else
  
  MessageRequester("GuiFromXml", "Couldn't create MSXML3-Object")
  
EndIf
und hier ist das entsprechende XML (bitte unter '[c]GuiDefinition.xml[/c]' speichern):

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<window name="frmMain">
	<position x="0" y="0" w="220" h="110"/>
	<title>GuiFromXml</title>
	<flags>13107201</flags> <!-- #PB_Window_ScreenCentered | #PB_Window_SystemMenu -->
	<gadgets>
		<gadget type="text" name="lblName">
			<position x="10" y="10" w="60" h="20"/>
			<content>Name:</content>
		</gadget>
		<gadget type="string" name="txtName">
			<position x="70" y="10" w="140" h="20"/>
			<content>Peter</content>
		</gadget>
		<gadget type="text" name="lblSurname">
			<position x="10" y="40" w="60" h="20"/>
			<content>Surname:</content>
		</gadget>
		<gadget type="string" name="txtSurname">
			<position x="70" y="40" w="140" h="20"/>
			<content>Parker</content>
		</gadget>
		<gadget type="button" name="cmdOK">
			<position x="80" y="80" w="60" h="20"/>
			<content>OK</content>
		</gadget>
		<gadget type="button" name="cmdCancel">
			<position x="150" y="80" w="60" h="20"/>
			<content>Cancel</content>
		</gadget>
	</gadgets>
</window>
Grüße ... Kiffi

Verfasst: 12.12.2005 23:04
von edel
Sehr schoen :allright: