Access violation



  • Polofreak schrieb:

    Was aber komisch ist, wenn ich folgendes eingebe:

    m_pSet = &GetDocument()->m
    

    dann sollte ja mein Intellisens mich eigentlich zu den einträgen mit m bringen, dort ist aber keine einzige Member drin!

    Mach mal das & weg.
    Gibt GetDokument den richtigen Typ zurück? (Wenn das CDocument gibt, kannst du deine Member lange suchen. 😉 Mach mal dynamic_cast.)
    Ansonsten wurden die Links zur FAQ vorhin grade gepostet...

    Und mit dem zweiten Beitrag glaube ich nicht dass es am Variablenname liegt, da ich in ner anderen Klasse genau den namen verwende...

    Ja, du sagst es doch schon: in ner anderen Klasse.



  • Links zur FAQ gepostet? Ähm komm grad nicht mit also ich seh hier kein Link zu den FAQs im Thread. Oder was meinst du? 😞

    Wenn ich das Und weg mache, dann bin ich immer noch gleich weit, m_...is not a member of CDokument. Glaub ich ihm ja! Aber ich will doch einfach nur meinen Recordset so öffnen wie es auch die Recordview-Klasse tut. Dass ich ihn nicht bei jeder Funktion abfragen und dann evtl. öffnen muss!

    Was muss ich dazu tun?
    Ist es einfacher wenn ich mir nochmal ne RecordView-Klasse anlege, und mit der das nochmal von vorn mach? 😞 😞



  • Ich hab doch nicht gesagt, dass die HIER gepostet wurden, guck mal da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-106531.html 🙂

    Ich glaube nicht, dass du neu anfangen musst. Ich glaube nur, du musst das mal sortieren. Vor allem für mich, weil ich grade nicht durchblicke, was du wo hast und was du wo haben willst.

    Also:
    In welcher Klasse ist m_dokumentenVerwaltungSet deklariert? (Im Doc vermutlich?)
    Wo willst du es nutzen? (Im View vermute ich mal...)
    Was für einen Typ gibt GetDocument zurück?

    Ich glaube, es hängt am GetDocument, aber antworte bitte erstmal, damit ich auch sicher sein kann. 🙂



  • 🙂 jetzt weiß ich auch was für nen FAQ beitrag, 🙂 aber da hast du mich falsch verstanden, da hab ich einfach nur keine Membervariablen drin, meine Funktionen kommen da schön aufgelistet. Ich wollte damit nur zum Ausdruck bringen, dass es dort keine Member gibt!

    hier ist es deklariert: DokumentenVerwaltungDoc.h(22):CDokumentenVerwaltungSet m_dokumentenVerwaltungSet;
    Hier will ich es nutzen: EinstellungenView.cpp(106): m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;
    So wie hier: DokumentenVerwaltungView.cpp(97): m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;

    mein GetDocument sieht so aus:

    CDokumentenVerwaltungDoc* CDokumentenVerwaltungView::GetDocument() // non-debug version is inline
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDokumentenVerwaltungDoc)));
    	return (CDokumentenVerwaltungDoc*)m_pDocument;
    }
    

    Also und jetzt die eigentliche Frage, brauch ich die Zeile

    m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;
    

    überhaupt? Denn ich muss zu meiner Schande gestehen, dass ich es mutwillig reinkopiert hab, weil es was mit dem m_pSet zu tun hat und in ner Klasse war die funktioniert 🙄 🙄 Ich hab allerdings nicht mal ne Ahnung was ich da tu! Meinst du es ist vielleicht einfach mir zu erklären, was ich tun muss um mein m_pSet einfach in der ganzen Klasse verwenden zu können ohne jedes mal open ... zu schreiben (so wie in ner Recview halt) Wäre vermutlich sinniger als den Fehler in meiner mutwilligen *entschuldige* SCHEIßE zu suchen. Außer du siehst ihn gleich auf anhieb. 🙂
    Ich Dank dir jetzt schon ganz herzlich für deine Geduld 😉



  • Wie wäre es denn, denn du das Recordset einfach einmal ganz zu Anfang aufmachst?

    Dazu bieten sich an:
    Konstruktor vom Doc (weil da isses ja deklariert)
    OnInitialUpdate vom View (gleich zum Daten anzeigen weiternutzen)

    Ach, jetzt hab ich das! 💡
    Du hast ja zwei Doc-Views und willst das im anderen nutzen.

    Okay, dann hilft das GetDocument auch nicht, weil es das falsche Doc zurückgibt. (oder haben beide Views das Selbe Doc?)
    Da du ja den Umschaltmechanismus aus der FAQ benutzt, gibt es das CDokumentenVerwaltungDoc zu dem Zeitpunkt, wo es den CEinstellungenView gibt gar nicht, weil es immer nur ein Pärchen gibt. (Solltest du da was abgewandelt haben, sag es bitte.)

    Also bietet sich folgende Lösung an: Du machst die Variable einfach nochmal und zwar im CEinstellungenDoc. Da kannst du (mit Anpassungen, denn alles wirst du wohl nciht so brauchen) vom CDokumentenVerwaltungDoc abschreiben.

    Okay? 🙂



  • Sieht für mich so aus, als hätte er jetzt die Zeile mit dem new nicht mehr drin...



  • 👍 👍 You got it! 👍 👍
    Genau so schauts aus! Genau das ist mein Problem, WOW du kannst es besser erklären als ich selbst!

    Jetzt ist aber nur ich habe jetzt zwei nahezu identischen Docs, nur noch Klassennamen sind unterschiedlich, aber er sagt immernoch m_... is not a member of CDocument. An deiner Switchview habe ich nichts geändert!



  • Polofreak schrieb:

    ...aber er sagt immernoch m_... is not a member of CDocument.

    Da passt ein Cast immernoch nicht. Zeig doch bitte mal das GetDocument von beiden Viewklassen. Ich fürchte, die eine (gezeigte) war die automatisch erstellte (und somit schon angepasste) und die andere hast du selber erstellt aber die Funktion nicht angepasst.

    Du bekommst hier nur einen Zeiger auf die Basisklasse. Die bemeckerte Variable ist aber in der abgeleiteten Klasse, also kann er die nicht finden. 🙂



  • @isabeau: Die Zeile mit dem new war ja auch nur ein Lösungsversuch.
    Eigentlich will er das Recordset als Membervariable haben, so wie bei den Docs, die erstellt werden, wenn man CRecordView beim Projekterstellen auswählt.
    So hab ich das jedenfalls verstanden. 🙂



  • Estartu_de du hast es genau richtig verstanden! 🙂
    Ich musste gestern schnell ne Lösung präsentieren und hab drum schnell selbst mir den Recordset geöffnet und so weiter drum das open und new, jetzt soll es aber schön und funktional sein und nicht mehr schnell und einigermaßen funktional!

    AAAAAAAAAAAHHHHHHHHHHHH Ich IDIOT!!

    Also hier meine GetDocument-Klassen:

    CDokumentenVerwaltungDoc* CDokumentenVerwaltungView::GetDocument() //Ich sollte hier schon auch CEinstellungenView::GetDocument() schreiben!
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDokumentenVerwaltungDoc)));
    	return (CDokumentenVerwaltungDoc*)m_pDocument;
    }
    

    Aber das Problem ist, ich krieg diese Access Violation immernoch wenn ich irgendwas mit m_pSet aufrufe! ( Siehe am Anfang dieses Threads )
    ich sollte doch jetzt mit m_pSet-> darauf zugreifen können, oder?? kann ich aber nicht!! Der steigt mir immer in der ersten Anweisung im Set aus! In meinem Fall ist das jetzt MoveFirst(); dersteigt dann an folgender Stelle aus:

    case CFieldExchange::BindFieldToColumn:
    		{
    			// Assumes all bound fields BEFORE unbound fields
    			CODBCFieldInfo* pODBCInfo =
    				&pFX->m_prs->m_rgODBCFieldInfos[nField - 1];
    			UINT cbColumn = pODBCInfo->m_nPrecision;
    

    Vielen lieben Dank für deine Geduld 🙂



  • Polofreak schrieb:

    Also hier meine GetDocument-Klassen:

    CDokumentenVerwaltungDoc* CDokumentenVerwaltungView::GetDocument() //Ich sollte hier schon auch CEinstellungenView::GetDocument() schreiben!
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDokumentenVerwaltungDoc)));
    	return (CDokumentenVerwaltungDoc*)m_pDocument;
    }
    

    Ich sehe da nur eine Funktion...
    Naja, du musst bei den Funktionen darauf achten, dass du die Klassennamen richtig anpasst, was du aber gemerkt hast, wenn ich den Kommentar richtig deute. 🙂

    Kannst du mich Quellcodetechnisch mal wieder auf den aktuellen Stand bringen? Wie sieht der Code momentan aus?
    Ist das Recordset vorher geöffnet worden? Prüf es zur Not mit IsOpen ab. Also mit:

    ASSERT(m_p...Set->IsOpen());
    

    Das mit dem Zeiger aufs Doc klappt jetzt? Die Member sind alle da?



  • Das mit dem Zeiger auf Doc klappt Member sind da!

    Das mit den Docs hab ich falsch verstanden hier kommen sie:

    // EinstellungenDoc.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "dokumentenverwaltung.h"
    #include "DokumentenVerwaltungSet.h"
    #include "EinstellungenDoc.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CEinstellungenDoc
    
    IMPLEMENT_DYNCREATE(CEinstellungenDoc, CDocument)
    
    BEGIN_MESSAGE_MAP(CEinstellungenDoc, CDocument)
    	//{{AFX_MSG_MAP(CEinstellungenDoc)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    // CDokumentenVerwaltungDoc construction/destruction
    
    CEinstellungenDoc::CEinstellungenDoc()
    {
    	// TODO: add one-time construction code here
    }
    CEinstellungenDoc::~CEinstellungenDoc()
    {
    }
    
    BOOL CEinstellungenDoc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    		return FALSE;
    	// TODO: add reinitialization code here
    	// (SDI documents will reuse this document)
    	return TRUE;
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // CEinstellungenDoc serialization
    
    void CEinstellungenDoc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: add storing code here
    	}
    	else
    	{
    		// TODO: add loading code here
    	}
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // CEinstellungenDoc diagnostics
    
    #ifdef _DEBUG
    void CEinstellungenDoc::AssertValid() const
    {
    	CDocument::AssertValid();
    }
    
    void CEinstellungenDoc::Dump(CDumpContext& dc) const
    {
    	CDocument::Dump(dc);
    }
    #endif //_DEBUG
    
    /////////////////////////////////////////////////////////////////////////////
    // CEinstellungenDoc commands
    
    // DokumentenVerwaltungDoc.cpp : implementation of the CDokumentenVerwaltungDoc class
    //
    
    #include "stdafx.h"
    #include "DokumentenVerwaltung.h"
    
    #include "DokumentenVerwaltungSet.h"
    #include "DokumentenVerwaltungDoc.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CDokumentenVerwaltungDoc
    
    IMPLEMENT_DYNCREATE(CDokumentenVerwaltungDoc, CDocument)
    
    BEGIN_MESSAGE_MAP(CDokumentenVerwaltungDoc, CDocument)
    	//{{AFX_MSG_MAP(CDokumentenVerwaltungDoc)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    		//    DO NOT EDIT what you see in these blocks of generated code!
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CDokumentenVerwaltungDoc construction/destruction
    
    CDokumentenVerwaltungDoc::CDokumentenVerwaltungDoc()
    {
    	// TODO: add one-time construction code here
    
    }
    CDokumentenVerwaltungDoc::~CDokumentenVerwaltungDoc()
    {
    }
    
    BOOL CDokumentenVerwaltungDoc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    		return FALSE;
    
    	// TODO: add reinitialization code here
    	// (SDI documents will reuse this document)
    
    	return TRUE;
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // CDokumentenVerwaltungDoc serialization
    
    void CDokumentenVerwaltungDoc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: add storing code here
    	}
    	else
    	{
    		// TODO: add loading code here
    	}
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // CDokumentenVerwaltungDoc diagnostics
    
    #ifdef _DEBUG
    void CDokumentenVerwaltungDoc::AssertValid() const
    {
    	CDocument::AssertValid();
    }
    
    void CDokumentenVerwaltungDoc::Dump(CDumpContext& dc) const
    {
    	CDocument::Dump(dc);
    }
    #endif //_DEBUG
    
    /////////////////////////////////////////////////////////////////////////////
    // CDokumentenVerwaltungDoc commands
    

    Sind doch gleich oder?
    Also das Assert sagt mir das es nicht open ist!
    Aber wieso ist es im einen Open und im anderen nicht? Wo werden denn standardSets für die View geöffnet?



  • Polofreak schrieb:

    Wo werden denn standardSets für die View geöffnet?

    Gute Frage, ich glaube, ich habe es gefunden:

    void CRecordView::OnInitialUpdate()
    {
    	CRecordset* pRecordset = OnGetRecordset();
    	// recordset must be allocated already
    	ASSERT(pRecordset != NULL);
    
    	if (!pRecordset->IsOpen())
    	{
    		CWaitCursor wait;
    		pRecordset->Open();
    	}
    
    	CFormView::OnInitialUpdate();
    }
    

    Sorry, aber da ich mit Formviews arbeite kannte ich den Mechanismus bis eben nicht.
    Also, du musst in der Viewklasse noch folgendes anpassen:
    Im Header:

    protected:
    	CDokumentenVerwaltungSet* m_pSet;
    
    // Überladungen
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CEinstellungenView)
    	public:
    	virtual CRecordset* OnGetRecordset(); // Hier nur diese Zeile an die passende Stelle schreiben, das andere ist schon da!
    	//}}AFX_VIRTUAL
    

    Im Cpp:

    /////////////////////////////////////////////////////////////////////////////
    // CEinstellungenView Datenbankunterstützung
    CRecordset* CEinstellungenView OnGetRecordset()
    {
    	return m_pSet;
    }
    

    Ich hoffe, ich habe alles korrekt an deine Klassennamen angepasst, achte trotzdem bitte auf eventuelle Fehler. ⚠



  • WOW OK das heißt ich sollte in meiner OnInit die OnInit vom RecordView öffnen, oder??

    Ich hab jetzt deine Erweiterungen Eingebaut, und aus

    CRecordset* CEinstellungenView OnGetRecordset()
    

    musste ich nur schnell

    CRecordset* CEinstellungenView::OnGetRecordset()
    

    machen, ansonsten haben die Namen gepasst 🙂 👍

    Wenn ich aber meine OnInit so gestallte wie die OnInit bei der es geht, also die gehende ist:

    void CDokumentenVerwaltungView::OnInitialUpdate()
    {
    	m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;
    	CRecordView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    	m_brush.CreateSolidBrush(RGB(255,255,255));
    	m_pSet->loadPCD(m_PCD_CMB);
    }
    

    und bei der wo jetzt kommt sagt er mir illegal call of nonstatic memberfunction.

    void CEinstellungenView::OnInitialUpdate() 
    {
    	ASSERT(m_pSet->IsOpen());
    	m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;
    	CRecordView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    	m_brush.CreateSolidBrush(RGB(255,255,255));	
    	m_pSet->loadPCD(m_cmbPCD);
    }
    

    D A N K E für deine Geduld mit mir! Ich wüsste ohne dich echt nicht mehr weiter!



  • Gern geschehen. 🙂 Ich lerne dabei doch auch dazu. 😃

    In welcher Zeile meckert er denn? Der einzige Unterschied, den ich sehe ist der ASSERT (der an der Stelle tierisch in die Hose geht, weil du erst danach den Zeiger initialisierst).



  • void CEinstellungenView::OnInitialUpdate() 
    { 
        m_pSet = &GetDocument()->m_dokumentenVerwaltungSet; 
        CRecordView::OnInitialUpdate(); //<-- hier mault er rum!
        ASSERT(m_pSet->IsOpen());  // <-- steht das da besser??
        GetParentFrame()->RecalcLayout(); 
        ResizeParentToFit(); 
        m_brush.CreateSolidBrush(RGB(255,255,255));    
        m_pSet->loadPCD(m_cmbPCD); 
    }
    


  • Die Stelle für das Assert ist schon besser, aber immernoch unlogisch.
    Ich hatte dir doch weiter oben gezeigt, dass es in InInitialUpdate erst geöffnet wird. Außerdem war das ein Test - eigentlich kannst du die Zeile löschen.
    Wenn du sie behalten möchtest, mach sie bitte noch eine Zeile tiefer.

    Was für eine Basisklasse hat denn CEinstellungenView? Die Fehlermeldung deutet sehr darauf hin, dass es nicht CRecordView ist.



  • Nein wenn es ein Rekordview wäre hätte ich ja diese ganzen Probleme nicht! Es ist ein Formview, in dem ich einfach nur auf die Setklasse zugreifen will, und die DB schon geöffnet ist etc, im Prinzip sollte das besser eine RecView sein.

    Hab es jetzt so

    m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;
    	CRecordView *test;
    	ASSERT(m_pSet->IsOpen());
    	test->OnInitialUpdate();
    

    Und er kackt mir wieder beim assert ab! Man ich will doch einfach nur meine Setfunktionen ausführen können, ohne mir Gedanken zu machen was jetzt wann wo offen ist und was nicht!



  • Na, ich dachte den Fehler hätte ich dir ausreichend erklärt... 🙄

    Mach lieber einfach das OnInitialUpdate nach:

    void CEinstellungenView::OnInitialUpdate()
    {
        m_pSet = &GetDocument()->m_dokumentenVerwaltungSet;
        if (!m_pSet->IsOpen())
        {
            CWaitCursor wait;
            m_pSet->Open();
        }
    
        CFormView::OnInitialUpdate();
    
        GetParentFrame()->RecalcLayout();
        ResizeParentToFit();
        m_brush.CreateSolidBrush(RGB(255,255,255));    
        m_pSet->loadPCD(m_cmbPCD);
    }
    

    Und irgendwie kommt mir das jetzt bekannt vor. 😕



  • *kissingsmily* Jetzt gehts, sieh ich das richtig, hätte ich einfach nur das Open rein machen müssen und fertig??

    Vielen Vielen lieben Dank, endlich kann ich wieder normal arbeiten.
    Dank deiner Geduld!!


Anmelden zum Antworten