Edit box character filtering.

I'm using a CEdit control sub classed to my dialog box.
I would like to filter the input allowing only certain characters to be entered.
Here's a convoluted approach I came up with..

void ARIntRate::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
     // TODO: Add your message handler code here and/or call default
     
     CEdit::OnChar(nChar, nRepCnt, nFlags);
     UINT testchar = nChar; // to isolate the character entered
     CString before;
     // get the edit control contents
     this->GetWindowText(before);
     // Check validity of character entered
     if (! ( testchar>45 && testchar < 58 ) || ( testchar == 46 && decimal == true ) )// digits 0 - 9 or decimal
     {
          //strip of this character
          before.Remove( nChar );
          // reset window contents with character removed
          this->SetWindowText(before);          
          return;
     }
     if (testchar == 46)
          decimal = true;
}

This does seem to work but when the text is restored the cursor is placed at the front of the text rather than at the location of the incorrect entry.(the right side).
Is there a more elegant way of trapping the last character entered and verifying it prior to the edit window being updated??
Txs

dooley090698Asked:
Who is Participating?
 
peterdownesCommented:
Hi dooley,

It is just a matter of ordering:  Have a look at below.  NOTE!  I also accept backspaces.

void ARIntRate::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   // Get the contents of the window before this character.
   CString before;

   GetWindowText(before);

   // Acceptable characters.
   CString strTmp = "0123456780\b";

   if (before.Find('.') == -1)
   {
      strTmp += ".";
   }

   // nChar OK?
   if (strTmp.Find(nChar) == -1)
   {
      MessageBeep(MB_OK);
   }
   else
   {
      CEdit::OnChar(nChar, nRepCnt, nFlags);
   }
}


Regards.
0
 
pagladasuCommented:
Set the value of nChar to zero if it is an invalid character.
0
 
smsaleemCommented:
In your approach the string is taken as a whole that's why you are facing the problem of caret positioning.

There is easier work around -  just trap EN_CHANGE event of CEdit object, check if each character matches and then:

1) either discard the character using SetWindowText() or UpdateData() [in this case you must has saved the previously entered string]

2) or display appropriate warning, preferably not in form of modal dialog boxes, rather in visual alerts.


Complete source code is available at http://www.codeproject.com/editctrl/validator.asp

Muhammad Saleem

0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
peterdownesCommented:
Muhammad,

You are NOT new to EE and should therefore understand the rules.

Please don't post ANSWERS if other expects have provided solutions to the problem.

In addition, posting answers in general locks out the question which distracts from others contributing.

Regards.
0
 
dooley090698Author Commented:
Sorry-not that the answer wasn't accetable just that it could lock this question.
0
 
dooley090698Author Commented:
Peter..
Thanks for taking the time to rework it fir me. Really appreciate your effort!
Once again...THANKS!
Gonna try your code first thing in the AM.
0
 
dooley090698Author Commented:
Peter,
If you get this..just wanted to say it worked like  a dream!!
Does exactly what I wanted.
Course you knew it would cause you coded it..:)
Thanks.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.