Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   TFramedVertScrollBox objetos desordenados (https://www.clubdelphi.com/foros/showthread.php?t=94527)

jhonalone 20-03-2020 22:42:26

TFramedVertScrollBox objetos desordenados
 
Hola amigos. Yo y mis rarezas.
El título lo dice. Añado controles (TListView y TRctangle) al TFramedVertScrollBox y no salen en el orden añadido. Bueno, la primera vez SI. Las sucesivas NO. Os pongo un trozo de código que uso.

Código Delphi [-]
// Borro los controles anteriores
for xx := FramedVertScrollBox2.ChildrenCount-1 downto 0 do
  if (FramedVertScrollBox2.Children[xx] is TRectangle) or
      (FramedVertScrollBox2.Children[xx] is TListView)
  then
    FramedVertScrollBox2.RemoveObject(FramedVertScrollBox2.Children[xx]);

    // Hay que poner las posiciones a cero para que queden en su sitio
Rectangle7.Position.Y := 0;
Rectangle8.Position.Y := 0;
Rectangle9.Position.Y := 0;
Rectangle10.Position.Y := 0;
Rectangle11.Position.Y := 0;

ListView1.Position.Y := 0;
ListView2.Position.Y := 0;
ListView3.Position.Y := 0;
ListView4.Position.Y := 0;
ListView5.Position.Y := 0;


// Después añado los controles
        FramedVertScrollBox2.AddObject(Rectangle7);
        FramedVertScrollBox2.AddObject(ListView1);

        FramedVertScrollBox2.AddObject(Rectangle8);
        FramedVertScrollBox2.AddObject(ListView2);

        FramedVertScrollBox2.AddObject(Rectangle9);
        FramedVertScrollBox2.AddObject(ListView3);

        FramedVertScrollBox2.AddObject(Rectangle10);
        FramedVertScrollBox2.AddObject(ListView4);

        FramedVertScrollBox2.AddObject(Rectangle11);
        FramedVertScrollBox2.AddObject(ListView5);

Repito, la primera vez salen en el orden que los he añadido.

Las sucesivas me junta los rectángulos al final, pero no todos... Me junta los TListView... Inserta entre los ListView algún TRectangle... Y me mantiene la posición del desplazamiento vertical, que me gustaría que empezara el ScrollBars, siempre, en el principio.

Vamos, un desastre.

Todos los controles están alineados al Top

Agradezco cualquier sugerencia.

Saludos.

jhonalone 21-03-2020 00:54:39

Cita:

Empezado por jhonalone (Mensaje 536362)
Y me mantiene la posición del desplazamiento vertical, que me gustaría que empezara el ScrollBars, siempre, en el principio.

Hola de nuevo.
Esta parte la he resuelto asi:
Código Delphi [-]
 FramedVertScrollBox2.ViewportPosition := PointF(0, 0);
 FramedVertScrollBox2.RealignContent;

Sigo esperando vuestra ayuda.
Gracias y saludos.

jhonalone 21-03-2020 16:41:28

Hola de nuevo.
Sigo investigando...

Sé que el control tiene un método Sort.
Código Delphi [-]
procedure Sort(Compare: TFmxObjectSortCompare); override;
Que según la ayuda, el parámetro Compare debe ser del tipo
Código Delphi [-]
TFmxObjectSortCompare = function(item1, item2: TFmxObject): Integer;

Pero reconozco humildemente que no tengo ni idea de cómo hacerlo.
Había pensado utilizar una propiedad que tienen en común todos los controles: la propiedad Tag para hacerlo. Pero estoy intentando averiguar cómo, sin éxito.

Como os comentaba, la segunda vez que lleno el TFramedVertScrollBox con un orden nuevo, no respeta el orden de asignación de los objetos. Es curioso que siempre los desordena en el mismo orden, aunque repita varias veces la asignación. (¿...?)

Bien. Sigo esperando que alguien más experto me saque de este apuro.
Gracias anticipadas y un saludo.

jhonalone 22-03-2020 01:48:12

Hola a todos.
Muchas gracias a los que me habéis leído y a los que estuvierais intentando resolver mi problema.

¡¡También HE RESUELTO EL PROBLEMA de la ordenación!!

Fiel a mi costumbre de publicar mis soluciones, por si ayudan a alguien, aquí está la solución:
Código Delphi [-]

// Primero eliminamos los controles que habíamos asignado antes
for xx := FramedVertScrollBox2.ChildrenCount-1 downto 0 do
  if (FramedVertScrollBox2.Children[xx] is TRectangle) or
      (FramedVertScrollBox2.Children[xx] is TListView)
  then
    FramedVertScrollBox2.RemoveObject(FramedVertScrollBox2.Children[xx]);

...........

    // Quitamos esto al  principio de la asignación de controles
{Rectangle7.Position.Y := 0;
Rectangle8.Position.Y := 0;
Rectangle9.Position.Y := 0;
Rectangle10.Position.Y := 0;
Rectangle11.Position.Y := 0;

ListView1.Position.Y := 0;
ListView2.Position.Y := 0;
ListView3.Position.Y := 0;
ListView4.Position.Y := 0;
ListView5.Position.Y := 0;
       }

// Aasignamos los nuevos controles
        FramedVertScrollBox2.AddObject(Rectangle7);
        FramedVertScrollBox2.AddObject(ListView1);

        FramedVertScrollBox2.AddObject(Rectangle8);
        FramedVertScrollBox2.AddObject(ListView2);

        FramedVertScrollBox2.AddObject(Rectangle9);
        FramedVertScrollBox2.AddObject(ListView3);

        FramedVertScrollBox2.AddObject(Rectangle10);
        FramedVertScrollBox2.AddObject(ListView4);

        FramedVertScrollBox2.AddObject(Rectangle11);
        FramedVertScrollBox2.AddObject(ListView5);

........

// Colocamos después en el orden inverso al que deben figurar en el TFramedVertScrollBox
ListView5.Position.Y := 0;
Rectangle11.Position.Y := 0;
ListView4.Position.Y := 0;
Rectangle10.Position.Y := 0;
ListView3.Position.Y := 0;
Rectangle9.Position.Y := 0;
ListView2.Position.Y := 0;
Rectangle8.Position.Y := 0;
ListView1.Position.Y := 0;
Rectangle7.Position.Y := 0;

Consiste en poner los controles en la posición CERO del VertScrollBox (o FramedVertScrollBox) en orden inverso a como quieres que aparezcan en el contenedor, después de haber añadido todos los controles.

Un saludo y hasta la próxima.

Casimiro Notevi 22-03-2020 11:28:41

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 10:55:01.

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