Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
21.11.2005, 15:59
felekchris



hallo,

ich habe schon wieder ein kleines Problem, diesmal mit MFC.

In meiner Anwendung habe ich ein Hauptdialogdfenster (A), welches wiederrum ein anderes Dialogfenster beinhaltet. sagen wir (B) (wird über Menu aufgerufen).
Jedes Dialogfenster ist als eigene Klasse implemetiert, in dem Dialogfenster (B) habe ich ein Eingabefeld und ein eine Methode die diesen Wert zurückliefert.
Meine Frage ist :ich wie komme an die Werte, die dem Dialog (B) übergeben wurden, in meinem Dialog (A) ran?. Ist etwa der Ausdruck CDialog:EndDialog(0) daran Schuld, dass ich kein Ergebnis bekomme?

Dialog (B)

int dialogClasse::getEinsatz(){

return str;
}

void dialogClasse::OnSetEinsatz()
{
str = m_einsatz; //m_einsatz ist das Eingabefeld im Dialog(B)
CDialog::EndDialog(0);

}

Dialog (A)

dialogClass dlg;
int result = dlg.getEinsatz();
if(!result)....

an dieser Stelle ist die Variable "result" nicht mit dem eingegeben Wert belegt.
p.s.
Die Anwendung wurde ohne Doc/View Unterstützung erstellt.

Vielen Dank

--

zum Seitenanfang zum Seitenende Profil || Suche
001
21.11.2005, 16:40
Kriz



Hm, ich sehe schon... Da mangelt's an allem ;)

Also fangen wir erstmal hier an: Es gibt einerseits die Komponenten (CEdit, CStatic, CWasweißich) und andererseits die Variablen, die die Werte der Komponenten verwalten. Beispielsweise bei einem CEdit Textfeld gibt es einerseits eine Variable für das CEDit selber (z.B. m_edit) und eine Variable, die den String des Textfeldes beinhaltet (z.B. m_strEdit). Wenn du nun m_strEdit = "Trullalla"; schreibst und willst, daß dieser neue String im Textfeld erscheint, mußt du z.B. schreiben:
Quellcode:void TextSetzen(const char *str)
{
    if(str) m_edit.SetWindowText(str); // Neuen String setzen
    UpdateData(FALSE); // Zauberfunktion zum Updaten :)
}
Um nun den String aus einem CEdit in m_strEdit zu speichern, mußt du folgendes machen (ich gehe mal davon aus, daß m_strEdit ein CString Objekt ist):
Quellcode:void TextHolen()
{
    UpdateData(TRUE); // Aktuelle Dialoginhalte auffrischen
    m_edit.GetWindowText(m_strEdit); // String holen
}
Hier ist das Schlagwort also UpdateData() für Komponenten-Datenaustausch. Das setzt aber voraus, daß dein Dialog den sogenannten DDX Mechanismus implementiert hat. DDX (Direct Data Exchange) muß vorhanden sein, wenn du Werte via UpdateData() aktualisieren möchtest. Wenn du einen Dialog vom Assistenten (VisualC++/Studio) erstellen läßt, wird DDX automatisch implementiert.

So, nun zum zweiten Teil: Ich glaube, du hast die Prinzipien der objektorientierten Programmierung mit C++ nicht so ganz gerafft. Das zeigt mir nämlich dein Code bzw. deine Versuche, Daten zwischen Dialogen auszutauschen. Deine Klasse B (also der Dialog, der vom Dialog A aufgerufen wird), kann auf zwei Arten seine Daten "verfügbar" machen. Erstens: Alle Membervariablen von Dialog B sind public deklariert oder zweitens: Für jede Membervariable von Dialog B gibt es eine public Methode zum Setzen und Holen des jeweiligen Variablenwerts. Erstere Methode ist zwar einfach und schön, widerspricht aber dem objektorientierten Dogma der Objektkapselung. Wenn alle Membervariablen public sind, kann Dialog A bequem über das Dialog B Objekt auf dessen Variablen zugreifen:
Quellcode:DialogB m_dlgB;
// ...
m_dlgB.m_edit.SetWindowText("Neuer Text");
Die zweite Methode ist die, die der Objektorientierung nahesteht. Die Variablen werden als protected oder private deklariert und nur die Get/Set Methoden erlauben den jeweiligen Zugriff auf sie. Zwar gibt es einige Leute, die dem Irrglauben unterliegen, Get/Set Methoden sind Schmarrn, laß dich davon aber nicht beeinflussen (die Alternative sind Combomethoden, die alles in einem erledigen, was aber nicht immer geht... tja):
Quellcode:DialogB m_dlgB;
// ...
m_dlgB.GetTextField().SetWindowText("Neuer Text");

CEdit& DialogB::GetTextField()
{
    return m_edit;
}
Du mußt also in Dialog B Methoden definieren, die den Zugriff auf dessen Membervariablen regeln. Nur so kannst du Daten aus Dialog B nach Dialog A "importieren" und umgekehrt.

Zur allgemeinen Sache rate ich dir: Erstmal C++ richtig verstehen, dann Windows programmieren. Zum Thema MFC empfehle ich dir daher noch die MFC-Bibel "Windowsprogrammierung mit MFC" von Jeff Prosise (MicrosoftPress Verlag).

Hau rein!

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
002
21.11.2005, 17:05
felekchris



hallo Kriz,

die Lösung des Problems ist sogar einfacher als ich vermutet habe. Ich habe einen groben Fehler begangen, indem ich das Dialogfenster lokal aufrufe, somit kann ich gar nicht an die Variablen rankommen.

dialogClasse dlg;
dlg.DoModal();

anstatt

dialogClasse dlg;
if(dlg.DoModal()==IDOK)
{ ...}

Nichtsdestotrotz vielen dank für Deine ausführliche Anleitung.

felix christian

--

zum Seitenanfang zum Seitenende Profil || Suche