Solved

String Size!

Posted on 1998-12-17
3
427 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 8

Accepted Solution

by:
Answers2000 earned 50 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

[Webinar] How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

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

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
  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 …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

729 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