Variablen des parent-(Haupt-)Fensters ändern

sTEk

Erfahrenes Mitglied
Ich hänge etwas durch. :/

SDI-Programm, von FormView abgeleitet

Ich möchte gern eine Variable meines Parent-Window von einem modalen Dialog aus ändern (der wird nicht geschlossen, sondern läuft weiter) - aber irgendwie klappen alle Lösungsvorschläge hier im Board nicht.

Wenn ich bspw. im modalen Dialog einen Pointer auf meine Hauptklasse machen möchte scheitert es daran, dass er mir aufgrund des #include <Hauptview.h> in der .cpp des modalen Dialogs einen Compilerfehler bringt:

hauptview.h(34) : error C2143: syntax error : missing ';' before '*'

Wenn ich versuche, mittels Messages wenigstens über einen Umweg die Daten des Hauptframes zu ändern, passiert nichts.

Code:
 GetParentwnd()->SendMessage(WM_SENDEN,55,0);

Die Message ist definitiv richtig deklariert, im Hauptfenster klappt es.

Gibt es noch eine Möglichkeit - oder die richtige - Variablen zu ändern bzw. eine Funktion des parents aufzurufen?
 
Da du nur einen Pointer auf deine Hauptklasse benutzt, sollte auch eine Forwardeklaration á la "class CMeinView;" ausreichen (im Header). In der cpp-Datei den Header wirklich includen. Die Klasse, die er da nicht kennt, deren Header kannst du direkt darüber includen.
 
Irgendwie klappt das nicht...
meine Klasse des modalen Dialoges sieht im Header so aus:
Code:
#if !defined(AFX_PROTMESSEN_H__6434C66A_DE5D_47FB_BC32_5E1FAEFEEB4F__INCLUDED_)
 #define AFX_PROTMESSEN_H__6434C66A_DE5D_47FB_BC32_5E1FAEFEEB4F__INCLUDED_
 
 #if _MSC_VER > 1000
 #pragma once
 #endif // _MSC_VER > 1000
 // ProtMessen.h : Header-Datei
 //
 
 /////////////////////////////////////////////////////////////////////////////
 // Dialogfeld CProtMessen 
 
 class CProtMessen : public CDialog
 {
 // Konstruktion
 public:
 	CProtMessen(CWnd* pParent = NULL);   // Standardkonstruktor
 		CSerialPorte m_port;
 		class CSOFTView* m_www;
 // Dialogfelddaten
 	//{{AFX_DATA(CProtMessen)...
Die CPP-Datei dazu sieht so aus:
Code:
// ProtMessen.cpp: Implementierungsdatei
 //
 #include "stdafx.h"
 #include "SOFT.h"
 #include "ProtMessen.h"
 #include "Windows.h"
 #include "SerialPort2.h"
 #include "SOFTView.h"
 ...
Er meckert beim Compilieren über die SOFTView.h folgendermaßen rum:
von kabsoft\softview.h(34) : error C2143: syntax error : missing ';' before '*'
Code:
#if !defined(AFX_KABSOFTVIEW_H__59D3C335_95AB_4836_BA8F_1BE0EDF2DEF3__INCLUDED_)
 #define AFX_KABSOFTVIEW_H__59D3C335_95AB_4836_BA8F_1BE0EDF2DEF3__INCLUDED_
 
 #if _MSC_VER > 1000
 #pragma once
 #endif // _MSC_VER > 1000
 
 #include "Einstellungen.h"
 
 #include "ProtokollDaten.h"
 #include "ErwEinstellungen.h"
 #include "SerialPort2.h"	// Added by ClassView
 
 
 
 class CKabSOFTView : public CFormView
 {
 protected: // Nur aus Serialisierung erzeugen
 	CKabSOFTView();
 	DECLARE_DYNCREATE(CKabSOFTView)
 
 public:
 	//{{AFX_DATA(CKabSOFTView)
 	enum{ IDD = IDD_KABSOFT_FORM };
 		// HINWEIS: der Klassenassistent fügt an dieser Stelle Datenelemente (Members) ein
 	//}}AFX_DATA
 
 // Attribute
 public:
 	CKabSOFTDoc* GetDocument(); //hier meckert er rum
 ...
Was mache ich falsch?
 
Code:
#if !defined(AFX_KABSOFTVIEW_H__59D3C335_95AB_4836_BA8F_1BE0EDF2DEF3__INCLUDED_)
 #define AFX_KABSOFTVIEW_H__59D3C335_95AB_4836_BA8F_1BE0EDF2DEF3__INCLUDED_
 
 #if _MSC_VER > 1000
 #pragma once
 #endif // _MSC_VER > 1000
 
 #include "Einstellungen.h"
 
 #include "ProtokollDaten.h"
 #include "ErwEinstellungen.h"
 #include "SerialPort2.h"	// Added by ClassView
 
 
 class CKabSOFTDoc; // forward declaration um Klasse für Methodenrückgabetyp bekannt zu machen...
 class CKabSOFTView : public CFormView
 {
 protected: // Nur aus Serialisierung erzeugen
 	CKabSOFTView();
 	DECLARE_DYNCREATE(CKabSOFTView)
 
 public:
 	//{{AFX_DATA(CKabSOFTView)
 	enum{ IDD = IDD_KABSOFT_FORM };
 		// HINWEIS: der Klassenassistent fügt an dieser Stelle Datenelemente (Members) ein
 	//}}AFX_DATA
 
 // Attribute
 public:
 	CKabSOFTDoc* GetDocument(); //hier meckert er jetzt hoffentlich nimmer rum

Gruß


RedWing
 
Super!! :)

Das klappt schon mal, jetzt hab ich aber das Problem, dass mein Programm mit einem
...Anwendung xxxx versucht auf Speicher xxxx zuzugreifen...
abstürzt, sobald ich auf den Pointer zugreife.
Ich habe das so realisiert:
Code:
//In meiner Klasse des modalen Dialogs
   CKabSOFTView* baba=(CKabSOFTView*) FindWindow(NULL,_T("HauptFenstername"));
   baba->m_Anzahl=4;
Wo liegt mein Denkfehler?

--------------------------------------------------------------------------------
Nachtrag:
Habe es jetzt geschafft, nach Stunden in der MSDN:
Code:
CKabSOFTView* baba=(CKabSOFTView*) GetParentOwner(); 
 baba->KabtecSenden(55);
 
Zuletzt bearbeitet:
Zurück