Autor Beitrag
Franky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 18

Windows 98; xphomeedition
Delphi 2007 RAD Studio
BeitragVerfasst: Di 20.01.09 09:42 
Hallo Leute, ich weiß nicht mehr weiter. :(

Ich habe ein Programm geschrieben, in dem ich Daten aus nem XML-Document einlesen will. Ich hatte es zunächst so geschrieben, dass die genutzten Funktionen direkt beim Buttonklick in der GUI aufgerufen werden. Das funktionierte auch.

Nun wollte ich es etwas verallgemeinern und hab die Funktionen in eine eigene Klasse ausgelagert. Jetzt schmiert es wieder nur ab mit oben genanntem Fehler :(


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
unit xmlreader;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils,Shellapi, XMLDoc, XMLIntf;

type
  POrt=^Ort;
  Ort=record
    name      :string;
    x         : integer;
    y         : integer;
    naechster : POrt;
    vorheriger: POrt
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TSP = class(TObject)
    Stadt: POrt;
    ChildList: IXMLNodeList;
    OrtListe: POrt;
    procedure LoadXML(adresse:String);
    procedure SaveXML(adresse:String);
    procedure GetTree(Liste:IXMLNodeList;isfolder:boolean;foldername:string;tiefe:integer);
    function GetTown(Liste:IXMLNodeList):Ort;
  private
  public
    myXML: IXMLDocument;
  end;

var
  SalesMan: TSP;
  Form1: TForm1;
implementation

{ TSP }

function TSP.GetTown(Liste: IXMLNodeList): Ort;
var a,b:integer;//Zählvariablen
    node:IXMLNode;//HauptKnoten
var namelist:IXMLNodeList;//Liste für das Namens-Attribut
var namenode:IXMLNode;// Knoten für den Namens-Knoten
var pointlist: IXMLNodeList;//KnotenListe für den PointKnoten
var PointNode:IXMLNode;//Knoten für den coordinates-Knoten
var coordstring:string;
var MeinOrt:POrt;
begin
  a:=0;
  //Zuerst prüfen, ob es sich auch wirklich um eine Ortsmarke handelt
  while a<Liste.Count do
    begin
      node:=Liste.Get(a);
      a:=a+1;
    end;
  a:=0;
  while a<Liste.Count do
  begin
    node:=Liste.Get(a);
    if node.NodeName='name' then
       begin
         namelist:=node.ChildNodes;
         namenode:=namelist.first;
         Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+'Willkommen in '+Vartostr(Namenode.NodeValue);
       end
    else if node.Nodename='Point' then
       begin
           pointlist:=node.ChildNodes;
           b:=0;
           while b<pointList.Count do
           begin
             pointnode:=Pointlist.Get(b);
             if Pointnode.NodeName='coordinates' then
             begin
                 coordstring:=Vartostr(Pointnode.NodeValue);
                 Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+'   '+copy(coordstring,1,pos(',',coordstring)-1);
                 Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+'   '+copy(coordstring,pos(',',coordstring)+1,posex(',',coordstring,pos(',',coordstring))-1);
             end;
             b:=b+1;
           end;

       end;

    a:=a+1;
  end;
end;

procedure TSP.GetTree(Liste: IXMLNodeList; isfolder: boolean;
                      foldername: string; tiefe: integer);
var node:IXMLNode;
var namelist:IXMLNodeList;
var namenode:IXMLNode;
var a:integer;
begin
   a:=0;
   while (a<Liste.Count) do
   begin
     node:=Liste.Get(a);
     if node.Nodename='Folder' then
        begin
          Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+node.Nodename+'ORDNER';
          GetTree(node.ChildNodes,True,foldername,tiefe);
        end
     else if ((node.Nodename='Placemark'and (tiefe=2)) then   // Stadt gefunden
        begin
          Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+node.Nodename+'Stadt kommt';
          GetTown(node.ChildNodes);
        end
     else if ((node.Nodename='Placemark'and (tiefe=1)) then   // Route entdeckt
        begin
          Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+node.Nodename+'Route gefunden';
          GetTown(node.ChildNodes);
        end
     else if (node.Nodename='name'then
        begin
        nameList:=node.ChildNodes;
        namenode:=namelist.First;
          if Vartostr(namenode.NodeValue)=foldername then
            begin
               tiefe:=tiefe+1;
               if tiefe=1 then              
                   foldername:='Orte';// Der Hauptordner wurde gefunden, im Unterordner befinden sich die Orte
            end;
        end
     else 
      begin
        Form1.memo1.text:=Form1.memo1.text+chr(13)+chr(10)+node.NodeName;
        GetTree(node.ChildNodes,isfolder,foldername,tiefe);
      end;
     a:=a+1;
   end;
end;

procedure TSP.LoadXML(adresse: String);
var mywert:integer;
begin
   mywert:=mywert+1;
   myXML:=newXMLDocument;
   myXML.LoadFromFile(adresse);
   myXML.Active:=True;
   ChildList:=MyXML.ChildNodes;
   Form1.memo1.Text:=Inttostr(ChildList.Count);
   GetTree(ChildList,False,'Handelsreise',0);
end;

procedure TSP.SaveXML(adresse: String);
var Datei:Textfile;
var a:Integer;
begin
     AssignFile(Datei,adresse);
     rewrite(Datei);
     writeln(Datei,'<?xml version="1.0" encoding="UTF-8"?>');
     writeln(Datei,'<kml xmlns="http://earth.google.com/kml/2.2">');
     writeln(Datei,'  <Folder>');
     writeln(Datei,'    <name>Reise</name>');
     writeln(Datei,'    <open>1</open>');
     //Orte eintragen
     writeln(Datei,'    <Folder>');
     writeln(Datei,'       <name>Orte</name>');
     writeln(Datei,'       <open>1</open>');
     for a := 0 to 6  do
       begin
         writeln(Datei,'      <Placemark>');
         writeln(Datei,'        <name>Ort'+inttostr(a)+'</name>');
         //Wichtig: 14 Nach.-Stellen für korrekte anzeige beachten
         writeln(Datei,'        <Point><coordinates>'+inttostr(a*3)+'.00000000000000,'+inttostr(a*10)+'.00000000000000,0</coordinates></Point>');
         writeln(Datei,'      </Placemark>');
       end;
     writeln(Datei,'    </Folder>');
     //Route eintragen
     writeln(Datei,'  <Placemark>');
     writeln(Datei,'    <name>Route</name>');
     writeln(Datei,'    <LineString>');
     writeln(Datei,'    <coordinates>');
     for a := 0 to 6 do
       begin
         writeln(Datei,inttostr(a*3)+'.00000000000000,'+inttostr(a*10)+'.00000000000000,0 ');
       end;
     writeln(Datei,'    </coordinates>');
     writeln(Datei,'    </LineString>');
     writeln(Datei,'  </Placemark>');
     writeln(Datei,'</Folder>');
     writeln(Datei,'</kml>');
     CloseFile(Datei);

end;



{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  SalesMan.LoadXML('E:\Eigene Dateien\Studium\Semester3\ProgrammiersprachenII\Traveling Salesman\Handelsreise2.kml');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SalesMan.SaveXML('E:\Eigene Dateien\Studium\Semester3\ProgrammiersprachenII\Traveling Salesman\Handelsreise5.kml');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    ShellExecute(Application.Handle,'open','D:\Programme\Google\Google Earth\GoogleEarth.exe','"E:\Eigene Dateien\Studium\Semester3\ProgrammiersprachenII\Traveling Salesman\Handelsreise5.kml"','E:\Eigene Dateien\Studium\Semester3\ProgrammiersprachenII\Traveling Salesman\',SC_DEFAULT);
end;


end.



Ich hoffe, ihr könnt damit was anfangen, ich hab von Delphi nicht viel Ahnung.

Das problem tritt in Zeile 152 auf, die Funktion wird in Zeile 207 aufgerufen.


Danke im vorraus :)

_________________
Hier könnte ihre Werbung stehen
delphiprogrammierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 20.01.09 09:45 
Wo ist die Funktion

newXMLDocument ???
Franky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 18

Windows 98; xphomeedition
Delphi 2007 RAD Studio
BeitragVerfasst: Di 20.01.09 22:22 
Ja. newXMLDocument entspricht, so wie ich das verstanden habe einem Init-Befehl.

Kann mir da denn keiner weiter helfen?

Wenn ihr noch irgendwelche Infos braucht, dann sagt`s bitte

_________________
Hier könnte ihre Werbung stehen
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Mi 21.01.09 06:42 
Dumme Frage: Du hast schon irgendwo eine Instanz von TSP erzeugt, oder? Ich hab in dem Code zwar gesehen, daß Du Salesman als TSP deklarierst aber nirgens etwas wie SalesMan := TSP.Create;

Grüße,
Uli
Franky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 18

Windows 98; xphomeedition
Delphi 2007 RAD Studio
BeitragVerfasst: Mi 21.01.09 09:17 
Hm, schon seltsam, diese Sprache :?

Einerseits: Danke, hab`s in die Create-Funktion geschrieben, jetzt gehts :D

Andererseits: Ich bin mir zu 100.000% sicher, dass ich diese Funktion im vorherigen Code (habe den jetzigen ja nur dahingehend umgestellt) nicht!!!!!! aufgerufen habe. Der hat aber einwandfrei funktioniert

Tja, wie dem auch sei, es funktioniert jetzt, danke :shock:

_________________
Hier könnte ihre Werbung stehen
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Mi 21.01.09 09:55 
Na ja, Objekte müssen halt nun mal erzeugt werden. Das ist aber in jeder Sprache so (soweit ich weiß). Wenn Du ursprünglich alles in der Form (also TForm) drinnen stehen hattest, da hast Du es natürlich nicht benötigt, da es nichts gab, was erzeugt werden mußte (Und die TForm Instanz wurde als MainForm automatisch erzeugt). Erst mit dem Auslagern in eine eigene Klasse mußt Du von dieser Klasse nun eine Instanz erzeugen.

Grüße,
Uli
Franky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 18

Windows 98; xphomeedition
Delphi 2007 RAD Studio
BeitragVerfasst: Mi 21.01.09 10:26 
user profile iconuko hat folgendes geschrieben Zum zitierten Posting springen:
Na ja, Objekte müssen halt nun mal erzeugt werden. Das ist aber in jeder Sprache so (soweit ich weiß). Wenn Du ursprünglich alles in der Form (also TForm) drinnen stehen hattest, da hast Du es natürlich nicht benötigt, da es nichts gab, was erzeugt werden mußte (Und die TForm Instanz wurde als MainForm automatisch erzeugt). Erst mit dem Auslagern in eine eigene Klasse mußt Du von dieser Klasse nun eine Instanz erzeugen.

Grüße,
Uli


Ja, is mir grad auch wie Schuppen aus den Haaren gefallen :shock:
Naja, ich hol mir jetzt mal ne Zange, um die Nägel zu lösen, die das Brett vor meinem Kopf halten :lol: :oops:

_________________
Hier könnte ihre Werbung stehen