Funktionen in Elterndialog aufrufen
-
Ich habe in einem Dialogfeld ein nichtmodales Dialogfeld aufgerufen und angezeigt. ich möchte nun von diesem childdialog eine Funktion des Elterndialog aufrufen. ich habe es schon einmal mit
CElternDlg* pDlg=dynamic_cast<CElternDlg*>(AfxGetApp()->GetMainWnd());
pDlg->elternfunktion(string);versucht , klappt jedoch nicht. Hat jemand eine Idee
??
Danke im Voraus
Linus
-
subdialog hat eine membervariable; die des parentwindows:
CParentwindow* pParentDlgwenn du das subfenster öffnest:
pSubDlg->pParentDlg = this;
Esco
-
Ich komm damit nicht weiter .
Die einzigen Variablen die ich auf den ParenDlg beziehen stehen im Konstructor
(CWin* pParent /= NULL/)
und später noch einmal
CWin* m_pParentdamit komme ich aber so nicht an die Funktionen des parentDlg
Wenn ich eine Membervariable in subdlg.h erstelle wie du sagst ,dann hagelt es im Compiler Fehlermeldungen.
Ich komm da einfach nicht weiter .
-
linus schrieb:
Wenn ich eine Membervariable in subdlg.h erstelle wie du sagst ,dann hagelt es im Compiler Fehlermeldungen.
Ich komm da einfach nicht weiter .du kannst keine membervariablen erstellen oder wie?
Esco
-
Klar kann ich Membervariablen erstellen jedoch ist der Typ im subdialog nicht bekannt. Villeicht hab ich ja ein Knoten im Gehirn . Also
Elterndialog : CElternDlg
Subdialog : CChildDlgWenn ich jetzt in ChildDlg.h
CElternDlg* pParentDlg;
deklariere, bekomme ich lauter Fehlermeldungen
"Fehlende Speicherklasse oder Typspezifizierer"
-
linus schrieb:
Klar kann ich Membervariablen erstellen jedoch ist der Typ im subdialog nicht bekannt. Villeicht hab ich ja ein Knoten im Gehirn . Also
Elterndialog : CElternDlg
Subdialog : CChildDlgWenn ich jetzt in ChildDlg.h
CElternDlg* pParentDlg;
deklariere, bekomme ich lauter Fehlermeldungen
"Fehlende Speicherklasse oder Typspezifizierer"jo, das ist klar. du musst die header einbinden...
Esco
-
neenee, So groß ist der Knoten im Gehirn nu auch wieder nicht ;-))
sicher hab ich versucht die Header einzufügen. Allein der Versuch
ElternDlg.h in childDlg.h einzubinden mag der Compiler gar nicht. Wogegen das Einbinden in childDlg.cpp kein Problem gibt , jedoch hilft mir das bei der Deklaration in der ChildDlg-Headerdatei nichts , dort kennt der Compiler dann wiederum den Eltern-Dilaog nicht. Das Problem muß woanders liegen.
Sorry
-
jo, also ich kenn nur einen fehler, bei dem ein solches problem auftaucht.
poste doch mal bitte deinen code und die genauen fehlermeldungen.
Esco
-
OK . Hier ist mein Code
aufrufender Elterndialog := SonChatDlg
ChildDialog := MsgPrivatDialogMsgPrivatDialog.cpp :
// MsgPrivatDialog.cpp : Implementierungsdatei // #include "stdafx.h" #include "SonChat.h" #include "SonChatDlg.h" //<= ELTERNDIALOG #include "MsgPrivatDialog.h" #include ".\msgprivatdialog.h" // CMsgPrivatDialog-Dialogfeld IMPLEMENT_DYNAMIC(CMsgPrivatDialog, CDialog) CMsgPrivatDialog::CMsgPrivatDialog(CWnd* pParent /*=NULL*/) : CDialog(CMsgPrivatDialog::IDD, pParent) , m_strTelName(_T("")) , m_strPrivatSend(_T("")) , m_pParentDlg(NULL) { } CMsgPrivatDialog::~CMsgPrivatDialog() { } void CMsgPrivatDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_STTELNAME, m_strTelName); DDX_Text(pDX, IDC_EDIT1, m_strPrivatSend); DDX_Control(pDX, IDC_LIST1, m_ctlPrivatList); } BEGIN_MESSAGE_MAP(CMsgPrivatDialog, CDialog) ON_BN_CLICKED(IDOK, OnBnClickedOk) ON_WM_ACTIVATE() END_MESSAGE_MAP() // CMsgPrivatDialog-Meldungshandler void CMsgPrivatDialog::OnBnClickedOk() { // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. UpdateData(TRUE); // HIER MÖCHTE ICH DIE ELTERNFUNKTION AUFRUFEN UpdateData(FALSE); } void CMsgPrivatDialog::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialog::OnActivate(nState, pWndOther, bMinimized); } const CMsgPrivatDialog::nDlgActionMsg = RegisterWindowMessage("DlgActionMsg");
MsgPrivatDialog.h :
#pragma once #include "SonChatDlg.h" //<= Elterndialog #include "afxwin.h" // CMsgPrivatDialog-Dialogfeld class CMsgPrivatDialog : public CDialog { DECLARE_DYNAMIC(CMsgPrivatDialog) public: CMsgPrivatDialog(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CMsgPrivatDialog(); // Dialogfelddaten enum { IDD = IDD_PRIVATD }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung DECLARE_MESSAGE_MAP() public: CString m_strTelName; afx_msg void OnBnClickedOk(); afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); CWnd *m_pParent; public: static const nDlgActionMsg; CString m_strPrivatSend; CListBox m_ctlPrivatList; CSonChatDlg* m_pParentDlg; //<== };
und Hier nun die Fehlermeldungen:
Kompilieren... UserDlg.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer SonChatDlg.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer SonChat.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer MySocket.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer MsgPrivatDialog.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer MsgPrivatDialog.cpp(19) : error C2614: 'CMsgPrivatDialog': Unzulässige Elementinitialisierung: 'm_pParentDlg' ist weder Basis noch Element MsgPrivat.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer DateDlg.cpp d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::CSonChatDlg': Fehlende Speicherklasse oder Typspezifizierer d:\projekte\chazon\MsgPrivatDialog.h(36) : error C2501: 'CMsgPrivatDialog::m_pParentDlg': Fehlende Speicherklasse oder Typspezifizierer Generieren von Code... Das Build-Protokoll wurde unter "file://d:\projekte\chazon\Release\BuildLog.htm" gespeichert. chazon - 22 Fehler, 0 Warnung(en)
Villeicht hab ich ja Tomaten auf den Augen . Schau einfach mal drüber. Manchmal sieht man ja den Wald vor lauter Bäumen nicht
danke
-
also, ich hatte mal ein ähnliches problem beim anlegen von klasseninstanzen in der header. folgendes muss nicht helfen, hat aber schon geholfen:
schreibe in die header des kindialogs vor folgende zeile:
class CMsgPrivatDialog : public CDialog
folgendes davor:
class CSonChatDlg;
es muss also in der MsgPrivatDialog.h nachher folgendes stehen:
class CSonChatDlg; class CMsgPrivatDialog : public CDialog { // usw...
du musst dabei die header des elterndialogs eigentlich nicht mehr in die header des kinddialogs einbinden. es müsste reichen, wenn du dies in der cpp tust.
Esco
-
... und der Herr sandte dem genervten Programmierer einen Engel ,der ihn von seinen Leiden erlöste.....
Danke . es klappt.
Die Frage nach dem Warum so?? stelle ich dann im nächsten Leben.
Linus