TXML in BCB6 Pro



  • Hallo!

    Ich habe ein Problem und zwar, will ich ein TXML-Document in BCB6 Prof. verwenden. Ich habe folgenden Quellcode:

    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
       TButton *Start;
       TListBox *ListBox1;
       TOpenDialog *OpenDialog1;
       TSaveDialog *SaveDialog1;
       void __fastcall StartClick(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
       __fastcall TForm1(TComponent* Owner);
       TXMLDocument *XMLLOGFILE;
       TXMLDocument *CAEDocument;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
       TXMLDocument *XMLLOGFILE  = new TXMLDocument("");
       TXMLDocument *CAEDocument = new TXMLDocument("");
    }
    
    void __fastcall TForm1::StartClick(TObject *Sender)
    {
       _di_IXMLNodeList  CamList, PlaceList;
       _di_IXMLNode      PlaceNode;
       AnsiString        FileName;
       bool Err = false;
       modul aktuell;
    
       //CAM-Datei öffnen:
       OpenDialog1->InitialDir = ".";
       OpenDialog1->Filter = "CAM-Dateien | *.cam";
       if(OpenDialog1->Execute())
       {
          try
          {  // Datei mit OpenDialog öffnen:
     :arrow_right:      this->CAEDocument->Active = True;
             this->CAEDocument->FileName = OpenDialog1->FileName;
             CAEDocument->ParseOptions = CAEDocument->ParseOptions << poResolveExternals;
             CAEDocument->ParseOptions = CAEDocument->ParseOptions << poValidateOnParse;
          }
          catch(Exception &e) 
          { 
              MessageBox(Handle, e.Message.c_str(), "Fehler", MB_ICONERROR); 
          } 
    }
    

    Wie ihr seht eigentlich nichts ungewöhnliches! Weder der Compiler noch Linker melden einen Fehler. Erst zur Laufzeit (siehe Pfeil) tritt ein Fehler auf mit folgendem Text:

    Benachrichtigung über Debugger-Exception
    Im Projekt CAM.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 
    'Zugriffsverletzung bei Adresse 00402264.Lesen der Adresse 00000000'. 
    Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
    

    Das Programm an und für sich hat schon funktioniert, allerdings mit einer Enterprise-Version. Aus diesem Grund (Enterprise -> Pro) , musste ich die Komponente TXML entfernen und wollte es dann so wie oben lösen. Ich scheine aber irgendwas vergessen oder falsch gemacht zu haben. Ich hoffe ich bekomme hier Hinweise oder Tipps was der Fehler sein könnte oder wie ich bei der Fehlersuche fortfahren könnte.

    DANKE!!! *Noodle*



  • Hallo

    überleg dir mal, wann lokale Variablen ihre Gültigkeit verlieren und warum du Membervariablen nicht wie lokale Variablen nennen sollst.
    Der Konstruktor muß so aussehen :

    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
       XMLLOGFILE  = new TXMLDocument("");
       CAEDocument = new TXMLDocument("");
    }
    

    bis bald
    akari



  • Hallo!

    Danke schon mal, klar jetzt funktioniert es. So war der Konstruktor gemeint:

    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
       this->XMLLOGFILE  = new TXMLDocument("");
       this->CAEDocument = new TXMLDocument("");
    }
    

    Jetzt ist eine anderer Fehler zur Laufzeit aufgetreten. Das werde ich mir mal anschauen und wenn ich nicht weiterkomme würde ich wieder auf dich/euch zurück kommen.

    Danke nochmal. *Noodle*



  • Hallo

    noch drei Anmerkungen :
    - das this-> brauchst du in den Fällen nicht.
    - Benutzt eine eindeutige Konvention, um deine Membervariablen zu benennen. Zum Beispiel m_CAEDocument. Dann fallen solche Fehler leichter auf, wenn in Methoden plötzlich eine Variable mit m_ dekalriert wird.
    - benutz die Initialisierunglisten von Konstruktoren

    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner), XMLLOGFILE(new TXMLDocument("")), CAEDocument(new TXMLDocument(""))
    {
    }
    

    bis bald
    akari



  • Also, ich komme irgendwie nicht weiter. Immer diese doofen EAccessViolations!!!! 😞

    Hier liegt es an der CamList. Aber wie gesagt, warum darauf nicht zugegriffen werden kann, weiß ich nicht. An diesem Punkt habe ich gar keine Änderungen gemacht zwecks Enterprise / Pro -Version. Deshalb wundert mich es, dass das ganze jetzt nicht mehr funktioniert!

    void __fastcall TForm1::StartClick(TObject *Sender)
    {
       _di_IXMLNodeList  CamList, PlaceList;
       _di_IXMLNode      PlaceNode;
       AnsiString        FileName;
       bool Err = false;
       modul aktuell;
    
       //CAM-Datei öffnen:
       OpenDialog1->InitialDir = ".";
       OpenDialog1->Filter = "CAM-Dateien | *.cam";
       if(OpenDialog1->Execute())
       {
          try
          {  // Datei mit OpenDialog öffnen:
             this->CAEDocument->Active = True;
             this->CAEDocument->FileName = OpenDialog1->FileName;
             CAEDocument->ParseOptions = CAEDocument->ParseOptions << poResolveExternals;
             CAEDocument->ParseOptions = CAEDocument->ParseOptions << poValidateOnParse;
          }
          catch(Exception &e) 
          { 
              MessageBox(Handle, e.Message.c_str(), "Fehler", MB_ICONERROR); 
          } 
          aktuell.SetCamNode(CAEDocument->DocumentElement);
     :arrow_right:   CamList = aktuell.GetCamNode()->ChildNodes;
    }
    
    void  __fastcall modul::SetCamNode(IXMLNode *Node)
    {
       this->CamNode = Node;
    }
    _di_IXMLNode __fastcall  modul::GetCamNode()
    {
       return this->CamNode;
    }
    

    Ich danke euch nochmal für eure Unterstützung! *NOODLE*



  • Hallo

    Benutz den Debugger und schau dir die einzelnen Werte an, vor allem von CAEDocument->DocumentElement. mehr läßt sich da von uns aus nicht sagen.

    bis bald
    akari



  • Ja, das habe ich in der Zwischenzeit auch schon gemacht. Da steht leider der Wert NULL drin...

    Ich danke trotzdem und werde jetzt mal weiter suchen, warum in CAEDocument nichts reingeschrieben wird.



  • Also, ich habe jetzt nochmal in meinem Programm nach einem Fehler gesucht. Natürlich habe ich nichts gefunden.....

    Dann habe ich mal eine Testausgabe gemacht und siehe da, es wird was erkannt:

    this->ListBox1->Items->Add(CAEDocument->DocumentElement->GetNodeName());
             CamNode = CAEDocument->DocumentElement;
             CamList = CamNode->ChildNodes;
    

    Ergibt in der Ausgabe den Namen des Root-Knotens. Soweit so gut, also kann über CAEDocument->DocumentElement, Daten ausgelesen werden. Will ich den Knoten DocumentElement aber irgendwo fest reinschreiben, dass ich über die Variable auf den Knoten zugreifen kann, gehts nicht. Auch beim Untersuchen der Variable DocumentElement zur Laufzeit steht nur NULL drin.

    Weiß jemand vielleicht Rat? Was kann ich denn nochmachen um dahinter zu kommen?


Anmelden zum Antworten