Automatisches Update von Document geht nicht
-
Hallo Leute,
MFC bereitet mir eine schwere Zeit.
Ich habe hier eine MDI Anwendung mit der ich mehrere verschieden Dokumente verarbeite. Dazu versuche ich mich stark an das Doc/View Konzept zuhalten. Hat bisher auch gut funktioniert. Ich habe z.B. eine Dok geschrieben die ein Textdatei einläd. Nach dem laden daten sich automatisch alle Views ab und ziehen sich die neusten Daten.
So nun habe ich eine 2. Dokumenteklasse angelegt und wieder gleich gearbeitet. Nur diesmal ziehen sich die Views nicht automatisch die Daten und ivh weiß bei Leibe nicht wie ich sie dazu zwingen kann.Hier der Code der Dok Klasse:
Header:##include "stdafx.h" #include "screwmachinesgui.h" #if !defined(AFX_CONTROLWNDDOC_H__8F588294_1069_43A2_8127_DB0B861CFDCE__INCLUDED_) #define AFX_CONTROLWNDDOC_H__8F588294_1069_43A2_8127_DB0B861CFDCE__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // ControlWndDoc.h : Header-Datei // ///////////////////////////////////////////////////////////////////////////// // Dokument CControlWndDoc class CControlWndDoc : public CDocument { protected: CControlWndDoc(); // Dynamische Erstellung verwendet geschützten Konstruktor DECLARE_DYNCREATE(CControlWndDoc) // Attribute public: // Operationen public: // Überschreibungen // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(CControlWndDoc) public: virtual void Serialize(CArchive& ar); // Überschrieben für Dokument-Ein-/Ausgabe protected: virtual BOOL OnNewDocument(); //}}AFX_VIRTUAL // Implementierung public: static CString get_Content(); static void add_Content(CString content); static void set_Content(CString content); static void reset_Content(); public: virtual ~CControlWndDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif // Generierte Nachrichtenzuordnungsfunktionen protected: //{{AFX_MSG(CControlWndDoc) // HINWEIS - Der Klassen-Assistent fügt hier Member-Funktionen ein und entfernt diese. //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. #endif // AFX_CONTROLWNDDOC_H__8F588294_1069_43A2_8127_DB0B861CFDCE__INCLUDED_CPP
// ControlWndDoc.cpp: Implementierungsdatei // #include "ControlWndDoc.h" CString m_content=""; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CControlWndDoc IMPLEMENT_DYNCREATE(CControlWndDoc, CDocument) CControlWndDoc::CControlWndDoc() { } BOOL CControlWndDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; return TRUE; } CControlWndDoc::~CControlWndDoc() { } BEGIN_MESSAGE_MAP(CControlWndDoc, CDocument) //{{AFX_MSG_MAP(CControlWndDoc) // HINWEIS - Der Klassen-Assistent fügt hier Zuordnungsmakros ein und entfernt diese. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Diagnose CControlWndDoc #ifdef _DEBUG void CControlWndDoc::AssertValid() const { CDocument::AssertValid(); } void CControlWndDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // Serialisierung CControlWndDoc void CControlWndDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // ZU ERLEDIGEN: Code zum Speichern hier einfügen } else { // ZU ERLEDIGEN: Code zum Laden hier einfügen } } ///////////////////////////////////////////////////////////////////////////// // Befehle CControlWndDoc CString CControlWndDoc::get_Content() { return m_content; } void CControlWndDoc::add_Content(CString content) { m_content=m_content+ "/n" +content; } void CControlWndDoc::set_Content(CString content) { m_content=content; } void CControlWndDoc::reset_Content() { m_content=""; }Hier die CPP der anzeigenden GUI:
// Control.cpp: Implementierungsdatei // #include "Control.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CControl IMPLEMENT_DYNCREATE(CControl, CEditView) CControl::CControl() { } CControl::~CControl() { } BEGIN_MESSAGE_MAP(CControl, CEditView) //{{AFX_MSG_MAP(CControl) // HINWEIS - Der Klassen-Assistent fügt hier Zuordnungsmakros ein und entfernt diese. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Zeichnung CControl void CControl::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // ZU ERLEDIGEN: Code zum Zeichnen hier einfügen } ///////////////////////////////////////////////////////////////////////////// // Diagnose CControl #ifdef _DEBUG void CControl::AssertValid() const { CEditView::AssertValid(); } void CControl::Dump(CDumpContext& dc) const { CEditView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // Behandlungsroutinen für Nachrichten CControl void CControl::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CEdit& theEdit = GetEditCtrl(); theEdit.SetWindowText(CControlWndDoc::get_Content()); }Hier das Create Statement:
m_ControllWndTemplate = new CMultiDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CControlWndDoc), // Dokumentklasse RUNTIME_CLASS(CNewChildWnd), // Rahmenklasse RUNTIME_CLASS(CControl)); CDocument* lpDoc = 0;So wenn ich nun in einer anderen Klasse
void CGeometrie_Spaltarten::OnButton1() { CControlWndDoc::set_Content("test"); }führt der View kein Update aus.
Was mache ich falsch?
Vielen Dank schonmal.
Groove
-
du musst den views schon mitteilen, dass sich das dokument geändert hat. schau dir die MSDN zur methode "UpdateAllViews()" an.
-
UpdateAllViews ist auch meiner Meinung nach der korrekte Weg.
Mal eine ganz andere Frage:
Warum verwendest Du statische Memberfunktionen? Die Nutzung des Datenfeldes wird dadurch auch statisch und man kann nur eine CControlWndDoc Instanz nutzen!
-
Danke erstmal.
Habe jetzt auch rausgefunden warum das bei dem anderen View funktioniert hat, dort arbeite ich in der OnDraw Methode, die wird ja immer ausgeführt, wenn sich was verändert, z.B. ein Open Dialog sich öffnet und schließt, also war nur zufall, dass es ging.Ich habe statische Funktionen benutzt, weil ich nicht weiß wie ich sonst auf das die Dok Methoden zugreifen kann...vor allem weil bei mir z.B. View 1 von Dok A auf Dok B zugreifen muss und darauf hin wiederrum View 1 von Dok B diese Änderung anzeigen soll.
Ich gebe zu das mir dieses ganze Konzept ziemlich fremd ist, denn ich habe ja keine Objekte von der Dok Klasse der doch?
Wo ich wieder bei Thema wäre, wie kann jetzt View 1 von Dok A View 1 von Dok B zum updaten bewegen?
Danke nochmal.
Edit:
Es soll auch nur eine ControllWndDoc Instanz geben, nicht mehr!UdateAllViews unktioniert einfach nicht, führe ich es in den statischen Methoden aus, bekomme ich die Meldung das UpdateAllViews keine statische Funktion ist...von den anderen Views der anderen Docs kriege ich keine Referenz auf meine Dok Klasse...leider finde ich nirgends funktionierenden Beispielcode in dem ein UpdateAllViews mal exemplarisch benutzt wird.