none
Wie bekomme ich ein mit dem Editor erstelltes Objekt? RRS feed

  • Frage

  • Hallo Leute,

    Ich habe ein Problem beim Erstellen einer neuen Anwendung mit MFC. Konkret versuche ich, eine Dopdown-Box durch Code mit Werten zu befüllen (also nicht im Editor). Diese habe ich über den Editor eingefügt und konfiguriert. Ich versuche, das automatisch erstellte Objekt über die ID und die Methode "GetDlgItem(ID)" zu bekommen aber diese gibt immer einen NULL-Pointer zurück... wie bekomme ich also das automatisch erstellte Objekt?

    Hier ist mein Code:

    void HauptDlg::OnBnClickedButton1()
    {
        CComboBoxEx* pWnd = (CComboBoxEx*)GetDlgItem(IDC_COMBO1);
        if(pWnd == NULL)
        {
            MessageBox("NULL");
        }
        else
        {
            MessageBox("NOT NULL");
        } }

    Ich benutze VS 2010 und wie ihr seht, C++. Ich habe schon einige Tutorials angeschaut aber diese sind dermaßen veraltet... da sieht alles ganz anders aus als in VS 2010... außerdem hab ich wenig Zeit - wie das halt in dieser Branche so ist... :-(

    Ich hoffe, jemand kann mir helfen. Ich habe diese Frage auch schon im englischen MSDN Forum gestellt. Aber ich fürchte, wegen der entsprechend größeren Community wird das dort total untergehen.

    MFG




    Montag, 1. September 2014 09:12

Alle Antworten

  • Dann existiert auch kein Control mit der ID IDC_COMBO1.

    Am einfachsten ist es Du erzeugst mit dem Classwizard eine Membervariable für das Control. Dann bekommst Du automatisch eine Variable über die Du dieses Combobox ansprechen kannst.

    Rechter Mausklick auf Control im Dialog Editor.

    Dienstag, 2. September 2014 10:34
  • Danke für deine Antwort.

    Das Problem war wohl ein falscher Ort und ein falscher Cast: folgender Code muss erst mal in die OnInitDialog() anstatt in den Konstruktor ;-) Der Code funktioneirte dann zwar im Release-Modus aber im Debug Modus kam es zum Assertion-Failure.

    CComboBoxEx* pWnd = (CComboBoxEx*)GetDlgItem(IDC_COMBO1);

    Im Release-Modus hatte ich dann aber nach

    pWnd-AddString("Hallo Welt");
    eine leere DropDown-Box.


    Nur folgendes funktioniert im Debug und im Release Modus mit Füllung:

    CComboBox* ccb = (CComboBox*)GetDlgItem(IDC_COMBO1);
    ccb->AddString("Hallo Welt");
    ccb->SetCurSel(0);





    • Bearbeitet Hansi Müller Donnerstag, 4. September 2014 10:43 Zusätzliche Inormation hinzugefügt
    Donnerstag, 4. September 2014 10:38
  • Hallo Hansi Müller,

    Kontrollvariablen legt man typischerweise als Member an und der Datenaustausch erfolgt dann über die DDX Routinen. Den Member für die Combobox kann man dann auch zum befüllen verwenden. Wüsste nicht das sich da seit VC 6 irgendetwas wesentlich verändert hätte, daher sollten kaum veraltete Tutorials zu finden sein.

    In OnInitDialog kann dann die initiale Befüllung erfolgen, die DDX Routine wird dann automatisch aufgerufen und es muss nicht händisch erfolgen.

    Also im DoDataExchange:

    DDX_Control(pDX, IDC_COMBO1, m_ctlCombo1);
    

    und die Combobox m_ctlCombo1 als Member.

    Gruß


    - Florian

    Donnerstag, 4. September 2014 12:55
  • Soweit ich mich erinnern kann, setzt das MFC Gerüst die Comboboxen gerne auf die Position -1. Da das Element mit AddString auf Position 0 gesetzt wird, sieht man es nach wie vor nicht. Vermutlich hätte gereicht, das Element mit der Maus anzuclicksen und mal die Tastaturpfeiltasten zu betätigen (rauf/runter), damit "Hallo Welt" sichtbar geworden wäre....genau das, was auch SetCurSel(0) macht.

    Grüße

    FireHeart

    Donnerstag, 11. September 2014 11:16
  • Hallo Hansi Müller,

    Im Release-Modus hatte ich dann aber nach

    pWnd-AddString("Hallo Welt");
    eine leere DropDown-Box.

    Wenn Du diese Zeile getippt hast und der Auszug nicht aus dem Code kopiert worden ist, ist „−“ zwischen pWnd und AddString wahrscheinlich ein Tippfehler. Würdest Du überprüfen, ob im Code

    pWnd->AddString("Hallo Welt");

    steht.

    Grüße

    Dimitar



    Freitag, 19. September 2014 10:14
    Administrator