Problem mit DoDataExchange
-
Hallo zusammen.
Ich habe wahrscheinlich ein kleines Problem mit der o.g. CDialog-Methode. Und zwar wollte ich, nur mal zum Test, einem Textfeld eine Variable "von Hand" zuweisen. Dabei bin ich folgendermaßen vorgegangen:
Im Header:
CEdit myEdit; int m_iTextZahl;In der Quelltextdatei in der Methode DoDataExchange():
DDX_Text(pDX, IDC_MYTEXT, m_iTextZahl);Das Kompilieren funktioniert ja noch, wenn ich den Code allerdings ausführe, dann läuft gleich zu Beginn ein Asseration-Fault auf. Die Datei, die den Assert auslöst, ist eine von Microsoft generierte namens dlgdata.cpp. Die Fehlermeldung lautet dann: no data exchange control with ID TextfeldID.
Wie weise ich denn mein Textfeld auf das Datenaustauschobjekt hin.Danke Euch für's Reinschauen
Gruß
_Bongo
-
Hallo.
Ist die "IDC_MYTEXT" dem Edit Control auch zugewiesen? In der Fehlermeldung steht irgendwas "no data exchange control with ID TextfeldID". Sonst würde er ja irgendwas mit MYTEXT schreiben. Ist außerdem die Variable m_iTextZahl als Member des Edit Controls deklariert?
-
Zitat: Ist die "IDC_MYTEXT" dem Edit Control auch zugewiesen?
Wenn mich nicht alles täuscht, dann werden ID und Control mittels Create-Methode miteinander verbunden. Das habe ich auch getan (Textfeld wird auch angezeigt)
Zitat:Ist außerdem die Variable m_iTextZahl als Member des Edit Controls deklariert?
Habe ich das nicht bereits mit der Zeile:
DDX_Text(pDX, IDC_MYTEXT, m_iTextZahl);getan?
Was kann ich denn da noch vergessen haben? Oder denke ich mit den oben geschreibenen Zeilen falsch?
-
Sorry, hatte ich überlesen. Ja die IDD wird mittels Create() übergeben. Vielleicht postest Du mal die ganze Methode....
-
Existiert das Feld IDC_MYTEXT in der Dialogresource?
Der Fehler in dlgdata.cpp Zeile 43 (oder 44 je nach C++ Version) kommt, wenn zwar der Eintrag im DoDataExchange, aber das Edit-Feld als eigentliche Resource im Dialog gar nicht vorhanden ist. Also erst den Dialog mit allen Elementen zeichnen, dann per Hand die Member-Variablen und Eintrag in DoDataExcange hinzufügen.
Tester2
-
Die ID habe ich den Dialogressourcen bereits zugefügt. Ich poste den ganzen Code morgen mal. Habe alles auf'm Notebook und das hab' ich gerad' nicht dabei.
-
Hier sind die Codezeilen:
Ort: testApp.h
private: CEdit myText; int m_iTest;Methode: OnInitDialog()
Ort: testApp.cppmyText.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, CRect(20, 200, 80, 220), this, 121);Methode: DoDataExchange(CDataExchange* pDX)
Ort: testApp.cppDDX_Text(pDX, IDC_EDIT1, m_iTest); CDialog::DoDataExchange(pDX);
-
Das Einzige, was ich noch vermuten könnte:
Stimmen der letzte Parameter in Create (nID=121) und der Wert für IDC_EDIT1 (in resoure.h) überein???Tester2
-
Ich glaube, da ist noch irgendein Code-Müll von Dir übrig. Ich habe das Szenario mal nachgestellt und bin über eine ähnliche (wenn nicht gleiche) Problematik gefallen.
Ich habe erstmals eine Edit-Control per Hand eingefügt (IDC_MYTEXT) und diesem händisch die DDX-Methode vervollständigt.
Anschließend erzeugte ich ein weiteres Edit-Control, daß ich per Create-Methode dem Dialog hinzufügte.
Bis nun alles OK ... aber jetzt ... als ordnungsliebender Mensch habe ich das Edit-Control, daß ich zuvor per D&D dem Dialog hinzugefügt habe entfernt und siehe da
Error: no data exchange control with ID 0x03ED.
und zwar in dlgdata.cpp
Nun, was ist da passiert!
CDialog::OnInitDialog ruft UpdateData auf und dieses die DDX-Methode Deiner Klasse.
In Deiner (und auch meiner) DDX-Methode weise ich nun m_iTextZahl dem Control mit der ID (IDC_MYTEXT) in der DoDataExchange-Methode zu, EINEM CONTROL, WELCHES ERST SPÄTER IN DER OnInitDialog-Methode ERZEUGT WIRD!!!!!!
Nun, einem Control, daß bis dato noch gar nicht existiert kann auch keine Variable zugewiesen bekommen. Da schimpft die MFC, und zwar mit Recht!
-
An Tester2:
Stimmt - ich habe den falschen ID-Bezeichner (IDC_EDIT1) eingetragen. Allerdings lief derselbe Fehler nach einer Korrektur wieder auf.An ChrisPlusPlus:
Ich habe den Code genau da eingefügt, wo auskommentiert steht: hier Code eintragen. Aber der Lösungsvorschlag hört sich logisch an. Werde das heute Abend mal ausprobieren.
-
Stimmt ChrisPlusPlus,
an die variante habe ich gar nicht gedacht.Tester2
-
Bin Deinem Vorschlag mal nachgegangen und habe den Aufruf der Create-Methode vor den Aufruf von InitDialog der Basisklasse geschoben. Hat funktioniert - Danke.
Gruß
Bongo