Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi scrollBox scrollen mit drag and drop ? (https://www.delphipraxis.net/128806-scrollbox-scrollen-mit-drag-drop.html)

thomas2009 6. Feb 2009 14:12


scrollBox scrollen mit drag and drop ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

ich habe ein Problem beim zeichnen auf Image in scrollBox
der Zeichenbereich ist größer als was am Bildschirm angezeigt wird
Ich muss die ScrollBox scrollen um weiter unten oder rechts den Rest zu sehen

wenn ich gerade beim Zeichnen bin, dann sollte der ScrollBox automatisch sich scrollen,
wenn ich außerhalb mit gedrückter Maustaste ziehe

Gibt es eine Idee?

himitsu 6. Feb 2009 14:18

Re: scrollBox scrollen mit drag and drop ?
 
die ScrollBox hat doch bestimmt ein OnMouseMove?
dann prüf dort einfach, ob sich der Mauszeiger außerhalb der Box befindet und Scroll entsprechend.
Vermutlich mußt'e dann aber auch noch im OnMouseMove der Komponenten innerhalb der ScrollBox prüfen.

[add]
'ne ScrollBox1 wird benötigt und irgendwelche Komponenten in dieser Box

Delphi-Quellcode:
// allen Komponenten in der ScrollBox diese Prozedur für OnMouseMove zuweisen
Procedure TForm1.ScrollBox1ComponentMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  Var P: TPoint;

  Begin
    If not (Sender is TControl) Then Exit;
    P.X := X;
    P.Y := Y;
    P := TControl(Sender).ClientToParent(P, ScrollBox1);
    ScrollBox1.OnMouseMove(Sender, Shift, P.X, P.Y);
  End;

// und diese Prozedur für ScrollBox1.OnMouseMove
Procedure TForm1.ScrollBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  Function Comp(i, min, max: Integer): Integer;
    Begin
      If     i < min Then Result := 1
      Else If i > max Then Result := -1
      Else                Result := 0;
    End;

  Var R: TRect;

  Begin
    {}Caption := Format('%s > %d:%d', [Sender.ClassName, X, Y]);

    R := ScrollBox1.ClientRect;
    ScrollBox1.ScrollBy(Comp(X, R.Left, R.Right) * 1, Comp(Y, R.Top, R.Bottom) * 1);
  End;
hier wird allerdings nur gescrollt, wenn sich der Mauszeiger bewegt
und die Grenzen der ScrollBox solltest du auch noch einbauen (hier kann man noch unbegrenzt sonstwohin scrollen)

himitsu 6. Feb 2009 14:35

Re: scrollBox scrollen mit drag and drop ?
 
[del]

thomas2009 6. Feb 2009 14:59

Re: scrollBox scrollen mit drag and drop ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu
hier wird allerdings nur gescrollt, wenn sich der Mauszeiger bewegt
und die Grenzen der ScrollBox solltest du auch noch einbauen (hier kann man noch unbegrenzt sonstwohin scrollen)

Wo soll ich die Grenzen eingeben ?
Ich habe den Code getestet aber es wird nicht gescrollt

himitsu 6. Feb 2009 17:12

Re: scrollBox scrollen mit drag and drop ?
 
wo weiß ich jetzt auch nicht, ab man könnte die untergeordneten Komponenten durchgehn und schauen ob noch eine davon außerhalb der Richung ligt, in die man scrollen will und wenn da nichts mehr liegt, dann wird halt nicht weitergescrollt.

Schieb mal deine ScrollBox in den Bereich des Fensters (nicht drüberrausstehen) ... z.B. einfach (ScrollBox.)Align auf alClient setzen.

Und dann klickst du z.B. mit der Linken Maustaste in den Bereich der ScrollBar und verläßt das Fenster (Maustaste gedrückt lassen)
> OnMouseMove reagiert außerhalb des Clientbereichs nur, wenn angeklickt wurde/wird.

man könnte aber die Bereiche, wo gescrollt wird innerhalb des Clientbereichs verschieben, dann wäre sozusagen der Randbereich des Fensters scrollaktiv.

z.B. statt if i > max ein if i > max - 20 , dann würde das Scrollen schon innerhalb eines 20 Pixel großen Randstreifens beginnen und nicht erst außerhalb (und innerhalb würde OnMouseMove auch ohne Tastendruck reagieren)

thomas2009 6. Feb 2009 18:52

Re: scrollBox scrollen mit drag and drop ?
 
Es geht jetzt

Aber die Grenzen muss ich eingeben, damit die ScrollBox nicht immer weiter und weiter zu unendlich scrollt : (

Es soll scrollt bis ScrollBox-Höhe (Image1-Höhe) als Max natürlich

himitsu 6. Feb 2009 20:04

Re: scrollBox scrollen mit drag and drop ?
 
Hab das ganze mal in 'ne nette Prozedur verpackt :angel:

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 ... :angel:

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;

thomas2009 7. Feb 2009 00:01

Re: scrollBox scrollen mit drag and drop ?
 
Der letzte Code funktioniert viel viel besser jetzt außer eine Sache:
Wenn ich nach rechts scrolle und scrolle dann am ende verschwendet die Scroll-leiste komplett ! Um die die Leiste wieder zu sehen, muss ich wieder nach links scrollen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz