Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » TabControl & Member Variable

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
31.10.2006, 12:13 Uhr
CppProgrammer



Hallo
Ich hab einen Dialog1 (main dlg) in dem ich ein TabControl eingebaut habe, das einen Dialog2 zeigt.
Wie kann ich jetzt mit einem Klick auf einen Button von Dialog1 auf eine MemberVariable aus Dialog2 zugreifen?
Mein Code sieht bis jetzt so aus:

C++:
void CDialog1::OnButton1()
{
    
    CWnd* pWnd = m_ctlCustomTab.GetSSLPage(0);
    CDialog2* dlg = (CDialog2*)pWnd;
    dlg->m_ctlCustomRichEdit.AddText("TEST");
    
}


Er lässt sich fehlerfrei kompilieren, beim Ausführen des Programms stürzt das ganze allerdings ab. Wie kann man das zum Laufen bringen?

Dieser Post wurde am 31.10.2006 um 12:14 Uhr von CppProgrammer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.10.2006, 13:44 Uhr
www.pat



vielleicht hilft das dir weiter:


C++:
CForm1 *pForm1 = new CForm1();
pForm1->m_ctlCustomRichEdit.AddText("TEST");



aus meinem Thread:
hier klicken

siehe Kommentar von LowFly

Dieser Post wurde am 31.10.2006 um 13:50 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.10.2006, 14:20 Uhr
LowFly



#include die header des Dialog2 in Dialog1.cpp unterhalb Dialog1.h

in der jeweiligen function wo du zugriff auf die Membervariable haben willst schreibst du

CDialog2 *pDlg = new CDialog2();
CString sStr = pDlg->MemberVariable;

oder ohne zeiger

CDialog2 Dlg;
CString sStr = pDlg.MemberVariable;

die Variable sollte aber unter public deklariert sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.11.2006, 05:02 Uhr
CppProgrammer



Also ich hab das jetzt mit den Headern so gemacht und auch nochmal überprüft ob die MemberVariablen auch wirklich als public deklariert sind. Es sollte eigentlich alles stimmen.
Trotzdem funktioniert es nur wenn ich über das pWnd zugreife, wenn ich aber auf irgendwas aus dlg (welchem ich pWnd zugewiesen habe) zugreife dann stürzt das ganze ab.

C++:
void CDialog1::OnButton1()
{
    CWnd* pWnd = m_ctlTab.GetSSLPage(0);
    CDialog2* dlg = new CDialog2(pWnd);
    pWnd->SetDlgItemText(IDC_EDIT, "TEST"); // Funktioniert ohne Probleme
    dlg->m_ctlCheck.SetCheck(1); // Funktioniert NICHT (bringt das Programm zum Absturz)
}


Wo liegt der Fehler?

Dieser Post wurde am 01.11.2006 um 05:04 Uhr von CppProgrammer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.11.2006, 09:40 Uhr
LowFly



hmm,
halt moment, hab dich da falsch verstanden. Du kannst so (CDialog2* dlg = new CDialog2(); bzw. CDialog2 dlg; ) nur auf Variable zugreifen.

Funktionen kannst du so nicht ansprechen.

du könntest es über PostMessage o. SendMessage probieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.11.2006, 10:03 Uhr
mmc20
puss in boots



Zitat von CppProgrammer:


C++:
void CDialog1::OnButton1()
{
    CWnd* pWnd = m_ctlTab.GetSSLPage(0);
    CDialog2* dlg = new CDialog2(pWnd);
    pWnd->SetDlgItemText(IDC_EDIT, "TEST"); // Funktioniert ohne Probleme
    dlg->m_ctlCheck.SetCheck(1); // Funktioniert NICHT (bringt das Programm zum Absturz)
}




das das mit dem "dlg->m_ctlCheck.SetCheck(1);" nicht funktioniert wundert mich garnicht, denn du nimmst da zugriff auf einen nicht initialisierten dialog. ich glaube auch nicht das du den dialog2 "noch einmal" anlegen willst ?!
mit "pWnd->m_ctlCheck.SetCheck(1);" sollte es allerdings funktionieren.

@LowFly
warum sollte man keine functionen ansprechen können ?!

mit solchen zugriffen sollte man aber immer vorsichtig sein, da die zwei dialoge (mainDlg, tabDlg) in unterschlidlichen threads laufen (CDialog2 ist ja nonmodal) sollte man das ganze noch threadsicher machen, oder gleich alles über messages.

Dieser Post wurde am 01.11.2006 um 10:07 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.11.2006, 10:06 Uhr
CppProgrammer



Naja diese ganzen Versuche hatten eigentlich genau das zum Sinn und Zweck der Sache. Mein eigentliches Programm ist ein ChatClient welcher mehrere ChatRooms auf die Tabs verteilt. Ich hab also einen MainDialog der die Tabs und den Socket (Verbindung zum Server) und den ganzen Kram hält, und einen zweiten ChannelDialog, der entsprechend oft in den Tabs geöffnet wird. Um erstmal den richtigen Tab/ChannelDialog zu kriegen muss ich mit dem pWnd anfangen (CWnd* pWnd = m_ctlTab.GetSSLPage(0)). Mein eigentliches Problem ist es jetzt dass ich irgendwie die Memberfunktion von der ControlVariable des RichEdit Feldes (vom ChannelDialog) ansprechen muss, um dem entsprechenden RichEdit Feld den dazugehörigen Text hinzuzufügen (m_ctlRichEdit.AddText("bla bla...")). Ich müsste das ganze über diese MemberFunktion machen, da sie auch weitere Parameter wie zB Farbe, Fett, Unterstrichen, ... hat welche ja ziemlich nützlich für einen Chat sind. Wie könnte ich dieses Problem jetzt am besten lösen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.11.2006, 10:12 Uhr
mmc20
puss in boots


stell sicher das die m_ctlRichEdit public ist, dann kannst du auch mit "pWnd->m_ctlRichEdit.AddText("bla bla...")" daraufzugreifen.

du musst natürlich den pWnd noch auf dein CDialog2 casten...

C++:
void CDialog1::OnButton1()
{
    CDialog2* pDlg = (CDialog2*)m_ctlTab.GetSSLPage(0);
    pDlg->m_ctlRichEdit.AddText("bla bla...");
}


Dieser Post wurde am 01.11.2006 um 10:15 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.11.2006, 10:12 Uhr
CppProgrammer



@mmc20

C++:
void CDialog1::OnButton1()
{
    CWnd* pWnd = m_ctlTab.GetSSLPage(0);
    CDialog2 *dlg = new CDialog2(pWnd);
    pWnd->SetDlgItemText(IDC_EDIT, "TEST");
    pWnd->m_ctlCheck.SetCheck(1); // Kompiler Error
}


error C2039: 'm_ctlCheck' : is not a member of 'CWnd' see declaration of 'CWnd'
error C2228: left of '.SetCheck' must have class/struct/union type


Zitat:

du musst natürlich den pWnd noch auf dein CDialog2 casten...


Wie geht das denn? Hab bei sowas noch wenig Erfahrung...

Dieser Post wurde am 01.11.2006 um 10:18 Uhr von CppProgrammer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.11.2006, 10:20 Uhr
mmc20
puss in boots


[siehe post 007]
Dieser Post wurde am 01.11.2006 um 10:20 Uhr von mmc20 editiert.
 
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: