cxspinedit.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,961 行 · 第 1/5 页

PAS
1,961
字号
begin
  DrawSpinEdit(ACanvas, Self);
end;

{ TcxSpinEditViewData }

procedure TcxSpinEditViewData.Calculate(ACanvas: TcxCanvas; const ABounds: TRect;
  const P: TPoint; Button: TcxMouseButton; Shift: TShiftState; AViewInfo: TcxCustomEditViewInfo;
  AIsMouseEvent: Boolean);
begin
  inherited Calculate(ACanvas, ABounds, P, Button, Shift, AViewInfo, AIsMouseEvent);
  CalculateSpinEditViewInfo(Self, TcxSpinEditViewInfo(AViewInfo));
end;

procedure TcxSpinEditViewData.CalculateButtonBounds(ACanvas: TcxCanvas;
  AViewInfo: TcxCustomEditViewInfo; AButtonVisibleIndex: Integer;
  var ButtonsRect: TRect);
var
  AButtonWidth, ADefaultButtonHeight, AFastButtonWidth: Integer;
  ANativeStyle: Boolean;
  ASpinButtonsPosition: TcxSpinEditButtonsPosition;
  Y: Integer;

  procedure CalculateButtonMetrics;
  var
    AClientExtent: TRect;
    AEditButtonsExtent: TRect;
  begin
    ACanvas.Font := Style.GetVisibleFont;
    AButtonWidth := CalculateEditDefaultButtonWidth(ACanvas, AViewInfo.ButtonsInfo[AButtonVisibleIndex]);

    AClientExtent := GetClientExtent(ACanvas, AViewInfo);
    AEditButtonsExtent := GetButtonsExtent(ACanvas);
    TcxSpinEditViewInfo(AViewInfo).ArrowSize := GetArrowSize(Size(AButtonWidth + 2,
      (ButtonsRect.Bottom - ButtonsRect.Top) div 2 + 2), adUp).cy;
    if ANativeStyle then
    begin
      ADefaultButtonHeight := ACanvas.TextHeight('Zg') +
        Self.GetEditContentSizeCorrection.cy + (AClientExtent.Top + AClientExtent.Bottom) -
        (AEditButtonsExtent.Top + AEditButtonsExtent.Bottom) - 1;
      ADefaultButtonHeight := ADefaultButtonHeight div 2 + Integer(Odd(ADefaultButtonHeight));
    end
    else
      if Style.LookAndFeel.SkinPainter <> nil then
      begin
        with Style.LookAndFeel.SkinPainter.EditButtonSize do
        begin
          ADefaultButtonHeight := cy div 2 + TcxSpinEditViewInfo(AViewInfo).ArrowSize;
          AFastButtonWidth := ADefaultButtonHeight * 3 div 2 + Integer(Odd(cy));
          Exit;
        end;
      end
      else
        ADefaultButtonHeight := (TcxSpinEditViewInfo(AViewInfo).ArrowSize * 2 - 1) * 2 + 1 - 2;
      AFastButtonWidth := MulDiv(ADefaultButtonHeight, 3, 2) + Integer(Odd(AFastButtonWidth));
  end;

  procedure UpdateButtonsNativePart;

    procedure SetButtonsNativePart;
    begin
      if ASpinButtonsPosition = sbpVert then
      begin
        AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex].Data.NativePart := SPNP_DOWN;
        AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex].Data.NativePart := SPNP_UP;
      end
      else
      begin
        AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex].Data.NativePart := SPNP_DOWNHORZ;
        AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex].Data.NativePart := SPNP_UPHORZ;
      end;
      if Length(AViewInfo.ButtonsInfo) > 2 then
      begin
        AViewInfo.ButtonsInfo[cxSpinFastBackwardButtonIndex].Data.NativePart := SPNP_DOWNHORZ;
        AViewInfo.ButtonsInfo[cxSpinFastForwardButtonIndex].Data.NativePart := SPNP_UPHORZ;
      end;
    end;

    procedure ResetButtonsNativePart;
    var
      I: Integer;
    begin
      for I := Low(AViewInfo.ButtonsInfo) to High(AViewInfo.ButtonsInfo) do
        AViewInfo.ButtonsInfo[I].Data.NativePart := TC_NONE;
    end;

  begin
    if NativeStyle then
    begin
      SetButtonsNativePart;
    end
    else
      ResetButtonsNativePart;
  end;

  function GetDelimiterSize: Integer;
  begin
    if ANativeStyle and not AViewInfo.IsCustomDrawButton
    then
      Result := 1
    else
      Result := 0;
  end;

  function GetBottomCorrection: Integer;
  begin
    if ANativeStyle and IsCompositionEnabled and not AViewInfo.IsCustomDrawButton then
      Result := 1
    else
      Result := 0;
  end;

var
  APrevButtonsRect: TRect;
  AShowFastButtons: Boolean;
