Scrollbox automatisch scrollen

    Scrollbox automatisch scrollen

    Hallo,

    ich stehe vor einem Problem:
    In einer TScrollbox befindet sich ein TPanel und auf diesem ein oder mehrere "Unterpanels".

    Diese Unterpanels möchte ich zur Laufzeit mit der Maus anfassen und umpositionieren, was auch hervorragend funktioniert.
    Nun besteht der Wunsch, beim Erreichen der sichtbaren Grenzen die Scrollbox automatisch scrollen zu lassen um die Panels komplett über das Blatt verschieben zu können.

    Über die Abfrage

    Quellcode

    1. if x < ScrollBox1.ViewportPosition.x then
    2. ScrollBox1.ScrollBy(ScrollBox1.ViewportPosition.x - x, 0);
    3. if y < ScrollBox1.ViewportPosition.y then
    4. ScrollBox1.ScrollBy(0, ScrollBox1.ViewportPosition.y - y);
    5. if y + h > ScrollBox1.ViewportPosition.y + ScrollBox1.ClientHeight then
    6. ScrollBox1.ScrollBy(0, ScrollBox1.ViewportPosition.y - y - h);


    scrollt es auch, aber dabei ändert sich ja gleichzeitig die X/y-Position der Maus und damit "rutscht" alles beim Erreichen des sichtbaren Randes sofort bis zum Bildrand.
    Irgendwie fehlt mir der Ansatz, nur die Scrollbox zu scrollen ohne an der eigentlichen Mausposition was zu ändern.

    Kann mir bitte mal jemand auf die Sprünge helfen?

    Danke
    Ciao
    Stefan
    Das Problem ist ja nicht die Mausposition, die bleibt unverändert. Sondern wohl eher, dass deine Prozedur (die vermute ich im MouseMove steht, oder?) eben sofort nach dem Scrollen wieder aufgerufen wird, weil sich in Bezug auf die geänderten Komponenten die Maus bewegt hat. Folgende Idee:
    Prüfe im MouseMove, ob du dich in einem kritischen Bereich befindest (d.h. eine kleine Region um den Rand). Wenn das so ist, dann aktiviere einen Timer mit einem von dir so gewählten Intervall, dass das Verhalten flüssig, aber nicht zu schnell wird. Wenn nicht, deaktiviere den Timer. Im Timer selbst führst du das Scrollen um ein definiertes Delta aus.
    Alternativ könntest du in deine Randregion unten, rechts und in der rechten Ecke drei Images oder PaintBoxen oder andere durchsichtige Steuerelemente platzieren und das Einschalten/Ausschalten des Timers in den OnMouseEnter/OnMouseLeave-Ereignissen steuern. Dann müsste nicht jedes Mal MouseMove getestet werden. Da aber die Scrollelemente über dem Inhalt sind, ist es nicht mehr möglich, auf Darunterliegendes zu klicken.
    Schließlich solltest du noch schauen, wie es mit der Zuverlässigkeit ist. Ich weiß nicht mehr, welche der Ereignisse, aber manche feuern nicht, wenn die Maus sehr schnell bewegt wird. Es könnte also quasi sein, dass das Scrollen bei einem schnellen Überfahren des Rands mit der Maus aktiviert wird, aber das Ereignis zum Deaktivieren nicht mehr ausgelöst wird. Das kann auch passieren, wenn die Maus zur falschen Richtung das Steuerelement verlässt. Hierfür sollte dann ein zusätzliches Deaktivieren des Timers im OnMouseLeave Abhilfe schaffen.
    Master of the EDH ;)