Access violation
-
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 commandsSind 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_VIRTUALIm 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!!
-
Schön, dass es jetzt tut.

Naja, dass irgendwo ein Open reinmusste war ja von Anfang an klar - blos über das "Wo am besten?" waren wir uns ja unklar.
-
Joa scho!
Ich dachte nur nicht dass es so einfach ist, dass ich es wirklich wie ich es eigentlich intuitiv gemacht hätte, (wenn mein Hinr mir nicht immer dazwischen funken würde) in die OnInitialUpdate machen kann. (Ich hatte mir ja bei meinen panischen hin und her kopierereien einiges zerschossen!) Nächst mal nicht so viel überlegen wie es die im RecView machen sondern erst mal überlegen wie ich es denn machen würde.
Nochmals Vielen lieben Dank
-
Öhm jetzt hab ich damit wieder ein Problem, Ich hab rein nur von debug auf release gestellt und schon
error LNK2001: unresolved external symbol "public: class CEinstellungenDoc * __thiscall CEinstellungenView::GetDocument(void)" (?GetDocument@CEinstellungenView@@QAEPAVCEinstellungenDoc@@XZ)
Woran liegt das? Wenn ich zurück in Debug gehe geht es wieder!
-
Polofreak schrieb:
Öhm jetzt hab ich damit wieder ein Problem, Ich hab rein nur von debug auf release gestellt und schon
error LNK2001: unresolved external symbol "public: class CEinstellungenDoc * __thiscall CEinstellungenView::GetDocument(void)" (?GetDocument@CEinstellungenView@@QAEPAVCEinstellungenDoc@@XZ)
Woran liegt das? Wenn ich zurück in Debug gehe geht es wieder!
Ich wollte das einfach nochmal schnell zitieren weil ich das echt nicht versteh, aber lösen muss, und ich glaube, dass es mit Sicherheit der eine oder andere bzw die eine oder andere weiß!
-
Joa ich hab es raus bekommen, hat zwar ewig gedauert aber ich habs! Für die die es interessiert, Standardmäßig gibt es bei den Recview-Klassen ne Debug und ne Release Get-Document-FKT. Ich hatte unten wohl kein
#ifndef _DEBUG // debug version in DokumentenVerwaltungView.cpp inline CEinstellungenDoc* CEinstellungenView::GetDocument() { return (CEinstellungenDoc*)m_pDocument; } #endif
-
Das haben ALLE Viewklassen, die ich bisher so gesehen habe.

Das war eine der netten Stolperfallen, die dir in der Releaseversion das Genick brechen können.
Lies mal: http://www.codeproject.com/debug/survivereleasever.asp
-
WOW der Artikel hat mich zwar mengenmäßig erschlagen, aber es ist echt ein guter artikel, der genau das beschreibt, was mir passiert ist.
Vielen Dank