Wie spreche ich das Hauptdialogfeld an?
-
Hallo!
Habe mal wieder ein Problem mit meinen Dialogen. Ich habe ein Hauptdialogfeld in meiner Anwendung und eine .cpp-Datei, in der ich einige Funktionen ablege. Nun möchte ich eine weitere Funktion dort definieren, die auch auf eine Variable des Hauptfeldes zugreifen muss. Wie kann ich die Variable nun ansprechen, bzw. wie spreche ich das Dialogfeld an? Ich weiß nur, dass der Klassenname CGleitlagerVersion1Dlg ist... Ich hatte überlegt, vielleicht eine get-Funktion in die Klasse des Hauptdialogfeldes einzufügen, aber dann habe ich wieder das Problem, dass diese ja nur auf ein Objekt angewandt werden kann, wenn sie nicht statisch ist.....und von diesem Objekt (das Hauptdialogfeld) kenn ich denn Namen nicht?!?
Bin übrigens absoluter Anfänger in diesem Bereich und hoffe auf Hilfe von euch! Danke schonmal!
-
AfxGetMainWnd hilft dir weiter.
Wirf mal die Suche an nach *AfxGetMainWnd*
-
Also ich habe jetzt in meiner Datei folgendes aufgerufen:
CWnd* dialog = AfxGetMainWnd();
Nun kann ich zwar mit dialog-> auf alle mögichen Methoden zugreifen, aber nicht auf meine eigenen Variablen und Methoden, die ich der Klasse hinzugefügt habe. Ich stelle vielleicht mal den Code hier ein, dann könnt ihr mir vielleicht besser helfen!
GleitlagerVersion1.h
class CGleitlagerVersion1Dlg : public CDialog { // Konstruktion public: CGleitlagerVersion1Dlg(CWnd* pParent = NULL); // Standard-Konstruktor // Dialogfelddaten //{{AFX_DATA(CGleitlagerVersion1Dlg) enum { IDD = IDD_GLEITLAGERVERSION1_DIALOG }; int m_iBetriebsdrehzahl; int m_iLagerbelastung; int m_iUmgebungstemperatur; double m_dWellendurchmesser; double m_dBohrungsdurchmesser; CString m_strWerkstoffLager; CString m_strWerkstoffWelle; double m_dOelviskositaetCP; double m_dOelviskositaetPAS; CString m_strWarnmeldung; //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CGleitlagerVersion1Dlg) protected: virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL // Implementierung protected: HICON m_hIcon; // Generierte Message-Map-Funktionen //{{AFX_MSG(CGleitlagerVersion1Dlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnExit(); afx_msg void OnVorschlagUmgebungstemperatur(); afx_msg void OnOptionCp(); afx_msg void OnOptionPas(); afx_msg void OnVorschlagOelviskositaetCp(); afx_msg void OnVorschlagOelviskositaetPas(); afx_msg void OnOk(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CNeuerWerkstoff m_DialogNeuerWerkstoff; std::vector<double> ergDouble; };
-> Auf die Methoden OnVorschlag... usw. kann ich immer noch nicht zugreifen, ebensowenig wie auf die Variable m_DialogNeuerWekstoff, auf die ich gerne zugreifen möchte. Meine andere Datei, in der die Methode steht, wo ich auf die Variable zugreifen möchte, sieht folgendermaßen aus:
#include "Schnittstellen.h" #include "StringTokenizer.h" int neuenWerkstoffSpeichern() { std::ofstream werkstoffe("Werkstoffe.txt",std::ios::app); CWnd* dialog = AfxGetMainWnd(); // nächster Aufruf funktioniert nicht int length = dialog->m_DialogNeuerWerkstoff.m_strNeuerWerkstoff.GetLength(); werkstoffe.close(); return OK; }
MAYDAY -> KANN MIR JEMAND HELFEN? BIN ZU BLÖD UND VERSTEH ES NICHT!
-
also als aller erstes: Bitte benutze Codetags. (Wie das geht bekommste bestimmt gleich von ESTARTU nen Link)
2. wie sind denn deine Funktionen auf die du zugreifen willst deklariert?
Na??RISCHTISCH protected. und was könnte das heißen?? Dass nicht jede Klasse einfach so drauf zugreifen darf. bevor du jetzt aber einfach aus dem protected ein public machst solltest du dir mal ein paar Grundlegende Sachen zu C++ anschauen. Grundlagen Bücher Tutorials o.ä.
auf deine public variablen kannste mit
dialog.variable
zugreifen!
-
Hm.....hab erst gedacht: Bin ich doof
Aber es funktioniert immer noch nicht! Habe jetzt m_DialogNeuerWerkstoff public deklariert. Nun kann ich aber immer noch nicht mit dem Punktoperator darauf zugreifen. Wenn ich dialog.m_DialogNeuerWerkstoff aufrufe, bekomme ich folgende Fehlermeldung:
error C2228: Der linke Teil von '.m_DialogNeuerWerkstoff' muss eine Klasse/Struktur/Union sein ???? Hab ich denn so ein Brett vorm Kopf?
-
Du musst noch casten.
Quick&Dirty:
CGleitlagerVersion1Dlg* dialog = (CGleitlagerVersion1Dlg*)AfxGetMainWnd();
-
Also es kommt drauf an ob du dynamisch oder statisch castest ob du . oder -> verwendest. falls du das nicht weißt merkst du das ja ziemlich schnell am intellisense (ich hoff ich hab jetzt keinen Scheiß geschrieben) Zeig bitte nochmal schnell den Teil um den es geht sprich die Deklaration und den Aufruf und kennzeichne bitte in welcher Klasse was und vorallem wie deklariert ist.
z.B.
//Klasse 1 public membervariable m_nTest =0;
[Edit] hm zu langsam und scheinbar nichts sagend. Sorry[/Edit]
-
Jaaaaaa, es klappt. Vielen vielen Dank! Ich werde übrigens nicht einfach die Variablen, die ich dort ansprechen will, auf public setzen, sondern habe mir überlegt, Get-Funktionen dafür zu schreiben. Mein Tag ist gerettet
-
Das war soweit schon richtig - wenn es nicht der Castfehler ist, dann wäre das meine nächste Frage gewesen.
Ich fürchte, dass es hier zusätzliche Probleme geben könnte, weil ein Dialog durchgereicht wird, aber das werden wir ja bald sehen.
-
Wenn du Funktionen hast, die mit Membern deiner Klasse arbeiten müssen - warum sind das dann keine Klassenmethoden?
-
@absolute Offtopic hehejo in deiner Signatur darf es nicht an stupid heißen sondern selbstverstänbdlich a stupid!
Sorry für diesen Post!