Recordview Problem
-
Ich habe eine MFC SDI erzeugt. Jetzt habe ich weiteren Dialog erstellt der andere Datensätze anzeigen soll. Deshalb habe ich die Dialogklasse vom Typ Recordview gemacht. Jetzt ist mein Problem, das ICH diesen Dialog nicht aufrufen kann, da doModal im Recview nicht geht und wenn ich es so versucht habe
CBoundaryView* view = new CBoundaryView();
view->ShowWindow(SW_SHOW);bringt der Compiler zwar kein Fehler aber er steigt während der Laufzeit aus.
Wie öffne ich einen CRecordview abgeleiteten Dialog. (z.B. über nen Button)
-
Da du mehrere View in deinem Programm nutzt, musst du zur Laufzeit die View ändern. Schau mal in der MFC FAQ nach, dort steht für so etwas ein Beitrag drin wie du mehrere View verwendest.
-
Hab schon in den FAQs gesucht aber jezt muss ich mal mit mehreren Views schauen. Danke für den Tip, hast du mir vielleicht nen schönen Link in die FAQs?
Danke schon mal
-
Es war der 4te Link von oben
http://www.c-plusplus.net/forum/viewtopic-var-t-is-81908.html
-
OK das bringt mich schon mal weiter, aber geht das auch wenn ich nicht für jeden Recordview ein eigenes Doc hab? Wenn nein was muss ich bei der Erstellung von den Docs beachten? Oder wie geht das?
-
Für "mit ohne Doc" gibts was bei Codeproject, glaube ich.
Bei der Erstellung des Doc musst du eigentlich nix beachten. Einfach erstellen und fertig. Dann noch mit dem schon vorhandenen vergleichen, was man so alles gebrauchen kann und ggf. übertragen.
Versuch es einfach und schau, wie weit du kommst.
Kannst ja hier schreien, wenn du nicht weiter kommst.
-
So ich habe es versucht wie es in der FAQ steht, der Compiler bringt auch keine Fehler. Wenn ich das Programm aber starte steigt er mir zur Laufzeit aus. Er bringt dann immer "unknown software exception" wie er es auch schon beim oben beschriebenen Versuch gemacht hat.
(view->ShowWindow(SW_SHOW);
)
Woran liegt das denn bitte ich versteh das nicht!
Sobald ich den Button drücke. Auf dem Button liegtCMainFrame switchto; switchto.SwitchToView(2);
und die Funktion ist so wie in der FAQ beschrieben, nur natürlich mit meinen Var.-Namen und so.
Please help me!
-
Du hast die Funktion aus der FAQ genommen und die Variablennamen geändert und es geht nicht mehr?
Oder hast du doch mehr geändert? Zeig doch mal.
Ich habe an der Stelle optimistischerweise keine NULL-Zeiger-Prüfung
, vielleicht solltest du das nachholen.
-
void CMainFrame::SwitchToView(unsigned int f_nId) { // Ist es nicht der aktuelle View? if (f_nId != m_nCurID) { // aktuellen view holen CView* pActiveView = GetActiveView(); ASSERT(pActiveView); // den nächsten view holen CView* pNextView; switch (f_nId) { case IDD_MY11_FORM: pNextView = create_view<CMy11View, CMy11Doc>(this); break; case IDD_BOUNDARY: pNextView = create_view<CBoundaryView, CBoundaryDoc>(this); break; default: ASSERT(0); return; break; } // die interne id austauschen UINT nTemp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID); ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNextView->m_hWnd, GWL_ID)); ::SetWindowLong(pNextView->m_hWnd, GWL_ID, nTemp); pActiveView->ShowWindow(SW_HIDE); pNextView->ShowWindow(SW_SHOW); // neuen View setzen SetActiveView(pNextView); // layout updaten RecalcLayout(); // View neuzeichnen pNextView->Invalidate(); // altes document löschen CDocument* pOldDoc = pActiveView->GetDocument(); delete pOldDoc; // alten view löschen pActiveView->DestroyWindow(); m_nCurID = f_nId; } }
Das ist die paar wenigen Änderungen belaufen sich wirklich nur auf Variablennamen-Änderungen oder habe ich etwas unbewußt verändert (durch aufschlagendem Kopf auf der Tastatur
)
Wo ist da bitte ne NULL-Pointer Abfrage? weiß nicht wo!*blindenbrille*
-
Ich sach doch:
Ich habe an der Stelle optimistischerweise keine NULL-Zeiger-Prüfung
, vielleicht solltest du das nachholen.
Ich baus mal ein, formatieren musst du:
void CMainFrame::SwitchToView(unsigned int f_nId) { // Ist es nicht der aktuelle View? if (f_nId != m_nCurID) { // aktuellen view holen CView* pActiveView = GetActiveView(); ASSERT(pActiveView); if(!pActiveView) { return; } // den nächsten view holen CView* pNextView; switch (f_nId) { case IDD_MY11_FORM: pNextView = create_view<CMy11View, CMy11Doc>(this); break; case IDD_BOUNDARY: pNextView = create_view<CBoundaryView, CBoundaryDoc>(this); break; default: ASSERT(0); return; break; } ASSERT(pNextView); if(!pNextView) { return; } // die interne id austauschen UINT nTemp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID); ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNextView->m_hWnd, GWL_ID)); ::SetWindowLong(pNextView->m_hWnd, GWL_ID, nTemp); pActiveView->ShowWindow(SW_HIDE); pNextView->ShowWindow(SW_SHOW); // neuen View setzen SetActiveView(pNextView); // layout updaten RecalcLayout(); // View neuzeichnen pNextView->Invalidate(); // altes document löschen CDocument* pOldDoc = pActiveView->GetDocument(); delete pOldDoc; // alten view löschen pActiveView->DestroyWindow(); m_nCurID = f_nId; } }
Und IDD_MY11_FORM oder IDD_BOUNDARY hat tatsächlich den Wert 2?
Schreib lieber IDD_MY11_FORM oder IDD_BOUNDARY hin, das ist später leichter nachzuvollziehen und auch zu pflegen.Du hast auch keinen ASSERT bekommen und einfach ignoriert?
-
OK das mit der NULL-POinter hab ich wohl vorhin gepennt, ich bekomm jetzt auch einen anderen Fehler, allerdings immernoch "unknown sofware exception" (künftig U S E) ich hab auch die IDD anstelle der 2 eingetrage, weiß nicht warum ich das so hatte. Ich bekomm den Fehler U S E jetzt in der Zeile:
ASSERT(pActiveView);
in der SwitchToView Methode
komm da irgendwie auf keinen grünen Zweig
-
Hab grad im Debug festgestell dass die current ID nie die ID von meinen IDD hat ewige Zahl 343578936 oder so und die ID sind eigentlich 101(IDD_MY11_FORM) und 130(IDD_BOUNDARY)
liegt es daran?
-
Ooookay, ganz langsam:
1. Das ist ein ASSERT. Erklärungen findest du im Forum und der MSDN.
Fakt ist, dass du keinen aktiven View hast ODER keiner gefunden werden konnte. Kann das sein?
2. Drück mal "Alles neu erstellen", das hilft bei komischen Fehlern.
3. Hast du VC6? Hast du den Service Pack 6 installiert? Sollte man nachholen, hilft auch bei unverständlichen Fehlern.So, dass war jetzt der große Rundumschlag
jetzt kommst du.
-
Das ist ein Indiz für meinen Verdacht, dass du keinen aktuellen view hast. Kann das sein?
-
Das habe ich auch gerade eben festgestellt aber ich weiß nicht wieso! Wie sag ich denn überhaupt dass ein View aktiv ist und wo? Das mit dem ASSERT hab ich grad mal nachgelesen, und ich verwende VC++ 6 SPs hab ich keine zusätzlichen installiert werde ich aber gleich mal nacholen.
-
Das machst du mit SetActiveView (ist ja auch in der Funktion).
Aber für den Startview habe ich das gelassen, was der Assistent erstellt hat - aber mdifiziert, weil ich da mal rumprobiert hatte.
Musst mal gucken, ob du es wiedererkennst:
Im InitInstance// Die Doc-View-Kombination anmelden if (!RegisterDocView (RUNTIME_CLASS(CKundenDoc), RUNTIME_CLASS(CKundenView))) { return FALSE; }
// ------------------------------------------------------------------------------------------------ // // Diese Funktion führt alle notwendigen Schritte aus, um die Doc-View-Kombination anzumelden // // ------------------------------------------------------------------------------------------------ bool CMyApp::RegisterDocView( CRuntimeClass* f_pDocClass, CRuntimeClass* f_pViewClass) { // Neues Template erstellen CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate( // Welches Menü (immer das normale) IDR_MAINFRAME, // Welche Dokumentenklasse f_pDocClass, // Welches Rahmenfenster (immer das normale) RUNTIME_CLASS(CMainFrame), // Welche Viewklasse f_pViewClass); // Hats geklappt? if (!pDocTemplate) { return false; } // Hinzufügen AddDocTemplate(pDocTemplate); return true; }
-
Also ich hab das mal versucht mit dem wo du da geschrieben hast, er fragt mich jetzt am anfang ob ich My11 oder My11 öffnen will aber sonst ändert sich nicht wirklich viel ich flieg wieder beim Assert auf die Schnauze, vermutlich immernoch weil ich kein aktiven View hab. Aber dafür hab ich jetzt
SP6
Ich muss doch einfach im Startview (bei mir CMy11View) sagen,SetActiveView(this);
muss da noch irgendwas davor oder danach?
Ich verzweifel so langsam!
-
Okay, dann nimm die Zeilen wieder raus, wenn der dich fragt, dann hast du AddDocTemplate zweimal aufgerufen.
Sag mal, bekommst du denn einen View angezeigt? Also, tritt der Fehler gleich beim Starten auf oder erst beim Umschalten?
PS: Das SetActiveView macht das Framework automatisch.
-
ICh kann die Anwendung starten und ich hab ja auf nen Buton diese Funktion SwitchView, und sobald ich auf diesen Button clicke steigt er aus. Was kann ich da jetzt tun?
Geht das vielleicht gar nicht so mit Recordviews? Geht das nur mit Formviews oder mit allen?? Eigentlich dohc mit allen Views, oder?
-
Eigentlich sollte das mit allen Views gehen.
Ich mache das mit Formviews.
Wenn du gar keine Idee mehr hast gibt es zwei Möglichkeiten.
1. Du machst ein leeres Projekt, wo du das nochmal versuchst. Manchmal baut man Fehler ein, die man später nicht mehr findet.
2. Du bereinigst das Projekt, packst es als zip (!!!) und schickst es an estartu_de@yahoo.com. Ich gucke drauf, wenn ich Zeit habe und finde vielleicht den Fehler.