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

📄 mmscroll.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/index.html               =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 04.11.98 - 00:51:59 $                                        =}
{========================================================================}
unit MMScroll;

{$I COMPILER.INC}

interface

uses
{$IFDEF WIN32}
  Windows,
{$ELSE}
  WinProcs,
  WinTypes,
{$ENDIF}
  SysUtils,
  Messages,
  Classes,
  Graphics,
  Controls,
  ExtCtrls,
  MMObj,
  MMUtils,
  MMString,
  MMMulDiv;

type
  TMMScrollPanelKind   = (spHorizontal, spVertical);
  TMMScrollShiftKind   = (sknone, skleft, skright, skboth, skJump);
  TMMScrollChangeEvent = procedure(Sender : TObject; Min, Max : longint) of object;

  {-- TMMScrollPanel ----------------------------------------------------}
  TMMScrollPanel = class(TMMGraphicControl)
  private
    FRangeMin      : Longint;
    FRangeMax      : Longint;
    FSliderMin     : Longint;
    FSliderMax     : Longint;
    FSizeable      : Boolean;
    FSliderColor   : TColor;
    FSliderDown    : Boolean;
    FLastLoc       : integer;
    FLocator       : Longint;
    FLocColor      : TColor;
    FSliderLight   : TColor;
    FSliderShadow  : TColor;
    FKind          : TMMScrollPanelKind;
    FShiftOffset   : Longint;
    FShift         : TMMScrollShiftKind;
    FLastMin,
    FLastMax       : Longint;

    FOnTrack       : TMMScrollChangeEvent; { action: slider was moved       }
    FOnTrackSize   : TMMScrollChangeEvent; { action: slider was resized     }
    FOnTrackEnd    : TMMScrollChangeEvent; { action: any action is done     }

    procedure SetRangeMin(Value: Longint);
    procedure SetRangeMax(Value: Longint);
    procedure SetSliderMin(Value: Longint);
    procedure SetSliderMax(Value: Longint);
    procedure SetSliderBoth(Min, Max: Longint);   { fuer Aufrufe von innen }
    procedure SetSliderDown(Value: Boolean);
    procedure SetSliderColor(Value: TColor);
    procedure SetSliderLight(Value: TColor);
    procedure SetSliderShadow(Value: TColor);
    procedure SetLocator(Value : Longint);
    procedure SetLocColor(Value : TColor);
    procedure SetKind(Value: TMMScrollPanelKind);
    property  SliderDown: Boolean read FSliderDown write SetSliderDown;
    function  PixelTo_X(X,Y: integer): Longint;
    function  X_ToPixel(X_Value: Longint): integer;
    function  MouseAction(X, Y: integer): TMMScrollShiftKind;
    procedure Pixel(var PixMin, PixMax: integer);
    procedure DrawLocator(aCanvas: TCanvas; var LastLoc: integer);
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;

  protected
    procedure Track; dynamic;
    procedure TrackEnd; dynamic;
    procedure DblClick; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                        X,Y: integer); override;
    procedure MouseUp(Button : TMouseButton; Shift: TShiftState;
                      X,Y: integer); override;
    procedure MouseMove(Shift: TShiftState; X,Y: integer); override;

  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;

    procedure SetSliderAll(Min, Max: Longint);
    procedure SetRangeAll(Min, Max: Longint);

  published
    property OnTrack: TMMScrollChangeEvent read FOnTrack write FOnTrack;
    property OnTrackEnd: TMMScrollChangeEvent read FOnTrackEnd write FOnTrackend;
    property OnTrackSize: TMMScrollChangeEvent read FOnTrackSize write FOnTrackSize;

    property Align;
    property Bevel;
    property Color;
    property Enabled;
    property Font;
    property ShowHint;
    property Visible;
    property Width default 100;
    property Height default 22;
    property Caption;
    property ParentFont;
    property ParentColor;
    property ParentShowHint;
    property Kind: TMMScrollPanelKind read FKind write SetKind default spHorizontal;
    property RangeMin: Longint read FRangeMin write SetRangeMin default 0;
    property RangeMax: Longint read FRangeMax write SetRangeMax default 1000;
    property Sizeable: Boolean read FSizeable write FSizeable default True;
    property SliderMin: Longint read FSliderMin write SetSliderMin default 200;
    property SliderMax: Longint read FSliderMax write SetSliderMax default 500;
    property Locator: Longint read FLocator write SetLocator default -1;
    property LocatorColor: TColor read FLocColor write SetLocColor default clYellow;
    property SliderColor: TColor read FSliderColor write SetSliderColor default clBtnFace;
    property SliderLight: TColor read FSliderLight write SetSliderLight default clBtnHighLight;
    property SliderShadow: TColor read FSliderShadow write SetSliderShadow default clBlack;
  end;

implementation

const
     Griff = 4;
     MinPixel = 15;

{== TMMScrollPanel ======================================================}
constructor TMMScrollPanel.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);

   ControlStyle := ControlStyle - [csSetCaption];

   Bevel.BorderSpace := 1;
   Bevel.BorderSpaceColor := clBtnFace;

   Caption := '';
   FRangeMin := 0;
   FRangeMax := 1000;
   FSliderMin := 200;
   FSliderMax := 500;
   FKind := spHorizontal;
   FLastLoc := -1;
   FLocator := -1;
   FLocColor := clYellow;
   FSliderColor := clBtnFace;
   FSliderLight := clBtnHighLight;
   FSliderShadow:= clBlack;
   FShift := sknone;
   FSizeable := True;
   Width := 100;
   Height := 22;

   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
end;

{-- TMMScrollPanel ------------------------------------------------------}
destructor TMMScrollPanel.Destroy;
begin

   inherited destroy;
end;

{-- TMMScrollPanel ------------------------------------------------------}
function TMMScrollPanel.X_ToPixel(X_Value: longint): integer;
begin
   if FKind = spHorizontal then
      Result := Limit(BevelExtend+MulDiv32(X_Value-FRangeMin,(Width-2*BevelExtend)-1,FRangeMax-FRangeMin),-32700,32700)
   else
      Result := Limit(BevelExtend+MulDiv32(X_Value-FRangeMin,(Height-2*BevelExtend)-1,FRangeMax-FRangeMin),-32700,32700);
end;

{bekommt X,Y , damit FKind intern ber點ksichtigt werden kann}
{-- TMMScrollPanel ------------------------------------------------------}
function TMMScrollPanel.PixelTo_X(X,Y: integer): Longint;
begin
   if FKind = spHorizontal then
      Result := MulDiv32(X-BevelExtend,FRangeMax-FRangeMin,(Width-2*BevelExtend)-1)+FRangeMin
   else
      Result := MulDiv32(Y-BevelExtend,FRangeMax-FRangeMin,(Height-2*BevelExtend)-1)+FRangeMin;
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetSliderDown(Value: Boolean);
begin
   if Value <> FSliderDown then
   begin
      FSliderDown := Value;
      Invalidate;
   end;
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetRangeMin(Value: Longint);
begin
   SetRangeAll(Value, FRangeMax);
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetRangeMax(Value: Longint);
begin
   SetRangeAll(FRangeMin, Value);
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetRangeAll(Min, Max: Longint);
begin
   if Min > Max then SwapLong(Min, Max);
   if (Min <> FRangeMin) or (Max <> FRangeMax) then
   begin
      FRangeMin := Min;
      FRangeMax := Max;
      SetSliderAll(MMUtils.Max(FSliderMin,FRangeMin),
                   MMUtils.Min(FSliderMax,FRangeMax));
      Invalidate;
   end;
   {$IFDEF WIN32}
   {$IFDEF TRIAL}
   {$DEFINE _HACK1}
   {$I MMHACK.INC}
   {$ENDIF}
   {$ENDIF}
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetSliderMin(Value: Longint);
begin
   SetSliderAll(Value,FSliderMax);
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetSliderMax(Value: Longint);
begin
   SetSliderAll(FSliderMin,Value);
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetSliderAll(Min, Max: Longint);
begin
   if (Min <> FSliderMin) or (Max <> FSliderMax) then
   begin
      SetSliderBoth(Min, Max);
      TrackEnd;
   end;
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetSliderBoth(Min, Max: Longint);
begin
   { waehrend Tracking }
   if Min > Max then SwapLong(Min, Max);
   if Min = Max then
   begin
      if Max = FRangeMax then Dec(Max)
      else inc(Min);
   end;

   if (Min <> FSliderMin) or (Max <> FSliderMax) then
   begin
      FSliderMax := Limit(Max, FRangeMin, FRangeMax);
      FSliderMin := Limit(Min, FRangeMin, FRangeMax);
      Refresh;
   end;
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetKind(Value: TMMScrollPanelKind);
var
   Temp: integer;

begin
   if Value <> FKind then
   begin
      FKind := Value;
      if ((FKind = spHorizontal) and (Height > Width)) or
         ((FKind = spVertical) and (Height < Width)) then
      begin
         Temp := Width;
         Width := Height;                        { swap Width and Height }
         Height := Temp;
      end;
      Invalidate;
   end;
   {$IFDEF WIN32}
   {$IFDEF TRIAL}
   {$DEFINE _HACK2}
   {$I MMHACK.INC}
   {$ENDIF}
   {$ENDIF}
end;

{-- TMMScrollPanel ------------------------------------------------------}
procedure TMMScrollPanel.SetLocColor(Value: TColor);
begin
   if (Value <> FLocColor) then
   begin
      FLocColor := Value;
      Invalidate;
   end;
end;

⌨️ 快捷键说明

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