begin
  if AButtonVisibleIndex <> ButtonVisibleCount - 1 then
    Exit;
  APrevButtonsRect := ButtonsRect;
  AShowFastButtons := Properties.SpinButtons.ShowFastButtons;
  ASpinButtonsPosition := Properties.SpinButtons.Position;
  ANativeStyle := AreVisualStylesMustBeUsed(AViewInfo.NativeStyle, totSpin);
  TcxSpinEditViewInfo(AViewInfo).ButtonsPosition := Properties.SpinButtons.Position;

  CalculateButtonMetrics;
  if AShowFastButtons then
    with AViewInfo.ButtonsInfo[cxSpinFastForwardButtonIndex] do
    begin
      Bounds := Rect(ButtonsRect.Right - AFastButtonWidth, ButtonsRect.Top,
        ButtonsRect.Right, ButtonsRect.Bottom - GetBottomCorrection);
      ButtonsRect.Right := Bounds.Left;
    end;

  if ASpinButtonsPosition = sbpVert then
  begin
    with AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex] do
    begin
      Bounds := Rect(ButtonsRect.Right - AButtonWidth, ButtonsRect.Top,
        ButtonsRect.Right, ButtonsRect.Top + (cxRectHeight(ButtonsRect) - GetDelimiterSize) div 2);
      Y := Bounds.Bottom + GetDelimiterSize;
    end;
    with AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex] do
    begin
      Bounds := Rect(ButtonsRect.Right - AButtonWidth, Y,
        ButtonsRect.Right, ButtonsRect.Bottom);
      ButtonsRect.Right := Bounds.Left;
    end;
  end
  else
  begin
    with AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex] do
    begin
      Bounds := Rect(ButtonsRect.Right - ADefaultButtonHeight, ButtonsRect.Top,
        ButtonsRect.Right, ButtonsRect.Bottom - GetBottomCorrection);
      ButtonsRect.Right := Bounds.Left;
      Dec(ButtonsRect.Right, GetDelimiterSize);
    end;
  end;

  if ASpinButtonsPosition = sbpHorzLeftRight then
  begin
    if AShowFastButtons then
      with AViewInfo.ButtonsInfo[cxSpinFastBackwardButtonIndex] do
      begin
        Bounds := Rect(ButtonsRect.Left, ButtonsRect.Top,
          ButtonsRect.Left + AFastButtonWidth, ButtonsRect.Bottom - GetBottomCorrection);
        ButtonsRect.Left := Bounds.Right;
      end;
    with AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex] do
    begin
      Bounds := Rect(ButtonsRect.Left, ButtonsRect.Top,
        ButtonsRect.Left + ADefaultButtonHeight, ButtonsRect.Bottom - GetBottomCorrection);
      ButtonsRect.Left := Bounds.Right;
    end;
  end
  else
  begin
    if ASpinButtonsPosition = sbpHorzRight then
    begin
      with AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex] do
      begin
        Bounds := Rect(ButtonsRect.Right - ADefaultButtonHeight, ButtonsRect.Top,
          ButtonsRect.Right, ButtonsRect.Bottom);
        ButtonsRect.Right := Bounds.Left;
      end;
    end;
    if AShowFastButtons then
      with AViewInfo.ButtonsInfo[cxSpinFastBackwardButtonIndex] do
      begin
        Bounds := Rect(ButtonsRect.Right - AFastButtonWidth, ButtonsRect.Top,
          ButtonsRect.Right, ButtonsRect.Bottom - GetBottomCorrection);
        ButtonsRect.Right := Bounds.Left;
      end;
  end;
  UpdateButtonsNativePart;
end;

procedure TcxSpinEditViewData.CalculateButtonViewInfo(ACanvas: TcxCanvas;
  AViewInfo: TcxCustomEditViewInfo; AButtonVisibleIndex: Integer;
  var ButtonsRect: TRect);
begin
  inherited CalculateButtonViewInfo(ACanvas, AViewInfo, AButtonVisibleIndex,
    ButtonsRect);
  if Properties.SpinButtons.Position = sbpHorzLeftRight then
  begin
    AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex].Data.LeftAlignment := True;
    if Length(AViewInfo.ButtonsInfo) > 2 then
      AViewInfo.ButtonsInfo[cxSpinFastBackwardButtonIndex].Data.LeftAlignment := True;
  end;
end;

procedure TcxSpinEditViewData.CheckButtonsOnly(AViewInfo: TcxCustomEditViewInfo;
  APrevButtonsWidth, AButtonsWidth: Integer);

  procedure SetButtonsVisibleBounds;
  var
    I: Integer;
  begin
    for I := 0 to Length(AViewInfo.ButtonsInfo) - 1 do
      with AViewInfo.ButtonsInfo[I] do
        IntersectRect(VisibleBounds, Bounds, AViewInfo.BorderRect);
  end;

var
  ASpinEditViewInfo: TcxSpinEditViewInfo;
