ComboBox Werte auslesen schlägt fehl



  • Hallo,

    ich verwende eine SDI-Projekt. Aus der CDB1Dlg-Klasse heraus versuche ich auszulesen, welche Auswahl der Bediener über das Kombo-Feld getroffen hat.

    [cpp]
    void CDB1Dlg::OnCbnSelchangeCombostation()
    {
    int choice;
    // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    UpdateData(TRUE);
    choice=m_ComboDialog.GetCurSel();

    Anschliessend stürzt das Programm mit dieser Fehlermeldung ab:

    Debug Assertion Failed
    File afxwin2.inl
    Line: 732
    For information on how your programm can cause an assertion failure,
    see the Visual C++ documentation on asserts
    Unbehandelte Ausnahme bei 0x7c29215 (mfc71d.dll) in DBX.exe: Benutzerhaltepunkt

    Kurz gesagt, immer wenn ich eine Methode der CComboBox aufrufe stürzt das Programm ab.

    Kann mir jemand weiterhelfen.



  • Kann es sein, dass du Visual C++ mmit der MFC verwendest?
    wenn ja, falsches Forum..
    du wirst verschoben sobald ein moderator auftaucht



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn du eine Membervariable über den Assitenten anlegts, wird der Werte der Auswahl nach UpdateData(TRUE) an diese Variable übergeben.
    Andere Möglichkeit: Du fängst das Event ab, wenn sich die Combo Box schliesst.
    z.B. 'OnCloseupComboBox' hier kannst du dann über ein zugewiesenes Control für die ComboBox den ausgewählten Wert mit 'SetCurSelection() abfragen.



  • SelChange ist da besser, denn man kann ja auch mit den Pfeiltasten die Auswahl ändern. 😉
    Da du einen ASSERT bekommst, tippe ich darauf, dass das Fenster nicht existiert - wieso auch immer. Drück mal Wiederholen und zeig wo du landest.
    Du kannst auch da nochmal lesen, wie man solche Fehler sucht. 🙂



  • Danke für die schnelle Antwort.

    Ich habe es jetzt auch mal mit CDB1Dlg::OnCbnCloseupCombi() versucht. Wenn m_ComboDialog.GetCurSel() aufgerufen wird, gibts wieder den Absturz. Drücke ich auf Wiederholen, kommt diese Meldung:

    Unbehandelte Ausnahme bei 0x7c29215b (mfc71.dll) in DBX.exe:
    Benutzerhaltepunkt.

    Wahrscheinlich existiert wirklich ein benötigtes Fenster nicht. Aber welches ? Ich habe eigentlich nur über die Ressourcenansicht einen neuen Dialog IDD_DB1_DLG eingefügt. Über den lasse ich den Bediener mit einem EditControl-Textfeld eine Fahrzeugnummer eingeben und mit der Kombo-Box im gleichen Menü soll er einen bestimmten Stations-Typen eingeben. (Dieser Dialog ist keiner Klasse zugeordnet). Der Zugriff auf die Fahrzeugnummer funktioniert einwandfrei mit:
    [cpp]
    BOOL CDB1Doc::OnNewDocument()
    {
    m_dlg.DoModal();
    vin.Format("'%s'",m_dlg.m_strVin);
    .....
    }
    Die Sache mit der Kombo-Box bringt mich noch zur Verzweiflung.

    Wißt Ihr vielleicht noch einen Rat ?



  • Hier läuft grundsätzlich was schief.
    Ich habe jetzt zum Austesten ein neues Project angelegt:

    Vorgehensweise:
    -SDI-Project anlegen (MFC-Anwendung)

    -Anwendungstyp: Einfaches Dokument (alle anderen Einstellungen auf Standard)

    -der MFC-Anwendungsassistent generiert CTestView,CTestApp,CTestDoc,CMainFrame

    -über die Ressourcenansicht Ressource hinzugefügt nämlich ein neuer Dialog mit dem Namen IDD_TEST

    -mit dem Klassenassistenten eine neue Klasse namens CTestDlg erstellt. Basisklasse ist CDialog

    -ComboBox mit der Toolbox auf den Dialog IDD_TEST gezogen.

    -in CTestView.h enum {IDD=IDD_DIALOG} in enum {IDD=IDD_TEST} geändert

    -zurück zur Klassenansicht. Eine Objektvariable in CTestDoc namens m_dlg vom Typ CTestDlg angelegt, um aus der CTestDoc auf die Methoden in CTestDlg zugreifen zu können.

    -eine Objektvariable in CTestDoc namens m_combo vom Typ CComboBox erzeugt.

    -In CTestDoc::OnNewDocument m_dlg.DoModal() aufgerufen um das Dialogfeld IDD_TEST anzuzeigen. (funktioniert noch)

    -In CTestDoc::OnNewDocument m_combo.GetCurSel() aufgerufen.

    -Compilierung erfolgreich. Programm stürzt ab mit der u.a. Fehlermeldung.



  • Was hab ich nur vergessen bzw. falsch gemacht.

    Ich brauch jetzt wirklich dringend Verstärkung. Was läuft hier schief.



  • Was hab ich nur vergessen bzw. falsch gemacht.

    Ich brauch jetzt wirklich dringend Verstärkung. Was läuft hier schief.



  • -In CTestDoc::OnNewDocument m_dlg.DoModal() aufgerufen um das Dialogfeld IDD_TEST anzuzeigen. (funktioniert noch)

    -In CTestDoc::OnNewDocument m_combo.GetCurSel() aufgerufen.

    Setz mal spaßeshalber auf die Zeile mit DoModal nen Breakpoint (F9), Starte (F5) und wenn du aufläufst, drück F10 (Step).
    Dann überleg mal, was ich 07:26:01 geschrieben hatte. 😉



  • Hallo estartu,

    schön, dass Du mir hilfst.
    Ich hab jetzt den Breakpoint auf die Zeile DoModal gesetzt, bin mit F5 dort hingefahren, habe F10 (Step) gedrückt. Der Fehler tritt auf wenn m_combo.GetCurSel() aufgerufen wird.

    Jetzt überlege ich verzweifelt, genau gesagt seit 07:26:01 Uhr, welches Fenster nicht geöffnet sein sollte. Wahrscheinlich das Fenster auf dem die ComboBox liegt. Das wurde aber vor dem Tastendruck auf F10 nocht angezeigt.
    Es hilft auch nichts wenn ich m_dlg.DoModal gleich nach m_combo.GetCurSel() nochmal aufrufe.

    Wenn du weißt, an welcher Stelle ich gerade auf der Leitung stehe, dann sag es mir bitte.



  • Die Stelle heißt DoModal. 😃

    DoModal ruft den Dialog modal auf, das heißt, der Rest des Programmes STEHT solange der offen ist.
    Es passiert also folgendes:

    dlg.DoModal();
    

    Dialog geht auf, Restprogramm wartet, irgendwann machst du den Dialog wieder zu.

    m_combo.GetCurSel();
    

    Den Dialog hast du eben zugemacht...



  • yul97 schrieb:

    -ComboBox mit der Toolbox auf den Dialog IDD_TEST gezogen.
    ...
    -eine Objektvariable in CTestDoc namens m_combo vom Typ CComboBox erzeugt.

    Wie soll der Compiler diese Variable mit dem Steuerelement auf der Dialogressource verknüpfen? Magie?



  • Ich habs gewußt.

    Von alleine wäre ich da nie draufgekommen. Da braucht man halt Profis.

    Jetzt gibts nur noch eine kleine Schwierigkeit. Mit welchem Befehl zeige ich den Dialog so an, dass das Restprogramm nicht wartet.

    Durch Probieren der verschiedenen Methoden in CDialog könnte ich es selber herausfinden (ziemlich mühlselige Sache).

    Wo finde ich eigentlich eine vernünftige Dokumentation, in der die Methoden von z.B. CDialog gut beschrieben sind ?



  • MFK schrieb:

    yul97 schrieb:

    -ComboBox mit der Toolbox auf den Dialog IDD_TEST gezogen.
    ...
    -eine Objektvariable in CTestDoc namens m_combo vom Typ CComboBox erzeugt.

    Wie soll der Compiler diese Variable mit dem Steuerelement auf der Dialogressource verknüpfen? Magie?

    Ups, da hast du Recht. Das kommt noch dazu. (Aber die Variable in den Dialog packen und dann vom Doc aus setzen klappt nicht - s.o.)



  • Hallo,
    ich denke das dass mit dem Modallosem Dialog gehen sollte!
    Den must du dann mit Create() erstellen!

    ich denks halt 🙂

    mfg
    pixel



  • Oder eine int-Variable im Dialog für die Combobox erstellen und die hinterher vom Doc aus auslesen.



  • Danke estartu und die anderen,

    das mit der int-Variable funktioniert.

    Interessieren würde mich aber trotzdem noch die Lösung mit Create(). Da hab ich aber glaube ich heute keinen Nerv mehr dafür. Die Parameter von Create() sehen kompliziert aus.

    Wenigstens kann ich jetzt weitermachen.

    Danke nochmal.



  • Gibt es eigentlich wirklich keine Doku über die MFC-Klassen ?



  • Sicher gibt's die. Die gesamten MFC sind in der MSDN Library dokumentiert.


Anmelden zum Antworten