Zugriff auf Member geht net, aber warum ??
-
Hallo,
ich schreib gerade eine Anwendung und habe dabei ein merkwürdiges Problem.
In einem Dialog gibt es ein Textfeld. Dies ist mit der Klassenvariablem m_Spieler1 verknüpft.
Wenn ich den Inhalt setzen will kommt die Fehlermeldung
„Unbehandelte Ausnahme „ und der Debugger steht in der ATLSIMPSTR.H
in der Zeile
ASSERT(::IsWindow(m_hWnd));Was soll mir das sagen ??
Dies ist die Funktion
int CAtomServer10Dlg::SpielerAnzeigen(int SpielerNr, CString Name)
{
if (SpielerNr ==1)
{
m_Spieler1.SetString("Fritz"); <- Fehlerverursachende Zeile
}
UpdateData(FALSE);
return 0;
}In dieser Funktion funktionierts wie es soll, Fritz wird im Dialog angezeigt.
// Nachricht an einen bestimmten Mitspieler senden
int CAtomServer10Dlg::NachrichtSenden(int Spieler, char *message)
{m_Spieler1.SetString("Fritz");
UpdateData(FALSE);return 0;
}Die Klasse CatomServer10Dlg ist von CDialog abgeleitet.
CString m_Spieler1; ist im Abschnitt public definiert.Irgendwie habe ich gerade Knoten in meinen Gedanken und komme nicht weiter.
Warum ist meine Membervariable nicht da ?? Oder fehlt mir ein Zeiger auf mein Fenster ???
-
Das assert sagt nicht das die varaible nicht verfuegbar ist sondern das das element worauf die variable zeigt noch nicht konstruiert und erstellt wurde
ich vermute die verknuepfung zu dem dialog element {ueber die ID} ist nicht richtig
-
Danke für die Antwort,
die Dialog ID ist richtig, wird vom Debugger ( beim Asser) mit dem richtigem Wert ausgegeben.
-
dann pruefe halt das element obs shcon erstellt wurde
ich vermute weiterhin das du den wert aendern moechtest bevor das fenster fertig erzeugt wurde
amsonsten versuch maCEdit *tst = static_cast<CEdit *>(this->GetDlgItem(ID_BLA)); if(tst) tst->SetString(_T("Fasel"));evtl war das DDX noch nicht gueltig
-
1. Warum this-> ?
2. SetString ist kein (mir bekannter) Member von CEdit!
-
1. ist so ne angewohnheit wenn ich auf dialogelemente der eigenen klasse zugreif, koennte auch weg ich weiss
2. mag sein, ich hab nur ein control geraten da oben was von nem textfeld stand, dann hab ich SetText einfach uebernommen - muss nicht stimmen
-
So ich hab das mal so geändert
CStatic *tst = (CStatic
GetDlgItem(IDC_SPIELER1);statt der Zuweisung über die Member
dann passiert dies:
Unbehandelte Ausnahme bei 0x0056341a in AtomServer10.exe:
0xC0000005: Zugriffsverletzung-Leseposition 0x0000001c.CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd));
-
1. nimm besser static_cast wen du schon cpp proggst
2. hast du den zeiger geprueft ob er gueltig ist bevor du ihn benutzt ?
3. das es bei GetDlgItem meckert ist eigentlich ein gutes zeichen dass das element nicht verfuegbar ist ?!
-
Seiteneffekt ??
Also ich hab das noch mal probiert.
Die beiden Funktionen werden unterschiedlich aufgerufen.
Die Funktion, wo es mit dem Zugriff auf die Membervariable klappt, wird über einen Button aufgerufen.
Die andere Funktion wird aus einer anderen Klasse aufgerufen.
Diese andere Klasse ist eine Ableitung von CasyncSocket.
Und da ich Socket Verbingen für bis zu 6 Rechner brauch, habe ich dafür ein statisches Klassenarray [6] angelegt. Kommt nun eine bestimmte Zeichenkette in der OnReceive an, so wird diese an die Dialogklasse weitergegeben und in der Dialogklasse ausgewertet. Steht ein bestimmter Inhalt in der Zeichenkette, wird die Funktion, die jetzt das Problem macht, aufgerufen.
Fehlt mir eine Verbindung von einer der Klassen im Array zum Dialog ??
Und wie müsste die aussehen ??
Und gleich noch eine Frage. In meiner Socketklasse sind Behandlungsfunktionen drin, wie aber kann ich jetzt ermitteln, ob ich quasi in der 1 oder 2 oder 3 Instanz meiner Klasse bin ??
Testweise hatte ich jetzt einfach mal die problemfunktion auch stupid über einen Button aufgerufen und das funktioniert problemlos .
Aber ich bin jetzt ratlos.