?? curredit.pas
字號:
{*******************************************************}
{ }
{ Delphi VCL Extensions (RX) }
{ }
{ Copyright (c) 1995, 1996 AO ROSNO }
{ Copyright (c) 1997, 1998 Master-Bank }
{ }
{*******************************************************}
unit CurrEdit;
{$I RX.INC}
{$W-}
interface
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Menus, Forms, StdCtrls, Mask,
Buttons, ToolEdit;
type
{ TCustomNumEdit }
TCustomNumEdit = class(TCustomComboEdit)
private
FCanvas: TControlCanvas;
FAlignment: TAlignment;
FFocused: Boolean;
FValue: Extended;
FMinValue, FMaxValue: Extended;
FDecimalPlaces: Cardinal;
FBeepOnError: Boolean;
FCheckOnExit: Boolean;
FZeroEmpty: Boolean;
FFormatOnEditing: Boolean;
FFormatting: Boolean;
FDisplayFormat: String;
procedure SetFocused(Value: Boolean);
procedure SetAlignment(Value: TAlignment);
procedure SetBeepOnError(Value: Boolean);
procedure SetDisplayFormat(const Value: string);
function GetDisplayFormat: string;
procedure SetDecimalPlaces(Value: Cardinal);
function GetValue: Extended;
procedure SetValue(AValue: Extended);
function GetAsInteger: Longint;
procedure SetAsInteger(AValue: Longint);
procedure SetMaxValue(AValue: Extended);
procedure SetMinValue(AValue: Extended);
procedure SetZeroEmpty(Value: Boolean);
procedure SetFormatOnEditing(Value: Boolean);
function GetText: string;
procedure SetText(const AValue: string);
function TextToValText(const AValue: string): string;
function CheckValue(NewValue: Extended; RaiseOnError: Boolean): Extended;
function IsFormatStored: Boolean;
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
procedure CMExit(var Message: TCMExit); message CM_EXIT;
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
procedure WMPaste(var Message: TMessage); message WM_PASTE;
protected
{$IFDEF WIN32}
procedure AcceptValue(const Value: Variant); override;
{$ELSE}
procedure AcceptValue(const Value: string); override;
{$ENDIF}
procedure Change; override;
procedure ReformatEditText; dynamic;
function GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap; override;
procedure DataChanged; virtual;
function DefaultDisplayFormat: string; virtual;
procedure KeyPress(var Key: Char); override;
function IsValidChar(Key: Char): Boolean; virtual;
function FormatDisplayText(Value: Extended): string;
function GetDisplayText: string; virtual;
procedure Reset; override;
procedure CheckRange;
procedure UpdateData;
procedure UpdatePopup; virtual;
property Formatting: Boolean read FFormatting;
property Alignment: TAlignment read FAlignment write SetAlignment
default taRightJustify;
property BeepOnError: Boolean read FBeepOnError write SetBeepOnError
default True;
property CheckOnExit: Boolean read FCheckOnExit write FCheckOnExit default False;
property GlyphKind default gkDefault;
property ButtonWidth default 20;
property DecimalPlaces: Cardinal read FDecimalPlaces write SetDecimalPlaces
default 2;
property DisplayFormat: string read GetDisplayFormat write SetDisplayFormat
stored IsFormatStored;
property MaxValue: Extended read FMaxValue write SetMaxValue;
property MinValue: Extended read FMinValue write SetMinValue;
property FormatOnEditing: Boolean read FFormatOnEditing
write SetFormatOnEditing default False;
property Text: string read GetText write SetText stored False;
property MaxLength default 0;
property ZeroEmpty: Boolean read FZeroEmpty write SetZeroEmpty default True;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear; {$IFDEF RX_D5} override; {$ENDIF}
property AsInteger: Longint read GetAsInteger write SetAsInteger;
property DisplayText: string read GetDisplayText;
property PopupVisible;
property Value: Extended read GetValue write SetValue;
end;
{ TCurrencyEdit }
TCurrencyEdit = class(TCustomNumEdit)
protected
function DefaultDisplayFormat: string; override;
public
constructor Create(AOwner: TComponent); override;
published
property Alignment;
property AutoSelect;
property AutoSize;
property BeepOnError;
property BorderStyle;
property CheckOnExit;
property Color;
property Ctl3D;
property DecimalPlaces;
property DisplayFormat;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property FormatOnEditing;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property MaxLength;
property MaxValue;
property MinValue;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Value;
property Visible;
property ZeroEmpty;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
{ TRxCustomCalcEdit }
TRxCustomCalcEdit = class(TCustomNumEdit)
public
constructor Create(AOwner: TComponent); override;
end;
{ TRxCalcEdit }
TRxCalcEdit = class(TRxCustomCalcEdit)
published
property Alignment;
property AutoSelect;
property AutoSize;
property BeepOnError;
property BorderStyle;
property ButtonHint;
property CheckOnExit;
property ClickKey;
property Color;
property Ctl3D;
property DecimalPlaces;
property DirectInput;
property DisplayFormat;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property FormatOnEditing;
property GlyphKind;
{ Ensure GlyphKind is published before Glyph and ButtonWidth }
property Glyph;
property ButtonWidth;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property MaxLength;
property MaxValue;
property MinValue;
property NumGlyphs;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupAlign;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Value;
property Visible;
property ZeroEmpty;
property OnButtonClick;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
implementation
uses Consts, rxStrUtils, VclUtils, MaxMin, RxCalc;
{$R *.R32}
const
sCalcBmp = 'CEDITBMP'; { Numeric editor button glyph }
CalcBitmap: TBitmap = nil;
type
THack = class(TPopupWindow);
function IsValidFloat(const Value: string; var RetValue: Extended): Boolean;
var
I: Integer;
Buffer: array[0..63] of Char;
begin
Result := False;
for I := 1 to Length(Value) do
if not (Value[I] in [DecimalSeparator, '-', '+', '0'..'9', 'e', 'E']) then
Exit;
Result := TextToFloat(StrPLCopy(Buffer, Value,
SizeOf(Buffer) - 1), RetValue {$IFDEF WIN32}, fvExtended {$ENDIF});
end;
function FormatFloatStr(const S: string; Thousands: Boolean): string;
var
I, MaxSym, MinSym, Group: Integer;
IsSign: Boolean;
begin
Result := '';
MaxSym := Length(S);
IsSign := (MaxSym > 0) and (S[1] in ['-', '+']);
if IsSign then MinSym := 2
else MinSym := 1;
I := Pos(DecimalSeparator, S);
if I > 0 then MaxSym := I - 1;
I := Pos('E', AnsiUpperCase(S));
if I > 0 then MaxSym := Min(I - 1, MaxSym);
Result := Copy(S, MaxSym + 1, MaxInt);
Group := 0;
for I := MaxSym downto MinSym do begin
Result := S[I] + Result;
Inc(Group);
if (Group = 3) and Thousands and (I > MinSym) then begin
Group := 0;
Result := ThousandSeparator + Result;
end;
end;
if IsSign then Result := S[1] + Result;
end;
{ TCustomNumEdit }
constructor TCustomNumEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csSetCaption];
MaxLength := 0;
FBeepOnError := True;
FAlignment := taRightJustify;
FDisplayFormat := DefaultDisplayFormat;
FDecimalPlaces := 2;
FZeroEmpty := True;
inherited Text := '';
inherited Alignment := taLeftJustify;
FDefNumGlyphs := 2;
{ forces update }
DataChanged;
ControlState := ControlState + [csCreating];
try
GlyphKind := gkDefault;
ButtonWidth := 20;
finally
ControlState := ControlState - [csCreating];
end;
end;
destructor TCustomNumEdit.Destroy;
begin
FCanvas.Free;
//DisposeStr(FDisplayFormat);
if FPopup <> nil then begin
TPopupWindow(FPopup).OnCloseUp := nil;
FPopup.Free;
FPopup := nil;
end;
inherited Destroy;
end;
function TCustomNumEdit.GetDefaultBitmap(var DestroyNeeded: Boolean): TBitmap;
begin
DestroyNeeded := False;
if CalcBitmap = nil then begin
CalcBitmap := TBitmap.Create;
CalcBitmap.Handle := LoadBitmap(hInstance, sCalcBmp);
end;
Result := CalcBitmap;
end;
function TCustomNumEdit.DefaultDisplayFormat: string;
begin
Result := ',0.##';
end;
function TCustomNumEdit.IsFormatStored: Boolean;
begin
Result := (DisplayFormat <> DefaultDisplayFormat);
end;
function TCustomNumEdit.IsValidChar(Key: Char): Boolean;
var
S: string;
SelStart, SelStop, DecPos: Integer;
RetValue: Extended;
begin
Result := False;
S := EditText;
GetSel(SelStart, SelStop);
System.Delete(S, SelStart + 1, SelStop - SelStart);
System.Insert(Key, S, SelStart + 1);
S := TextToValText(S);
DecPos := Pos(DecimalSeparator, S);
if (DecPos > 0) then begin
SelStart := Pos('E', UpperCase(S));
if (SelStart > DecPos) then DecPos := SelStart - DecPos
else DecPos := Length(S) - DecPos;
if DecPos > Integer(FDecimalPlaces) then Exit;
end;
Result := IsValidFloat(S, RetValue);
if Result and (FMinValue >= 0) and (FMaxValue > 0) and (RetValue < 0) then
Result := False;
end;
procedure TCustomNumEdit.KeyPress(var Key: Char);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -