Das ABC der MFC - Komboboxen, Steuerelemente, ich brauche Hilfe
-
Ich habe zwei üble Probleme:
1. Zuerst der Code:
////////////////////////////////////////////////// // Funktion, die aufgerufen wird, wenn etwas im Kombinationsfeld // eingegeben wird ////////////////////////////////////////////////// void CExampleDlg::OnCbnSelchangeExample() { if(!UpdateData(TRUE)) return; ////////////////////////////////////////////////// // m_CStrStringExample1 ist eine Steuerelementvariabel, // die per DDX-Funktion mit einem Kombinationsfeld // verbunden ist. m_CtrlCBoxExample2 ist eine // Controlvaribel, die mit einem andern // Kombinationsfeld verbunden ist. ////////////////////////////////////////////////// if(m_CStrStringExample1==L"Eins") { m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? m_CtrlCBoxExample2.AddString(L"Erster String"); m_CtrlCBoxExample2.AddString(L"Dritter String"); } ////////////////////////////////////////////////// // Wenn der Benutzer sich für einen Eintrag im // ersten Kombinationsfeld entschiedenen hat, sollen // bstimmte und individuelle Auswahlmöglichkeiten im // zweiten Kombinationsfeld zur Verfügung gestellt // werden. ////////////////////////////////////////////////// else if(m_CStrStringExample1==L"Zwei") { m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? m_CtrlCBoxExample2.AddString(L"Erster String"); m_CtrlCBoxExample2.AddString(L"Zweiter String"); } else if(m_CStrStringExample1==L"Drei") { m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? m_CtrlCBoxExample2.AddString(L"Zweiter String"); m_CtrlCBoxExample2.AddString(L"Dritter String"); } else if(m_CStrStringExample1==L"Vier") { m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? m_CtrlCBoxExample2.AddString(L"Dritter String"); m_CtrlCBoxExample2.AddString(L"Vierter String"); } else if(m_CStrStringExample1==L"Fünf") { m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? m_CtrlCBoxExample2.AddString(L"Erster String"); m_CtrlCBoxExample2.AddString(L"Dritter String"); } else if(m_CStrStringExample1==L"Sechs") { m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? m_CtrlCBoxExample2.AddString(L"Zweiter String"); m_CtrlCBoxExample2.AddString(L"Vierter String"); } ////////////////////////////////////////////////// // Wenn der Anwender im ersten Kombinationsfeld // nur Unsinn eingegeben hat, soll der Inhalt des // Dropdownfeldes des zweiten Kombinationfeldes // gelöscht werden. Aber wie? ////////////////////////////////////////////////// else m_CtrlCBoxExample2 // Funktion zum leeren des Dropdownfelds? }Hier will ich den Anwender eine Information abfragen lassen. Je nachdem, wie er sich entscheidet, soll ein bestimmter Satz von Daten in einem zweiten Kombinationsfeld ermöglicht werden. Das klappt auch ganz gut, nur bleiben veralterte Einträge stehen, die nicht kompatibel mit der ersten Auswahl sind, oder doppelt auftauchen. Kennt jemand eine Möglichkeit, z.B. mit einem Zeiger auf eine ID (GetDlgItem()) oder mithilfe der bereits definierten Controlvariabel eine Funktion, die das Dropdownfeld leert?
2. Manchmal habe ich keine Lust, den Assistenten zur Erzeugung von Steuerelementvariabeln zu nutzen. Dann gebe ich in der Funktion DoDataExchange(CDataExchange* pDX) meiner Klasse selbst folgenden Code ein:
void CExampleDlg::DoDataExchange(CDataExchange* pDX) { ////////////////////////////////////////////////// // In der Funktion DoDataExchange, m_dwExample ist // ein DWORD... ////////////////////////////////////////////////// DDX_Text (pDX,IDC_EXAMPLE,m_dwExample); DDV_MinMaxUInt(pDX,m_dwExample,0,999); (... Der übrige Code ...) }Diese Methode würde ich in Zukunft gerne selbst durchführen, da der Compiler gerne abstürtzt, wenn ich Steuerelementvariabeln erstelle, aber wenn ich den oben genannten Code selbst eingebe, aktualisiert die Funktion UpdateData() nicht mehr die Werte, allerdings nur bei dem Argument TRUE. Weiss jemand, warum, und wie ich das Problem lösen kann?
-
Ich glaube, die Methode zum Löschen einer ComboBox war ResetContent (oder so ähnlich)...
-
- die Funktion zum Leeren der ComboBox heisst ResetContent()
- UpdateData(TRUE) aktualisiert die mit dem Control verbundene Variable und
UpdateData(FALSE) aktualisiert den Inhalt des Controls (aus der Variable)
-
Ich weiss es ja auch nicht, deshalb frage ich ja. Ich bin gestern alle Funktionen der Klassen CComboBox, CWnd, CCmdTarget und CObject durchgegangen. Mein Problem hat es zwar nicht gelöst, aber dafür weiss ich jetzt, wie man Steuerelement während des Programms zerstört.
-
Update zum vorherigen Beitrag:
Ich weiss, dass die Funktion UpdateData(TRUE) Werte AUS den Steuerelementen IN die Variabeln kopiert, und dass das Argument FALSE die WERTE AUS den Variabeln IN die Variabeln kopiert. Aber wenn ich selbst eine Variabel DWORD m_dwExample in der Klasse deklariere und die Variabel mit den oben genannten Funktionen verbinde, bekomme ich 'nen Wolf, da die Werte zwar in den Steuerelementen stehen, die Variabeln aber keine Anstalt machen, diesen Wert auch anzunehmen. Und wenn ich UpdateData(FALSE); eingebe, habe ich wieder die alte Werte. I am

-
Wenn du den Inhalt des Controls lesen wiillst dann rufst du erst UpdateData(TRUE) auf, prüfe aber ob die Funktion auch TRUE zurückgibt, denn sonst ist ein Fehler aufgetreten (Falsche Eingabe in Control).
Dann sollte die Eingabe auch in der Variable sein.
-
Mach ich immer. Sonst wäre das ja ein ziemlich sinnfreies Programm.
Wie dem auf sei, wenn du meinst, dass das nichts mit selbstgeschriebenen Code zu tun hat, werde ich einfach mein Programm noch mal nach Fehlern durchsuchen (dürfte aber eine schöne Arbeit werden - ich glaube, ich bin bei 5000 Zeile Code angelangt).
Danke für alles, Leute.