AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XMLDocument zur Laufzeit erzeugen(Fehlermeldung)
Thema durchsuchen
Ansicht
Themen-Optionen

XMLDocument zur Laufzeit erzeugen(Fehlermeldung)

Ein Thema von Cyberaxx · begonnen am 21. Okt 2006 · letzter Beitrag vom 23. Nov 2006
Antwort Antwort
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, 22: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
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)

  Alt 22. Okt 2006, 01:23
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 ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Physikus

Registriert seit: 21. Nov 2006
1 Beiträge
 
#3

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)

  Alt 22. Nov 2006, 12:00
Folgende Änderung muß vorgenommen weren:

Delphi-Quellcode:
private
    { Private-Deklarationen }
   OrgData : IXMLDocument;
um den Ausnahmefehler zu verhindern.
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

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

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)

  Alt 22. Nov 2006, 13:31
Danke für die Info, ich werds gleich mal ausprobieren.
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
Benutzerbild von Cyberaxx
Cyberaxx

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

Re: XMLDocument zur Laufzeit erzeugen(Fehlermeldung)

  Alt 23. Nov 2006, 11:56
Das funktioniert prima.

Danke nochmals
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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