Access violation
От: alex221  
Дата: 08.08.03 12:48
Оценка:
Извините, что шлю такой большой кусок исходного кода, но времени на редактирование нету, к концу рабочего дня нужно доделать, а работа стоит из-за ошибки (в коде она отмечена комментарием). Это модифицированный пример из Qt, он называется xml/outliner М.б. здесь даже не в Qt дело. Помогите плиз, а то у меня уже мозги плавятся

Выделение миинмального кода здорово повысило бы шансы получить ответ. -- ПК.

//header file QXMLListView.h

#include <qlistview.h>
#include <qdom.h>

class PacketNodeListItem : public QListViewItem
{

public:

    PacketNodeListItem ( QListView * parent , QDomNode &d );
    PacketNodeListItem ( PacketNodeListItem * parent , QDomNode &d );
    PacketNodeListItem ( QListView * parent, PacketNodeListItem * after , QDomNode &d );
    PacketNodeListItem ( PacketNodeListItem * parent, PacketNodeListItem * after , QDomNode &d );

    QDomNode *domnode() { return de; }

protected:
    QDomNode *de; 
};

class QXMLListView :public QListView
{
    Q_OBJECT
public:
    QXMLListView(const QString fileName, QWidget *parent = 0, const char *name = 0);
    virtual ~QXMLListView();
private:
    int packetlength;
    void * datapacketptr;
    QDomNode *qdm;
    PacketNodeListItem *qqq;

    long int offset;
    QDomDocument domTree;
    void getHeaderInformation( const QDomElement &header );
    void buildTree( PacketNodeListItem *parentItem, const QDomElement &parentElement);

public slots:
    void langChange();
    void slotRMB( QListViewItem*);
};



/////Source file

#include "QXMLListView.h"
#include <qfile.h>
#include <qmessagebox.h>
#include <stdlib.h>
#include <memory.h>
#include <stdio.h>

// Construction/Destruction
//////////////////////////////////////////////////////////////////////
PacketNodeListItem::PacketNodeListItem ( QListView * parent , QDomNode &d)
:QListViewItem (parent){
de= new QDomNode (d.cloneNode (true));
}

PacketNodeListItem::PacketNodeListItem ( PacketNodeListItem * parent , QDomNode &d)
:QListViewItem (parent){
de= new QDomNode (d.cloneNode (true));
}

PacketNodeListItem::PacketNodeListItem ( QListView * parent, PacketNodeListItem * after , QDomNode &d)
:QListViewItem (parent, after){
de= new QDomNode (d.cloneNode (true));
}

PacketNodeListItem::PacketNodeListItem ( PacketNodeListItem * parent, PacketNodeListItem * after , QDomNode &d)
:QListViewItem (parent, after){
de= new QDomNode (d.cloneNode (true));
}


QXMLListView::QXMLListView(const QString fileName, QWidget *parent, const char *name )
    : QListView( parent, name )
{
addColumn( tr("Parameter") );
    setSorting( -1 );
    setRootIsDecorated( TRUE );

    // read the XML file and create DOM tree
    QFile opmlFile( fileName );
    if ( !opmlFile.open( IO_ReadOnly ) ) {
    QMessageBox::critical( 0,
        tr( "Critical Error" ),
        tr( "Cannot open file %1" ).arg( fileName ) );
    return;
    }
    if ( !domTree.setContent( &opmlFile)) {
    QMessageBox::critical( 0,
        tr( "Critical Error" ),
        tr( "Parsing error for file %1" ).arg( fileName ));
    opmlFile.close();
    return;
    }
    opmlFile.close();

    QDomElement root = domTree.documentElement();
    QDomNode node;

    // create the tree view out of the DOM
    node = root.firstChild();
    while ( !node.isNull() ) {
    if ( node.isElement() && node.nodeName() == "body") {
        QDomElement body = node.toElement();
        offset=0;
        buildTree( 0, body);
        break;
    }
    node = node.nextSibling();
    }

  connect(this, SIGNAL( pressed( QListViewItem *) ),
        this, SLOT( slotRMB( QListViewItem *)) );

}


void QXMLListView::slotRMB( QListViewItem * qlv){
    PacketNodeListItem *item =(PacketNodeListItem*) qlv;;
    if (item->domnode()->isElement) 
    {
    QString str= item->domnode().toElement().attribute("offset");  //здесь в рантайме вываливается ошибка защиты памяти
    }

}

QXMLListView::~QXMLListView()
{

}

void QXMLListView::buildTree( PacketNodeListItem *parentItem, const QDomElement &parentElement)
{
    
    PacketNodeListItem *thisItem = 0;
    QDomNode node = parentElement.firstChild();
    
    while ( !node.isNull() ) {
    if ( node.isElement() && node.nodeName() == "element"
    &&node.toElement().attribute("show")=="true") {

        if ( parentItem == 0 )
            thisItem = new PacketNodeListItem( this, thisItem, node );
        else
            thisItem = new PacketNodeListItem( parentItem, thisItem, node );
    
        if (node.toElement().hasAttribute( "name" ))
            thisItem->setText( 0, node.toElement().attribute( "name" ));

        if (node.toElement().attribute("terminal")!="true") buildTree( thisItem, node.toElement() );
    }
    node = node.nextSibling();
    }
}


Исправлена подсветка синтаксиса. -- ПК.
Re: Access violation
От: bog  
Дата: 08.08.03 18:51
Оценка:
Здравствуйте, alex221, Вы писали:

A> QString str= item->domnode().toElement().attribute("offset"); //здесь в рантайме вываливается ошибка


А может у узла нет аттрибута "offset"?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.