⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teenavigator.pas

📁 Delphi TeeChartPro.6.01的源代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{********************************************}
{   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 + -