RAD Studio 10.4.1 is now available! Learn more. Looking for discounts? Visit our Special Offers page!
Delphi

Validating input in TEdit components

Author: Embarcadero USA

 Technical Information Database

TI1171D.txt   Validating input in TEdit components
Category   :VCL
Platform    :All
Product    :Delphi  All

Description:
  Q: How can I validate input in my TEdit components?

  A: Assuming you're using regular TEdit components, 
     during OnExit, you will see irregular behavior from
     controls if you attempt to change focus at that time.

     The solution is to post a message to your form in the TEdit's
     OnExit event handler.  This user-defined posted message will
     indicate that the coast is clear to begin validating input.
     Since posted messages are placed at the end of the message
     queue, this gives Windows the opportunity to complete the
     focus change before you attempt to change the focus back to
     another control.

     Attached is a unit and text representation of a DFM (form)
     file which demonstrates this technique.

  { *** BEGIN CODE FOR UNIT5.PAS *** }
  unit Unit5;
  
  interface
  
  uses
    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls, Mask;
  
  const
    { User-defined message }
    um_ValidateInput = wm_User + 100;
  
  type
    TForm5 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      Edit3: TEdit;
      Edit4: TEdit;
      Button1: TButton;
      procedure EditExit(Sender: TObject);
      procedure EditEnter(Sender: TObject);
    private
      Refocusing: TObject;
      { User-defined message handler }
      procedure ValidateInput(var M: TMessage); message um_ValidateInput;
    end;
  
  var
    Form5: TForm5;
  
  implementation
  
  {$R *.DFM}
  
  procedure TForm5.ValidateInput(var M: TMessage);
  var
  E : TEdit;
  begin
    { The following line is my validation.  I want to make sure }
    { the first character is a lower case alpha character.  Note }
    { the typecast of lParam to a TEdit. }
    E := TEdit(M.lParam);
    if not (E.Text[1] in ['a'..'z']) then begin
      Refocusing := E;                       { Avoid a loop     }
      ShowMessage('Bad input');              { Yell at the user }
      TEdit(E).SetFocus;                     { Set focus back   }
    end;
  end;
  
  procedure TForm5.EditExit(Sender: TObject);
  begin
    { Post a message to myself which indicates it's time to  }
    { validate the input.  Pass the TEdit instance (Self) as }
    { the message lParam. }
    if Refocusing = nil then
      PostMessage(Handle, um_ValidateInput, 0, longint(Sender));
  end;
  
  procedure TForm5.EditEnter(Sender: TObject);
  begin
  if Refocusing = Sender then
    Refocusing := nil;
  end;
  
  end.
  { *** END CODE FOR UNIT5.PAS *** }

  { *** BEGIN CODE FOR UNIT5.DFM *** }
  object Form5: TForm5
    Left = 489
    Top = 303
    Width = 318
    Height = 205
    Caption = 'Form5'
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = 'System'
    Font.Style = []
    PixelsPerInch = 96
    TextHeight = 16
    object Edit1: TEdit
      Left = 32
      Top = 32
      Width = 121
      Height = 24
      TabOrder = 0
      Text = 'Edit1'
      OnEnter = EditEnter
      OnExit = EditExit
    end
    object Edit2: TEdit
      Left = 160
      Top = 32
      Width = 121
      Height = 24
      TabOrder = 1
      Text = 'Edit2'
      OnEnter = EditEnter
      OnExit = EditExit
    end
    object Edit3: TEdit
      Left = 32
      Top = 64
      Width = 121
      Height = 24
      TabOrder = 2
      Text = 'Edit3'
      OnEnter = EditEnter
      OnExit = EditExit
    end
    object Edit4: TEdit
      Left = 160
      Top = 64
      Width = 121
      Height = 24
      TabOrder = 3
      Text = 'Edit4'
      OnEnter = EditEnter
      OnExit = EditExit
    end
    object Button1: TButton
      Left = 112
      Top = 136
      Width = 89
      Height = 33
      Caption = 'Button1'
      TabOrder = 4
    end
  end
  { *** END CODE FOR UNIT5.DFM *** }



Reference:


7/16/98 4:34:03 PM
 

Article originally contributed by Borland Staff


Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Learn More About Upgrading

Related posts
C++News

Using C++17 Algorithms Library Parallel Sorting with C++Builder 10.4 Sydney for Win32 and Win64

C++

What's New in the GetIt Package Manager - June 2020

C++

RAD Studio 10.4 Now Available, Learn More

C++NewsRAD Studio

Open for Business with 10.4! - May 2020 GM Update

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES