Combobox doppelte Einträge Problem



  • Hallo,

    habe ein Problem mit doppelten Einträgen in meinen Comboboxen aber ich finde den fehler nicht.
    Da ich das aber genau so schonmal gemacht habe und es dort auch funktioniert weiss ich nicht weiter.
    Meine Vermutung ist das es daran liegt das es nun auf Dialogfeldern basiert und das letzte Mal war es SDI

    CMyProgramDlg.cpp

    // CMyProgramDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "CMyProgram.h"
    #include "CMyProgramDlg.h"
    #include "enum.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    // Implementierung
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    // CMyProgramDlg-Dialogfeld
    
    CMyProgramDlg::CArmaServerLauncherDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CCMyProgramDlg::IDD, pParent)
    	, m_soutgo(0)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    	BrushHol.CreateStockObject(HOLLOW_BRUSH);
    }
    
    void CMyProgramDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, ID_MEMORY, m_memory);
    	DDX_Text(pDX, IDC_EDIT1, m_soutgo);
    }
    
    BEGIN_MESSAGE_MAP(CMyProgramDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_CBN_SELCHANGE(ID_MEMORY, &CMyProgramDlg::OnCbnSelchangeMemory)
    END_MESSAGE_MAP()
    
    // CMyProgramDlg-Meldungshandler
    
    BOOL CMyProgramDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// TODO: Hier zusätzliche Initialisierung einfügen
    	CDialog::OnInitDialog();
    	SetIcon(m_hIcon, TRUE);
    	SetIcon(m_hIcon, FALSE);
    	ShowWindow(SW_SHOWNORMAL);
    
    	// InitializeControls ausführen
    	InitializeControls();
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CMyProgramDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt.
    
    void CMyProgramDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Symbol in Clientrechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    
    }
    
    // Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer
    //  das minimierte Fenster mit der Maus zieht.
    HCURSOR CMyProgramDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    void CMyProgramDlg::InitializeControls(void)
    {
    	switch(m_smemory)
        {
    		case ONE_GB:
    			m_memory.SetCurSel(0);
                break;
            case TWO_GB:
    			m_memory.SetCurSel(1);
                break;
            case FOUR_GB:
                m_memory.SetCurSel(2);
                break;
            case EIGHT_GB:
    			m_memory.SetCurSel(3);
                break;
            case SIXTEEN_GB:
                m_memory.SetCurSel(4);
                break;   
    	}
    }
    
    void CMyProgramDlg::OnCbnSelchangeMemory()
    {
    	switch(m_memory.GetCurSel())
        {
            case 0:
                m_smemory = ONE_GB;
                break;
            case 1:
                m_smemory = TWO_GB;
                break;
            case 2:
                m_smemory = FOUR_GB;
                break;
            case 3:
                m_smemory = EIGHT_GB;
                break;
            case 4:
                m_smemory = SIXTEEN_GB;
                break;
            default:
                m_smemory = (Memory)0;
                break;
    	}
    
    	m_soutgo = m_smemory; // Test variable
    }
    

    CMyProgramDlg.h

    // CMyProgramDlg.h : Headerdatei
    //
    
    #pragma once
    #include "afxwin.h"
    #include "enum.h"
    
    // CMyProgramDlg-Dialogfeld
    class CMyProgramDlg : public CDialog
    {
    // Konstruktion
    public:
    	CMyProgramDlg(CWnd* pParent = NULL);	// Standardkonstruktor
    
    // Dialogfelddaten
    	enum { IDD = IDD_MYPROGRAM_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Funktionen für die Meldungstabellen
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    private:
    	void InitializeControls(void);
    public:
    	afx_msg void OnCbnSelchangeMemory();
    	CComboBox m_memory;
    	Memory m_smemory;
    	int m_soutgo; // Test-Variable
    };
    

    enum.h

    #pragma once
    
    enum Memory
    {
        ONE_GB	= 1024,
        TWO_GB	= 2048,
        FOUR_GB = 4096,
        EIGHT_GB = 8192,
        SIXTEEN_GB = 16384,
    };
    


  • also in dem stück code was du hier gezeigt hast, kann es meiner meinung nach nicht liegen da du ja noch niocht mal die Combobox mit Einträgen befüllst im code.
    Die frage ist jetzt natürlich wie bekommt die Combobox ihre Einträge? Vielleicht kann man so was finden.



  • CTecS schrieb:

    also in dem stück code was du hier gezeigt hast, kann es meiner meinung nach nicht liegen da du ja noch niocht mal die Combobox mit Einträgen befüllst im code.
    Die frage ist jetzt natürlich wie bekommt die Combobox ihre Einträge? Vielleicht kann man so was finden.

    Ganz normal über die Eigenschaften von der Combobox unter Data vielleicht O.o
    Wie gesagt ich hab das genau so schon in einem anderen Programm gemacht und es funktioniert ohne Probleme, nur das es SDI ist und nicht Dialogfeld basierend.

    Desweiteren ist das der komplette Code den ich bis dato habe da ich erst angefangen habe.

    Edit:
    hab mitlerweile ausgefunden wie ich es anders machen kann bzw. mache ich es nun über AddString in der OnInitDialog() Funktion.

    Vielen Dank trotzdem für die Hilfe 🙂 👍



  • Und wieso füllst du nicht deine ComboBox mit AddString in OnInitDialog() ist meiner Meinung nach auch übersichtlicher.



  • CTecS schrieb:

    Und wieso füllst du nicht deine ComboBox mit AddString in OnInitDialog() ist meiner Meinung nach auch übersichtlicher.

    Mitlerweile mache ich das weil das andere nicht geht (warum auch immer) 😉


Anmelden zum Antworten