Delphi nach CPP
-
Hallo,
ich habe da ein kleines Problem mit einer Übersetzung von Delphi nach CPP, vielleicht kann mir jemand sagen was ich Falsch mache.Hier der Delphi Code:
unit uXmlParser2; { mk, 12.4.04 } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc, ComCtrls, oxmldom; type TForm1 = class(TForm) XDoc: TXMLDocument; bGibaus: TButton; OpenDialog1: TOpenDialog; tvBaum: TTreeView; mAusgabe: TMemo; procedure bGibausClick(Sender: TObject); private public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.bGibausClick(Sender: TObject); var node : IXMLNode; nodes : IXMLNodeList; knoten : TTreeNode; s : string; i : integer; procedure erweitere(node : IXMLNode;knoten : TTreeNode); var nodes : IXMLNodeList; kindknoten : TTreeNode; i : integer; begin if node.HasChildNodes then begin nodes := node.ChildNodes; for i := 0 to nodes.Count - 1 do begin case nodes[i].NodeType of ntElement : kindknoten := tvBaum.Items.AddChild(knoten,'<'+nodes[i].NodeName+'>'); ntText : kindknoten := tvBaum.Items.AddChild(knoten,nodes[i].text); end; // of case erweitere(nodes[i],kindknoten); end; end; end; begin if OpenDialog1.Execute then try tvBaum.Items.Clear; XDoc.LoadFromFile(OpenDialog1.FileName); node := XDoc.DocumentElement; nodes := node.AttributeNodes; s := ''; for i := 0 to nodes.Count - 1 do s := s + nodes[i].NodeName + ' = ' +nodes[i].NodeValue + ' '; knoten := tvBaum.Items.Add(nil,'<'+node.NodeName+'> '+s); erweitere(node,knoten); except on E:Exception do mAusgabe.Lines.Add(E.Message); end; end;Jetzt die Übersetzung:
Unit1.h//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ComCtrls.hpp> #include <Dialogs.hpp> #include <msxmldom.hpp> #include <XMLDoc.hpp> #include <xmldom.hpp> #include <XMLIntf.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TTreeView *tvBaum; TButton *bGibaus; TXMLDocument *XDoc; TOpenDialog *OpenDialog1; void __fastcall bGibausClick(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen void __fastcall erweitere(IXMLNode*node,TTreeNode*knoten); __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifUnit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::bGibausClick(TObject *Sender) { IXMLNode * node; IXMLNodeList * nodes; TTreeNode * knoten; AnsiString s; int i; if (OpenDialog1->Execute()) { tvBaum->Items->Clear(); XDoc->LoadFromFile(OpenDialog1->FileName); node = XDoc->DocumentElement; nodes = node->AttributeNodes; s = ""; for ( i= 0;i<nodes->Count - 1;i++) { s = s + nodes[i]->NodeName + " = " +nodes[i]->NodeValue + " ";// Fehler knoten = tvBaum->Items->Add(NULL,"<"+node->NodeName+"> "+s); erweitere(node,knoten); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::erweitere(IXMLNode*node,TTreeNode*knoten) { IXMLNodeList * nodes; TTreeNode * kindknoten; int i; if (node->HasChildNodes) { nodes = node->ChildNodes; for( i=0;i< nodes->Count - 1;i++) { switch (nodes[i]->NodeType)//Fehler { case ntElement: { kindknoten = tvBaum->Items->AddChild(knoten,'<'+nodes[i]->NodeName+'>');//Fehler } case ntText: { kindknoten = tvBaum->Items->AddChild(knoten,nodes[i]->Text);//Fehler } } } erweitere(nodes[i],kindknoten);//Fehler } } //---------------------------------------------------------------------------Die Fehlermeldung lautet:
[C++ Fehler] Unit1.cpp(60): E2288 Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich*
[C++ Fehler] Unit1.cpp(64): E2034 Konvertierung von 'IXMLNodeList' nach 'IXMLNode *' nicht möglich
[C++ Fehler] Unit1.cpp(64): E2342 Keine Übereinstimmung des Typs beim Parameter 'node' ('IXMLNode *' erwartet, 'IXMLNodeList' erhalten)Weiss jemand was da Falsch mache?
In Delphi funktioniert der Code?????Gruss Lisa
-
Hallo
ich vermute es muß nodes->Items[i]->NodeName o.ä. heißen.
In solchen Fällen hilft die Doku und die Auto-Vervollständigen weiter.bis bald
akari
-
Die Idee hatte ich auch schon, aber die Eigenschaft Items ist nicht vorhanden
Gruss Lisa
-
Hallo
du kannst auch als Namen für die Eigenschaften auch noch Item und Node probieren.
bis bald
akari
-
Danke das wars!!
Aber jetzt bekomme ich diese Fehlermeldung:---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EVariantTypeCastError aufgetreten. Meldung: 'Variante des Typs (String) konnte nicht in Typ (Double) konvertiert werden'. Prozeß wurde angehalten.Was mache ich falsch?? Ich bin am verzweifeln!!!
Gruss Lisa
-
Hallo
da ich in deinem Quellcode-Auszug keinen Bezug zu irgendwelchen float-Operationen sehe, muß der Auslöser wo anders sein.
Die Fehlermeldung bedeutet, das du versuchst eine Variable vom Typ Variant mit String-Inhalt in ein double umzuwandeln.
Zuerst solltst du dich in der BCB-Hilfe über den Typ Variant schlau machen. Dieser Datentyp kann Werte verschiedenster andere festgelegten Typen aufnehmen, aber immer nur genau einen. Wenn also gerade ein String gespeichert ist, kannst du kein double auslesen.
Je nach dem was du eigentlich vorhast must du also die Belegung des Variants überprüfen oder mit StrToFloat o.ä. arbeiten.bis bald
akari
-
Ich finde diesen blöden fehler nicht.
Der Auslöser ist:
erweitere(node,knoten);gruss lisa