Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Scroll automático en TScrollBox. (https://www.clubdelphi.com/foros/showthread.php?t=61172)

Lord Delfos 28-10-2008 18:08:38

Problema visual con scroll automático en TScrollBox.
 
Buenas, gente. A ver si alguno sabe a qué se debe esto.

Tengo una TScrollBox con controles TImage adentro, algo como una galería. El usuario puede cambiar las imágenes de lugar arrastrándolas y soltándolas sobre otras.

Actualmente estoy usando un TDragControlObject para poder obtener una imagen para mostrar mientras se arrastra. Hasta acá no hay ningún problema. Todo se ve perfecto.

La cosa es que se me ocurrió agregar la posibilidad de que la imagen pueda ser arrastrada fuera del recuadro visual de la scrollbox, es decir, que si yo estoy en la imagen 150, y la quiero arrastrar hasta la posición 1, puede arrastrarla hacia la parte superior de la scrollbox y ésta va a "autoescrolear" hacia arriba.

La cosa es que gráficamente se rompe total y completamente. Aparecen partes de imágenes sobre las que pasé, va quedando una "estela fantasma" de la imagen que arrastro, en fin, se rompe feo, feo.

El código que tengo actualmente en el OnDragOver de las TImage es éste:

Código Delphi [-]
procedure TScrollImagenes.DragOverImagen(Sender, [...]
begin
  Accept:= (Source is TMyDragObject);
  if Accept then
    begin
    if ScreenToClient(Mouse.CursorPos).Y<100 then
      if VertScrollBar.Position>10 then
        Self.Perform(WM_VSCROLL, 0, 0);
    end;
  //Refresh;
end;
El resultado:

http://link.imgshare.us/0rjSjj

La única imagen de arrastre que debería verse es la de arriba del todo, las demás van quedando por el camino.

Al principio pensé hacer un refresh (que ahí en el código está comentado), que aunque es ineficiente y causa algún parpadeo... digamos que podría vivir con ello si solucionara el otro problema. Pero el resultado no fue mucho mejor:

http://link.imgshare.us/0rjSl7

Fíjense que la imagen que arrastro está "contaminada" por otras imágenes por las que pasé antes.

Todo esto pasa únicamente cuando hay que hacer scroll, si se arrastra dentro del campo visual la cosa se ve perfectamente:

http://link.imgshare.us/0rjSkh

... Algo bastante loco.

Si alguien sabe algo al respecto, incluyendo cómo debe hacerse un autoscroll correctamente, se los agradecería hasta el infinito.

PD: Si piensan que el culpable es el Perform(WM_SCROLL, 0, 0), están equivocados, ya probé con el ScrollBy y la cosa no anduvo tampoco: hacía scroll pero no cambiaba el Top de las imágenes, así que el resultado era desastroso.


La franja horaria es GMT +2. Ahora son las 03:50:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi