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

📄 uadatanav.pas

📁 基于Midas 技术的多层应用开发包第二版(带开发文档)
💻 PAS
字号:
{******************************************************************************************}
{                                                                                          }
{       Universal Agent on demond SDK                                                      }
{                                                                                          }
{                                                                                          }
{ COPYRIGHT                                                                                }
{ =========                                                                                }
{ The UA SDK (software) is Copyright (C) 2001-2003, by vinson zeng(曾胡龙).                }
{ All rights reserved.                                                                     }
{ The authors - vinson zeng (曾胡龙),                                                      }
{ exclusively own all copyrights to the Advanced Application                               }
{ Controls (AppControls) and all other products distributed by Utilmind Solutions(R).      }
{                                                                                          }
{ LIABILITY DISCLAIMER                                                                     }
{ ====================                                                                     }
{ THIS SOFTWARE IS DISTRIBUTED "AS IS" AND WITHOUT WARRANTIES AS TO PERFORMANCE            }
{ OF MERCHANTABILITY OR ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED.                 }
{ YOU USE IT AT YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS,                }
{ DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS SOFTWARE.}
{                                                                                          }
{ RESTRICTIONS                                                                             }
{ ============                                                                             }
{ You may not attempt to reverse compile, modify,                                          }
{ translate or disassemble the software in whole or in part.                               }
{ You may not remove or modify any copyright notice or the method by which                 }
{ it may be invoked.                                                                       }
{******************************************************************************************}


unit UADataNav;

interface
uses
  Windows, Classes, SysUtils, Messages, Controls,
  Buttons, ComCtrls, ExtCtrls,StdCtrls,DB,Math,
  UAClientDataSet;

type

  TUANavDataLink = class;

  TUANavBtnType = (nbFirst,nbPrior,nbNext,nbLast);

  TUADataNav = class (TCustomPanel)
  private

    FPageEdit:TEdit;
    FFirstBtn:TSpeedButton;
    FLastBtn:TSpeedButton;
    FPriorBtn:TSpeedButton;
    FNextBtn:TSpeedButton;

    ButtonWidth: Integer;


    FDataLink:TUANavDataLink;
    FFlat: Boolean;
    MinBtnSize: TPoint;
    FAllPage:Cardinal;
    FCurrPage:Cardinal;

    procedure InitCtrls;
    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;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
    function  GetDataSource: TDataSource;
    function  GetHints: TStrings;
    procedure SetDataSource(const Value: TDataSource);
    procedure SetFlat(const Value: Boolean);
    procedure SetHints(const Value: TStrings);
    procedure SetSize(var W: Integer; var H: Integer);
    procedure CalcMinSize(var W, H: Integer);

  protected

    procedure DataChanged;
    procedure EditingChanged;
    procedure ActiveChanged;
    procedure Loaded; override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;
    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;

    procedure PageChange(Sender:TObject);

  public

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;

    property AllPage:Cardinal read FAllPage;
    property CurrPage:Cardinal read FCurrPage;

  published
    property DataSource: TDataSource read GetDataSource write SetDataSource;
    property Align;
    property Anchors;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Flat: Boolean read FFlat write SetFlat default False;
    property Ctl3D;
    property Hints: TStrings read GetHints write SetHints;
    property ParentCtl3D;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property Visible;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnResize;
    property OnStartDock;
    property OnStartDrag;

  end;

  TUANavDataLink = class(TDataLink)
  private
    FDataNav: TUADataNav;
  protected
    procedure EditingChanged; override;
    procedure DataSetChanged; override;
    procedure ActiveChanged; override;
  public
    constructor Create(ANav: TUADataNav);
    destructor Destroy; override;
  end;




implementation
//{$R UADataNav.Res}

{ TUADataNav }

procedure TUADataNav.ActiveChanged;
begin

end;

procedure TUADataNav.CalcMinSize(var W, H: Integer);
begin

  if (csLoading in ComponentState) then Exit;

  W := Max(W, 5 * MinBtnSize.X);
  H := Max(H, MinBtnSize.Y);

  if Align = alNone then W := (W div 5) * 5;

end;

procedure TUADataNav.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  if not (csLoading in ComponentState) then
    ActiveChanged;

