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:
Project Project1.exe raised
exception class EAccessViolation '
Access violation at address 009742AA. Write of address 00000004'. Process stopped. Use Step or Run to continue.
Der Quellcode so
Delphi-Quellcode:
// 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.
Aufruf des Threads so
Delphi-Quellcode:
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;
Ich habe dann testweise mal die XMLDocument Komponente auf das Datenmodul gesetzt und es als Variable übergeben. Dann funktioniert es auch im Thread.
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