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;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.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


Anmelden zum Antworten