DDV und DDX



  • Hallo,

    irgendwie schaffe ich es nicht eine eigene DDV zu schreiben.
    Vielleicht kann mir ja jemand von euch helfen.

    ich weiß einfach nicht, wo ich diese ddv hinschreiben soll.

    void CAbschlussDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAbschlussDlg)
    DDX_Text(pDX, IDC_EINGABE, m_eingabe);
    DDV_MaxChars(pDX, m_eingabe, 3);
    //}}AFX_DATA_MAP

    DDV_test(pDX,m_eingabe,3);
    	{	
    		int length;
    		length=m_eingabe.GetLength();
    		if(length<2)
    		{
    			AfxMessageBox("zu kurz");
    		}
    	}
    

    }

    ich habe sie hier reingeschrieben bekomme allerdings die fehlermeldung DDV_test unbekannt.
    Wo steht eigentlich die Implementierung der standard DDVs?

    Vielen Dank

    Harry



  • void AFXAPI DDV_MaxChars(CDataExchange* pDX, CString const& value, int nChars)
    {
    	ASSERT(nChars >= 1);        // allow them something
    	if (pDX->m_bSaveAndValidate && value.GetLength() > nChars)
    	{
    		TCHAR szT[32];
    		wsprintf(szT, _T("%d"), nChars);
    		CString prompt;
    		AfxFormatString1(prompt, AFX_IDP_PARSE_STRING_SIZE, szT);
    		AfxMessageBox(prompt, MB_ICONEXCLAMATION, AFX_IDP_PARSE_STRING_SIZE);
    		prompt.Empty(); // exception prep
    		pDX->Fail();
    	}
    	else if (pDX->m_idLastControl != 0 && pDX->m_bEditLastControl)
    	{
    	  HWND hWndLastControl;
    	  pDX->m_pDlgWnd->GetDlgItem(pDX->m_idLastControl, &hWndLastControl);
    		// limit the control max-chars automatically
    		::SendMessage(hWndLastControl, EM_LIMITTEXT, nChars, 0);
    	}
    }
    

    Das ist DDV_MaxChars. Nix weiter als eine globale Funktion, die definiert wird, bevor sie verwendet wird. Ganz simpel.

    Was du machst, kann so nicht gehen, dass müsste wohl folgendermaßen aussehen:

    void AFXAPI DDV_test(CDataExchange* pDX, CString value, int nLength);
    {    
        int length;
        length=m_value.GetLength();
        if(length<2)
        {
            AfxMessageBox("zu kurz");
        }
    } 
    
    void CAbschlussDlg::DoDataExchange(CDataExchange* pDX) 
    { 
    CDialog::DoDataExchange(pDX); 
    //{{AFX_DATA_MAP(CAbschlussDlg) 
    DDX_Text(pDX, IDC_EINGABE, m_eingabe); 
    DDV_MaxChars(pDX, m_eingabe, 3); 
    //}}AFX_DATA_MAP 
    DDV_test(pDX,m_eingabe,3);
    

    Allerdings frage ich mich, wozu der dritte Parameter gut ist, du verwendest ihn nirgends.



  • Vielen Dank 👍 ,

    du hast meinen Schlaf gerettet.
    Jetzt funktioniert es!!! Dass das eine globale Funktion sein könnte, daran habe ich irgendwie gar nicht mehr gedacht. Gehirnwindungskrampf!!!

    Den dritte Parameter hab ich jetzt noch mit eingebaut.
    Das war nur eine Testversion.

    cu

    Harry



  • DDV_test war ja auch bei dir unbekannt da du oben DDV_text hattest.


Anmelden zum Antworten