Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XMLDocument zur Laufzeit erzeugen(Fehlermeldung) (https://www.delphipraxis.net/79406-xmldocument-zur-laufzeit-erzeugen-fehlermeldung.html)

Cyberaxx 21. Okt 2006 21:31


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:

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

Bernhard Geyer 22. Okt 2006 00:23

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 ...

Physikus 22. Nov 2006 11:00

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
 
Folgende Änderung muß vorgenommen weren:

Delphi-Quellcode:
private
    { Private-Deklarationen }
   OrgData : IXMLDocument;
um den Ausnahmefehler zu verhindern.

Cyberaxx 22. Nov 2006 12:31

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
 
Danke für die Info, ich werds gleich mal ausprobieren. :)

Cyberaxx 23. Nov 2006 10:56

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
 
Das funktioniert prima.

Danke nochmals


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz