cxspinbutton.pas

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

PAS
561
字号

{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL                }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxSpinButton;

{$I cxVer.inc}

interface

uses
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  Windows, Classes, Controls, Forms, Graphics, Messages, StdCtrls, SysUtils,
  cxClasses, cxContainer, cxControls, cxCustomData, cxEdit, cxExtEditConsts,
  cxExtEditUtils, cxGraphics, cxMaskEdit, cxSpinEdit, cxTextEdit, cxVariants;

type
  { TcxSpinButtonViewData }

  TcxCustomSpinButtonProperties = class;
  
  TcxSpinButtonViewData = class(TcxSpinEditViewData)
  private
    function GetProperties: TcxCustomSpinButtonProperties;
  protected
    function CanPressButton(AViewInfo: TcxCustomEditViewInfo; AButtonVisibleIndex: Integer):
      Boolean; override;
    function IsButtonPressed(AViewInfo: TcxCustomEditViewInfo; AButtonVisibleIndex:
      Integer): Boolean; override;
  public
    PressedState: TcxSpinEditPressedState;
    procedure Calculate(ACanvas: TcxCanvas; const ABounds: TRect; const P: TPoint;
      Button: TcxMouseButton; Shift: TShiftState; AViewInfo: TcxCustomEditViewInfo;
      AIsMouseEvent: Boolean); override;
    property Properties: TcxCustomSpinButtonProperties read GetProperties;
  end;

  { TcxCustomSpinButtonProperties }

  TcxCustomSpinButton = class;

  TcxCustomSpinButtonProperties = class(TcxCustomSpinEditProperties)
  protected
    class function GetViewDataClass: TcxCustomEditViewDataClass; override;
    function IsDisplayValueNumeric: Boolean; override;
    function IsEditValueNumeric: Boolean; override;
    function PreserveSelection: Boolean; override;
  public
    constructor Create(AOwner: TPersistent); override;
    class function GetContainerClass: TcxContainerClass; override;
  end;

  { TcxSpinButtonProperties }

  TcxSpinButtonProperties = class(TcxCustomSpinButtonProperties)
  published
    property Alignment;
    property AssignedValues;
    property AutoSelect;
    property BeepOnError;
    property HideSelection;
    property ImmediatePost;
    property Increment;
    property LargeIncrement;
    property MaxValue;
    property MinValue;
    property ReadOnly;
    property SpinButtons;
    property UseCtrlIncrement;
    property UseLeftAlignmentOnEditing;
    property ValueType default vtInt;
    property OnChange;
    property OnEditValueChanged;
  end;

  { TcxSpinButtonControlHook }

  TcxSpinButtonControlHook = class(TcxControlHook)
  private
    FParent: TWinControl;
  protected
    procedure HookWndProc(var AMsg: TMessage); override;
  public
    destructor Destroy; override;
  end;

  { TcxCustomSpinButton }

  TcxCustomSpinButton = class(TcxCustomSpinEdit)
  private
    FAssociate: TWinControl;
    FAutoWidth: Boolean;
    FSpinButtonControlHook: TcxSpinButtonControlHook;
    function GetActiveProperties: TcxCustomSpinButtonProperties;
    function GetProperties: TcxCustomSpinButtonProperties;
    procedure SetAssociate(AValue: TWinControl);
    procedure SetAutoWidth(Value: Boolean);
    procedure SetProperties(Value: TcxCustomSpinButtonProperties);
  protected
    procedure InternalSetEditValue(const Value: TcxEditValue;
      AValidateEditValue: Boolean); override;
    procedure InternalSetDisplayValue(const Value: TcxEditValue); override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    function CanFocusOnClick: Boolean; override;
    procedure SetSize; override;
    procedure Initialize; override;
    function InternalDoEditing: Boolean; override;
    procedure JoinToAssociate; virtual;
    procedure SetAssociateText(const AValue: Variant); virtual;
    function GetValue: Variant; override;
    procedure SynchronizeEditValueFromAssociate; virtual;
    property Associate: TWinControl read FAssociate write SetAssociate;
    property AutoWidth: Boolean read FAutoWidth write SetAutoWidth default True;
    property TabStop default False;
  public
    destructor Destroy; override;
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    function Increment(AButton: TcxSpinEditButton): Boolean; override;
    property ActiveProperties: TcxCustomSpinButtonProperties read GetActiveProperties;
    property Properties: TcxCustomSpinButtonProperties read GetProperties
      write SetProperties;
  end;

  { TcxSpinButton }

  TcxSpinButton = class(TcxCustomSpinButton)
  private
    function GetActiveProperties: TcxSpinButtonProperties;
    function GetProperties: TcxSpinButtonProperties;
    procedure SetProperties(Value: TcxSpinButtonProperties);
  public
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    property ActiveProperties: TcxSpinButtonProperties read GetActiveProperties;
  published
    property Anchors;
    property Associate;
    property AutoSize;
    property AutoWidth;
    property BeepOnEnter;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property Properties: TcxSpinButtonProperties read GetProperties
      write SetProperties;
    property ShowHint;
    property Style;
    property StyleDisabled;
    property StyleFocused;
    property StyleHot;
    property TabOrder;
    property TabStop;
    property Value;
    property Visible;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEditing;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
  end;

implementation

uses
  cxEditConsts, cxEditUtils, dxThemeConsts, dxThemeManager;

type
  TWinControlAccess = class(TWinControl);

{ TcxSpinButtonControlHook }

destructor TcxSpinButtonControlHook.Destroy;
begin
  FParent := nil;
  inherited Destroy;
end;

procedure TcxSpinButtonControlHook.HookWndProc(var AMsg: TMessage);
var
  AKey: Longint;
begin
  if Assigned(WinControl) and not IsDestroying and
    ((AMsg.Msg = WM_KEYDOWN) or (AMsg.Msg = WM_KEYUP)) then
  begin
    AKey := AMsg.WParam;
    if (FParent <> nil) and (AKey in [VK_UP, VK_DOWN, VK_NEXT, VK_PRIOR]) then
      PostMessage(FParent.Handle, AMsg.Msg, AKey, AMsg.LParam);
  end;
  inherited HookWndProc(AMsg);
end;

{ TcxSpinButtonViewData }

procedure TcxSpinButtonViewData.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);
  TcxSpinEditViewInfo(AViewInfo).Text := '';
end;

function TcxSpinButtonViewData.CanPressButton(AViewInfo: TcxCustomEditViewInfo;
  AButtonVisibleIndex: Integer): Boolean;
begin
  Result := inherited CanPressButton(AViewInfo, AButtonVisibleIndex);
end;

function TcxSpinButtonViewData.IsButtonPressed(AViewInfo: TcxCustomEditViewInfo;
  AButtonVisibleIndex: Integer): Boolean;
begin
  Result := inherited IsButtonPressed(AViewInfo, AButtonVisibleIndex);
end;

function TcxSpinButtonViewData.GetProperties: TcxCustomSpinButtonProperties;
begin
  Result := TcxCustomSpinButtonProperties(FProperties);
end;

{ TcxCustomSpinButtonProperties }

constructor TcxCustomSpinButtonProperties.Create(AOwner: TPersistent);
begin
  inherited Create(AOwner);
  HideCursor := True;
end;

class function TcxCustomSpinButtonProperties.GetContainerClass: TcxContainerClass;
begin

⌨️ 快捷键说明

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