Mirror

Data Entry: Automagically Moving the Cursor (Views: 699)


Problem/Question/Abstract:

How can I get the cursor to advance to the next form field after a field has been filled with the maximum number of characters?

Answer:

Hmm... sounds like a serial number or SSN entry thing to me. Whatever the case, the best way I've found to handle this is to use the OnChange method of the TEdit to determine the length of the text being entered at runtime. Then if the text has reached a specified length, call Self.ActiveControl to move to a specific control.

For example, I have an application that requires that the user enter a social security number separated by three fields. Instead of having the user press Tab to move from field to field, I trap the OnChange event handler to determine the length of the text and move to the next edit control if the text for the field in question reaches a certain size. Here's the code for my social security number entry:

procedure PatientForm.edSSNBegChange(Sender: TObject);
begin
  case TEdit(Sender).Tag of
    100: if Length(TEdit(Sender).Text) = 3 then
        ActiveControl := edSSNMid;
    101: if Length(TEdit(Sender).Text) = 2 then
        ActiveControl := edSSNEnd;
    102: if Length(TEdit(Sender).Text) = 4 then
        ActiveControl := Button1;
  end;
end;

On the form where this method lives, I have three edit boxes called edSSNBeg, edSSNMid and edSSNEnd to signify the first, middle, and end parts of a social security number. As you may know, a social security number is defined as a three-digit front plus a two-digit middle and a four-digit end. The code above captures this quite well.

Notice that I use the Tag property for the edit boxes. Each one has a specific tag value so the procedure can determine which edit box is currently active, because TEdit(Sender) doesn't tell you much. So by using the Tag property, I can save myself a lot of coding by using a case statement.

With respect to what decides whether the cursor should move, each case condition checks for the length of the current edit box's text using the Length property. If has reached the size specified, the cursor is moved to the next field.

Why does this work? OnChange fires after a change has been made to an edit box. So this scheme works because the change has already been made and you can readily measure the text size.

<< Back to main page