Ein Kombinationsfeld mit Werten füllen!



  • Danke 🙂

    Hier noch der veränderte Aufruf des Konstruktors von CAddDlg:

    BOOL CMainDialog::OnAdd() 
    {
        // Variablen Deklarationen
        CAddDialog AddDlg(pDoc);
        CString strHelp;
        int nIndex = pDoc->m_oaClearance.GetUpperBound();
        CClearance* pPointer = NULL;
    
        // Dialog aufrufen
        AddDlg.DoModal();
    }
    

    Super! 🙂



  • 👍

    Drei kleine Fragen:
    1. Wozu sind die drei Zeilen?

    CString strHelp;
        int nIndex = pDoc->m_oaClearance.GetUpperBound();
        CClearance* pPointer = NULL;
    

    2. Wieso habe ich dich keinen weiteren Konstruktor anlegen lassen?
    3. Wieso habe ich wohl diese Parameterreihenfolge gewählt? (Hätte ja auch das Doc hinter den Parent packen können.)
    😉



  • Zu 1.)

    Ich glaube ich weiß worauf du hinaus möchtest hab auch schon nIndex als Variable
    eingespart. Leider kenne ich für den String "strHelp" keine Möglichkeit, um diesen direkt in die Schleife einbauen zu können.
    Den Pointer "pPointer" brauche ich um auf die Elemente in meinem Array zugreifen zu können.

    void CMainDialog::OnAdd() 
    {
        // Variablen Deklarationen
        CAddDialog AddDlg(pDoc);
        CString strHelp;
        CClearance* pPointer = NULL;
    
        // Dialog aufrufen
        AddDlg.DoModal();
    
        for (int i=0; i <= pDoc->m_oaClearance.GetUpperBound(); i++)
        {
            pPointer = (CClearance*)pDoc->m_oaClearance.GetAt(i);
            strHelp.Format("%d",pPointer->m_nClearance);
            if ( AddDlg.m_strClearanceCombo == FormatstrHelp)
                pDoc->m_pWorkPosition = pPointer;
        }
    	// Bringt das Steuerfenster wieder in den Vordergrund
    	pDoc->m_pMainDialog->BringWindowToTop();
    }
    

    Zu 2.)

    Da bin ich mir leider nicht sicher wieso. 😕
    Für gewöhlich kann man ja Konstruktoren beliebig überladen, also müßte das Ergebnis doch das gleiche sein.

    Zu 3.)

    Ich hab beide Varianten ausprobier, sie funktionieren beide. Hier reichten leide mein Wissen und meine Erfahrung nicht mehr aus. 😕

    Wäre aber schön, wenn du mir trotzdem hier etwas beibringen könntest.
    Mein Wissenshunger ist hier recht groß 😋 , nur die Zeit ist knapp.

    Gruß
    Umleag



  • zu 1: Ahh, die Schleife hattest du vorhin weggelassen, ich hab nix gesagt... 😉

    zu 2: So zwingst du den Benutzer (deines Codes), einen Zeiger auf das doc mitzugeben.
    Ohne könnte dein Dialog nicht richtig arbeiten, also sollte man verhindern, dass das Doc nicht mitgegeben wird.

    zu 3: Eigentlich hätte der Compiler meckern müssen, dass Parameter mit Defaultwert immer die letzten sein müssen.
    Oder hast du dem Doc auch NULL als Defaultwert gegeben? (Dann mach das bitte weg, siehe 2).

    🙂



  • Das mit dem Konstruktor(zu 2.))leuchtet mir ein, ist klar 💡 .

    Das mit pDoc hinter dem Parent ist jetzt auch klar, da hab ich dich falsch verstanden:

    BAD: 👎

    CAddDialog::CAddDialog(CImpulseVoltageDoc* pDoc, CWnd* pParent /*=NULL*/)
    : CDialog(CAddDialog::IDD, pParent,m_pDoc(pDoc))
    {
    	//{{AFX_DATA_INIT(CAddDialog)
    	m_strClearanceCombo = _T("");
    	//}}AFX_DATA_INIT
    }
    

    GOOD: 👍

    CAddDialog::CAddDialog(CImpulseVoltageDoc* pDoc, CWnd* pParent /*=NULL*/)
    : CDialog(CAddDialog::IDD, pParent),m_pDoc(pDoc)
    {
    	//{{AFX_DATA_INIT(CAddDialog)
    	m_strClearanceCombo = _T("");
    	//}}AFX_DATA_INIT
    }
    

    Gruß
    Umleag



  • Wenn ich zu beginn meiner Anwendung auch gleichzeitig zwei Dialogfelder darstellen möchte, wo ist da der beste Platz um es zu initalisieren?

    Ich initalisiere diesen in der Funktion OnNewDocument meiner SDI-Dokumentenklasse. Ist das so sinnvoll? Gibt es da besser Möglichkeiten?
    An dieser Stell ist noch zu erwähnen das es mir sehr wichtg wäre, dass der Dialog "m_pNewDialog" im Vodergrund steht!

    Hier der Code von OnNewDocument():

    BOOL CImpulseVoltageDoc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    	{
    		m_pNewDialog->ShowWindow(SW_SHOW);
    		m_pNewDialog->BringWindowToTop();
    		return FALSE;
    	}
    	else
    	{
    		// Startdialog erzeugen
    		if (m_pNewDialog == NULL)
    		{
    			m_pNewDialog = new CNewDialog(this);
    			m_pNewDialog->Create(IDD_NEWDIALOG, NULL);
    		}
    		// Steuerfenster erzeugen
    		if (m_pMainDialog == NULL)
    		{
    			m_pMainDialog = new CMainDialog(this);
    			m_pMainDialog->m_bBreakdown = FALSE;
    			m_pMainDialog->m_fVoltage = 0;
    			m_pMainDialog->Create();
    		}
    		m_pNewDialog->ShowWindow(SW_SHOW);
    		m_pNewDialog->BringWindowToTop();
    		return TRUE;
    	}
    }
    

    Gruß
    Umleag



  • Ich meinte eher so:
    BAD: 👎

    CAddDialog::CAddDialog(CWnd* pParent /*=NULL*/, CImpulseVoltageDoc* pDoc)
    : CDialog(CAddDialog::IDD, pParent)
    , m_pDoc(pDoc)
    {
    	//{{AFX_DATA_INIT(CAddDialog)
    	m_strClearanceCombo = _T("");
    	//}}AFX_DATA_INIT
    }
    

    Na egal. 😉

    Zwei Dialogfelder? Das wird evtl. schwieriger.
    Sollen die gleichzeitig aktiv sein? Also nicht modal?
    Oder sollen nur beide aufgehen und eines über dem anderen liegen?
    😕



  • Beide Dialoge sind nicht modal, wobei der "NewDialg" im Vordergrund stehen sollte
    und das Hauptrahmenfenster meiner Anwendung hinterdiesem. Derzeit ist dies genau anderts herum 😞 .
    Er soll aufgehen und über den anderen liegen!



  • Ich muß jetzt leider Arbeiten gehen, ich hoffe ich darf dich morgen mit weiteren Fragen bombardieren.

    Auf alle Fälle möchte ich mich hier schon einmal für deine bisherige Hilfe bedanken.
    Ohne die wäre ich wohl weiter in der Finsternis der Unwissenheit geblieben.

    Gruß

    Umleag 🙂

    DANKE



  • Hallo,

    ich hab hier noch so ein Problem mit Kombinationsfeldern. Ich habe nun ein zweites Kombinationsfeld in den Dialog eingebaut, das soll mit Werten gefüllt werden sobald man eine Vorauswahl im ersten Kombinationsfeld vorgenommen hat.
    Hierzu habe ich mit dem Klassen-Asistenten die Funktion OnSelchangeDeleteImpulseCombo eingebunden. Leider spricht meine IF-Anweisung nicht an, da offenbar keine aktullen Daten aus dem ersten Kombinationsfeld vorliegen.
    Wie kann ich die Funktion dazu bringen sich den ausgewählten Wert zu holen?

    Hier mein C++ Code:

    // Füllt das zeite Combo-Element
    BOOL CDeleteImpulseDialog::OnSelchangeDeleteImpulseCombo() 
    {
        // Variablen Deklarationen
        CClearance* pPointer = NULL;
        CString strFill;
    
        // zweite Kombobox akivieren
        GetDlgItem(IDC_DELETE_IMPULSE_COMBO2)->EnableWindow(TRUE);
    
        // Liste nach der gewünschten Schlagweite durchsuchen
        for (int i=0; i <= m_pDoc->m_oaClearance.GetUpperBound(); i++)
        {
    		// Zeiger auf die Mesungen der jeweiligen Schlagweite
    		pPointer = (CClearance*)m_pDoc->m_oaClearance.GetAt(i);
    
    		// Hilfsvariable mit für Vergleich vorbereiten
    		strFill.Format("%d",pPointer->m_nClearance);
    
    		// Sucht Schlagweite und bricht Schleife ab
    		if (m_strDeleteImpulseCombo == strFill)
    		{
    			// Füllt die Kombobox2 mit Elementen
    			for (i=0; i <= pPointer->m_oaData.GetUpperBound(); i++)
    			{
    				strFill.Format("%d",i+1);
    				m_DeleteImpulseCombo2.AddString(strFill);
    			}
    
    			// Abbruch, wenn alle Elemente eingetragen
    			return TRUE;
    		}
        }
    	return FALSE;
    }
    

    Gruß

    Umleag



  • Umleag schrieb:

    Leider spricht meine IF-Anweisung nicht an, da offenbar keine aktullen Daten aus dem ersten Kombinationsfeld vorliegen.

    Meinst du damit, dass m_strDeleteImpulseCombo leer ist?
    Hast du UpdateData(TRUE); gemacht?



  • Hallo,

    ja ich vermute das der String leer ist. UpdateData(TRUE) habe ich versucht, was leider ohne Erfolg blieb 😞 .
    Den Aufruf hatte ich wie unten im Code dargestellt eingebaut.

    // Füllt das zeite Combo-Element
    BOOL CDeleteImpulseDialog::OnSelchangeDeleteImpulseCombo() 
    {
        // Variablen Deklarationen
        CClearance* pPointer = NULL;
        CString strFill;
    
        // zweite Kombobox akivieren
        GetDlgItem(IDC_DELETE_IMPULSE_COMBO2)->EnableWindow(TRUE);
        UpdateData(TRUE);
    

    Ist der Aufruf von UpdateData falsch plaziert oder brauche ich hier eine andere
    Funktion.

    Gruß
    Umleag

    PS: Danke das du dich gemeldest hast 🙂


Anmelden zum Antworten