📄 wnnumberedit.pas
字号:
TheRect := Rect(0, 0, FWorkCellWidth + FWorkCellOffset, ClientHeight);
Canvas.TextRect(TheRect, XOffset + (FWorkCellOffset div 2), YOffset, FCurrencySymbol);
for I := 1 to FDigitalNumber - (Len - FDotLength) - 1 do
Canvas.FillRect(Rect((FWorkCellWidth + FGridLineWidth) * I + FWorkCellOffset, 0, (FWorkCellWidth + FGridLineWidth) * I + FWorkCellWidth + FWorkCellOffset, ClientHeight));
end
else
begin
for I := 1 to FDigitalNumber - (Len - FDotLength) - 1 - 1 do
Canvas.FillRect(Rect((FWorkCellWidth + FGridLineWidth) * I + FWorkCellOffset, 0, (FWorkCellWidth + FGridLineWidth) * I + FWorkCellWidth + FWorkCellOffset, ClientHeight));
TheRect := Rect((FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - (Len - FDotLength) - 1) + FWorkCellOffset, 0, (FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - (Len - FDotLength) - 1) + FWorkCellWidth + FWorkCellOffset, ClientHeight);
Canvas.FillRect(TheRect);
Canvas.TextRect(TheRect, (FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - (Len - FDotLength) - 1) + XOffset + FWorkCellOffset, YOffset, FCurrencySymbol);
end;
end
else
begin
Canvas.FillRect(Rect(0, 0, FWorkCellWidth + FWorkCellOffset, ClientHeight));
for I := 1 to FDigitalNumber - (Len - FDotLength) - 1 do
Canvas.FillRect(Rect((FWorkCellWidth + FGridLineWidth) * I + FWorkCellOffset, 0, (FWorkCellWidth + FGridLineWidth) * I + FWorkCellWidth + FWorkCellOffset, ClientHeight));
end;
XOffset := (FWorkCellWidth - Canvas.TextWidth('0')) div 2;
for I := 1 to Len - FDecimalNumber - FDotLength do
begin
TheRect := Rect((FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - (Len - FDotLength) - 1 + I) + FWorkCellOffset, 0, (FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - (Len - FDotLength) - 1 + I) + FWorkCellWidth + FWorkCellOffset, ClientHeight);
Canvas.FillRect(TheRect);
Canvas.TextRect(TheRect, (FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - (Len - FDotLength) - 1 + I) + XOffset + FWorkCellOffset, YOffset, Text[I]);
end;
for I := 1 to FDecimalNumber do
begin
TheRect := Rect((FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - FDecimalNumber - 1 + I) + FWorkCellOffset, 0, (FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - FDecimalNumber - 1 + I) + FWorkCellWidth + FWorkCellOffset, ClientHeight);
Canvas.FillRect(TheRect);
Canvas.TextRect(TheRect, (FWorkCellWidth + FGridLineWidth) * (FDigitalNumber - FDecimalNumber - 1 + I) + XOffset + FWorkCellOffset, YOffset, Text[Len - FDecimalNumber + I]);
end;
end;
Canvas.Brush.Color := OldBrushColor;
SetCursorState(OldCursorVisible);
end;
procedure TWNCurrencyEdit.InitCursorX(X: Integer);
var
I, Len: Integer;
begin
FCursorXPos := FDigitalNumber - FDecimalNumber - 1;
Len := Length(FormatFloat(FFormatString, FValue));
for I := 0 to FDigitalNumber - 1 do
if (X >= (FWorkCellWidth + FGridLineWidth) * I + FWorkCellOffset) and
(X <= (FWorkCellWidth + FGridLineWidth) * I + FWorkCellWidth - 1 + FWorkCellOffset) then
begin
if (I < FDigitalNumber - (Len - FDotLength)) then
FCursorXPos := FDigitalNumber - (Len - FDotLength)
else
FCursorXPos := I;
Break;
end;
end;
function TWNCurrencyEdit.Modified: Boolean;
begin
Result := FModified;
end;
procedure TWNCurrencyEdit.Paint;
begin
if (FCellWidth > -1) then
begin
ClientWidth := FCellWidth * FDigitalNumber + FGridLineWidth * (FDigitalNumber - 1);
FWorkCellWidth := FCellWidth;
FWorkCellOffset := 0;
end
else
begin
FWorkCellWidth := (ClientWidth - FGridLineWidth * (FDigitalNumber - 1)) div FDigitalNumber;
FWorkCellOffset := ClientWidth - FGridLineWidth * (FDigitalNumber - 1) - FWorkCellWidth * FDigitalNumber;
end;
DrawGrid;
DrawText;
inherited;
end;
procedure TWNCurrencyEdit.SetCursorState(Visible: Boolean);
begin
if (Visible and FCursorVisible) or (not Visible and not FCursorVisible) then
Exit;
DrawCursor;
end;
procedure TWNCurrencyEdit.UnDo;
begin
Value := FOriginValue;
end;
procedure TWNCurrencyEdit.WMChar(var Message: TMessage);
var
Text: string;
Len: Integer;
OldCursorVisible: Boolean;
begin
with TWMKey(Message) do
case CharCode of
Ord('0')..Ord('9'):
begin
Text := FormatFloat(FFormatString, FValue);
Len := Length(Text);
if not FReadOnly and (Len - FDotLength - FDecimalNumber < FMaxLength) then
begin
OldCursorVisible := FCursorVisible;
SetCursorState(false);
Text := sncStuff(Text, Chr(CharCode), FCursorXPos - (FDigitalNumber - 1 - (Len - FDotLength) - 1), 0);
if (FDecimalNumber > 0) and (Len + 1 - Pos('.', Text) > FDecimalNumber) then
Text := sncStuff(Text, '', Len + 1, 1);
if (FCursorXPos >= FDigitalNumber - FDecimalNumber) and (FCursorXPos < FDigitalNumber - 1) then
FCursorXPos := FCursorXPos + 1;
SetCursorState(OldCursorVisible);
ChangeValue(StrToFloat(Text) * FNegativeSign);
end;
end;
end;
inherited;
end;
procedure TWNCurrencyEdit.WMKeyDown(var Message: TMessage);
var
ShiftState: TShiftState;
Text: string;
Len: Integer;
OldCursorVisible: Boolean;
IntCharCode: Word;
begin
with TWMKey(Message) do
begin
ShiftState := KeyDataToShiftState(KeyData);
IntCharCode := CharCode;
if (ShiftState = [ssShift]) and (CharCode = 187) then
IntCharCode := VK_ADD;
if (ShiftState = []) and (CharCode = 188) then
IntCharCode := VK_SEPARATOR;
if (ShiftState = []) and (CharCode = 189) then
IntCharCode := VK_SUBTRACT;
if (ShiftState = []) and (CharCode = 190) then
IntCharCode := VK_DECIMAL;
Text := FormatFloat(FFormatString, FValue);
Len := Length(Text);
case IntCharCode of
VK_SUBTRACT:
if not FReadOnly then
ChangeValue(-Value);
VK_ADD:
if not FReadOnly and (Value < 0) then
ChangeValue(-Value);
VK_BACK:
if not FReadOnly then
begin
OldCursorVisible := FCursorVisible;
SetCursorState(false);
if (FCursorXPos < FDigitalNumber - FDecimalNumber) then
if (FCursorXPos > FDigitalNumber - (Len - FDotLength)) then
Text := sncStuff(Text, '', FCursorXPos - (FDigitalNumber - (Len - FDotLength)), 1)
else
begin
if (FCursorXPos = FDigitalNumber - (Len - FDotLength)) then
Text := sncStuff(Text, '', FCursorXPos - (FDigitalNumber - (Len - FDotLength) - 1), 1);
if (FCursorXPos < FDigitalNumber - FDecimalNumber - 1) then
FCursorXPos := FCursorXPos + 1;
end
else
begin
if (FCursorXPos > FDigitalNumber - FDecimalNumber) then
Text := sncStuff(Text, '', FCursorXPos - (FDigitalNumber - Length(Text) - FDotLength) - 1, 1)
else
Text := sncStuff(Text, '', FCursorXPos - (FDigitalNumber - Length(Text) - FDotLength), 1);
if (FCursorXPos > FDigitalNumber - FDecimalNumber) then
FCursorXPos := FCursorXPos - 1;
end;
if (Text = '') then
Text := '0';
SetCursorState(OldCursorVisible);
ChangeValue(StrToFloat(Text) * FNegativeSign);
end;
VK_DELETE:
if not FReadOnly then
if (ShiftState = []) then
begin
OldCursorVisible := FCursorVisible;
SetCursorState(false);
if (FCursorXPos < FDigitalNumber - FDecimalNumber) then
begin
if (FCursorXPos >= FDigitalNumber - (Len - FDotLength)) then
Text := sncStuff(Text, '', FCursorXPos - (FDigitalNumber - (Len - FDotLength) - 1), 1);
if (FCursorXPos < FDigitalNumber - FDecimalNumber - 1) then
FCursorXPos := FCursorXPos + 1;
end
else
Text := sncStuff(Text, '', FCursorXPos - (FDigitalNumber - Length(Text) - FDotLength), 1);
if (Text = '') then
Text := '0';
SetCursorState(OldCursorVisible);
ChangeValue(StrToFloat(Text) * FNegativeSign);
end
else
if (ShiftState = [ssCtrl]) then
begin
OldCursorVisible := FCursorVisible;
SetCursorState(false);
FCursorXPos := FDigitalNumber - FDecimalNumber - 1;
Text := '0';
SetCursorState(OldCursorVisible);
ChangeValue(StrToFloat(Text) * FNegativeSign);
end;
VK_DECIMAL:
if (FDecimalNumber <> 0) then
begin
SetCursorState(false);
if (FCursorXPos >= FDigitalNumber - FDecimalNumber) then
FCursorXPos := FDigitalNumber - FDecimalNumber - 1
else
FCursorXPos := FDigitalNumber - FDecimalNumber;
SetCursorState(true);
end;
end;
end;
inherited;
end;
procedure TWNCurrencyEdit.CNKEYDOWN(var Message: TMessage);
var
ShiftState: TShiftState;
Offset, Len: Integer;
CanMoveOut: Boolean;
begin
CanMoveOut := false;
with TWMKey(Message) do
begin
ShiftState := KeyDataToShiftState(KeyData);
Len := Length(FormatFloat(FFormatString, FValue));
case CharCode of
VK_LEFT:
if (ShiftState = [ssCtrl]) then
begin
if (FCursorXPos > FDigitalNumber - (Len - FDotLength) - 1) then
begin
SetCursorState(false);
if (FCursorXPos < FDigitalNumber - FDecimalNumber) then
begin
Offset := FCursorXPos - 3 + (FDigitalNumber - FDecimalNumber - FCursorXPos - 1) mod 3;
if (Offset >= FDigitalNumber - (Len - FDotLength) - 1) then
FCursorXPos := Offset
else
FCursorXPos := FDigitalNumber - (Len - FDotLength) - 1;
end
else
if (FCursorXPos = FDigitalNumber - FDecimalNumber) then
FCursorXPos := FCursorXPos - 1
else
begin
Offset := FCursorXPos - 1 - (FCursorXPos - 1 - (FDigitalNumber - FDecimalNumber)) mod 3;
// if (Offset>=FDigitalNumber-FDecimalNumber) then
FCursorXPos := Offset;
end;
SetCursorState(true);
end
else
CanMoveOut := FMoveOutAllowed;
end
else
if (FCursorXPos > FDigitalNumber - (Len - FDotLength) - 1) then
begin
SetCursorState(false);
FCursorXPos := FCursorXPos - 1;
SetCursorState(true);
end
else
CanMoveOut := FMoveOutAllowed;
VK_RIGHT:
if (ShiftState = [ssCtrl]) then
begin
if (FCursorXPos < FDigitalNumber - 1) then
begin
SetCursorState(false);
if (FCursorXPos < FDigitalNumber - FDecimalNumber - 1) then
begin
Offset := FCursorXPos + 1 + (FDigitalNumber - FDecimalNumber - FCursorXPos + 1) mod 3;
// if (Offset<FDigitalNumber-FDecimalNumber) then
FCursorXPos := Offset;
end
else
if (FCursorXPos = FDigitalNumber - FDecimalNumber - 1) then
FCursorXPos := FCursorXPos + 1
else
begin
Offset := FCursorXPos + 3 - (FCursorXPos - (FDigitalNumber - FDecimalNumber)) mod 3;
if (Offset <= FDigitalNumber - 1) then
FCursorXPos := Offset
else
FCursorXPos := FDigitalNumber - 1;
end;
SetCursorState(true);
end
else
CanMoveOut := FMoveOutAllowed;
end
else
if (FCursorXPos < FDigitalNumber - 1) then
begin
SetCursorState(false);
FCursorXPos := FCursorXPos + 1;
SetCursorState(true);
end
else
CanMoveOut := FMoveOutAllowed;
VK_UP,
VK_DOWN:
CanMoveOut := FMoveOutAllowed;
VK_HOME:
begin
SetCursorState(false);
FCursorXPos := FDigitalNumber - (Len - FDotLength) - 1;
SetCursorState(true);
end;
VK_END:
begin
SetCursorState(false);
FCursorXPos := FDigitalNumber - 1;
SetCursorState(true);
end;
else
begin
inherited;
Exit;
end;
end;
end;
if CanMoveOut then
begin
inherited;
MoveOut(TWMKey(Message).CharCode, ShiftState);
end;
end;
procedure TWNCurrencyEdit.MoveOut(var Key: Word; Shift: TShiftState);
begin
if Assigned(FOnMoveOut) then
FOnMoveOut(Self, Key, Shift);
end;
procedure TWNCurrencyEdit.WMKillFocus(var Message: TMessage);
begin
inherited;
FCursorTimer.Enabled := False;
FCursorTimer.Free;
FCursorTimer := nil;
SetCursorState(False);
Repaint;
end;
procedure TWNCurrencyEdit.WMLButtonDown(var Message: TMessage);
begin
inherited;
if not Focused then
begin
SetFocus;
SetCursorState(False);
InitCursorX(TWMMouse(Message).Pos.X);
SetCursorState(True);
end
else
begin
SetCursorState(False);
DecodeCursorX(TWMMouse(Message).Pos.X);
SetCursorState(True);
end;
end;
procedure TWNCurrencyEdit.WMSetFocus(var Message: TMessage);
begin
inherited;
Repaint;
FCursorTimer := TTimer.Create(nil);
FCursorTimer.Enabled := False;
FCursorTimer.interval := 500;
FCursorTimer.OnTimer := CursorTimerHandle;
FCursorTimer.Enabled := True;
FCursorVisible := False;
SetCursorState(True);
end;
function TWNCurrencyEdit.GetChineseCurrencyStr: string;
begin
Result := FChineseCurrencyStr;
end;
procedure TWNCurrencyEdit.SetChineseCurrencyStr(Value: string);
begin
FChineseCurrencyStr:=ArabiaToChinese(FValue);
end;
function TWNCurrencyEdit.ArabiaToChinese(const ArabiaCurrency: Currency): string;
var SmallMonth,BigMonth:string;
wei1,qianwei1:string[2];
qianwei,dianweizhi,qian:integer;
begin
{------- 修改参数令值更精确 -------}
{小数点后的位置,需要的话也可以改动-2值}
qianwei:=-2;
Smallmonth:=formatfloat('0.00',ArabiaCurrency);
dianweizhi :=pos('.',Smallmonth);{小数点的位置}
for qian:=length(Smallmonth) downto 1 do
begin
if qian<>dianweizhi then
begin
case strtoint(copy(Smallmonth,qian,1)) of
1:wei1:='壹'; 2:wei1:='贰';
3:wei1:='叁'; 4:wei1:='肆';
5:wei1:='伍'; 6:wei1:='陆';
7:wei1:='柒'; 8:wei1:='捌';
9:wei1:='玖'; 0:wei1:='零';
end;
case qianwei of
-3:qianwei1:='厘';
-2:qianwei1:='分';
-1:qianwei1:='角';
0 :qianwei1:='元';
1 :qianwei1:='拾';
2 :qianwei1:='佰';
3 :qianwei1:='千';
4 :qianwei1:='万';
5 :qianwei1:='拾';
6 :qianwei1:='佰';
7 :qianwei1:='千';
8 :qianwei1:='亿';
9 :qianwei1:='十';
10:qianwei1:='佰';
11:qianwei1:='千';
end;
inc(qianwei);
BigMonth :=wei1+qianwei1+BigMonth;{组合成大写金额}
end;
end;
Result:=BigMonth+'整';
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -