AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi scrollBox scrollen mit drag and drop ?
Thema durchsuchen
Ansicht
Themen-Optionen

scrollBox scrollen mit drag and drop ?

Ein Thema von thomas2009 · begonnen am 6. Feb 2009 · letzter Beitrag vom 7. Feb 2009
Antwort Antwort
thomas2009
(Gast)

n/a Beiträge
 
#1

scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 15:12
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?
Miniaturansicht angehängter Grafiken
scroll_scrollbox_drag_and_drop_414.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 15:18
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 15:35
[del]
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#4

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 15:59
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
Angehängte Dateien
Dateityp: zip scrollbox_mousemove_498.zip (4,0 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 18:12
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#6

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 19:52
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: scrollBox scrollen mit drag and drop ?

  Alt 6. Feb 2009, 21: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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#8

Re: scrollBox scrollen mit drag and drop ?

  Alt 7. Feb 2009, 01:01
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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