Aus Dialog Funktion in der View aufrufen



  • Nee, is nicht. Ich hab ein ganz normales SDI - Projekt (vom Assi erstellt). Da gibt's dann mehrere Dialogklassen (abgeleitet von CPropertySheet / Page). Von dort möchte ich auf eine Funktion in der View zugreifen, die was auf den Bildschirm pinselt. Dazu übergeb ich den this Pointer (siehe Bsp. oben) und brauch dann aber logischerweise in meiner Dialogklasse ein Objekt der view. Dieses wiederum krieg ich aber ja nur, wenn die header eingebunden ist.



  • Hi,

    tut mir leid, dass ich gestern nicht mehr antworten konnte, aber ich musste weg.

    Aus den bisherigen Infos konnte ich nicht alzuviel erkennen, deshalb mein Angebot: Wenn Du willst, kannst Du mir gern Dein Projekt schicken (Ohne Debug-Dir! 😃 ), dann schau ich mal rein.

    Gruss

    yeti



  • Hi, danke für's Angebot, aber das Projekt darf ich dir leidner nicht schicken.. sonst gibt's Ärger mit Boss!
    Aber der Fehler ist reproduzierbar. Wenn du ein neues Projekt hast, mit dem Asssitenten erstellt (SDI), dort einen Dialog einfügst und ne Klasse dazu wirst du sehen, das sich die View.h in der Dialogklasse nicht includieren lässt! (VC .NET 2003)

    Gruß
    Thomas

    PS: ich hab nen Beitrag gefunden, wo jemand ein ähnliches Problem hat. Mann soll statt

    #include ..view.h
    
    class CMeinProgView;
    

    zu Anfang der header schreiben. Dann meckert zwar der kompiler nicht mehr, ich kann aber auch nicht auf Funktionen der View zugreifen



  • Hi, danke für's Angebot, aber das Projekt darf ich dir leidner nicht schicken.. sonst gibt's Ärger mit Boss!
    Aber der Fehler ist reproduzierbar. Wenn du ein neues Projekt hast, mit dem Asssitenten erstellt (SDI), dort einen Dialog einfügst und ne Klasse dazu wirst du sehen, das sich die View.h in der Dialogklasse nicht includieren lässt! (VC .NET 2003)

    Gruß
    Thomas

    PS: ich hab nen Beitrag gefunden, wo jemand ein ähnliches Problem hat. Mann soll statt

    #include ..view.h
    
    class CMeinProgView;
    

    zu Anfang der header schreiben. Dann meckert zwar der kompiler nicht mehr, ich kann aber auch nicht auf Funktionen der View zugreifen



  • Hi,

    tja, dann bin ich im Moment auch ratlos.... 😕

    Sorry!

    Gruss

    yeti



  • Ich aber nicht. 🙂

    Das ist ein rekursives include. 💡

    Wenn du das class verwendest, kannst du die Funktionen nur im Header nicht verwenden.
    Im Cpp kannst du ganz normal includen und die Funktionen verwenden.

    Das liegt an der Funktionsweise von #include.
    Die kann ich blos per Schrift schlecht erklären, musste mal gucken wo es eine Erklärung gibt.

    Hast du es jetzt hingekriegt? sonst muss ich mir mal ein Beispiel zusammenstottern. 😉



  • Danke.
    Hab jetzt folgendes gemacht, geht aber immer noch nicht:
    - in der Header hab ich zu Anfang

    class CMeinProgView
    

    geschrieben und ein Objekt erstellt (public)
    - in der cpp meiprogview includiert und über das objekt eine Funktion aufgerufen.
    ---> geht immer noch nicht, gleiche meldung

    dann hab ich den include wieder aus der cpp gelöscht
    ---> geht auch nicht, aber andere Meldung:
    error C2027: Verwendung des undefinierten Typs "CMeinProgView"

    son Mist....



  • Gib doch bitte wenigstens die Stellen raus, die davon betroffen sind.

    Das sind vier Stück:
    2 Includes
    die stelle, wo das class steht
    die stelle wo bemeckert wird.

    alles mit dateiangabe.



  • Ok. Gut. Hab jetzt ein neues Projekt gemacht, so wie weiter oben auch beschrieben.

    1. Die Header von meinem Dialog, in dem ich eine Funktion der View aufrufe:

    class CVersuchProjektView;   //HIER WIRD DIE KLASSE BEKANNT GEGEBEN
    #pragma once
    
    // CTestDialog-Dialogfeld
    
    class CTestDialog : public CDialog
    {
    	DECLARE_DYNAMIC(CTestDialog)
    
    public:
    	CTestDialog(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~CTestDialog();
    
    // Dialogfelddaten
    	enum { IDD = IDD_DIALOG1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    public:
    	CVersuchProjektView *m_pVersuchView;
    	afx_msg void OnBnClickedButton1();
    };
    

    Dann die cpp meines Dialog's:

    // TestDialog.cpp : Implementierungsdatei
    //
    #include "stdafx.h"
    #include "VersuchProjekt.h"
    #include "TestDialog.h"
    #include "VersuchProjektView.h"  //HIER WIRD DIE VIEW INCLUDIERT
    #include ".\testdialog.h"
    
    // CTestDialog-Dialogfeld
    
    IMPLEMENT_DYNAMIC(CTestDialog, CDialog)
    CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
    	: CDialog(CTestDialog::IDD, pParent)
    	, m_pVersuchView(NULL)
    {
    }
    
    CTestDialog::~CTestDialog()
    {
    }
    
    void CTestDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CTestDialog, CDialog)
    	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    END_MESSAGE_MAP()
    
    // CTestDialog-Meldungshandler
    
    void CTestDialog::OnBnClickedButton1()  //DIESE FUNKTION RUFT WAS AUS DER VIEW AUF
    {
    // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	POINT punkt;
    	punkt.x = 100;
    	punkt.y = 100;
    	m_pVersuchView->OnLButtonDown(MK_LBUTTON,punkt);
    }
    

    Folgende Fehler treten auf:

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    error C2501: 'CVersuchProjektView::CVersuchProjektDoc': Fehlende Speicherklasse oder Typspezifizierer
    error C2501: 'CVersuchProjektView::GetDocument': Fehlende Speicherklasse oder Typspezifizierer
    warning C4183: 'GetDocument': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen

    alles in der VersuchProjektView.h Zeile

    public:
    	CVersuchProjektDoc* GetDocument() const;
    

    Hoffe, du kannst damit was anfangen.

    Danke
    Thomas



  • Der bemeckert doch das Doc ("CVersuchProjektDoc") und nicht den Dialog.

    Du hast mir also die falschen Schnipsel gegeben. 😉

    Ich brauche die von der Viewklasse.

    Da musst du das class CVersuchProjektDoc reinschreiben und dann im cpp includen - der Dialog mag das Problem auch haben (überblicke ich grade nicht), aber im View existiert es noch immer.

    🙂



  • Ok. Gut. Hab jetzt ein neues Projekt gemacht, so wie weiter oben auch beschrieben.

    1. Die Header von meinem Dialog, in dem ich eine Funktion der View aufrufe:

    class CVersuchProjektView;   //HIER WIRD DIE KLASSE BEKANNT GEGEBEN
    #pragma once
    
    // CTestDialog-Dialogfeld
    
    class CTestDialog : public CDialog
    {
    	DECLARE_DYNAMIC(CTestDialog)
    
    public:
    	CTestDialog(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~CTestDialog();
    
    // Dialogfelddaten
    	enum { IDD = IDD_DIALOG1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    public:
    	CVersuchProjektView *m_pVersuchView;
    	afx_msg void OnBnClickedButton1();
    };
    

    Dann die cpp meines Dialog's:

    // TestDialog.cpp : Implementierungsdatei
    //
    #include "stdafx.h"
    #include "VersuchProjekt.h"
    #include "TestDialog.h"
    #include "VersuchProjektView.h"  //HIER WIRD DIE VIEW INCLUDIERT
    #include ".\testdialog.h"
    
    // CTestDialog-Dialogfeld
    
    IMPLEMENT_DYNAMIC(CTestDialog, CDialog)
    CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
    	: CDialog(CTestDialog::IDD, pParent)
    	, m_pVersuchView(NULL)
    {
    }
    
    CTestDialog::~CTestDialog()
    {
    }
    
    void CTestDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CTestDialog, CDialog)
    	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    END_MESSAGE_MAP()
    
    // CTestDialog-Meldungshandler
    
    void CTestDialog::OnBnClickedButton1()  //DIESE FUNKTION RUFT WAS AUS DER VIEW AUF
    {
    // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	POINT punkt;
    	punkt.x = 100;
    	punkt.y = 100;
    	m_pVersuchView->OnLButtonDown(MK_LBUTTON,punkt);
    }
    

    Folgende Fehler treten auf:

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    error C2501: 'CVersuchProjektView::CVersuchProjektDoc': Fehlende Speicherklasse oder Typspezifizierer
    error C2501: 'CVersuchProjektView::GetDocument': Fehlende Speicherklasse oder Typspezifizierer
    warning C4183: 'GetDocument': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen

    alles in der VersuchProjektView.h Zeile

    public:
    	CVersuchProjektDoc* GetDocument() const;
    

    Hoffe, du kannst damit was anfangen.

    Danke
    Thomas



  • Du hast doppelt gepostet - meine Antwort siehe oben. 🙂



  • Juups, Sorry hab doppelt gepostet 🤡
    Also, hier der code der view.h ABER: da hab ich nix dran gemacht. Das ist alles orginal Microschrott!!!!!! Normal läuft's auch, erst wenn mann die header der view, also diese hier includiert, meckert er hier was an!

    // VersuchProjektView.h : Schnittstelle der Klasse CVersuchProjektView
    //
    #pragma once
    
    class CVersuchProjektView : public CView
    {
    protected: // Nur aus Serialisierung erstellen
    	CVersuchProjektView();
    	DECLARE_DYNCREATE(CVersuchProjektView)
    
    //ACHTUNG: DA MECKERT ER!
    // Attribute
    public:
    	CVersuchProjektDoc* GetDocument() const;
    
    //JETZT IST MECKERN FERTIG
    
    // Operationen
    public:
    
    // Überschreibungen
    	public:
    	virtual void OnDraw(CDC* pDC);  // Überladen, um diese Ansicht darzustellen
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    
    // Implementierung
    public:
    	virtual ~CVersuchProjektView();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // Generierte Funktionen für die Meldungstabellen
    protected:
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    };
    
    #ifndef _DEBUG  // Debugversion in VersuchProjektView.cpp
    inline CVersuchProjektDoc* CVersuchProjektView::GetDocument() const
       { return reinterpret_cast<CVersuchProjektDoc*>(m_pDocument); }
    #endif
    


  • Du musst bei deiner include

    #include "stdafx.h"
    #include "VersuchProjekt.h"
    #include "TestDialog.h"
    #include "VersuchProjektDoc.h" // Die muss bei eine ..View.h dabei wenn Doc/View Architectur 
    #include "VersuchProjektView.h"
    #include ".\testdialog.h"
    

    Da du eine Doc/View Architectur hast(deinen Klassen nach zu urteilen). Das du die includen sollst ist aber auch schon vorher gesagt worden.
    😃
    Denn fehler hab ich aber auch schonmal gemacht 🤡



  • DANKE!! Hat funktioniert!
    2 Tage Arbeit, 107 graue Haare und fünf kaputte Mäuse...

    wegen einer Zeile Quellcode, die der Anwendungsassistent weg lässt.
    Ich fass das alles nochmal zusammen und hoffe, dass es jemand in die FAQ packt!

    Nochmal Danke,

    Thomas 😃



  • Gern geschehen 🙂

    Muss mich hier mal anmelden, hätte ich das vorher gemacht, müsstest du nicht solange warten 🙄 :p 😉 😉 😉


Anmelden zum Antworten