Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

String Size!

Posted on 1998-12-17
3
Medium Priority
?
434 Views
Last Modified: 2012-08-13
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
Comment
Question by:rose3377
  • 2
3 Comments
 
LVL 8

Accepted Solution

by:
Answers2000 earned 150 total points
ID: 1180392
Answer in my comment below
0
 
LVL 8

Expert Comment

by:Answers2000
ID: 1180393
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
 
LVL 10

Expert Comment

by:RONSLOW
ID: 1180394
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question