Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Memeber-Variablen: Datenaustausch zwischen 2 CDialog-Klassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
13.10.2004, 12:44 Uhr
Torsten Eberhardt



Hallo,
ich habe folgende Problem:
In einer Dialog-Anwendung (Klasse CWin0000Dlg, abgeleitet von CDialog) soll über ein Menü ein modales Dialogfeld (Klasse CDialog1, abgeleitet von CDialog) zur Einstellung von Werten aufgerufen werden. Wie kann ich nach Eingabe der Werte im aufgerufenen Dialogfeld (CDialog1) die in den Member-Variablen übergebenen Werte in der anderen Klasse (CDialog) auswerten bzw. evtl. auch verändern?!

Mfg,
T. Eberhardt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.10.2004, 13:38 Uhr
xXx
Devil


Wenn du wissen willst wie man auf die Variablen aus dem ersten Dialog in dem zweiten Dialog zugreifen kann, dann funktionier das so:

Zuerst muss du den Namen der Variable aus dem ersten Dialog in den zweiten einfügen das geht in dem du in dem Header des Dialogs das folgende eingibst:

Code:

// Unter
public:
        // darunter muss du zu den aufgelisteten Variablen noch die aus dem Dialog eins  
        // einfügen; Beispiel anhand eines Edit Feldes:
        CString m_Edit1;



Jetzt müssen sie noch den Header aus Dialog 1 in den 2. Dialog einbinden.
Und das selbe umgekehrt.

Dann muss man in der OnInitDialog() - Funktion von dem ersten Dialog noch den folgenden Code eingeben, denn Code musst du auf deine Variablen abändern.

Code:

UpdateData(TRUE);
((CWizardSheet*)GetParent())->m_Edit1 = m_Edit1;
UpdateData(FALSE);



In Dialog 2 in die OnInitDialog() - Funktion den folgenden Code:

Code:

UpdateData(TRUE);
CString m_Edit1;
m_Edit1 = ((CWizardSheet*)GetParent())->m_Edit1;
UpdateData(FALSE);



Jetzt ist in Dialog 2 auch auf die Variable m_Edit1 zugreifbar!!!

Das hab ich nur zum Teil getestet, sollte aber funktionieren.

Dieser Post wurde am 13.10.2004 um 13:39 Uhr von xXx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.10.2004, 14:58 Uhr
~Wahnsinnig
Gast


Hi,

ich würde gerne diese Vorgehensweise auch in Zusammenhang mit einer SDI Form bringen. SO, das ich dort auch eine variable zwischen zwei Dialogen austausche. Leider geht das, wie xXx gemacht hat nicht. Gibt ein Access voilation. Oder hab ich was falsch gemacht?
Anstatt CWizardSheet klasse habe ich dann die jeweilige Dialog Klasse eingesetzt.

Vielen Dank für nen Tip
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.10.2004, 15:31 Uhr
xXx
Devil


Du hast eigenlich alles richtig gemacht:
CWizardsheet = CDeinAnwendungname
CWizardSheet1 = CDein1.Dialog
CWizardSheet2 = CDein2.Dialog

bei mir hats funktioniert!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.10.2004, 19:40 Uhr
~Wahnsinnig
Gast


Hi xXx,

danke fürs ausprobieren. Wäre echt ein Traum, wenn das bei mir so funktionieren würde, wie bei dir.

Aber wenn ich das ablaufen lasse. bekomme ich immer access violation!!
Ich habe eine SDI from, aus dem View rufe ich dann meinen Hauptdialog auf. Bzw. ich lasse Ihn direkt beim Start im CView::PreCreateWindow(cs); starten. Evlt. liegt da auch der Fheler??
Jedenfalls habe ich dann noch einen Dialog, der mit doModal auch in View aufgerufen wird. Habe beiden Dialogen nun eine globale variable hinzu gefügt. (FlagII)
Jetzt habe ich das in Oninitial vom hauptdialog.


Code:

UpdateData(TRUE);
    ((CHandControl*)GetParent())->m_FlagII = m_FlagII;
    UpdateData(FALSE);



und das


Code:

