📄 jvqspin.pas
字号:
{******************************************************************************}
{* WARNING: JEDI VCL To CLX Converter generated unit. *}
{* Manual modifications will be lost on next release. *}
{******************************************************************************}
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvSpin.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 2001,2002 SGB Software
All Rights Reserved.
Contributor(s):
Polaris Software
boerema1
roko
remkobonte
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvQSpin.pas,v 1.15 2005/02/06 23:40:52 asnepvangers Exp $
unit JvQSpin;
{$I jvcl.inc}
interface
uses
SysUtils, Classes, Qt, QWindows, QMessages,
QComCtrls, QControls, QExtCtrls, QGraphics, QForms,
QComboEdits, JvQExComboEdits, QComCtrlsEx,
JvQEdit, JvQExMask, JvQMaskEdit, JvQComponent;
type
TSpinButtonState = (sbNotDown, sbTopDown, sbBottomDown);
TJvSpinButtonStyle = (sbsDefault, sbsClassic); // Polaris
TJvSpinButton = class(TJvGraphicControl)
private
FDown: TSpinButtonState;
FDragging: Boolean;
FUpBitmap: TBitmap; // Custom up arrow
FDownBitmap: TBitmap; // Custom down arrow
FButtonBitmaps: Pointer;
FRepeatTimer: TTimer;
FLastDown: TSpinButtonState;
FFocusControl: TWinControl;
FOnTopClick: TNotifyEvent;
FOnBottomClick: TNotifyEvent;
FButtonStyle: TJvSpinButtonStyle;
procedure SetButtonStyle(Value: TJvSpinButtonStyle);
procedure TopClick;
procedure BottomClick;
procedure GlyphChanged(Sender: TObject);
function GetDownGlyph: TBitmap;
function GetUpGlyph: TBitmap;
procedure SetDown(Value: TSpinButtonState);
procedure SetDownGlyph(Value: TBitmap);
procedure SetFocusControl(Value: TWinControl);
procedure SetUpGlyph(Value: TBitmap);
procedure TimerExpired(Sender: TObject);
procedure CMSysColorChange(var Msg: TMessage); message CM_SYSCOLORCHANGE;
protected
procedure CheckButtonBitmaps;
procedure RemoveButtonBitmaps;
procedure Paint; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
function MouseInBottomBtn(const P: TPoint): Boolean;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Down: TSpinButtonState read FDown write SetDown default sbNotDown;
published
property ButtonStyle: TJvSpinButtonStyle read FButtonStyle write SetButtonStyle default sbsDefault;
property DragMode;
property Enabled;
property Visible;
property DownGlyph: TBitmap read GetDownGlyph write SetDownGlyph;
property UpGlyph: TBitmap read GetUpGlyph write SetUpGlyph;
property FocusControl: TWinControl read FFocusControl write SetFocusControl;
property ShowHint;
property ParentShowHint;
property Anchors;
property Constraints;
property OnBottomClick: TNotifyEvent read FOnBottomClick write FOnBottomClick;
property OnTopClick: TNotifyEvent read FOnTopClick write FOnTopClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnStartDrag;
end;
TValueType = (vtInteger, vtFloat, vtHex);
TSpinButtonKind = (bkStandard, bkDiagonal, bkClassic);
TJvCheckOption = (coCheckOnChange, coCheckOnExit, coCropBeyondLimit);
TJvCheckOptions = set of TJvCheckOption;
TJvCustomSpinEdit = class(TJvExCustomComboMaskEdit)
private
FShowButton: Boolean;
FCheckMaxValue: Boolean;
FCheckMinValue: Boolean;
FCheckOptions: TJvCheckOptions;
FDisplayFormat: string;
FFocused: Boolean;
FLCheckMaxValue: Boolean;
FLCheckMinValue: Boolean;
FAlignment: TAlignment;
FMinValue: Extended;
FMaxValue: Extended;
FOldValue: Extended;
FIncrement: Extended;
FDecimal: Byte;
FChanging: Boolean;
//FOldValue: Extended; // New
FEditorEnabled: Boolean;
FValueType: TValueType;
FButton: TJvSpinButton;
FBtnWindow: TWinControl;
FArrowKeys: Boolean;
FOnTopClick: TNotifyEvent;
FOnBottomClick: TNotifyEvent;
// FButtonKind: TSpinButtonKind;
FUpDown: TCustomUpDown;
FThousands: Boolean; // New
function StoreCheckMaxValue: Boolean;
function StoreCheckMinValue: Boolean;
procedure SetCheckMaxValue(NewValue: Boolean);
procedure SetCheckMinValue(NewValue: Boolean);
procedure SetMaxValue(NewValue: Extended);
procedure SetMinValue(NewValue: Extended);
function CheckDefaultRange(CheckMax: Boolean): Boolean;
procedure SetDisplayFormat(const Value: string);
function IsFormatStored: Boolean;
//function TextToValText(const AValue: string): string;
procedure SetFocused(Value: Boolean);
//procedure CheckRange(const AOption: TJvCheckOption);
//function TryGetValue(var Value: Extended): Boolean; // New
function GetAsInteger: Longint;
function GetButtonKind: TSpinButtonKind;
function GetButtonWidth: Integer;
function GetMinHeight: Integer;
function IsIncrementStored: Boolean;
function IsMaxStored: Boolean;
function IsMinStored: Boolean;
function IsValueStored: Boolean;
procedure GetTextHeight(var SysHeight, Height: Integer);
procedure ResizeButton;
procedure SetAlignment(Value: TAlignment);
procedure SetArrowKeys(Value: Boolean);
procedure SetAsInteger(NewValue: Longint);
procedure SetButtonKind(Value: TSpinButtonKind);
procedure SetDecimal(NewValue: Byte);
procedure SetEditRect;
procedure SetThousands(Value: Boolean);
procedure UpDownClick(Sender: TObject; Button: TUDBtnType);
procedure SetShowButton(Value: Boolean);
procedure WMCut(var Mesg: TMessage); message WM_CUT;
procedure WMPaste(var Mesg: TMessage); message WM_PASTE;
protected
FButtonKind: TSpinButtonKind;
procedure DoKillFocus(FocusedWnd: HWND); override;
function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; const MousePos: TPoint): Boolean; override;
procedure BoundsChanged; override;
procedure EnabledChanged; override;
procedure DoEnter; override;
procedure DoExit; override;
procedure FontChanged; override;
function CheckValue(NewValue: Extended): Extended;
function CheckValueRange(NewValue: Extended; RaiseOnError: Boolean): Extended;
function GetValue: Extended; virtual; abstract;
procedure DataChanged; virtual;
procedure RecreateButton;
procedure SetValue(NewValue: Extended); virtual; abstract;
procedure SetValueType(NewType: TValueType); virtual;
function DefaultDisplayFormat: string; virtual;
property DisplayFormat: string read FDisplayFormat write SetDisplayFormat stored IsFormatStored;
// procedure DefinePropertyes(Filer: TFiler); override;
function IsValidChar(Key: Char): Boolean; virtual;
procedure Change; override;
procedure DownClick(Sender: TObject); virtual;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure UpClick(Sender: TObject); virtual;
property ButtonWidth: Integer read GetButtonWidth;
public
procedure Loaded; override;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property AsInteger: Longint read GetAsInteger write SetAsInteger default 0;
property Text;
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
property ArrowKeys: Boolean read FArrowKeys write SetArrowKeys default True;
property ButtonKind: TSpinButtonKind read FButtonKind write SetButtonKind default bkDiagonal;
property Decimal: Byte read FDecimal write SetDecimal default 2;
property EditorEnabled: Boolean read FEditorEnabled write FEditorEnabled default True;
property Increment: Extended read FIncrement write FIncrement stored IsIncrementStored;
property MaxValue: Extended read FMaxValue write SetMaxValue stored IsMaxStored;
property MinValue: Extended read FMinValue write SetMinValue stored IsMinStored;
property CheckOptions: TJvCheckOptions read FCheckOptions write FCheckOptions default [coCheckOnChange, coCheckOnExit, coCropBeyondLimit];
property CheckMinValue: Boolean read FCheckMinValue write SetCheckMinValue stored StoreCheckMinValue;
property CheckMaxValue: Boolean read FCheckMaxValue write SetCheckMaxValue stored StoreCheckMaxValue;
property ValueType: TValueType read FValueType write SetValueType
default vtInteger ;
property Value: Extended read GetValue write SetValue stored IsValueStored;
property Thousands: Boolean read FThousands write SetThousands default False;
property ShowButton: Boolean read FShowButton write SetShowButton default True;
property OnBottomClick: TNotifyEvent read FOnBottomClick write FOnBottomClick;
property OnTopClick: TNotifyEvent read FOnTopClick write FOnTopClick;
end;
TJvSpinEdit = class(TJvCustomSpinEdit)
protected
procedure SetValue(NewValue: Extended); override;
function GetValue: Extended; override;
public
constructor Create(AOwner: TComponent); override;
published
//Polaris
//property CheckOnExit;
property CheckOptions;
property CheckMinValue;
property CheckMaxValue;
property BeepOnError;
property Align;
property Alignment;
property ArrowKeys;
property DisplayFormat;
property ButtonKind default bkDiagonal;
property Thousands;
property Decimal;
property EditorEnabled;
property Increment;
property MaxValue;
property MinValue;
property ShowButton;
property ValueType;
property Value;
property OnBottomClick;
property OnTopClick;
property AutoSelect;
property AutoSize;
property BorderStyle;
property Color;
property DragMode;
property Enabled;
property Font;
property Anchors;
property Constraints;
property MaxLength;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
property OnContextPopup;
property OnMouseWheelDown;
property OnMouseWheelUp;
property HideSelection;
property ClipboardCommands;
end;
implementation
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
QConsts,
JvQThemes,
JvQJCLUtils, JvQJVCLUtils, JvQConsts, JvQResources, JvQToolEdit;
{$IFDEF MSWINDOWS}
{$R ..\Resources\JvSpin.Res}
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
{$R ../Resources/JvSpin.Res}
{$ENDIF UNIX}
const
sSpinUpBtn = 'JvSpinUP';
sSpinDownBtn = 'JvSpinDOWN';
sSpinUpBtnPole = 'JvSpinUPPOLE';
sSpinDownBtnPole = 'JvSpinDOWNPOLE';
const
InitRepeatPause = 400; { pause before repeat timer (ms) }
RepeatPause = 100;
(*Polaris
procedure TJvSpinButton.DrawBitmap(ABitmap: TBitmap; ADownState: TSpinButtonState);
var
R, RSrc: TRect;
dRect: Integer;
{Temp: TBitmap;}
begin
ABitmap.Height := Height;
ABitmap.Width := Width;
with ABitmap.Canvas do
begin
R := Bounds(0, 0, Width, Height);
Pen.Width := 1;
Brush.Color := clBtnFace;
Brush.Style := bsSolid;
FillRect(R);
{ buttons frame }
Pen.Color := clWindowFrame;
Rectangle(0, 0, Width, Height);
MoveTo(-1, Height);
LineTo(Width, -1);
{ top button }
if ADownState = sbTopDown then Pen.Color := clBtnShadow
else Pen.Color := clBtnHighlight;
MoveTo(1, Height - 4);
LineTo(1, 1);
LineTo(Width - 3, 1);
if ADownState = sbTopDown then Pen.Color := clBtnHighlight
else Pen.Color := clBtnShadow;
if ADownState <> sbTopDown then
begin
MoveTo(1, Height - 3);
LineTo(Width - 2, 0);
end;
{ bottom button }
if ADownState = sbBottomDown then Pen.Color := clBtnHighlight
else Pen.Color := clBtnShadow;
MoveTo(2, Height - 2);
LineTo(Width - 2, Height - 2);
LineTo(Width - 2, 1);
if ADownState = sbBottomDown then Pen.Color := clBtnShadow
else Pen.Color := clBtnHighlight;
MoveTo(2, Height - 2);
LineTo(Width - 1, 1);
{ top glyph }
dRect := 1;
if ADownState = sbTopDown then Inc(dRect);
R := Bounds(Round((Width / 4) - (FUpBitmap.Width / 2)) + dRect,
Round((Height / 4) - (FUpBitmap.Height / 2)) + dRect, FUpBitmap.Width,
FUpBitmap.Height);
RSrc := Bounds(0, 0, FUpBitmap.Width, FUpBitmap.Height);
{
if Self.Enabled or (csDesigning in ComponentState) then
BrushCopy(R, FUpBitmap, RSrc, FUpBitmap.TransparentColor)
else
begin
Temp := CreateDisabledBitmap(FUpBitmap, clBlack);
try
BrushCopy(R, Temp, RSrc, Temp.TransparentColor);
finally
Temp.Free;
end;
end;
}
BrushCopy(R, FUpBitmap, RSrc, FUpBitmap.TransparentColor);
{ bottom glyph }
R := Bounds(Round((3 * Width / 4) - (FDownBitmap.Width / 2)) - 1,
Round((3 * Height / 4) - (FDownBitmap.Height / 2)) - 1,
FDownBitmap.Width, FDownBitmap.Height);
RSrc := Bounds(0, 0, FDownBitmap.Width, FDownBitmap.Height);
{
if Self.Enabled or (csDesigning in ComponentState) then
BrushCopy(R, FDownBitmap, RSrc, FDownBitmap.TransparentColor)
else
begin
Temp := CreateDisabledBitmap(FDownBitmap, clBlack);
try
BrushCopy(R, Temp, RSrc, Temp.TransparentColor);
finally
Temp.Free;
end;
end;
}
BrushCopy(R, FDownBitmap, RSrc, FDownBitmap.TransparentColor);
if ADownState = sbBottomDown then
begin
Pen.Color := clBtnShadow;
MoveTo(3, Height - 2);
LineTo(Width - 1, 2);
end;
end;
end;
*)
type
TColorArray = array [0..2] of TColor;
THackedCustomForm = class(TCustomForm);
TJvUpDown = class(TCustomUpDown)
private
FChanging: Boolean;
protected
procedure Click(Button: TUDBtnType); override;
public
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnClick;
end;
{ The face of a spin button is stored because they are a bit to complex to
calculate everytime in a Paint method. There are multiple bitmaps stored
for a single spin button, eg disable/top-down/bottom down etc.
The face bitmaps of a spin button are stored in a TSpinButtonBitmaps
object. Multiple spin buttons can use the same TSpinButtonBitmaps object.
(That is, identical spin buttons (same height, width, button kind etc.) use the
same TSpinButtonbitmaps objects) The TSpinButtonBitmaps objects are managed
by a single TSpinButtonBitmapsManager object.
}
TSpinButtonBitmapsManager = class;
TSpinButtonBitmaps = class
private
FManager: TSpinButtonBitmapsManager;
FHeight: Integer;
FWidth: Integer;
FStyle: TJvSpinButtonStyle;
FClientCount: Integer;
FTopDownBtn: TBitmap;
FBottomDownBtn: TBitmap;
FNotDownBtn: TBitmap;
FDisabledBtn: TBitmap;
FCustomGlyphs: Boolean;
FResetOnDraw: Boolean;
protected
procedure DrawAllBitmap;
procedure DrawBitmap(ABitmap: TBitmap; ADownState: TSpinButtonState; const Enabled: Boolean);
procedure PoleDrawArrows(ACanvas: TCanvas; const AState: TSpinButtonState; const Enabled: Boolean;
AUpArrow, ADownArrow: TBitmap);
procedure JvDrawArrows(ACanvas: TCanvas; const AState: TSpinButtonState; const Enabled: Boolean;
AUpArrow, ADownArrow: TBitmap);
procedure Reset;
function CompareWith(const AWidth, AHeight: Integer; const AStyle: TJvSpinButtonStyle;
const ACustomGlyphs: Boolean): Integer;
public
constructor Create(AManager: TSpinButtonBitmapsManager; const AWidth, AHeight: Integer;
const AStyle: TJvSpinButtonStyle; const ACustomGlyphs: Boolean); virtual;
destructor Destroy; override;
procedure AddClient;
procedure RemoveClient;
procedure Draw(ACanvas: TCanvas; const ADown: TSpinButtonState;
const AEnabled, AMouseInTopBtn, AMouseInBottomBtn: Boolean);
procedure DrawGlyphs(ACanvas: TCanvas; const AState: TSpinButtonState; const Enabled: Boolean;
AUpArrow, ADownArrow: TBitmap);
property Width: Integer read FWidth;
property Height: Integer read FHeight;
property Style: TJvSpinButtonStyle read FStyle;
property CustomGlyphs: Boolean read FCustomGlyphs;
end;
TSpinButtonBitmapsManager = class
private
FClientCount: Integer;
FList: TList;
protected
function Find(const Width, Height: Integer; const AButtonStyle: TJvSpinButtonStyle;
const ACustomGlyphs: Boolean; var Index: Integer): Boolean;
procedure Remove(Obj: TObject);
public
constructor Create; virtual;
destructor Destroy; override;
function WantButtons(const Width, Height: Integer; const AButtonStyle: TJvSpinButtonStyle;
const ACustomGlyphs: Boolean): TSpinButtonBitmaps;
procedure AddClient;
procedure RemoveClient;
end;
var
GSpinButtonBitmapsManager: TSpinButtonBitmapsManager = nil;
//=== Local procedures =======================================================
function SpinButtonBitmapsManager: TSpinButtonBitmapsManager;
begin
if GSpinButtonBitmapsManager = nil then
GSpinButtonBitmapsManager := TSpinButtonBitmapsManager.Create;
Result := GSpinButtonBitmapsManager;
end;
function DefBtnWidth: Integer;
begin
Result := GetSystemMetrics(SM_CXVSCROLL);
if Result > 15 then
Result := 15;
end;
function RemoveThousands(const AValue: string): string;
begin
if DecimalSeparator <> ThousandSeparator then
Result := DelChars(AValue, ThousandSeparator)
else
Result := AValue;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -