Texteingabe mit CString ?
-
Also ich habe mir einen Button erstellt, der eine Dialogbox öffnet in der sich ein Eingabefeld befindet.
Ich möchte nun gerne den Inhalt Speichern um ihn anschließend in der OnPaint von ChildView verwenden zu können.
Es handelt sich um ein STI Fenster.Ich bin wie folgt vorgegangen:
Ich habe zunächst dem Dialogfeld eine Variable zugewisen
Das sieht dann in der Dialog Klasse wie folgt aus:
public: CDlgTEXT_EINGABE(CWnd* pParent = NULL); // Standardkonstruktor // Dialogfelddaten //{{AFX_DATA(CDlgTEXT_EINGABE) enum { IDD = IDD_TEXT_EINGABE }; CString m_text_eingabe; //für Text Speichern //}}AFX_DATANun hab ich in der ChildView eine ähnliche Variable public deklariert.
// Implementierung public: CString textEingabe; //Text Speichern virtual ~CChildView();Der Funktion für den Button befindet sich in der Main Frame
Dort schiebe ich den Inhalt von der einen Variable in die andere:void CMainFrame::OnButtonTexteingabe() { CDlgTEXT_EINGABE dlg; if (dlg.DoModal() == IDOK) { m_wndView.textEingabe= dlg.m_text_eingabe; } }Wenn ich jetzt mein Programm ausführe und sich die dialogbox öffne und einen Text zur laufzeit eingebe, stürtzt das Programm zur laufzeit ab.
Hab ich einen Denkfehler gemacht?
Oder ist CString der falsche um Texteingabe zu speichern?
-
Und wo stürzt es ab?
Alles was ich soweit sehen kann ist richtig!
-
ich vermute mal das du den text aus dem control liest erst wenn du danach fragst
das problem ist, das edit control wurde nach dem IDOK schon zerstoertmachs am besten so das die variable "m_text_eingabe" geschrieben wird bevor das OK ausgefuehrt wird
alsovoid Blabla::OnOk() { this->GetDlgItemText(IDC_EDIT, m_text_eingabe); CWnd::OnOk(); }
-
Das Programm ist zur Laufzeit abgestürtzt, wenn ich etwas in die dialogbox eingeben habe und ok eingeben habe.
Aber ich hab den Fehler gefunden

ich habe im ChildView Konstruktor vergessen die String Variable mit einem standartwert zu initalisieren.
CChildView::CChildView() { textEingabe = _T(""); }da diese Zuweisung Fehlte und beim anderen CString
CDlgTEXT_EINGABE::CDlgTEXT_EINGABE(CWnd* pParent /*=NULL*/) : CDialog(CDlgTEXT_EINGABE::IDD, pParent) { //{{AFX_DATA_INIT(CDlgTEXT_EINGABE) m_text_eingabe = _T(""); //}}AFX_DATA_INIT }gemacht wurde crashte das Programm offenbar wenn ich
in der OnButtonTexteingabem_wndView.textEingabe= dlg.m_text_eingabe; //Weitergabe desmache.
-
1. Das kann nie und nimmer die Ursache sein für einen Crash. Ein CString wird automatisch mit einem leeren String initialisiert.
2. Dein Code initialisiert CString zweimal!
Besser:
CChildView::CChildView()
: textEingabe(_T(""))
{
}