end;

constructor TUADataNav.Create(AOwner: TComponent);
begin

  inherited;

  inherited Create(AOwner);
  ControlStyle := ControlStyle - [csAcceptsControls, csSetCaption] + [csOpaque];
  if not NewStyleControls then ControlStyle := ControlStyle + [csFramed];
  FDataLink := TUANavDataLink.Create(Self);

  BevelOuter := bvNone;
  BevelInner := bvNone;
  Width := 121;
  Height := 25;
  FullRepaint := False;

  InitCtrls;
  
end;

procedure TUADataNav.DataChanged;
begin

end;

destructor TUADataNav.Destroy;
begin

  FDataLink.Free;
  FDataLink := nil;

{  if Assigned(FPageEdit) then
    FreeAndNil(FPageEdit);

  if Assigned(FFirstBtn) then
    FreeAndNil(FFirstBtn);

  if Assigned(FLastBtn) then
    FreeAndNil(FLastBtn);

  if Assigned(FPriorBtn) then
    FreeAndNil(FPriorBtn);

  if Assigned(FNextBtn) then
    FreeAndNil(FNextBtn);
 }
  inherited Destroy;
  
end;

procedure TUADataNav.EditingChanged;
begin

end;

procedure TUADataNav.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
  inherited;

end;

function TUADataNav.GetDataSource: TDataSource;
begin
  Result := FDataLink.DataSource;

end;

function TUADataNav.GetHints: TStrings;
begin

end;

procedure TUADataNav.InitCtrls;
var
  X: Integer;
  ResName: string;


begin

  MinBtnSize := Point(20, 18);
  X := 0;

  FFirstBtn := TSpeedButton.Create(Self);
  FFirstBtn.SetBounds(X,0 ,MinBtnSize.X, MinBtnSize.Y);
//  FFirstBtn.Glyph.LoadFromResourceName(HInstance, 'DATA_FIRST');
  FFirstBtn.Enabled := True;
  FFirstBtn.Parent := Self;
  X := X + MinBtnSize.X;
  FFirstBtn.Caption := '<<';
  FFirstBtn.Parent := Self;

  FPriorBtn := TSpeedButton.Create(Self);
  FPriorBtn.SetBounds(X,0 ,MinBtnSize.X, MinBtnSize.Y);
//  FPriorBtn.Glyph.LoadFromResourceName(HInstance, 'DATA_PRIOR');
  FPriorBtn.Enabled := True;
  FPriorBtn.Parent := Self;
  X := X + MinBtnSize.X;
  FPriorBtn.Caption := '<';
  FPriorBtn.Parent := Self;

  FPageEdit := TEdit.Create(Self);
  FPageEdit.SetBounds(X,0 ,MinBtnSize.X+20, MinBtnSize.Y);
  FPageEdit.Enabled := True;
  FPageEdit.Parent := Self;
  FPageEdit.Visible := true;
  X := X + MinBtnSize.X+20;
  FPageEdit.Parent := Self;

  FNextBtn := TSpeedButton.Create(Self);
  FNextBtn.SetBounds(X,0 ,MinBtnSize.X, MinBtnSize.Y);
//  FNextBtn.Glyph.LoadFromResourceName(HInstance, 'DATA_NEXT');
  FNextBtn.Enabled := True;
  FNextBtn.Parent := Self;
  X := X + MinBtnSize.X;
  FNextBtn.Caption := '>';
  FNextBtn.Parent := Self;

  FLastBtn := TSpeedButton.Create(Self);
  FLastBtn.SetBounds(X,0 ,MinBtnSize.X, MinBtnSize.Y);
//  FLastBtn.Glyph.LoadFromResourceName(HInstance, 'DATA_LAST');
  FLastBtn.Enabled := True;
  FLastBtn.Parent := Self;
  X := X + MinBtnSize.X;
  FLastBtn.Caption := '>>';
  FLastBtn.Parent := Self;

end;

procedure TUADataNav.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited;

end;

procedure TUADataNav.Loaded;
var
  W, H: Integer;
begin
  inherited Loaded;
  W := Width;
  H := Height;
  SetSize(W, H);
  if (W <> Width) or (H <> Height) then
    inherited SetBounds (Left, Top, W, H);
  ActiveChanged;
