Autor Beitrag
meolus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

Gentoo, Debian, Win7 64-bit, WinXP
Delphi 2006 Prof., Delphi 2005 PE
BeitragVerfasst: Di 08.08.06 22:26 
Hab mich gerade wieder ne Stunde damit rumgeschlagen, warum ich auf ein in ein TXMLDocument geladenes Dokument nur einmal draufzugreifen konnte und es danach das Active-Flag von alleine deaktiviert hat. Jedenfalls lieferten mir weiter Zugriffe und ein erneutes setzten des Active-Flags eine Exception.

Hab jetzt einfach bei der Deklaration IXMLDocument anstelle von TXMLDocument verwendet. Der Rest ist gleich geblieben. Jetzt funktioniert es wie es sollte! Kann mir das jemand erklären, warum die Komponenten nit das kann was sie können sollte und eine andere, was auch immer "I" ist deren Dienst übernimmt?


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var 
  XMLDocument: IXMLDocument;          //mit     XMLDocument: TXMLDocument;  

begin
  XMLDocument := TXMLDocument.Create(nil);
  XMLDocument.LoadFromFile('myfile.xml');
  XMLDocument.Active := true;

  iItemCount := XMLDocument.DocumentElement.ChildNodes['foo'].ChildNodes.Count;

                                      //ist      XMLDocument.Active ab HIER wieder false, bei
                                      //Verwendung von  IXMLDocument in der Deklaration NICHT!

  for i := 0 to iItemCount-1 do with Items[i] do begin
      Value := XMLDocument.DocumentElement.ChildNodes['foo'].ChildNodes['bar'+IntToStr(i)].ChildNodes.FindNode('value').Text;
  end;
end;


BTW wat macht man "normalerweise"/was in einer Klasse anstelle des nil in dem Create(nil)?

_________________
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.
ManniTwo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP SP III, Ubuntu 8.04, Debian 5.0
Delphi 5 Pro; Delphi 2005; C++,C# (VS 2005); Java, Ruby (Eclipse)
BeitragVerfasst: Fr 11.08.06 19:50 
eine komplette antwort kann ich dir nicht geben, nur sagen, dass ich dieses Problem mit IXMLDocument und TXMLDocument auch schon mal hatte,

aber ich kann auf eine Teilfrage antworten:
Das I steht in aller Regel dafür, dass es sich hierbei um ein Interface (dt: Schnittstelle) handelt. Ein Interface definiert öffentliche Methoden und von einem Interface können keine Instanzen (Create) gebildet werden. Es gibt Klassen, die Interfaces implementieren (ich sag mal ganz vorsichtig: ähnlich der Vererbung, deshalb ist die Syntax in Delphi auch gleich). Das heißt: diese Klassen müssen solche Methoden dann implementieren. Naja gut, ich hoffe das gab einen groben Eindruck. Präziser, besser und ausführlicher beschrieben in jedem guten Programmierhandbuch... :-)


Zu der "nil"-Geschichte: Siehe Delphi-Hilfe, Stichwort "TComponent"

_________________
Wer andern eine Bratwurst brät, der hat ein Bratwurst-Brat-Gerät, oder anders:
ausblenden Delphi-Quelltext
1:
if Self.BraetAndernEineBratwurst then Self.HasBratwurstBratGeraet := true;