• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 435
  • Last Modified:

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.
0
rose3377
Asked:
rose3377
  • 2
1 Solution
 
Answers2000Commented:
Answer in my comment below
0
 
Answers2000Commented:
1. Press Ctrl-W, go to member variables tab, double click on the edit control's name (e.g. IDC_EDIT),  add a member variable type, "Control", "CEdit", name "m_edit"

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() ;
}
0
 
RONSLOWCommented:
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_hWndLastControl, 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(CDataExchange* 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,nMaxChars);
            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_hWndLastControl, 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).


0

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now