Aus Dialog Funktion in der View aufrufen



  • Hallo,

    hab folgendes Problem:
    In der CXXView Klasse zeichne ich durch klick mit der Maustaste etwas auf den Bildschirm. Genau diese Funktion möchte ich nun aus einem modalen Dialog aufrufen. Wie komme ich an den Zeiger der View? Mit GetOwnerParent bekomm ich das Hauptfenster....

    Danke
    Thomas



  • Im Dialog einen Member des Typs CDeinView* deklarieren und dann vor dem DoModal rübereichen

    CDeinDialog Dlg;
    Dlg.pView = this;
    Dlg.DoModal();
    
    // feddisch
    


  • Ok. Da war ich schon...
    Habe aber dann das Problem, dass beim includieren der meiprogView.h in einer anderen header oder cpp vier Fehler auftreten, und zwar in der meinprogView.h.

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_tabAutoAlarm'
    error C2501: meiprogView::meiprogDoc: Fehlende Speicherklasse oder Typspezifizierer
    error C2501: meiprogView::GetDocument': Fehlende Speicherklasse oder Typspezifizierer

    Wat is denn da los??

    Danke



  • HILFE!
    Kann mir niemand helfen???

    Steh echt auf'm schlauch. Es kann doch nicht so schwierig sein, die header der MeinProgView einzubinden!

    DANKE! 😕



  • HILFE!
    Kann mir niemand helfen???

    Steh echt auf'm schlauch. Es kann doch nicht so schwierig sein, die header der MeinProgView einzubinden!

    DANKE! 😕



  • Hast Du Dir die Stellen mal genau angesehen, die der Compiler anmeckert?

    Zeig Doch mal etwas Code (Möglichst die Stellen, die angemeckert werden).

    Gruss

    yeti



  • Hi,
    mir fällt nicht ein, was ich da an Code poste soll...
    Mein Prog läuft ohne Fehler und Warnungen, solange, bis ich irgendwo die meinprogview.h includiere. Sonst mach ich nix nur

    #include "meinprogview.h"
    

    hinschreiben.
    Dann kommt beim kompilieren z.B. die Meldung in meinprogview.h

    public:
    CMeinProgDoc* GetDocument() const;
    

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'

    und noch 14 andere Meldungen, teilweise mir nicht zu erklären was die überhaupt mit der View zu tun haben... ich werd echt noch irre. So auf auf der Leitung stand ich glaub ich noch nie.

    Gruß
    Thomas



  • BITTE! Hat niemand eine Idee, warum sich die header der view nirgends includieren lässt??



  • Ich glaube, du hast ein Rekursivinclude gebastelt, bin mir aber nicht so sicher.

    Hast du in der doc.h die view.h included und umgekehrt? Das geht schief.



  • 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


Log in to reply