⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eznumed.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  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 + -