MdNumEd.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit MdNumEd;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls;
  5. type
  6.   TMdNumEdit = class (TCustomEdit)
  7.   private
  8.     fInputError: TNotifyEvent;
  9.   protected
  10.     function GetValue: Integer;
  11.     procedure SetValue (Value: Integer);
  12.   public
  13.     procedure WmChar (var Msg: TWmChar); message wm_Char;
  14.     constructor Create (Owner: TComponent); override;
  15.   published
  16.     property OnInputError: TNotifyEvent
  17.       read fInputError write fInputError;
  18.     property Value: Integer
  19.       read GetValue write SetValue default 0;
  20.     property AutoSelect;
  21.     property AutoSize;
  22.     property BorderStyle;
  23.     property CharCase;
  24.     property Color;
  25.     property Ctl3D;
  26.     property DragCursor;
  27.     property DragMode;
  28.     property Enabled;
  29.     property Font;
  30.     property HideSelection;
  31.     property MaxLength;
  32.     property OEMConvert;
  33.     property ParentColor;
  34.     property ParentCtl3D;
  35.     property ParentFont;
  36.     property ParentShowHint;
  37.     property PasswordChar;
  38.     property PopupMenu;
  39.     property ReadOnly;
  40.     property ShowHint;
  41.     property TabOrder;
  42.     property TabStop;
  43.     property Visible;
  44.     property OnChange;
  45.     property OnClick;
  46.     property OnDblClick;
  47.     property OnDragDrop;
  48.     property OnDragOver;
  49.     property OnEndDrag;
  50.     property OnEnter;
  51.     property OnExit;
  52.     property OnKeyDown;
  53.     property OnKeyPress;
  54.     property OnKeyUp;
  55.     property OnMouseDown;
  56.     property OnMouseMove;
  57.     property OnMouseUp;
  58.   end;
  59.   TMdThousandEdit = class (TMdNumEdit)
  60.   public
  61.     procedure Change; override;
  62.   end;
  63. procedure Register;
  64. implementation
  65. constructor TMdNumEdit.Create (Owner: TComponent);
  66. begin
  67.   inherited Create (Owner);
  68.   Value := 0;
  69. end;
  70. function TMdNumEdit.GetValue: Integer;
  71. begin
  72.   // set to 0 in case of error
  73.   Result := StrToIntDef (Text, 0);
  74. end;
  75. procedure TMdNumEdit.SetValue (Value: Integer);
  76. begin
  77.   Text := IntToStr (Value);
  78. end;
  79. procedure TMdNumEdit.WmChar (var Msg: TWmChar);
  80. begin
  81.   if not (Char (Msg.CharCode) in ['0'..'9']) and not (Msg.CharCode = 8) then
  82.   begin
  83.     if Assigned (fInputError) then
  84.       fInputError (Self);
  85.   end
  86.   else
  87.     inherited;
  88. end;
  89. procedure Register;
  90. begin
  91.   RegisterComponents ('Md', [TMdNumEdit, TMdThousandEdit]);
  92. end;
  93. { TMdCurrencyEdit }
  94. function StringToFloatSkipping (s: string): Extended;
  95. var
  96.   s1: string;
  97.   I: Integer;
  98. begin
  99.   // remove non-numbers, but keep the decimal separator
  100.   s1 := '';
  101.   for i := 1 to length (s) do
  102.    if s[i] in ['0'..'9'] then
  103.      s1 := s1 + s[i];
  104.   Result := StrToFloat (s1);
  105. end;
  106. procedure TMdThousandEdit.Change;
  107. var
  108.   CursorPos, // original position of the cursor
  109.   LengthDiff: Integer; // number of new separators (+ or -)
  110. begin
  111.   if Assigned (Parent) then
  112.   begin
  113.     CursorPos := SelStart;
  114.     LengthDiff := Length (Text);
  115.     Text := FormatFloat ('#,###',
  116.       StringToFloatSkipping (Text));
  117.     LengthDiff := Length (Text) - LengthDiff;
  118.     // move the cursor to the proper position
  119.     SelStart := CursorPos + LengthDiff;
  120.   end;
  121.   inherited;
  122. end;
  123. end.