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 + -
显示快捷键?