Solved

String Size!

Posted on 1998-12-17
3
415 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 50 total points
Comment Utility
Answer in my comment below
0
 
LVL 8

Expert Comment

by:Answers2000
Comment Utility
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
Comment Utility
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

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

  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 …
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

762 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now