Entwickler-Ecke

Datenbanken - [Problem] TXMLDocument kann plötzlich Pfad(e) nicht finden


Pepp3r - Fr 03.09.10 16:14
Titel: [Problem] TXMLDocument kann plötzlich Pfad(e) nicht finden
Hallo liebe Delphi-Comunity!

Ich habe ein mekrwürdiges Problem und ich kann selbst nach reiflicher Überlegung und Recherche keine lösung dazu finden.
Das Problem:
Ich programmiere gerade eine Filmdatenbank. Die daten speichere ich in einer XML-Datei.
Das lesen/schreiben einer solchen hat bisher auch prima funktioniert, bis plötzlich folgender Runtimeerror erschien:
Fehler

Das merkwürdige daran ist, dass der Pfad existiert, jedoch nicht von Txmldocument gefunden wird.
Des weiteren wird das stammvereichnis meines Programms ignoriert:

Delphi-Quelltext
1:
xml.LoadFromFile('DB\filme.xml');                    

-> das prog sucht plötzlich auf dem desktop, statt dort wo es sich befindet.
Also habe ich die Pfadangabe komplett angegeben, aber die Datei wird noch immer nicht gefunden.

Irgendwas muss passiert sein, dass TXmlDocument am rad dreht.
Ich hoffe jemand kann mir weiter helfen.
Danke im voraus an alle Helfer :)
Pepp3r

Hier der betroffene Programmcode:

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:
procedure TF_ImportierenPrev.Button1Click(Sender: TObject);
var
i, differenz: integer;
begin
  differenz := Filmdatenbank.ListView1.Items.Count;
  for i := differenz to differenz+listbox1.Items.Count-1 do
  begin
    close;
    Filmdatenbank.leererEintrag;
    Filmdatenbank.eintragAnzeigen(Filmdatenbank.listview1.Items.Count);
    Filmdatenbank.eintragAendern
        (i, '',
        listbox1.Items.Strings[i-differenz],
        '''''''''''''DB\filme.xml');
  end;
end;

procedure TFilmdatenbank.leererEintrag;
var
  node: ixmlnode;
  xml: txmldocument;
begin
  xml := txmldocument.Create(self);
  xml.Active := true;
  xml.LoadFromFile('DB\filme.xml');
  node := xml.DocumentElement;
  node.AddChild('eintrag');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('titel');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('jahr');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('regie');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('alternativ');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('cover');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('bewertung');
  node.ChildNodes[node.ChildNodes.count - 1].AddChild('komentar');
  xml.savetofile('DB\filme.xml');
  xml.Free;
  incListe;
  dbliste[high(dbliste)].cover := '';
  dbliste[high(dbliste)].titel := '';
  dbliste[high(dbliste)].jahr := '';
  dbliste[high(dbliste)].regie := '';
  dbliste[high(dbliste)].genre := '';
  dbliste[high(dbliste)].alternativ := '';
  dbliste[high(dbliste)].bewertung := '';
  dbliste[high(dbliste)].komentar := '';

end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.


Sinspin - Fr 03.09.10 17:57

Hi, auf den ersten Blick kann ich nichts verdächtiges erkennen. Aber die Struktur von XML garantiert dir nicht das ein neu eingefügter Knoten auch wirklich der letzte Eintrag in ChildNodes ist.
Daher kann ich nur raten es ein bisschen anders zu machen und mit einer Variablen zu arbeiten. Veleicht behebt das auch schon dein Problem.

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  NewEntry: IXMLNode;
....
  NewEntry := node.AddChild('eintrag');
  NewEntry.AddChild('titel');


jaenicke - Fr 03.09.10 21:38

user profile iconPepp3r hat folgendes geschrieben Zum zitierten Posting springen:
Des weiteren wird das stammvereichnis meines Programms ignoriert:

Delphi-Quelltext
1:
xml.LoadFromFile('DB\filme.xml');                    
Wenn du Delphi sagst, dass es im aktuellen Arbeitsverzeichnis suchen soll, also zum Beispiel nach dem Anzeigen eines Dialoges in diesem Verzeichnis, dann schaut Delphi natürlich auch dort.

Was hat dein Quelltext denn mit dem Verzeichnis zu tun, in dem dein Programm liegt? :gruebel:

Mehr zu dem Thema steht hier: ;-)
http://www.delphi-library.de/viewtopic.php?p=499701

Und wenn du die Datenbank auch verändern willst, dann hat es ohnehin wenig Sinn diese in das Verzeichnis der Exe zu speichern, siehe hier:
http://www.delphi-library.de/viewtopic.php?p=548600


Pepp3r - Sa 04.09.10 02:35

jaenikes beitrag hat mir weiter geholfen. mit der funktion ExtractFilePath(ParamStr(0)) funktioniert es. ich werde mir deine artikel mal genauer durchlesen, vielen dank dafür!
gruß
Pepp3r

edit://

der fehler lag tatsächlich darin, dass vorher ein Opendialog geöffnet wurde und delphi in einem anderen ort gesucht hat. mir war nicht klar, dass ein dialog einfluss darauf hat, ist ja auch alles andere als trivial ;). aber ich habe mal wieder was dazu gelernt.