Problem mit GetActivedocument
-
Moin!
Eines vorweg: Ich bin mir ganz sicher, dass das schon mal funktioniert hat... aber jetzt geht es halt nicht mehr.

Also: Ich schalte ja in einer SDI die Views um (siehe FAQ).
Dazu sind alle Views von CBasisView abgeleitet und alle Docs von CBasisDoc.Grob gekürzt besteht CBasisView::OnInitialUpdate() aus:
CFormView::OnInitialUpdate(); // Zeiger auf das Dokument holen CBasisDoc* pDoc = dynamic_cast<CBasisDoc*>(GetDocument()); AfxGetMainWnd()->SendMessage(WM_UPDATE_TEXTE, (WPARAM)pDoc);Hier ist das pDoc noch mein neues Doc. Wenn ich also grade von den Kundendaten auf die Rechnungen umschalte, ist es CRechnungDoc. So soll es sein!
Und dann kommt
LRESULT CMainFrame::OnUpdateTexte(WPARAM wParam, LPARAM pParam) { CBasisDoc* pDoc = (CBasisDoc*)(GetActiveDocument()); _ASSERTE(pDoc); if (pDoc) { // Tuwas zum Anzeigen was grade aktuell ist... } return 0; }Tja, und hier habe ich immer das alte Doc, also im aktuellen Beispiel CKundenDoc.

(Einen Geistesblitz und 5 Minuten später...)
... okay, da man manchmal einfach drüber "reden" muss, ist mir grade aufgefallen, dass ich ja nicht die Parameter sondern GetActiveDocument nutze. Jetzt nutze ich wParam und es geht.
**
Aber wieso gibt GetActiveDocument zu dem Zeitpunkt noch das falsche Doc? Wann wird das auf das neue gesetzt?
**
(Nur, damit ich nicht noch mehr solche Stolperfallen erwische. So viele aufmerksame Schüleraushilfen haben wir dann doch nicht, die meisten hier sind betriebsblind.)
-
Hab den FAQ nicht gelesen - wodurch wird das OnInitialUpdate ausgelöst?
Ich vermute, daß das über einen SetFocus/Activate-Handler passiert, und zum Aufrufzeitpunk das CFrameWnd::m_pActiveView noch auf den zuvor aktiven View zeigt.
Müßte sich beim durchwursteln des Callstacks verifizieren lassen.
-
peterchen schrieb:
Hab den FAQ nicht gelesen - wodurch wird das OnInitialUpdate ausgelöst?
Ich vermute, das macht irgendwas tief unten im SDI Gerüst.

Beim Debuggen bin ich der Lösung nichtmal nahe gekommen.
-
Hallo,
da würde ich nicht weiter suchen (oder nur, wenn du Zeit hast, im MFC-Quellcode nach SetActiveView (GetActiveDocument nutzt die aktive Ansicht, um das "richtige" Dokument zurück zu geben) suchen bzw. nach Änderungen der entsprechenden Membervariable), dein Code ist eben so, dass keine der Funktionen (die z.B bei Datei Neu oder Datei öffnen aufgerufen werden, dort wird die aktive Ansicht gesetzt, auch InitialUpdateFrame würde dafür sorgen, dass eine Ansicht als aktiv gesetzt wird) durchlaufen wird (passiert leicht, wenn man "Eigenkreationen" mit MFC implementiert), die die aktive Ansicht ändern. Nutze, wie auch im FAQ-Beispiel in SwitchView zu sehen, SetActiveView in OnInitialUpdate, um es einfach zu machen.
MfG,
Probe-Nutzer
-
So, altes Thema... neues Problem:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!Program: D:\Meine.exe
Module:
File: i386\chkesp.c
Line: 42The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
(Press Retry to debug the application)
---------------------------
Abbrechen Wiederholen Ignorieren
---------------------------Das knallt genau in der Funktion wo ich die in diesem Thread beschriebene Änderung gemacht habe.

Was sagt mir diese Meldung?
Probe-Nutzer schrieb:
Nutze, wie auch im FAQ-Beispiel in SwitchView zu sehen, SetActiveView in OnInitialUpdate, um es einfach zu machen.
MfG,
Probe-Nutzer
Das nutze ich ja. Trotzdem zickt es rum.

-
Ups, Kommando zurück... man sollte der Funktion dann auch ein Doc geben und keinen View.

Mir is zu warm.

-
estartu schrieb:
Probe-Nutzer schrieb:
Nutze, wie auch im FAQ-Beispiel in SwitchView zu sehen, SetActiveView in OnInitialUpdate, um es einfach zu machen.
MfG,
Probe-Nutzer
Das nutze ich ja. Trotzdem zickt es rum.

War aber nicht zu sehen im Code-Ausschnitt ;), denn dann muss es eigentlich funktionieren, weil die entsprechende Membervariable für die aktive Ansicht richtig gesetzt ist, bevor mit SendMessage der Dokumentzugriff eingeleitet wird, aber es geht ja auch so, durch Parameterübergabe...
MfG,
Probe-Nutzer
-
Probe-Nutzer schrieb:
War aber nicht zu sehen im Code-Ausschnitt
Naja, wär schön doof, das im Tutorial zu schreiben und im eigenen Code nicht.
