delphi code umwandeln in BCB code



  • Hallo kann mir vielleicht einer dabei helfen?
    Was mach ich hier falsch?

    Delphi code:

    private
        FDoChangeEvents: Boolean;
        FFileName: String;
        FModified: Boolean;
        HistoryList : TStringList;
        procedure PopulateHistoryMenu;
        procedure LoadIniSettings;
        procedure SaveIniSettings;
        procedure SetDoChangeEvents(const Value: Boolean);
        procedure SetFileName(const Value: String);
        procedure SetModified(const Value: Boolean);
        { Private declarations }
      public
        { Public declarations }
        property Modified : Boolean read FModified write SetModified;
        property FileName : String read FFileName write SetFileName;
        procedure DrawXML( Data : Pointer = nil );
        function  DrawXMLItem( XMLItem : TXMLItem; Node : TTreeNode; Data : Pointer ) : Pointer;
    
        property DoChangeEvents : Boolean read FDoChangeEvents write SetDoChangeEvents;
      end;
    
    procedure TfrmMain.DrawXML( Data : Pointer = nil );
    var
      p : Pointer;
    begin
      p := Data;
      if (tvXML.Selected <> nil) and
         (p = nil) then
        p := tvXML.Selected.Data;
    
      tvXML.Items.Clear;
      p := DrawXMLItem(XML.Root, nil, p);
      tvXML.FullExpand;
    
      if p = nil then
        tvXML.Selected := tvXML.Items[0]
      else
        tvXML.Selected := p;
    end;
    
    function TfrmMain.DrawXMLItem(XMLItem: TXMLItem; Node: TTreeNode; Data : Pointer) : Pointer;
    var
      n : TTreeNode;
      i : Integer;
      p : Pointer;
    begin
      Result := nil;
      p := nil;
      n := tvXML.Items.AddChild(Node, XMLItem.Name);
      n.Data := XMLItem;
      if Integer(n.Data) = Integer(Data) then
        p := n;
    
      for i := 0 to XMLItem.SubItemCount -1 do
        if p = nil then
          p := DrawXMLItem(XMLItem.SubItems[i], n, Data)
        else
          DrawXMLItem(XMLItem.SubItems[i], n, Data);
    
      if p <> nil then
        Result := p;
    end;
    

    Übersetzt in BCB
    Unit1.h

    private:	// Anwender-Deklarationen
    AnsiString FileName;
    bool Modified;
    public:		// Anwender-Deklarationen
    
    void __fastcall DrawXML( void * Data = NULL ); //nil=Null
    void __fastcall DrawXMLItem  ( TXMLItem * XMLItem , TTreeNode * Node , void * Data  );
            __fastcall TForm1(TComponent* Owner);
    

    Unit1.cpp

    void __fastcall TForm1::DrawXML( void * Data )
    {
    void * p;
    p = Data;
    if (tvXML->Selected == NULL && p ==NULL)
    {
      p = tvXML->Selected->Data; //tvXML = TreeView
    }
    tvXML->Items->Clear();
    p = DrawXMLItem(XML->Root, NULL, p);
    tvXML->FullExpand();
    
        if (p = NULL)
        {
        tvXML->Selected = tvXML->Items[0] ;
        }
        else
        {
        tvXML->Selected = p;
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::DrawXMLItem( TXMLItem * XMLItem , TTreeNode * Node , void * Data  )
    {
      TTreeNode * n;
      int i;
      void * p;
    
      Result = NULL;
      p = NULL;
      n = tvXML->Items->AddChild(Node, XMLItem->Name);
      n->Data = XMLItem;
      if Integer(n->Data) = int(Data) then
      p = n;
    
      for (i=0;i<XMLItemSubItemCount-1;i++')
        if( p == NULL)
        {
        p = DrawXMLItem(XMLItem.SubItems[i], n, Data)
        }
        else
        {
          DrawXMLItem(XMLItem->SubItems[i], n, Data);
         }
      if (p == NULL)
        {
        Result = p;
        }
    }
    

    Vorab schonmal danke

    Gruss Lisa



  • Was mach ich hier falsch?

    Keine Ahnung, was geht denn nicht?

    Wie sollte dir jemand helfen? Was sollte man mit deinen Codefragmenten tun? Wo sollte man sie einfügen??

    Irgendwie wäre so ein Hinweis auf Compiler oder Linkermeldungen hilfreich, die Zeilennummer wo es Probleme gibt usw.



  • zum einen möchte ich gerne wissen ob ich die Codezeilen richtig übersetzt habe

    und dann tauchen beim compilieren immer wieder fehler auf
    z.B.

    p = DrawXMLItem(XML->Root, NULL, p);
    

    [C++ Fehler] Unit1.cpp(27): E2109 Kein zulässiger Typ

    if (p = NULL)
        {
        tvXML->Selected = tvXML->Items[0] ;
        }
        else
        {
        tvXML->Selected = p;
        }
    

    [C++ Fehler] Unit1.cpp(32): E2034 Konvertierungvon 'TTreeNodes'nach 'TTreeNode *' nicht möglich
    [C++ Fehler] Unit1.cpp(36): E2034 Konvertierung von 'void *' nach 'TTreeNode *' nicht möglich

    gruss lisa



  • Die Fehlermeldung besagt, dass ein Zeiger erwartet wird und XML->Root offenbar keiner ist. Des Weiteren wird der Funktion DrawXMLItem die als 2. Parameter ebenfalls einen Zeiger vom Typ 'TTreeNode * erwartet ein void übergeben. Hier könnte ein casten helfen



  • wie würdet ihr denn diesen code übersetzen?

    private 
        FDoChangeEvents: Boolean; 
        FFileName: String; 
        FModified: Boolean; 
        HistoryList : TStringList; 
        procedure PopulateHistoryMenu; 
        procedure LoadIniSettings; 
        procedure SaveIniSettings; 
        procedure SetDoChangeEvents(const Value: Boolean); 
        procedure SetFileName(const Value: String); 
        procedure SetModified(const Value: Boolean); 
        { Private declarations } 
      public 
        { Public declarations } 
        property Modified : Boolean read FModified write SetModified; 
        property FileName : String read FFileName write SetFileName; 
        procedure DrawXML( Data : Pointer = nil ); 
        function  DrawXMLItem( XMLItem : TXMLItem; Node : TTreeNode; Data : Pointer ) : Pointer; 
    
        property DoChangeEvents : Boolean read FDoChangeEvents write SetDoChangeEvents; 
      end; 
    //----------------------------------------------------------------------------
    procedure TfrmMain.DrawXML( Data : Pointer = nil ); 
    var 
      p : Pointer; 
    begin 
      p := Data; 
      if (tvXML.Selected <> nil) and 
         (p = nil) then 
        p := tvXML.Selected.Data; 
    
      tvXML.Items.Clear; 
      p := DrawXMLItem(XML.Root, nil, p); 
      tvXML.FullExpand; 
    
      if p = nil then 
        tvXML.Selected := tvXML.Items[0] 
      else 
        tvXML.Selected := p; 
    end; 
    //------------------------------------------------------------------------
    function TfrmMain.DrawXMLItem(XMLItem: TXMLItem; Node: TTreeNode; Data : Pointer) : Pointer; 
    var 
      n : TTreeNode; 
      i : Integer; 
      p : Pointer; 
    begin 
      Result := nil; 
      p := nil; 
      n := tvXML.Items.AddChild(Node, XMLItem.Name); 
      n.Data := XMLItem; 
      if Integer(n.Data) = Integer(Data) then 
        p := n; 
    
      for i := 0 to XMLItem.SubItemCount -1 do 
        if p = nil then 
          p := DrawXMLItem(XMLItem.SubItems[i], n, Data) 
        else 
          DrawXMLItem(XMLItem.SubItems[i], n, Data); 
    
      if p <> nil then 
        Result := p; 
    end;
    


  • Und wozu diesen Code nochmal gepostet? Zeitschleife?

    Ich würde ihn gar nicht übersetzen, ich würde

    - eine XML Klasse des C++Builders nehmen oder
    - die pas-Datei in das Projekt mit aufnehmen und sie dann von dort direkt nutzen



  • Gibt es den keine Möglichkeit diesen Code zu Übersetzen?
    Die *.pas mit einzubinden würde ich als letzte Möglichkeit in Betracht ziehen.
    Kann mir denn keiner dabei helfen disen Code zu Übersetzen?
    Bitte helft mir!!!!

    Gruß Lisa



  • Sorry, aber man hat ja angefangen -> du postet einfach den Code nochmal



  • Hallo

    ich vermute mal so (ich übersetzte quasi Zeile für Zeile, da die Auszüge aus dem Kontext gerissen wurden und keine abschließende Korrektur ermöglichen)

    private :
        bool FDoChangeEvents;
        AnsiString FFileName;
        bool FModified;
        TStringList* HistoryList; // Die Instanz dieser StringList mus irgendwo erstellt und auch wieder gelöscht werden!
        void PopulateHistoryMenu();
        void LoadIniSettings();
        void SaveIniSettings();
        void SetDoChangeEvents(const bool Value);
        void SetFileName(const AnsiString& Value);
        void SetModified(const bool Value);
    //    { Private declarations }
      public :
    //    { Public declarations }
        __property bool Modified = {read = FModified, write = SetModified};
        __property AnsiString FileName =  {read = FFileName, write = SetFileName};
        void DrawXML(void* Data = NULL);
        void* DrawXMLItem(TXMLItem* XMLItem, TTreeNode* Node, void* Data);
    
        __property bool DoChangeEvents = {read = FDoChangeEvents, write = SetDoChangeEvents};
      };
    //----------------------------------------------------------------------------
    
    void TfrmMain::DrawXML(void* Data);
    {
      void* p = Data;
      if ((tvXML->Selected) && (!p))
        p = tvXML->Selected->Data;
    
      tvXML->Items->Clear();
      p = DrawXMLItem(XML->Root, 0, p);
      tvXML->FullExpand();
    
      if (!p) then
        tvXML->Selected = tvXML->Items[0];
      else
        tvXML->Selected = p;
      }
    //------------------------------------------------------------------------
    void* TfrmMain::DrawXMLItem(XMLItem* XMLItem, TTReeNode* Node, void* Data)
    {
      TTreeNode* n = tvXML->Items->AddChild(Node, XMLItem->Name);
      int i;
      void* p = 0;
    
      n->Data = XMLItem;
      if (int(n->Data) == int(Data)) p = n;
    
      for (int i = 0; i < XMLItem->SubItemCount; i++)
        if (!p)
          p = DrawXMLItem(XMLItem->SubItems[i], n, Data);
        else
          DrawXMLItem(XMLItem->SubItems[i], n, Data);
    
      return p;
      }
    


  • Erstmal danke!!!!

    Aber leider komme ich immer noch nicht weiter!!!

    Wenn einer Lust hat sich das ganze mal anzuschauen, ich habe die Komponente mit dem Demoprojekt(welches ich Übersetzen möchte) auf dem Server meines Bruders geladen.

    Die *.pas heißt "MainForm.pas"
    http://www.autogas-emsland.de/XMLParser.zip

    Gruß Lisa


Anmelden zum Antworten