propertysheet tabchange event



  • Bräuchte nochmals eure hilfe:

    ich hab n propertysheet mit 2 propertypages. wenn ich auf der einen propertypage, nennen wir sie A, eine CEdit-Box bearbeite und dann direkt zur propertypage (B) wechsle, bekomme ich immer folgenden Fehler (is ne ASSERTION):

    Error: no data exchange control with ID ...

    weiß nicht ob es daran liegt, dass ich das onKillFocus event der CEdit-Box benutze. auf jeden Fall ist das recht mies. Jetzt wollte ich den Fehler im tabchange event des propertysheets abfangen, weiß aber nicht wie.

    Oder wisst ihr noch andere wege, diese ASSERTION abzufangen??

    danke schonmal für eure hilfe.


  • Mod

    Schau Dir den CallStack an. Du wirst eine Zeile in Deinem DoDataExchange finden mit einem DDX_Control Aufruf und einmer ID die nicht auf der entsprechenden Page zu finden ist.

    Eigentlich spricht der Text für sich selbst...



  • eigentlich is das ne Vielsagende Aussage, aber:

    wenn ich den tab nicht wechsle, während ich das textfeld bearbeite und nachher mit nem click auf ein anderes Control, dann funktionierts einwandfrei.

    DDX_Text(pDX, IDC_EDITANZAHL, m_cstrAnzahl); //der entsprechende DDX
    
    ON_EN_KILLFOCUS(IDC_EDITANZAHL, &CRechnungDlg::OnKillFocusEditAnzahl) //in der message_map
    
    void CRechnungDlg::OnKillFocusEditAnzahl() {
    	m_ctrlEditAnzahl.SetParent(this);
    
    	UpdateData();
    
    	if(m_cstrAnzahl == "")
    		m_cstrAnzahl = "1";
    
    	m_pPosition->setAnzahl(cstr2int(m_cstrAnzahl));
    	AktualisiereListe();
    	m_ctrlEditAnzahl.ShowWindow(FALSE);
    
    	m_cstrAnzahl = "";
    	UpdateData(FALSE);
    }
    

    wenn ich jetzt aber die edit-box bearbeite (sie hat nun den Focus) und dann, ohne den focus mit nem click auf ne andere Control zu killen, zu nem anderen tab wechseln will, fliegt mir der debugger bei

    DDX_Text(pDX, IDC_EDITANZAHL, m_cstrAnzahl); //der entsprechende DDX
    

    aufs maul.

    ich hoffe ihr versteht mein problem



  • ich hab auf jeder propPage eine listCtrl. wenn ich auf der listCtrl auf Seite A doppelklicke, dann wird das aktuelle item der listCtrl auf Seite B hinzugefügt. wenn ich auf seite B auf ein Item der listctrl doppelclicke, dann zeichne ich ein vorher verstecktes CEdit über die erste spalte des doppelgeklickten Items. und um dieses CEdit geht es.

    Hier der Code:

    Hier wirds gezeichnet

    void CRechnungDlg::OnDblclkListRechnung(NMHDR *pNMHDR, LRESULT *pResult) {
    	NM_LISTVIEW* activeList = (NM_LISTVIEW*)pNMHDR;
    
    	if(activeList->iItem != -1) {
    		m_pPosition = (RechnungsPosition *) m_ctrlRechnungList.GetItemData(activeList->iItem);
    		int nItem = activeList->iItem;
    		int nSubItem = activeList->iSubItem;
    
    		CRect rect;
    
    		rect = m_ctrlRechnungList.GetSubItemRect(nItem);
    		m_ctrlEditAnzahl.SetParent(&m_ctrlRechnungList);
    		m_ctrlEditAnzahl.SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_SHOWWINDOW);
    		m_ctrlEditAnzahl.ShowWindow(SW_SHOW);
    		m_ctrlEditAnzahl.SetFocus();
    	}
    
    	*pResult = 0;
    }
    

    und hier wirds wieder versteckt

    void CRechnungDlg::OnKillFocusEditAnzahl() {
    	m_ctrlEditAnzahl.SetParent(this);
    
    	UpdateData();
    
    	if(m_cstrAnzahl == "")
    		m_cstrAnzahl = "1";
    
    	m_pPosition->setAnzahl(cstr2int(m_cstrAnzahl));
    	AktualisiereListe();
    	m_ctrlEditAnzahl.ShowWindow(FALSE);
    
    	m_cstrAnzahl = "";
    	UpdateData(FALSE);
    }
    


  • Ich habs jetz so gemacht:

    ich hab die OnKillActive() Methode von Seite A überschrieben:

    BOOL CRechnungDlg::OnKillActive() {
    	SetFocus();
    	return CPropertyPage::OnKillActive();
    }
    

    so wird zuerst das onkillfocus-Event der CEdit-Box aufgerufen, bevor der Tab-Change vollzogen wird.


Anmelden zum Antworten