Hab das ganze mal in 'ne nette Prozedur verpackt
Diese Prozedur mußt'e einfach nur der ScrollBox allen Komponenten darin zuweisen.
Über die Konstanten kannst'e das Ganze noch etwas steuern.
> ScrollSpeedXY = wie schnell gescrollt werden soll
> ScrollAreal = wie groß der Scrollbereich sein soll, in welchem schon gescrollt werden soll
(0 = nur außerhalb der ScrollBar | größer 0 = Anzahl der Pixel des Rahmens, wo es schon reagieren soll)
> das Auskommentierte kannst'e reinmachen, wenn es nur beim Klicken mit der linken Maustaste reagieren soll
Delphi-Quellcode:
Const ScrollSpeed = 3;
ScrollAreal = 20;
Procedure TForm1.ScrollBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Function Comp(i, min, max, Cmin, Cmax: Integer): Integer;
Begin
If (i < min + ScrollAreal) and (Cmin - ScrollSpeed < min) Then Result := 1
Else If (i > max - ScrollAreal) and (Cmax + ScrollSpeed > max) Then Result := -1
Else Result := 0;
End;
Var P: TPoint;
R, C: TRect;
i: Integer;
Begin
//If not (ssLeft in Shift) Then Exit;
P.X := X;
P.Y := Y;
While (Sender is TControl) and not (Sender is TScrollBox) do Begin
P := TControl(Sender).ClientToParent(P, TControl(Sender).Parent);
Sender := TControl(Sender).Parent;
End;
If Sender is TScrollBox Then Begin
If TScrollBox(Sender).ControlCount > 0 Then Begin
C := TWinControl(TScrollBox(Sender).Controls[0]).BoundsRect;
For i := 1 to TScrollBox(Sender).ControlCount - 1 do
UnionRect(C, TWinControl(TScrollBox(Sender).Controls[i]).BoundsRect, C);
End Else C := TScrollBox(Sender).ClientRect;
R := TScrollBox(Sender).ClientRect;
TScrollBox(Sender).ScrollBy(
Comp(P.X, R.Left, R.Right, C.Left, C.Right) * ScrollSpeed,
Comp(P.Y, R.Top, R.Bottom, C.Top, C.Bottom) * ScrollSpeed);
End;
End;
[add]
es gibt da 'nen kleines Problem mit der CursorPosition, und zwar wird diese nicht richtig übermittelt, wärend die Maustaste gedrückt ist ... heißt, diese wird mit verschoben.
außerdem ist der 0-Punkt im Clientbereich nicht 0, wenn ein Objekt nach link und/oder oben rausverschoben ist :schock:
also entweder man rechnet die Verschiebung wärend des Mausdrucks mit ein, oder ... nja, man ignoriert die X-Y-Parameter ganz einfach ...
Delphi-Quellcode:
Const ScrollSpeed = 3;
ScrollAreal = 20;
Procedure TForm1.ScrollBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Function Comp(i, min, max, Cmin, Cmax: Integer): Integer;
Begin
If (i < min + ScrollAreal) and (Cmin - ScrollSpeed < min) Then Result := 1
Else If (i > max - ScrollAreal) and (Cmax + ScrollSpeed > max) Then Result := -1
Else Result := 0;
End;
Var P: TPoint;
R, C: TRect;
i: Integer;
Begin
//If not (ssLeft in Shift) Then Exit;
While (Sender is TControl) and not (Sender is TScrollBox) do
Sender := TControl(Sender).Parent;
If Sender is TScrollBox Then Begin
GetCursorPos(P);
P := TScrollBox(Sender).ScreenToClient(P);
R := TScrollBox(Sender).ClientRect;
If TScrollBox(Sender).ControlCount > 0 Then Begin
C := TWinControl(TScrollBox(Sender).Controls[0]).BoundsRect;
For i := 1 to TScrollBox(Sender).ControlCount - 1 do
UnionRect(C, TWinControl(TScrollBox(Sender).Controls[i]).BoundsRect, C);
End Else C := TScrollBox(Sender).ClientRect;
TScrollBox(Sender).ScrollBy(
Comp(P.X, R.Left, R.Right, C.Left, C.Right) * ScrollSpeed,
Comp(P.Y, R.Top, R.Bottom, C.Top, C.Bottom) * ScrollSpeed);
End;
End;