UpdateData(TRUE);
int m_FlagII;
m_FlagII = ((CMainDlgII*)GetParent())->m_FlagII;
UpdateData(FALSE);



in meinem andren Dialog in einer Funktion in OnButton().

und nun, wenn ich es ausführe, kommt der Fehler access violation, wenn ich dieses OnClicked Ereignis auslöse.
wäre Wirklich super nett, wenn du da nen Idee hättest was ich falsch mache.
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.10.2004, 14:25 Uhr
Spacelord
Hoffnungsloser Fall


Das Ganze ist ansich eine eher bescheidene Lösung.
Ein anderer Lösungsansatz wäre folgender:
Du legst eine Klasse an die alle Daten die der Dialog erfassen soll als Attribut enthält.
Du überschreibst die OnOK Methode deines Dialogs dahingehend dass du eine weitere Memberfunktion aufrufst,die die Daten aus dem Dialog in den Membern einer Instanz der Datenklasse speichert,und diese Instanz dann per WM_COPYDATA an ein beliebiges CWnd Objekt verschickt. Diese Windowklasse muss dann auf WM_COPYDATA reagieren und kann die Daten weiterverarbeiten.

Ist aber nur so ne Idee...

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.10.2004, 14:32 Uhr
~Wahnsinnig
Gast


HI Spacelord

danke für den Tip werde mir das gleich mal anschauen. Ich habe auch noch eine andere Möglichkeit gefunden über extern. Klappt bei mir aber irgendwie nicht.


6.2: How do I share a global variable among my .CPP files? (top)
First, in one of your .CPP files (and only one) declare the variable at global scope (that is, outside of all function and class definitions). For example:
int g_volume;
Then in a header file that is included in all .CPP files - such as stdafx.h - add an extern declaration:
extern int g_volume;
The extern keyword tells the compiler that g_volume is an int declared in some other .CPP file. If you forget the first step, the linker will give an unresolved external error.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.10.2004, 14:53 Uhr
Spacelord
Hoffnungsloser Fall


Mit den globalen Variablen solltest du einfach wieder vergessen....
Die Lösung die ich oben vorgeschlagen habe hat einen Vorteil:Eine geringere Kopplung!
d.h die eine Klasse ist nicht zwangsweise auf die andere angewiesen.Die Instanz des Dialogs wäre nicht darauf angewiesen dass ein anderes CWnd Objekt existiert und anders rum muss das andere CWnd Objekt nicht zwangsläufig auf WM_COPYDATA reagieren.
Beide Klassen wären eventuell in einem anderen Zusammenhang einzeln wiederverwendbar.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.10.2004, 09:05 Uhr
~Wahnsinnig
Gast


Morgen Spacelord,

ich habe mich mal deinem Vorschlag mit WM_COPYDATA zugewand, leider klappt es nicht so richtig. Kenn mich mit SendMessage und so auch leider nicht so aus, evtl. kannst du mir da ja einen Tip geben.


C++:

void CklasseDlg1::OnStart()
{
CString strWindowTitel = _T("Dialog");//Name des anderen Fensters
    CString strDataToSend = _T("Hallo");

    CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitel );
    COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = strDataToSend.GetLength();
    cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
    pOtherWnd->SendMessage(WM_COPYDATA, (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(), (LPARAM)&cpd);
    strDataToSend.ReleaseBuffer();
}


BOOL CklasseDlg2::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    CString strReceivedText = (LPCSTR)(pCopyDataStruct->lpData);
    return CMainDlgII::OnCopyData(pWnd, pCopyDataStruct);
}




Diesen Code habe ich aus dem Netz und versuche Ihn ans Laufen zu bekommen. Es funktioniert auch ohne Fehler, bekomme aber auch keinen Aufruf. So richtig verstehe ich die Sache auch nicht nach dem SendMessage ...
Kannst du mir da helfen die Übersicht zu bekommen?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.10.2004, 09:44 Uhr
~Spacelord
Gast


Hast du in die Message Map deines "empfangenden" Dialogs WM_COPYDATA mit deiner Methode "verknüpft"?

MfG Spacelord
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: