Datenaustausch zwischen zwei Dialogen
-
Hallo,
ich habe eine dialogbasierende MFC-Anwendung und habe meinen Standarddialog in dem ich meine Buttons etc drin habe.
Nun möchte ich durch click auf einen Button einen neuen Dialog öffnen, dem ich die Klasse CmeinDlg zugewiesen habe.
In meiner mainDlg.cpp öffne ich das neue Dialogfenster mittels:
CmeinDlg dlg2; dlg2.DoModal();
In meinem neuen Dialog befindet sich ein CEdit-Feld (m_ausgabe), in das ich gerne die Daten die ich vorher ermittelt habe, automatisch in dem Feld anzeigen lassen.
Versucht habe ich das mit:
CAVSPrevDlg var; var.DoModal(); var.m_ausgabe.SetWindowTextW(meine_ausgabe);
was leider nicht funktioniert.
Kann mir jemand weiterhelfen?
-
Hab da eben etwas durcheinander kopiert, die beiden Codes lauten natürlich:
CmeinDlg dlg2; dlg2.DoModal();
und
CmeinDlg dlg2; dlg2.DoModal(); dlg2.m_ausgabe.SetWindowTextW(meine_ausgabe);
-
Du musst die Daten zuvor zuweisen.
DoModal kehrt erst bei Schließen des Dialoges zurück.Weiße dem Fenster eine Variable zu (mit dem Class-Wizward). Dieser Variable übergibst Du nach Konstruktion des Dialoges Diene Werte.
-
Dem Fenster oder dem CEdit-Feld? Mein CEdit-Feld hat die Membervariable m_ausgabe. Wenn ich es so schreibe:
CmeinDlg dlg2; dlg2.m_ausgabe.SetWindowTextW(_T("hallo")); dlg2.DoModal();
stürzt das Programm ab mit folgendem Fehler: Debug Assertion Failed!
-
Logisch: Weil das Fenster nicht existiert!
Das sagt Dir doch auch der ASSERT. Das Handle ist NULL!Du kannst diesem Child-Windows Ausgabe auch eine Variable zuordnen!
CEdit Controls können bei einem modalen Dialog weder vor DoModal noch nach DoModal benutzt werden. Vor DoModal ist en Edit Control des Dialoges nicht vorhanden, und nach DoModal ist es bereits wieder zerstört.
-
HerrMaier schrieb:
Dem Fenster oder dem CEdit-Feld? Mein CEdit-Feld hat die Membervariable m_ausgabe. Wenn ich es so schreibe:
CmeinDlg dlg2; dlg2.m_ausgabe.SetWindowTextW(_T("hallo")); dlg2.DoModal();
stürzt das Programm ab mit folgendem Fehler: Debug Assertion Failed!
Das muss auch abstürzen, da vor dem Aufruf von DoModal() das Editfeld noch nicht existiert und du ihm damit keine Inhalte zuweisen kannst. Nimm eine Variable vom Typ CString und weise sie dem Editfeld als Member zu. Dann sollte es gehen.
-
Ah ok, super! Funktioniert.
Wenn ich auf den Button klicke, wird der Text in dem neuen Dialolg im CEdit-Feld angezeigt. Eine Sache stört mich da noch:
Der Text wird "markiert" dargestellt, also blau hinterlegt, wie kann ich das ändern?
-
HerrMaier schrieb:
Ah ok, super! Funktioniert.
Wenn ich auf den Button klicke, wird der Text in dem neuen Dialolg im CEdit-Feld angezeigt. Eine Sache stört mich da noch:
Der Text wird "markiert" dargestellt, also blau hinterlegt, wie kann ich das ändern?
Wieso das denn? Sollte nicht sein. Zeig mal wie du das aufrufst...
-
so:
CmeinDlg dlg2; dlg.m_text = _T("hallo"); dlg2.DoModal();
-
Nachtrag:
CmeinDlg dlg2; dlg2.m_text = _T("hallo"); dlg2.DoModal();
-
HerrMaier schrieb:
Nachtrag:
CmeinDlg dlg2; dlg2.m_text = _T("hallo"); dlg2.DoModal();
Davon wird der Textnicht blau hinterlegt. Machst du innerhalb der Dialogklasse was mit der Variablen bzw. mit dem CEdit-Member?
-
Nein, da mach ich nichts damit, in der CmeinDlg.h stehen nur die Variablen drin:
#pragma once #include "afxwin.h" // CmeinDlg dialog class CmeinDlg : public CDialogEx { DECLARE_DYNAMIC(CmeinDlg) public: CmeinDlg(CWnd* pParent = NULL); // standard constructor virtual ~CmeinDlg(); // Dialog Data enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() public: CEdit m_cedit; CString m_text; };
und in der CmeinDlg.cpp hab ich nichts verändert:
// CmeinDlg.cpp : implementation file // #include "stdafx.h" #include "test.h" #include "CmeinDlg.h" #include "afxdialogex.h" // CmeinDlg dialog IMPLEMENT_DYNAMIC(CmeinDlg, CDialogEx) CmeinDlg::CmeinDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmeinDlg::IDD, pParent) { } CmeinDlg::~CmeinDlg() { } void CmeinDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_cedit); DDX_Text(pDX, IDC_EDIT1, m_text); } BEGIN_MESSAGE_MAP(CmeinDlg, CDialogEx) END_MESSAGE_MAP() // CmeinDlg message handlers
in der testDlg.cpp ruf ich sie dann nur durch Button-Klick auf:
void CtestDlg::OnBnClickedOk() { CmeinDlg dlg2; dlg2.m_text = _T("hallo"); dlg2.DoModal(); }
-
Das ist schon komisch. Dafür gibts erst mal keine Erklärung. Was ist wenn du den CEdit-Member wieder entfernst (den brauchst du anscheinend sowieso nicht)?
-
gleiches Problem
-
hat niemand eine Idee?
-
HerrMaier schrieb:
gleiches Problem
Welches Element des Dialoges hat denn beim Erstellen den Fokus? Vermutlich hat dein Editfeld die 1 in der Reihenfolge. Gib mal der Ok-Schlatfläche den ersten Eintrag und dann dürfte es weg sein.
-
hab, die Member-Variable für das CEdit-Feld gelöscht, immer noch.
Wie meinst du das mit der Reihenfolge ändern? In der Header des Dialogs der angezeigt werden soll?
Der Ok-Button befindet sich ja in einem anderen Dialog, in Dialog1, der Text soll ja in Dialog2 angezeigt werden
-
Der Text wird nicht blau hinterlegt wenn er nicht den Focus hat.
Hat Dein Text Control ein WS_TABSTOP?Implizit hat jeder Dialog einen IDOK Button und einen IDCANCEL Button!
Evtl. solltest Du mal ein paar Basics noch lernen...
-
schon klar, allerdings hab ich Dialog2 ok und cancel-Button rausgelöscht und hab nur das CEdit-Feld drin.
wo seh ich das mit dem WS-TABSTOP?
-
In Deinem Ressourcen Editor. In den Eigenschaften.