Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0597: Formular aus XML-Datei erstellen und anzeigen

 von 

Beschreibung 

Dieser Tipp zeigt, wie man aus eine einfachen XML Datei, ein VB-Form generieren kann. Außerdem können Controls erzeugt und Eigenschaften gesetzte werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [5,22 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei XMLForm.vbp  -------------
' Es muss ein Verweis auf 'Microsoft XML, v3.0' gesetzt werden.

'---- Anfang Formular "FormMuster" alias FormMuster.frm  ----

'----- Ende Formular "FormMuster" alias FormMuster.frm  -----
'----- Anfang Formular "FormStart" alias FormStart.frm  -----
' Steuerelement: Schaltfläche "Verarbeiten"
' Steuerelement: Schaltfläche "Validieren"
' Steuerelement: Textfeld "DTDDateiname"
' Steuerelement: Schaltfläche "Einlesen"
' Steuerelement: Textfeld "XMLDateiname"
' Steuerelement: Beschriftungsfeld "Label6"
' Steuerelement: Beschriftungsfeld "Label5"
' Steuerelement: Beschriftungsfeld "Label4"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Dim WithEvents Dokument As MSXML2.DOMDocument
Dim Fehler As MSXML2.IXMLDOMParseError

Private Sub Dokument_onreadystatechange()
    Select Case Dokument.readyState
    Case 1
        'Laden des Dokuments begonnen
        
    Case 2
        'Laden des Dokuments abgeschlossen
        
    Case 3
        'Datenstruktur liegt bereits Read-Only vor
        
    Case 4
        'Datenstruktur liegt komplett Read-Write vor bzw. Fehler
        '-> Überprüfung auf Fehler
        
        If Dokument.parseError.errorCode <> 0 Then
            MsgBox "Es gab einen Fehler beim Laden:" & vbCrLf & _
                Dokument.parseError.reason, vbCritical
            End
        Else
            Validieren.Enabled = True
        End If
    End Select
End Sub

Private Sub Einlesen_Click()
    'Schritt 1
    
    Dokument.Load XMLDateiname.Text
    XMLDateiname.Enabled = False
    Einlesen.Enabled = False
End Sub

Private Sub Form_Load()
    XMLDateiname = App.Path + "\Beispiel.xml"
    DTDDateiname = App.Path + "\xmlforms.dtd"
    Set Dokument = New MSXML2.DOMDocument
    Dokument.validateOnParse = False
End Sub

Private Sub Validieren_Click()
    'Schritt 2
    
    Validieren.Enabled = False
    Set Fehler = Dokument.Validate
    
    ' Überprüfung auf Fehler
    If Fehler.errorCode <> 0 Then
        MsgBox "Es gab einen Fehler beim Validieren:" & vbCrLf & _
            Fehler.reason, vbCritical
        End
    Else
        Verarbeiten.Enabled = True
    End If
End Sub

Private Sub Verarbeiten_Click()
    'Schritt 3
    
    Verarbeiten.Enabled = False
    
    'Hinweis zur Variablenbenennung:
    'Nodes haben Anfangsbuchstaben N, Attribute A
    Dim Nxmlforms As MSXML2.IXMLDOMNode
    Dim Nform As MSXML2.IXMLDOMNode
    Dim NformSubNode As MSXML2.IXMLDOMNode
    Dim Ncontrol As MSXML2.IXMLDOMNode
    Dim NcontrolSubNode As MSXML2.IXMLDOMNode
    Dim TempForm As FormMuster
    Dim TempControl As Control
    Dim ControlsZähler As Integer
    
    'Wurzel-Node abfragen
    Set Nxmlforms = Dokument.documentElement
    
    'Abfrage aller <form>-Nodes
    For Each Nform In Nxmlforms.childNodes
        
        'Erstellung eines neuen Formulars
        Set TempForm = New FormMuster
        
        'Sub-Nodes von <form> abfragen
        For Each NformSubNode In Nform.childNodes
            
            'Abfrage, ob es sich um <properties> oder
            '<controls> handelt
            Select Case NformSubNode.baseName
            Case "properties"
                'Übergibt den Node sowie die aktuelle Form an
                EigenschaftenForm NformSubNode, TempForm
                
            Case "controls"
                
                'Abfrage aller <control>-Nodes
                For Each Ncontrol In NformSubNode.childNodes
                    Set TempControl = TempForm.Controls.Add _
                        (Ncontrol.Attributes(0).Text, "T" & ControlsZähler)
                    TempControl.Visible = True
                    ControlsZähler = ControlsZähler + 1
                    
                    'Sub-Nodes von <control> abfragen
                    For Each NcontrolSubNode In Ncontrol.childNodes
                        If NcontrolSubNode.baseName = "properties" Then
                            'Übergibt den Node sowie das aktuelle Steuerelement an
                            EigenschaftenControl NcontrolSubNode, TempControl
                        End If
                    Next
                Next
            End Select
        Next
        TempForm.Show
    Next
End Sub

Sub EigenschaftenForm(Nproperties As MSXML2.IXMLDOMNode, F As FormMuster)
    Dim Nproperty As MSXML2.IXMLDOMNode
    Dim Aproperty As MSXML2.IXMLDOMAttribute
    Dim TempEigenschaft As String
    Dim TempEigenschaftWert As String
    
    'Abfrage aller <property>-Nodes
    For Each Nproperty In Nproperties.childNodes
        
        'Abfrage aller Attribute
        For Each Aproperty In Nproperty.Attributes
            
            'Abfrage, ob es sich um den Namen oder
            'den Wert der Eigenschaft handelt
            Select Case Aproperty.baseName
            Case "name"
                TempEigenschaft = Aproperty.Value
            Case "value"
                TempEigenschaftWert = Aproperty.Value
            End Select
        Next
        CallByName F, TempEigenschaft, VbLet, TempEigenschaftWert
    Next
End Sub

Sub EigenschaftenControl(Nproperties As MSXML2.IXMLDOMNode, C As Control)
    Dim Nproperty As MSXML2.IXMLDOMNode
    Dim Aproperty As MSXML2.IXMLDOMAttribute
    Dim TempEigenschaft As String
    Dim TempEigenschaftWert As String
    
    'Abfrage aller <property>-Nodes
    For Each Nproperty In Nproperties.childNodes
        
        'Abfrage aller Attribute
        For Each Aproperty In Nproperty.Attributes
        
            'Abfrage, ob es sich um den Namen oder
            'den Wert der Eigenschaft handelt
            Select Case Aproperty.baseName
            Case "name"
                TempEigenschaft = Aproperty.Value
            Case "value"
                TempEigenschaftWert = Aproperty.Value
            End Select
        Next
        
        CallByName C, TempEigenschaft, VbLet, TempEigenschaftWert
    Next
End Sub
'------ Ende Formular "FormStart" alias FormStart.frm  ------
'-------------- Ende Projektdatei XMLForm.vbp  --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 10 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von 99thalin99 am 21.12.2007 um 12:10

moin,
bezüglich (VB)Code nachladen und ausführen.
Was in Excel mittesl VBA geht, sollte auch in VB gehen. Da VBA ja nur die kleine "schewster" von VB ist.

Wär sich das mal in Excel anschauen möchte, sollte hier mal schauen (www.cpearson.com/excel/vbe.aspx)
Das klappt in Excel ganz gut, wenn man einge Excelfeinheiten und -eigenschaften sachen berücksichtigt.
(Habe da schon was für meine Frima umgesetzt und es Funktioniert super)

Gruss und ein frohes Fest und einen guten rutsch @all

Kommentar von Christoph Friedrich am 26.08.2004 um 12:03

also ich bin der meinung das man mittels des scriptcontrols auch normalen vb code in die xml datei reinpacken kann der dann zur laufzeit interpretiert wird.

Kommentar von Lars am 08.01.2004 um 22:30

moin,

das problem hat sich gelöst. bei meiner anwendung versuchte ich eine xml-datei aus dem internet auszuwerten. da gab es dann probleme mit dem dateizugriff. der readystate war nach dem einlesen nicht 4 wie bei einer lokalen datei, sondern 3. wenn man jedoch die eigenschaft "async" auf false setzt, dann bekommt man nach dem laden der datei auch den readystate 4 und die weitere verarbeitung klappt problemlos.

gruss, lars

Kommentar von Eckhart Wörner am 08.01.2004 um 22:01

Hallo Florian,

ich könnte das Ganze auf die Spitze treiben und sagen, auch das sei möglich. Man benötige den VB-Compiler und etwas Geduld.
Aber ich lasse es (zumal wir ins Absurde abrutschen würden).

Gruß, Eckhart

Kommentar von Florian Rittmeier am 08.01.2004 um 21:59

Man kann natürlich einen Quellcode für Brainfuck oder eine andere Sprache dort ablegen und dann nach dem Einlesen durch den Compiler oder nen Interpreter jagen.
Aber ich denke mal Sascha dachte da ehr ein sowas wie VB-Code und das ist nunmal nicht wirklich möglich.

Gruß Florian

Kommentar von Eckhart Wörner am 08.01.2004 um 21:45

Hallo Florian,

du sagtest am 27.12.2003 um 17:22:
> das ist nicht möglich.

Ganz unwidersprochen kann ich diese Aussage nicht lassen.
Es ist grundsätzlich möglich, in der XML-Datei eine eigene Sprache zu definieren. Microsoft hat das AFAIK ja auch irgendwie mit JavaScript gelöst.
Theoretisch wäre sogar eine Speicherung von Assembler möglich (obwohl der Aufwand in keiner Relation zum Resultat steht).

Gruß Eckhart

Kommentar von Florian Rittmeier am 07.01.2004 um 13:20

Hallo Lars,

geh doch mal ins Hauptforum und poste dort dein Problem und deinen kompletten Code. Die Wahrscheinlichkeit, dass man Dir dort helfen kann ist höher.

Gruß Florian

Kommentar von Lars am 07.01.2004 um 11:19

hi,

ich habe probleme beim einlesen von xml-dateien aus dem internet. der readystate des "dokuments" bleibt immer auf 3 stehen und verursacht einen fehler bei der validierung. setze ich einen breakpoint nach dem laden oder gehe kurz in den debugger und lass das proggi weiterlaufen geht der readystate komischerweise auf 4 und es läuft "problemlos".

packt man eine schleife rein die darauf wartet das der readystate von allein auf 4 geht hat man nen dauerloop. bin noch noob auf diesem gebiet und bräuchte tips und anregungen. danke.

lars

Kommentar von Florian Rittmeier am 27.12.2003 um 17:22

Hallo Sascha,

da ist nicht möglich.

Gruß Florian

Kommentar von Sascha am 06.06.2003 um 22:48

Kann man auch codes in xml dateien definieren, das also auch etwas passiert, wenn man auf den button klickt(auf dem generierten formular)?