?? curredit.pas
字號:
begin
if PopupVisible and (UpCase(Key) in ['0'..'9', DecimalSeparator, '.', ',',
'+', '-', '*', '/', '_', '=', 'C', 'R', 'Q', '%', #8, #13] -
[ThousandSeparator]) then
begin
THack(FPopup).KeyPress(Key);
Key := #0;
end;
if Key in ['.', ','] - [ThousandSeparator] then
Key := DecimalSeparator;
inherited KeyPress(Key);
if (Key in [#32..#255]) and not IsValidChar(Key) then begin
if BeepOnError then MessageBeep(0);
Key := #0;
end
else if Key = #27 then begin
Reset;
Key := #0;
end;
end;
procedure TCustomNumEdit.Reset;
begin
DataChanged;
SelectAll;
end;
procedure TCustomNumEdit.SetZeroEmpty(Value: Boolean);
begin
if FZeroEmpty <> Value then begin
FZeroEmpty := Value;
DataChanged;
end;
end;
procedure TCustomNumEdit.SetBeepOnError(Value: Boolean);
begin
if FBeepOnError <> Value then begin
FBeepOnError := Value;
UpdatePopup;
end;
end;
procedure TCustomNumEdit.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then begin
FAlignment := Value;
Invalidate;
end;
end;
procedure TCustomNumEdit.SetDisplayFormat(const Value: string);
begin
if DisplayFormat <> Value then begin
FDisplayFormat := Value;
Invalidate;
DataChanged;
end;
end;
function TCustomNumEdit.GetDisplayFormat: string;
begin
Result := FDisplayFormat;
end;
procedure TCustomNumEdit.SetFocused(Value: Boolean);
begin
if FFocused <> Value then begin
FFocused := Value;
Invalidate;
FFormatting := True;
try
DataChanged;
finally
FFormatting := False;
end;
end;
end;
procedure TCustomNumEdit.SetFormatOnEditing(Value: Boolean);
begin
if FFormatOnEditing <> Value then begin
FFormatOnEditing := Value;
if FFormatOnEditing then inherited Alignment := Alignment
else inherited Alignment := taLeftJustify;
if FFormatOnEditing and FFocused then ReformatEditText
else if FFocused then begin
UpdateData;
DataChanged;
end;
end;
end;
procedure TCustomNumEdit.SetDecimalPlaces(Value: Cardinal);
begin
if FDecimalPlaces <> Value then begin
FDecimalPlaces := Value;
DataChanged;
Invalidate;
end;
end;
function TCustomNumEdit.FormatDisplayText(Value: Extended): string;
begin
if DisplayFormat <> '' then
Result := FormatFloat(DisplayFormat, Value)
else
Result := FloatToStr(Value);
end;
function TCustomNumEdit.GetDisplayText: string;
begin
Result := FormatDisplayText(FValue);
end;
procedure TCustomNumEdit.Clear;
begin
Text := '';
end;
procedure TCustomNumEdit.DataChanged;
var
EditFormat: string;
begin
EditFormat := '0';
if FDecimalPlaces > 0 then
EditFormat := EditFormat + '.' + MakeStr('#', FDecimalPlaces);
if (FValue = 0.0) and FZeroEmpty then
EditText := ''
else
EditText := FormatFloat(EditFormat, FValue);
end;
function TCustomNumEdit.CheckValue(NewValue: Extended;
RaiseOnError: Boolean): Extended;
begin
Result := NewValue;
if (FMaxValue <> FMinValue) then begin
if (FMaxValue > FMinValue) then begin
if NewValue < FMinValue then Result := FMinValue
else if NewValue > FMaxValue then Result := FMaxValue;
end
else begin
if FMaxValue = 0 then begin
if NewValue < FMinValue then Result := FMinValue;
end
else if FMinValue = 0 then begin
if NewValue > FMaxValue then Result := FMaxValue;
end;
end;
if RaiseOnError and (Result <> NewValue) then
raise ERangeError.CreateFmt(ReplaceStr(ResStr(SOutOfRange), '%d', '%.*f'),
[DecimalPlaces, FMinValue, DecimalPlaces, FMaxValue]);
end;
end;
procedure TCustomNumEdit.CheckRange;
begin
if not (csDesigning in ComponentState) and CheckOnExit then
CheckValue(StrToFloat(TextToValText(EditText)), True);
end;
procedure TCustomNumEdit.UpdateData;
begin
ValidateEdit;
FValue := CheckValue(StrToFloat(TextToValText(EditText)), False);
end;
procedure TCustomNumEdit.UpdatePopup;
begin
if FPopup <> nil then
SetupPopupCalculator(FPopup, DefCalcPrecision, BeepOnError);
end;
function TCustomNumEdit.GetValue: Extended;
begin
if not (csDesigning in ComponentState) then
try
UpdateData;
except
FValue := FMinValue;
end;
Result := FValue;
end;
procedure TCustomNumEdit.SetValue(AValue: Extended);
begin
FValue := CheckValue(AValue, False);
DataChanged;
Invalidate;
end;
function TCustomNumEdit.GetAsInteger: Longint;
begin
Result := Trunc(Value);
end;
procedure TCustomNumEdit.SetAsInteger(AValue: Longint);
begin
SetValue(AValue);
end;
procedure TCustomNumEdit.SetMinValue(AValue: Extended);
begin
if FMinValue <> AValue then begin
FMinValue := AValue;
Value := FValue;
end;
end;
procedure TCustomNumEdit.SetMaxValue(AValue: Extended);
begin
if FMaxValue <> AValue then begin
FMaxValue := AValue;
Value := FValue;
end;
end;
function TCustomNumEdit.GetText: string;
begin
Result := inherited Text;
end;
function TCustomNumEdit.TextToValText(const AValue: string): string;
begin
Result := DelRSpace(AValue);
if DecimalSeparator <> ThousandSeparator then begin
Result := DelChars(Result, ThousandSeparator);
end;
if (DecimalSeparator <> '.') and (ThousandSeparator <> '.') then
Result := ReplaceStr(Result, '.', DecimalSeparator);
if (DecimalSeparator <> ',') and (ThousandSeparator <> ',') then
Result := ReplaceStr(Result, ',', DecimalSeparator);
if Result = '' then Result := '0'
else if Result = '-' then Result := '-0';
end;
procedure TCustomNumEdit.SetText(const AValue: string);
begin
if not (csReading in ComponentState) then begin
FValue := CheckValue(StrToFloat(TextToValText(AValue)), False);
DataChanged;
Invalidate;
end;
end;
procedure TCustomNumEdit.ReformatEditText;
var
S: string;
IsEmpty: Boolean;
OldLen, SelStart, SelStop: Integer;
begin
FFormatting := True;
try
S := inherited Text;
OldLen := Length(S);
IsEmpty := (OldLen = 0) or (S = '-');
if HandleAllocated then GetSel(SelStart, SelStop);
if not IsEmpty then S := TextToValText(S);
S := FormatFloatStr(S, Pos(',', DisplayFormat) > 0);
inherited Text := S;
if HandleAllocated and (GetFocus = Handle) and not
(csDesigning in ComponentState) then
begin
Inc(SelStart, Length(S) - OldLen);
SetCursor(SelStart);
end;
finally
FFormatting := False;
end;
end;
procedure TCustomNumEdit.Change;
begin
if not FFormatting then begin
if FFormatOnEditing and FFocused then ReformatEditText;
inherited Change;
end;
end;
{$IFDEF WIN32}
procedure TCustomNumEdit.AcceptValue(const Value: Variant);
{$ELSE}
procedure TCustomNumEdit.AcceptValue(const Value: string);
{$ENDIF}
begin
inherited AcceptValue(Value);
end;
procedure TCustomNumEdit.WMPaste(var Message: TMessage);
var
S: string;
begin
S := EditText;
try
inherited;
UpdateData;
except
EditText := S;
SelectAll;
if CanFocus then SetFocus;
if BeepOnError then MessageBeep(0);
end;
end;
procedure TCustomNumEdit.CMEnter(var Message: TCMEnter);
begin
SetFocused(True);
if FFormatOnEditing then ReformatEditText;
inherited;
end;
procedure TCustomNumEdit.CMExit(var Message: TCMExit);
begin
try
CheckRange;
UpdateData;
except
SelectAll;
if CanFocus then SetFocus;
raise;
end;
SetFocused(False);
SetCursor(0);
DoExit;
end;
procedure TCustomNumEdit.CMEnabledChanged(var Message: TMessage);
begin
inherited;
if NewStyleControls and not FFocused then Invalidate;
end;
procedure TCustomNumEdit.WMPaint(var Message: TWMPaint);
var
S: string;
begin
if PopupVisible then S := TPopupWindow(FPopup).GetPopupText
else S := GetDisplayText;
if not PaintComboEdit(Self, S, FAlignment, FFocused and not PopupVisible,
FCanvas, Message) then inherited;
end;
procedure TCustomNumEdit.CMFontChanged(var Message: TMessage);
begin
inherited;
Invalidate;
end;
{ TCurrencyEdit }
constructor TCurrencyEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlState := ControlState + [csCreating];
try
ButtonWidth := 0;
finally
ControlState := ControlState - [csCreating];
end;
end;
function TCurrencyEdit.DefaultDisplayFormat: string;
var
CurrStr: string;
I: Integer;
C: Char;
begin
Result := ',0.' + MakeStr('0', CurrencyDecimals);
CurrStr := '';
for I := 1 to Length(CurrencyString) do begin
C := CurrencyString[I];
if C in [',', '.'] then CurrStr := CurrStr + '''' + C + ''''
else CurrStr := CurrStr + C;
end;
if Length(CurrStr) > 0 then
case CurrencyFormat of
0: Result := CurrStr + Result; { '$1' }
1: Result := Result + CurrStr; { '1$' }
2: Result := CurrStr + ' ' + Result; { '$ 1' }
3: Result := Result + ' ' + CurrStr; { '1 $' }
end;
Result := Format('%s;-%s', [Result, Result]);
end;
{ TRxCustomCalcEdit }
constructor TRxCustomCalcEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlState := ControlState + [csCreating];
try
FPopup := TPopupWindow(CreatePopupCalculator(Self
{$IFDEF RX_D4}, BiDiMode {$ENDIF}));
TPopupWindow(FPopup).OnCloseUp := PopupCloseUp;
UpdatePopup;
finally
ControlState := ControlState - [csCreating];
end;
end;
procedure DestroyLocals; far;
begin
CalcBitmap.Free;
CalcBitmap := nil;
end;
{$IFDEF WIN32}
initialization
finalization
DestroyLocals;
{$ELSE}
initialization
AddExitProc(DestroyLocals);
{$ENDIF}
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -