📄 teenavigator.pas
字号:
{********************************************}
{ TCustomTeeNavigator }
{ Copyright (c) 2001-2003 by David Berneda }
{ All Rights Reserved }
{********************************************}
unit TeeNavigator;
{$I TeeDefs.inc}
interface
Uses {$IFNDEF LINUX}
Windows, Messages,
{$ENDIF}
{$IFDEF CLX}
QExtCtrls, QControls, QButtons, Types,
{$ELSE}
ExtCtrls, Controls, Buttons,
{$ENDIF}
Classes, TeeProcs;
type
TTeeNavGlyph = (ngEnabled, ngDisabled);
TTeeNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast,
nbInsert, nbDelete, nbEdit, nbPost, nbCancel);
TTeeButtonSet = set of TTeeNavigateBtn;
TTeeNavButton = class(TSpeedButton)
private
FIndex : TTeeNavigateBtn;
FRepeatTimer : TTimer;
procedure TimerExpired(Sender: TObject);
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure Paint; override;
public
Destructor Destroy; override;
property Index : TTeeNavigateBtn read FIndex write FIndex;
end;
TNotifyButtonClickedEvent=Procedure(Index:TTeeNavigateBtn) of object;
TCustomTeeNavigator=class(TCustomPanel,ITeeEventListener)
private
FHints : TStrings;
FDefHints : TStrings;
ButtonWidth : Integer;
MinBtnSize : TPoint;
FocusedButton : TTeeNavigateBtn;
FOnButtonClicked : TNotifyButtonClickedEvent;
FPanel: TCustomTeePanel;
procedure BtnMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ClickHandler(Sender: TObject);
procedure CheckSize;
procedure HintsChanged(Sender: TObject);
procedure SetSize(var W: Integer; var H: Integer);
{$IFNDEF CLX}
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
{$ENDIF}
{$IFNDEF CLX}
procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
{$ENDIF}
procedure SetPanel(const Value: TCustomTeePanel);
procedure TeeEvent(Event: TTeeEvent);
protected
Buttons: Array[TTeeNavigateBtn] of TTeeNavButton;
{$IFDEF CLX}
procedure BoundsChanged; override;
{$ENDIF}
procedure BtnClick(Index: TTeeNavigateBtn); dynamic;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure InitButtons; virtual;
procedure Loaded; override;
procedure DoTeeEvent(Event: TTeeEvent); virtual;
procedure Notification( AComponent: TComponent;
Operation: TOperation); override;
public
Constructor Create(AOwner: TComponent); override;
Destructor Destroy; override;
procedure EnableButtons; virtual;
procedure InitHints; { 5.02 }
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
Function PageCount:Integer; virtual;
property Panel:TCustomTeePanel read FPanel write SetPanel;
procedure Print; virtual;
property OnButtonClicked:TNotifyButtonClickedEvent read FOnButtonClicked
write FOnButtonClicked;
published
{ TPanel properties }
property Align;
property BorderStyle;
property Color;
{$IFNDEF CLX}
{$IFNDEF TEEOCX}
property UseDockManager default True;
property DockSite;
{$ENDIF}
{$ENDIF}
property DragMode;
{$IFNDEF CLX}
property DragCursor;
{$ENDIF}
property Enabled;
property ParentColor;
property ParentShowHint;
{$IFNDEF TEEOCX}
property PopupMenu;
{$ENDIF}
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property Anchors;
{$IFNDEF TEEOCX}
property Constraints;
{$ENDIF}
{$IFNDEF CLX}
property DragKind;
property Locked;
{$ENDIF}
{ TPanel events }
property OnClick;
property OnDblClick;
{$IFNDEF CLX}
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
{$ENDIF}
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
property OnResize;
{$IFNDEF CLX}
property OnCanResize;
{$ENDIF}
{$IFNDEF TEEOCX}
property OnConstrainedResize;
{$IFNDEF CLX}
property OnDockDrop;
property OnDockOver;
property OnEndDock;
property OnGetSiteInfo;
property OnStartDock;
property OnUnDock;
{$ENDIF}
{$ENDIF}
end;
TTeePageNavigatorClass=class of TCustomTeeNavigator;
implementation
Uses SysUtils, TeCanvas,
{$IFDEF CLX}
QForms, Qt,
{$ELSE}
Forms,
{$ENDIF}
TeeConst;
Const
InitRepeatPause = 400; { pause before repeat timer (ms) }
RepeatPause = 100; { pause before hint window displays (ms)}
SpaceSize = 5; { size of space between special buttons }
BtnTypeName: array[TTeeNavigateBtn] of PChar = ('FIRST', 'PRIOR', 'NEXT',
'LAST', 'INSERT', 'DELETE', 'EDIT', 'POST', 'CANCEL');
{ TCustomTeeNavigator }
Constructor TCustomTeeNavigator.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:=ControlStyle-[csAcceptsControls,csSetCaption] + [csOpaque];
{$IFNDEF CLX}
if not NewStyleControls then ControlStyle:=ControlStyle + [csFramed];
{$ENDIF}
FHints:=TStringList.Create;
TStringList(FHints).OnChange:=HintsChanged;
InitButtons;
InitHints;
BevelOuter:=bvNone;
BevelInner:=bvNone;
Width:=241;
Height:=25;
FocusedButton:=nbFirst;
{$IFNDEF CLX}
FullRepaint:=False;
{$ENDIF}
end;
Destructor TCustomTeeNavigator.Destroy;
begin
FDefHints.Free;
FHints.Free;
Panel:=nil;
inherited;
end;
procedure TCustomTeeNavigator.InitHints;
var I : Integer;
J : TTeeNavigateBtn;
begin
if not Assigned(FDefHints) then
FDefHints:=TStringList.Create;
with FDefHints do
begin
Clear;
Add(TeeMsg_First);
Add(TeeMsg_Prior);
Add(TeeMsg_Next);
Add(TeeMsg_Last);
Add(TeeMsg_Insert);
Add(TeeMsg_Delete);
Add(TeeMsg_Edit);
Add(TeeMsg_Post);
Add(TeeMsg_Cancel);
end;
for J:=Low(Buttons) to High(Buttons) do Buttons[J].Hint:=FDefHints[Ord(J)];
J := Low(Buttons);
for I := 0 to (FHints.Count - 1) do
begin
if FHints.Strings[I] <> '' then Buttons[J].Hint := FHints.Strings[I];
if J = High(Buttons) then Exit;
Inc(J);
end;
end;
procedure TCustomTeeNavigator.HintsChanged(Sender: TObject);
begin
InitHints;
end;
procedure TCustomTeeNavigator.SetSize(var W: Integer; var H: Integer);
var Count : Integer;
MinW : Integer;
I : TTeeNavigateBtn;
Space : Integer;
Temp : Integer;
Remain : Integer;
X : Integer;
ButtonH: Integer;
begin
if (csLoading in ComponentState) then Exit;
if Buttons[nbFirst] = nil then Exit;
Count := 0;
for I := Low(Buttons) to High(Buttons) do
begin
if Buttons[I].Visible then
begin
Inc(Count);
end;
end;
if Count = 0 then Inc(Count);
MinW := Count * MinBtnSize.X;
if W < MinW then W := MinW;
if H < MinBtnSize.Y then H := MinBtnSize.Y;
ButtonH:=H;
if BorderStyle=bsSingle then Dec(ButtonH,4);
ButtonWidth := W div Count;
Temp := Count * ButtonWidth;
if Align = alNone then W := Temp;
X := 0;
Remain := W - Temp;
Temp := Count div 2;
for I := Low(Buttons) to High(Buttons) do
begin
if Buttons[I].Visible then
begin
Space := 0;
if Remain <> 0 then
begin
Dec(Temp, Remain);
if Temp < 0 then
begin
Inc(Temp, Count);
Space := 1;
end;
end;
Buttons[I].SetBounds(X, 0, ButtonWidth + Space, ButtonH);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -