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.


  • Mod

    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.


Anmelden zum Antworten