Следующая статья: Использование опции MultiSelect в DBGrid.
Решение
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.