Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

XMLDocument zur Laufzeit erzeugen(Fehlermeldung)

  Alt 21. Okt 2006, 21:31
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
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat