📄 mmscroll.pas
字号:
{========================================================================}
{= (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 + -