📄 eznumed.pas
字号:
InvalidateEditor;
end;
procedure TEzDisplayFormat.SetShow(const Value: Boolean);
begin
if FShow = Value then Exit;
FShow := Value;
InvalidateEditor;
end;
{ TEzNumEd - numeric edit control }
Constructor TEzNumEd.Create( AOwner: TComponent );
Begin
Inherited Create( AOwner );
ControlStyle := ControlStyle + [csFramed, csOpaque];
Width := 121;
Height := 24;
TabStop := True;
FBorderStyle:= ebsSingle;
FBorderSize:= neEditBorderSize;
FBorderColor:= clDefault;
ParentColor := False;
Cursor := crIBeam;
FEditFormat:= TEzEditFormat.Create(Self);
FDisplayFormat:= TEzDisplayFormat.Create(Self);
FNumericValue := 0.0;
FOriginalValue := FNumericValue;
FReadOnly := false;
FAcceptNegatives := true;
FTabOnEnterKey := true;
FDecimalSeparator:= SysUtils.DecimalSeparator;
FThousandSeparator:= SysUtils.ThousandSeparator;
FUseWindowsSeparator:= True;
FShadowed:= False;
FShadowWidth:= neEditShadowSize;
FShadowColor:= clGray;
FDigits:= 8;
FDecimals:= SysUtils.CurrencyDecimals;
FUseThousandSeparator:= True;
FNegColor:= clRed;
//[KT] - added 12/06/01, FWidthPad, FHeightPad
FHeightPad := 0;
FWidthPad := -15;
End;
destructor TEzNumEd.Destroy;
begin
FEditFormat.Free;
FDisplayFormat.Free;
if Assigned( FCaretBm ) then FCaretBm.Free;
inherited;
end;
function TEzNumEd.GetAbout: TEzAbout;
begin
Result:= SEz_GisVersion;
end;
procedure TEzNumEd.SetAbout(const Value: TEzAbout);
begin
end;
procedure TEzNumEd.Loaded;
begin
inherited;
if FUseWindowsSeparator then
begin
FDecimalSeparator:= SysUtils.DecimalSeparator;
FThousandSeparator:= SysUtils.ThousandSeparator;
end;
end;
procedure TEzNumEd.SetUseThousandSeparator(const Value: Boolean);
begin
FUseThousandSeparator := Value;
Invalidate;
end;
Procedure TEzNumEd.SetBorderSize( Value: Integer );
begin
if FBordersize=Value then exit;
FBordersize:=value;
Invalidate;
end;
Procedure TEzNumEd.SetBorderColor(Value: TColor);
begin
if FBorderColor=Value then exit;
FBorderColor:=Value;
Invalidate;
end;
procedure TEzNumEd.SetDigits(const Value: Integer);
begin
if Value < 1 then Exit;
FDigits := Value;
Invalidate;
end;
procedure TEzNumEd.SetNegColor(const Value: TColor);
begin
if Value = FNegColor then exit;
FNegColor:= Value;
Invalidate;
end;
procedure TEzNumEd.SetDecimals(const Value: Integer);
begin
FDecimals := Value;
Invalidate;
end;
procedure TEzNumEd.SetShadowWidth(const Value: Integer);
begin
if FShadowWidth = Value then Exit;
FShadowWidth := Value;
Invalidate;
end;
procedure TEzNumEd.SetShadowColor(const Value: TColor);
begin
if FShadowColor = Value then Exit;
FShadowColor := Value;
Invalidate;
end;
procedure TEzNumEd.SetShadowed(const Value: Boolean);
begin
if FShadowed = Value then Exit;
FShadowed := Value;
Invalidate;
end;
procedure TEzNumEd.WMSetFocus(var Message: TWMSetFocus);
begin
inherited;
EditEnter;
if not IsDesigning then
RedrawBorder (0);
end;
procedure TEzNumEd.WMKillFocus(var Message: TWMKillFocus);
begin
inherited;
if not IsDesigning then
RedrawBorder (0);
EditExit;
end;
procedure TEzNumEd.WMNCPaint(var Message: TMessage);
begin
inherited;
RedrawBorder(Message.WParam);
end;
Procedure TEzNumEd.EditEnter;
Begin
If Not IsDesigning Then
Begin
FOriginalValue := FNumericValue;
{ Create the caret }
if FCaretBm <> Nil then FreeAndNil( FCaretBm );
FCaretBm := TBitmap.Create;
FCaretBm.Handle := LoadBitmap( HInstance, 'NUM_CARET' );
CreateCaret( Handle, FCaretBm.Handle, 0, 0 );
ShowCaret( Handle );
FModified := false;
FPartEditing := peInteger;
//FSelected := true;
Invalidate;
SetCursorPos;
End;
End;
Procedure TEzNumEd.EditExit;
Begin
If Not IsDesigning Then
Begin
HideCaret( Handle );
DestroyCaret;
if FCaretBm <> Nil then
begin
DeleteObject( FCaretBm.Handle );
FreeAndNil( FCaretBm );
end;
FSelected := false;
Invalidate;
End;
End;
Procedure TEzNumEd.Paint;
Var
R: TRect;
s,ls,rs: String;
fm: TEzEditFormat;
UsingParens: Boolean;
temp: Integer;
Begin
If Not IsDesigning and Focused Then
begin
HideCaret( Handle );
fm:= FEditFormat;
end else
fm:= FDisplayFormat;
Canvas.Font := Font;
With Canvas Do
Begin
{$ifdef false}
R := ClientRect;
if BorderStyle = ebsFlat then InflateRect( R, -1, -1 );
If BorderStyle = ebsSingle Then
Begin
Brush.Color := clWindowFrame;
FrameRect( R );
InflateRect( R, -1, -1 );
End;
{$endif}
if Enabled then
Brush.Color := Color
else
Brush.Color := clBtnFace;
FillRect( ClientRect );
RedrawBorder(0);
R:= FDrawTextRect;
{ left and right info }
ls:= ReplaceCodes( fm.LeftInfo );
rs:= ReplaceCodes( fm.RightInfo );
UsingParens:= false;
if IsDesigning then
s:= CreateMask( FEditFormat )
else
s:= AsString;
if Not IsDesigning and not Focused and
TEzDisplayFormat(fm).NegUseParens and (FNumericValue < 0) then
begin
ls := '(' + ls;
rs := ')' + rs;
UsingParens:= true;
if (Length(s) > 0) And (s[1] = '-') then System.Delete(s,1,1);
end;
s:= ls + s;
If ( FNumericValue = 0 ) And ( FNegFlag = true ) and Not UsingParens Then
s := '-' + s;
If FSelected Then
Begin
Brush.Color := clHighlight;
If FNumericValue < 0 Then
Font.Color := NegColor
Else
Font.Color := clHighlightText;
End
Else
Begin
If FNumericValue < 0.0 Then
Font.Color := NegColor;
If Not Enabled Then
Font.Color := clGray;
End;
if Length(rs) > 0 then
begin
Dec( R.Right, Canvas.TextWidth( rs ) );
end;
//[KT] - added 12/06/01, adjust for padding
InflateRect( R, WidthPad, HeightPad );
Canvas.Font.Color:= clBlack;
DrawText( Canvas.Handle, @s[1], Length( s ), R, dt_right Or
dt_singleline Or dt_vcenter );
if Length(rs) > 0 then
begin
temp:= R.Right;
R:= ClientRect;
InflateRect( R, 0, HeightPad );
R.Left:= temp;
DrawText( Canvas.Handle, @rs[1], Length( rs ), R, dt_left Or
dt_singleline Or dt_vcenter );
end;
End;
if not IsDesigning And FShadowed then
begin
ShadeIt(GetParentForm( Self ), Self, FShadowWidth, FShadowColor);
end;
If Focused Then
ShowCaret( Handle );
End;
{procedure TEzNumEd.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
if FBorderStyle=ebsFlat and not IsDesigning then
InflateRect(Message.CalcSize_Params^.rgrc[0], -3, -3);
end; }
procedure TEzNumEd.RedrawBorder(const Clip: HRGN);
var
//DC: HDC;
R: TRect;
NewClipRgn: HRGN;
FrameBrush, BtnFaceBrush, WindowBrush: HBRUSH;
I, bsz: Integer;
bs: TEzBorderStyle;
begin
//if FBorderStyle <> ebsNone then
//begin
If Not IsDesigning and Focused Then
HideCaret( Handle );
//DC := GetWindowDC(Handle);
try
{ Use update region }
if (Clip <> 0) and (Clip <> 1) then
begin
GetWindowRect (Handle, R);
if SelectClipRgn(Canvas.Handle, Clip) = ERROR then
begin
NewClipRgn := CreateRectRgnIndirect(R);
SelectClipRgn (Canvas.Handle, NewClipRgn);
DeleteObject (NewClipRgn);
end;
OffsetClipRgn (Canvas.Handle, -R.Left, -R.Top);
end;
{GetWindowRect(Handle, R);
OffsetRect(R, -R.Left, -R.Top); }
R:= ClientRect;
{if (IsDesigning and Enabled) or
(not IsDesigning and (Focused or (FMouseInControl and Not Focused))) then }
if (BorderStyle=ebsFlat) and Not Focused and FMouseInControl then
bs:= ebs3D
else
bs:= BorderStyle;
Case bs of
ebsSingle, ebsThick:
Begin
FrameBrush := CreateSolidBrush(ColorToRGB(BorderColor));
if FBorderStyle=ebsSingle then bsz:= 1 else bsz:= FBorderSize;
for I := 0 to bsz - 1 do
begin
FrameRect(Canvas.Handle, R, FrameBrush);
InflateRect(R, -1, -1);
end;
DeleteObject(FrameBrush);
End;
ebsFlat:
Begin
DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_RECT or BF_ADJUST);
with R do
begin
BtnFaceBrush:= CreateSolidBrush(ColorToRGB(clBtnFace));
FillRect (Canvas.Handle, Rect(Left, Top, Left+1, Bottom-1), BtnFaceBrush);
FillRect (Canvas.Handle, Rect(Left, Top, Right-1, Top+1), BtnFaceBrush);
DeleteObject(BtnFaceBrush);
end;
DrawEdge (Canvas.Handle, R, BDR_SUNKENINNER, BF_BOTTOMRIGHT);
InflateRect (R, -1, -1);
WindowBrush:= CreateSolidBrush(ColorToRGB(clWindow));
FrameRect (Canvas.Handle, R, WindowBrush);
DeleteObject(WindowBrush);
End;
ebs3D:
DrawEdge(Canvas.Handle, R, BDR_SUNKENINNER or BDR_SUNKENOUTER,
BF_LEFT or BF_TOP or BF_RIGHT or BF_BOTTOM);
end;
FDrawTextRect:= R;
finally
//ReleaseDC (Handle, DC);
If Focused Then
ShowCaret( Handle );
end;
//end;
end;
procedure TEzNumEd.CMMouseEnter (var Message: TMessage);
begin
inherited;
if (FBorderStyle=ebsFlat) and Not Focused then
begin
FMouseInControl := True;
if FHotTrack then RedrawBorder (0);
end;
end;
procedure TEzNumEd.CMMouseLeave (var Message: TMessage);
begin
inherited;
if (FBorderStyle=ebsFlat) and Not Focused then
begin
FMouseInControl := False;
if FHotTrack then RedrawBorder (0);
end;
end;
procedure TEzNumEd.SetUseWindowsSeparator(Value: Boolean);
begin
if FUseWindowsSeparator=Value then Exit;
FUseWindowsSeparator:=Value;
if Value then
begin
FDecimalSeparator:= SysUtils.DecimalSeparator;
FThousandSeparator:= SysUtils.ThousandSeparator;
end;
end;
procedure TEzNumEd.SetDecimalSeparator(const Value: Char);
begin
FDecimalSeparator := Value;
Invalidate;
end;
procedure TEzNumEd.SetThousandSeparator(const Value: Char);
begin
FThousandSeparator := Value;
Invalidate;
end;
procedure TEzNumEd.SetDisplayFormat(Value: TEzDisplayFormat);
begin
FDisplayFormat.Assign( Value );
end;
procedure TEzNumEd.SetEditFormat(Value: TEzEditFormat);
begin
FEditFormat.Assign( Value );
end;
Procedure TEzNumEd.SetEnabled( Value: Boolean );
Begin
Inherited SetEnabled( Value );
If Value Then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -