--- ---

Here's a rather simple-minded component that will do that for you:

    unit GSSimp;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TGSErrorType = (etChange, etPress);

    type
      TErrorEvent = procedure(Sender: TObject; ErrType: TGSErrorType)
        of object;

    type
      TGsSimpleNumEdit = class(TEdit)
      private
        FOnError: TErrorEvent;
      protected
        procedure Change; override;
        procedure KeyPress(var Key: Char); override;
      published
        property OnError: TErrorEvent read FOnError write FOnError;
      end;

    procedure Register;

    implementation

    procedure TGsSimpleNumEdit.Change;
    var
      tmpI: integer;
    begin
      try
        tmpI := StrToInt(Text);
        inherited Change;
      except
        if Assigned(FOnError) then
          FOnError(self, etChange);
      end;
    end;

    procedure TGsSimpleNumEdit.KeyPress(var Key: Char);
    var
      tText: string;
    begin
      if SelLength <> Length(Text) then
        tText := Text
      else
        tText := EmptyStr;
      if Key in ['0'..'9', #8, #127] then
        inherited KeyPress(Key)
      else
      begin
        Key := #0;
        if Assigned(FOnError) then
          FOnError(self, etPress);
      end;
    end;

    procedure Register;
    begin
      RegisterComponents('Garlin', [TGsSimpleNumEdit]);
    end;

    end.

See Tip #151 for an alternative solution.