end;

procedure TUADataNav.Notification(AComponent: TComponent;
  Operation: TOperation);
begin

  inherited Notification(AComponent, Operation);

  if (Operation = opRemove) and (TUANavDataLink <> nil) and
    (AComponent = DataSource) then
  begin
      //TUANavDataLink. := nil;
      if not (csLoading in ComponentState) then
        ActiveChanged;
  end;


  if Operation = opRemove then
    if AComponent = FPageEdit then FPageEdit := nil ;

  if Operation = opRemove then
    if AComponent = FFirstBtn then FFirstBtn := nil;

  if Operation = opRemove then
    if AComponent = FLastBtn then FLastBtn := nil ;

  if Operation = opRemove then
    if AComponent = FPriorBtn then FPriorBtn := nil ;

  if Operation = opRemove then
    if AComponent = FNextBtn then FNextBtn := nil ;


end;

procedure TUADataNav.PageChange(Sender: TObject);
begin

end;

procedure TUADataNav.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  W, H: Integer;
begin

  W := AWidth;
  H := AHeight;
  if not HandleAllocated then SetSize(W, H);
  inherited SetBounds (ALeft, ATop, W, H);

end;

procedure TUADataNav.SetDataSource(const Value: TDataSource);
begin

  FDataLink.DataSource := Value;
  if not (csLoading in ComponentState) then
    ActiveChanged;
  if Value <> nil then Value.FreeNotification(Self);

end;

procedure TUADataNav.SetFlat(const Value: Boolean);
begin
  FFlat := Value;
end;

procedure TUADataNav.SetHints(const Value: TStrings);
begin

end;

procedure TUADataNav.SetSize(var W, H: Integer);
var
  Space, Temp, Remain: Integer;
  X: Integer;
  I:integer;
  Count:integer;
begin

  if (csLoading in ComponentState) then Exit;
  CalcMinSize(W, H);
  Count := 5;

  ButtonWidth := W div Count;
  Temp := Count * ButtonWidth;
  if Align = alNone then W := Temp;


  X := 0;
  Remain := W - Temp;
  Temp := Count div 2;

  for I := 0 to ComponentCount -1 do
  begin
    if  Components[I] is TControl then
    begin
      Space := 0;
      if Remain <> 0 then
      begin
        Dec(Temp, Remain);
        if Temp < 0 then
        begin
          Inc(Temp, Count);
          Space := 1;
        end;
      end;
      TControl(Components[I]).SetBounds(X, 0, ButtonWidth + Space, Height);
      Inc(X, ButtonWidth + Space);
    end;
  end;


end;

procedure TUADataNav.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
  Message.Result := DLGC_WANTARROWS;

end;

procedure TUADataNav.WMKillFocus(var Message: TWMKillFocus);
begin

end;

procedure TUADataNav.WMSetFocus(var Message: TWMSetFocus);
begin

end;

procedure TUADataNav.WMSize(var Message: TWMSize);
var
  W, H: Integer;
begin

  inherited;
  W := Width;
  H := Height;
  SetSize(W, H);

end;

procedure TUADataNav.WMWindowPosChanging(
  var Message: TWMWindowPosChanging);
begin
  inherited;
  if (SWP_NOSIZE and Message.WindowPos.Flags) = 0 then
    CalcMinSize(Message.WindowPos.cx, Message.WindowPos.cy);

end;

{ TUANavDataLink }

procedure TUANavDataLink.ActiveChanged;
begin

  if FDataNav <> nil then FDataNav.ActiveChanged;

end;

constructor TUANavDataLink.Create(ANav: TUADataNav);
begin

  inherited Create;
  FDataNav := ANav;
  VisualControl := True;

end;

procedure TUANavDataLink.DataSetChanged;
begin
  if FDataNav <> nil then FDataNav.DataChanged;

end;

destructor TUANavDataLink.Destroy;
begin
  FDataNav := nil;
  inherited Destroy;
end;

procedure TUANavDataLink.EditingChanged;
begin

  if FDataNav <> nil then FDataNav.EditingChanged;

end;

end.

⌨️ 快捷键说明

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