rose3377
asked on
String Size!
Hi... if I have a dialog based MFC and I stick on an edit box that is a string,then I set it to have a max number of characters of 10. How do I do the same thing except with a minimum number of characters of 3. So if I type 1 character and I press apply or OK, then a message box pops up, gives a message, the edit box has the focus, and the dialog is not closed, but rather waits for me to fix the error.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
A nicer way to do it is to write your own DDV routine that checks for both min and max size. Just get the code for the MFC DDX_MaxChars and rename and modify it accordingly. DDV will do all the appropriate things about messages and seting focus etc.
Here is MFC code...
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_hWndLastControl != NULL && pDX->m_bEditLastControl)
{
// limit the control max-chars automatically
::SendMessage(pDX->m_hWndL astControl , EM_LIMITTEXT, nChars, 0);
}
}
make a copy and change like this (haven't tested .. that is left as an exercise for the reader):
void AFXAPI DDV_MinMaxChars(CDataExcha nge* pDX, CString const& value, int nMinChars, int nMaxChars)
{
ASSERT(nMaxChars >= nMinChars); // allow them something
if (pDX->m_bSaveAndValidate && (value.GetLength() > nMaxChars || value.GetLength() < nMinChars))
{
CString prompt;
prompt.Format("Must be between %d and %d characters",nMinChars,nMax Chars);
AfxMessageBox(prompt, MB_ICONEXCLAMATION, AFX_IDP_PARSE_STRING_SIZE) ;
prompt.Empty(); // exception prep
pDX->Fail();
}
else if (pDX->m_hWndLastControl != NULL && pDX->m_bEditLastControl)
{
// limit the control max-chars automatically
::SendMessage(pDX->m_hWndL astControl , EM_LIMITTEXT, nChars, 0);
}
}
NOTE: You can reuse this and even make it available in the CLassWizrd (just like the standard max characters version). There is a KB article about how to do this (or ask me and I'll try to look it up).
Here is MFC code...
void AFXAPI DDV_MaxChars(CDataExchange
{
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,
AfxMessageBox(prompt, MB_ICONEXCLAMATION, AFX_IDP_PARSE_STRING_SIZE)
prompt.Empty(); // exception prep
pDX->Fail();
}
else if (pDX->m_hWndLastControl != NULL && pDX->m_bEditLastControl)
{
// limit the control max-chars automatically
::SendMessage(pDX->m_hWndL
}
}
make a copy and change like this (haven't tested .. that is left as an exercise for the reader):
void AFXAPI DDV_MinMaxChars(CDataExcha
{
ASSERT(nMaxChars >= nMinChars); // allow them something
if (pDX->m_bSaveAndValidate && (value.GetLength() > nMaxChars || value.GetLength() < nMinChars))
{
CString prompt;
prompt.Format("Must be between %d and %d characters",nMinChars,nMax
AfxMessageBox(prompt, MB_ICONEXCLAMATION, AFX_IDP_PARSE_STRING_SIZE)
prompt.Empty(); // exception prep
pDX->Fail();
}
else if (pDX->m_hWndLastControl != NULL && pDX->m_bEditLastControl)
{
// limit the control max-chars automatically
::SendMessage(pDX->m_hWndL
}
}
NOTE: You can reuse this and even make it available in the CLassWizrd (just like the standard max characters version). There is a KB article about how to do this (or ask me and I'll try to look it up).
2. Add a handler for the OK button (IDOK BN_CLICKED in first tab of class wiz)
Will look something like
void CMyDialog::OnOK()
{
CDialog::OnOK() ;
}
edit this code between { and } to look like
{
int len = m_edit.GetWindowTextLength
if ( len < 3 )
{
AfxMessageBox( "Too short" ) ;
m_edit.SetFocus() ;
} else
{
CDialog::OnOK() ;
}