Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.227 Beiträge
 
Delphi 12 Athens
 
#7

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 20:04
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat