Aus Dialog Funktion in der View aufrufen
-
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ß
ThomasPS: 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ß
ThomasPS: 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 Anfangclass CMeinProgView
geschrieben und ein Objekt erstellt (public)
- in der cpp meiprogview includiert und über das objekt eine Funktion aufgerufen.
---> geht immer noch nicht, gleiche meldungdann 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 angenommenalles 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 angenommenalles 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