![]() |
XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
Hallo,
bin mir nicht sicher ob der Titel gut gewählt ist aber ich weiß grad keinen anderen. Ich möchte regelmässig eine XML Datei aus dem Web mit einer Datenbank abgleichen. Wenn ich das alles auf einer Form mache, habe ich damit auch kein Problem. Da die Seite und das Abgleichen alles ein wenig Zeit braucht, wollte ich das alles im Hintergrund laufen lassen. Dachte mir also ich baue es in einem Thread ein, die dann alle X Minuten oder Stunden anläuft. Das XMLDocument erzeuge ich zur Laufzeit, hole mir die XML Datei und gebe sie in einer Listbox aus. Das klappt auch super. Wenn ich aber hingegen versuche die Daten auszulesen und mir den Count holen will bekomme ich eine Exception. Ich weiss damit leider nichts anzufangen. Habe auch hier und im Delphi-Forum gesucht, bin aber nicht fündig geworden. Das ist die Fehlermeldung. Zitat:
Delphi-Quellcode:
Aufruf des Threads so
// Auf Form6 ist die Listbox zur Kontrolle.
unit Unit4; interface uses Classes, DB, ADODB, SysUtils, stdctrls, AOChat, Constant, Datenmodul, unit6, activeX, xmldom, XMLIntf, msxmldom, XMLDoc; Const URL = 'http://www.anarchy-online.com/org/stats/d/%s/name/%s/basicstats.xml'; type TUpdateMemberlist = class(TThread) Procedure GetOrgID; Procedure GetXMLData; Procedure FindMember; Procedure UpdateMember; Procedure InsertMember; Procedure DelMember; private { Private declarations } OrgData : TXMLDocument; OID : String; Public { Public declarations } AOChat : TAOChat; Orgname : String; Dim : String; protected procedure Execute; override; end; implementation Procedure TUpdateMemberlist.GetOrgID; Var I : Integer; V : Variant; Begin I := AOChat.Groups.IndexOf(Orgname); V := AOChat.Groups.GetGID(I); OID := AOChat.Groups.GIDToStr(V); OID := Copy(OID, 3, Length(OID)); OID := InttoStr(StrtoInt('$' + OID)); End; Procedure TUpdateMemberlist.GetXMLData; Var Count : Integer; Index : Integer; Begin form6.Show; OrgData := TXMLDocument.Create(Nil); //Dm.OrgData; OrgData.FileName := Format(URL, [DIM, OID]); OrgData.Active := True; form6.Caption := orgdata.FileName; form6.lb.Items := orgdata.XML; form6.lb.items.Add(inttostr(OrgData.DocumentElement.ChildNodes.Count)); <-- hier kommt die Fehlermeldung //Count := OrgData.DocumentElement.ChildNodes['members'].ChildNodes.Count; // ... End; procedure TUpdateMemberlist.Execute; begin OleInitialize(nil); GetOrgID; Synchronize(GetXMLData); OleUninitialize; end; End.
Delphi-Quellcode:
Ich habe dann testweise mal die XMLDocument Komponente auf das Datenmodul gesetzt und es als Variable übergeben. Dann funktioniert es auch im Thread.
procedure TForm1.Button12Click(Sender: TObject);
var UpdateMemberlist : TUpdateMemberlist; begin UpdateMemberlist := TUpdateMemberlist.Create(true); UpdateMemberlist.FreeOnTerminate := true; UpdateMemberlist.AOChat := aochat1; UpdateMemberlist.Orgname := org; UpdateMemberlist.Dim := '3'; UpdateMemberlist.Resume; end; Habe ich beim erstellen etwas nicht mit übergeben bzw. gesetzt was die Komponente auf der Form direkt mit setzt? Zweite Frage wäre in wie weit ist das belastender ob ich die Komponente erstelle oder aber die vom Datenmodul nutze? Hoffe mir kann hier jemand helfen :) Gruß Daniel |
Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
Ich habe es mir zwar jetzt nicht genau angeschaut.
Aber du übergibst ein COM-Interface (bzw. das entsprechende VLC-Wrapper-Klasse) welche du im VCL-Haupthreat erzeugt hast an das Thread. Fals Ja., so mußt Du das erst mittels COM-Marshalling-Funktionen für den Thread vorbereiten. Frag mich aber nicht zu dieser Zeit wie diese Funktion heißt. Im Entwickerl-Forum hat Andreas Kosch das schon öfters angesprochen. Bis bald zu normalen Zeiten ... |
Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
Folgende Änderung muß vorgenommen weren:
Delphi-Quellcode:
um den Ausnahmefehler zu verhindern.
private
{ Private-Deklarationen } OrgData : IXMLDocument; |
Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
Danke für die Info, ich werds gleich mal ausprobieren. :)
|
Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
Das funktioniert prima.
Danke nochmals |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz