Денежное поле редактирования в TEdit

Решение:

unit CurrEdit;

interface
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Menus,
  Forms, Dialogs, StdCtrls;

type
  TCurrencyEdit = class(TCustomMemo)
    private
      DispFormat: string;
      FieldValue: Extended;
      procedure SetFormat(A: string);
      procedure SetFieldValue(A: Extended);
      procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
      procedure CMExit(var Message: TCMExit); message CM_EXIT;
      procedure FormatText;
      procedure UnFormatText;
    protected
      procedure KeyPress(var Key: Char); override;
      procedure CreateParams(var Params: TCreateParams); override;
    public
      constructor Create(AOwner: TComponent); override;
    published
      property Alignment default taRightJustify;
      property AutoSize default True;
      property DisplayFormat: string read DispFormat write SetFormat;
      property Value: Extended read FieldValue write SetFieldValue;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Additional', [TCurrencyEdit]);
end;

constructor TCurrencyEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  AutoSize := True;
  Alignment := taRightJustify;
  Width := 121;
  Height := 25;
  DispFormat := '$,0.00;($,0.00)';
  FieldValue := 0.0;
  AutoSelect := False;
  WantReturns := False;
  WordWrap := False;
  FormatText;
end;

procedure TCurrencyEdit.SetFormat(A: String);
begin
  if DispFormat <> A then begin
    DispFormat := A;
    FormatText;
  end;
end;

procedure TCurrencyEdit.SetFieldValue(A: Extended);
begin
  if FieldValue <> A then begin
    FieldValue := A;
    FormatText;
  end;
end;

procedure TCurrencyEdit.UnFormatText;
var
  TmpText: String;
  Tmp: Byte;
  IsNeg: Boolean;

begin
  IsNeg := (Pos('-', Text) > 0) or (Pos('(', Text) > 0);
  TmpText := '';
  for Tmp := 1 to Length(Text) do
    if Text[Tmp] in ['0'..'9','.'] then TmpText := TmpText + Text[Tmp];
  try
    FieldValue := StrToFloat(TmpText);
    if IsNeg then FieldValue := -FieldValue;
  except
    MessageBeep(mb_IconAsterisk);
  end;
end;

procedure TCurrencyEdit.FormatText;
begin
  Text := FormatFloat(DispFormat, FieldValue);
end;

procedure TCurrencyEdit.CMEnter(var Message: TCMEnter);
begin
  SelectAll;
  inherited;
end;

procedure TCurrencyEdit.CMExit(var Message: TCMExit);
begin
  UnformatText;
  FormatText;
  Inherited;
end;

procedure TCurrencyEdit.KeyPress(var Key: Char);
begin
  if not (Key in ['0'..'9', '.', '-']) then Key := #0;
  inherited KeyPress(Key);
end;

procedure TCurrencyEdit.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  case Alignment of
    taLeftJustify:  Params.Style := Params.Style or ES_LEFT and Not ES_MULTILINE;
   taRightJustify:  Params.Style := Params.Style or ES_RIGHT and Not ES_MULTILINE;
         taCenter:  Params.Style := Params.Style or ES_CENTER and Not ES_MULTILINE;
  end;
end;

end.