VB 5/6-Tipp 0597: Formular aus XML-Datei erstellen und anzeigen
von Eckhart Wörner
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: | Verwendete API-Aufrufe: keine | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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)?