Datenaustausch zwischen zwei Dialogen


  • Mod

    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!


  • Mod

    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


  • Mod

    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?


  • Mod

    In Deinem Ressourcen Editor. In den Eigenschaften.



  • Ah ok, habs. Da ich nur das CEdit-Feld drin hatte, war der natürlich als Fokus.

    Hab ein static-text hinzugefügt und in den properties tabstop true, wenn tabstop meines cedit feldes false ist, funktionierts.


  • Mod

    Ist das nun eine Eingabe? Dann solltest Du auch die Selektion erlauben.
    Ist das nur eine Ausgabe, dann solltest Du ES_READONLY setzen.

    Dann musst Du auch mit WS_TABSTOP nicht rumspielen.


Anmelden zum Antworten