Datenaustausch zwischen zwei Dialogen
-
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.
-
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.
-
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.
-
Es ist eine Ausgabe, die man nachträglich noch editieren können soll, also quasi beides, readonly ist daher nicht erwünscht. Klappt ja nun
Vielen Dank an alle!
-
HerrMaier schrieb:
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.
Also hat er doch am Fokus rumgespielt. Normalerweise hat die Ok-Schaltfläche die 1 und die Cancel-Schaltfläche die 2. Fügt man ein Editfeld hinzu würde es die 3 bekommen und damit wäre das Problem erst gar nicht entstanden.
-
Oder in OnInitDialog, SetFocus auf das Edit Control. SetSel(0,0) und return FALSE!
-
Martin Richter schrieb:
Oder in OnInitDialog, SetFocus auf das Edit Control. SetSel(0,0) und return FALSE!
Wenn er im Ressourcen-Editor kein WS_TABSTOP findet wird er wohl kaum was in OnInitDialog gemacht haben können. Außerdem hat er die Controlvariable gelöscht.
-
AndyDD schrieb:
Martin Richter schrieb:
Oder in OnInitDialog, SetFocus auf das Edit Control. SetSel(0,0) und return FALSE!
Wenn er im Ressourcen-Editor kein WS_TABSTOP findet wird er wohl kaum was in OnInitDialog gemacht haben können. Außerdem hat er die Controlvariable gelöscht.
Ich wollte nur erläutern wie man ohne Markierung den Focus dennoch in ein Edit Control setzen kann.
-
Das mit dem leeren statischen Text erscheint mir nicht als guter Stil, wenns für dich als Hobbymensch ausreicht, lass es so.
Allerdings empfehle ich folgende Methode:
Generell für jedes Element, egal ob Button, Edit, usw immer eine Membervariable anlegen.
Da du in deiner cpp des zweiten Dialogs keine OnInit drin hast, mach eine rein. Füge deiner header unter protected
virtual BOOL OnInitDialog();
hinzu. Dann kopiere folgendes in deine cpp unter den Kommentar CmeinDlg message handlers:
// CmeinDlg message handlers BOOL CmeinDlg::OnInitDialog() { CDialogEx::OnInitDialog(); /* // setz Fokus auf das Eingabefeld m_cedit.SetFocus(); m_cedit.SetSel(0,0); // so wird zwar nichts markiert, allerdings steht der Cursor auf Anfang return FALSE; */ // daher besser: m_cedit.SetFocus(); int length = m_cedit.GetWindowTextLengthW(); m_cedit.SetSel(length, length); // setzt Cursor hinter das letzte Zeichen return FALSE; }
Hab alles angepasst, kannst einfach c&p. Hier spielt deine Tabstop-Einstellungen auch keine Rolle mehr.
Grüße
-
Also, ich verstehe diese ganze Diskussion jetzt nicht so ganz. Wenn man einfach eine Dialogklasse erstellt und im Ressourcen-Editor ein Edit-Control zufügt, der dann ein Member zuweist, dann hat man dieses Verhalten nicht. Der Fokus liegt dann immer auf der Ok-Schaltfläche.