begin
  inherited CheckButtonsOnly(AViewInfo, APrevButtonsWidth, AButtonsWidth);
  if Properties.SpinButtons.Position = sbpVert then
    with AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex].Bounds do
    begin
      AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex].Bounds.Left := Left;
      AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex].Bounds.Right := Right;
    end;
  SetButtonsVisibleBounds;
  if AreVisualStylesMustBeUsed(AViewInfo.NativeStyle, totSpin) then
  begin
    ASpinEditViewInfo := TcxSpinEditViewInfo(AViewInfo);
    case Properties.SpinButtons.Position of
      sbpHorzLeftRight:
        with ASpinEditViewInfo do
          FillChar(DelimiterLine, SizeOf(DelimiterLine), 0);
      sbpHorzRight:
        with AViewInfo.ButtonsInfo[cxSpinBackwardButtonIndex].Bounds do
        begin
          ASpinEditViewInfo.DelimiterLine[0] := Point(Right, Top);
          ASpinEditViewInfo.DelimiterLine[1] := Point(Right, Bottom - 1);
        end;
      sbpVert:
        with AViewInfo.ButtonsInfo[cxSpinForwardButtonIndex].Bounds do
        begin
          ASpinEditViewInfo.DelimiterLine[0] := Point(Left, Bottom);
          ASpinEditViewInfo.DelimiterLine[1] := Point(Right - 1, Bottom);
        end;
    end;
  end;
end;

function TcxSpinEditViewData.IgnoreButtonWhileStretching(
  AButtonVisibleIndex: Integer): Boolean;
begin
  Result := (Properties.SpinButtons.Position = sbpVert) and
    (AButtonVisibleIndex = cxSpinBackwardButtonIndex);
end;

function TcxSpinEditViewData.CanPressButton(AViewInfo: TcxCustomEditViewInfo;
  AButtonVisibleIndex: Integer): Boolean;
begin
  if Edit <> nil then
    Result := TcxCustomSpinEdit(Edit).PressedState = epsNone
  else
    Result := True;
end;

function TcxSpinEditViewData.IsButtonPressed(AViewInfo: TcxCustomEditViewInfo;
  AButtonVisibleIndex: Integer): Boolean;
var
  APressedState: TcxSpinEditPressedState;
begin
  if Edit = nil then
    APressedState := epsNone
  else
    APressedState := TcxCustomSpinEdit(Edit).PressedState;
  Result := (AButtonVisibleIndex + 1) = Integer(APressedState)
end;

procedure TcxSpinEditViewData.CalculateButtonNativeInfo(AButtonViewInfo: TcxEditButtonViewInfo);
begin
end;

function TcxSpinEditViewData.GetProperties: TcxCustomSpinEditProperties;
begin
  Result := TcxCustomSpinEditProperties(FProperties);
end;

{ TcxSpinEditButtons }

constructor TcxSpinEditButtons.Create(AOwner: TPersistent);
begin
  inherited Create;
  FOwner := AOwner;
  FPosition := sbpVert;
  FVisible := True;
end;

procedure TcxSpinEditButtons.Assign(Source: TPersistent);
begin
  if Source is TcxSpinEditButtons then
  begin
    Properties.BeginUpdate;
    try
      with TcxSpinEditButtons(Source) do
      begin
        Self.Position := Position;
        Self.ShowFastButtons := ShowFastButtons;
        Self.Visible := Visible;
      end;
    finally
      Properties.EndUpdate;
    end;
  end
  else
    inherited Assign(Source);
end;

procedure TcxSpinEditButtons.Changed;
begin
  Properties.Changed;
end;

function TcxSpinEditButtons.GetProperties: TcxCustomSpinEditProperties;
begin
  Result := TcxCustomSpinEditProperties(FOwner);
end;

procedure TcxSpinEditButtons.SetPosition(Value: TcxSpinEditButtonsPosition);
begin
  if Value <> FPosition then
  begin
    FPosition := Value;
    Changed;
  end;
end;

procedure TcxSpinEditButtons.SetShowFastButtons(Value: Boolean);
begin
  if Value <> FShowFastButtons then
  begin
    FShowFastButtons := Value;
    Changed;
  end;
end;

procedure TcxSpinEditButtons.SetVisible(Value: Boolean);
begin
  if Value <> FVisible then
  begin
    FVisible := Value;
    Changed;
  end;
end;

{ TcxSpinEditPropertiesValues }

procedure TcxSpinEditPropertiesValues.Assign(Source: TPersistent);
begin
  if Source is TcxSpinEditPropertiesValues then
  begin
    BeginUpdate;
    try
      inherited Assign(Source);
      ValueType := TcxSpinEditPropertiesValues(Source).ValueType;
    finally
      EndUpdate;
    end;
  end
  else
    inherited Assign(Source);
end;

procedure TcxSpinEditPropertiesValues.RestoreDefaults;
begin
  BeginUpdate;
  try
    inherited RestoreDefaults;
    ValueType := False;
  finally
    EndUpdate;
  end;
end;

procedure TcxSpinEditPropertiesValues.SetValueType(Value: Boolean);
begin
  if Value <> FValueType then

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?