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)
-   -   Sincronizar desplazamiento vertical en 2 ListBox (https://www.clubdelphi.com/foros/showthread.php?t=95688)

jhonalone 11-05-2022 23:38:44

Sincronizar desplazamiento vertical en 2 ListBox
 
Hola amigos.

Necesito ayuda para conseguir desplazar verticalmente 2 Listbox sincronizados con el mismo número de items y distintas Strings (Claro..).

En el buscador de internet he encontrado alguna solución aplicada para Windows utilizando mensajes de Windows en este enlace.

Pero no sé como hacerlo en FMX para Andorid.

Espero que alguien pueda ayudarme.

Gracias de antemano.

Saludos.

egostar 12-05-2022 04:03:25

Hola, debes hacer uso del evento OnViewPortPosition de los ListBox.

Agrega dos ListBox y un boton a la forma, en el ejemplo solo asigno el evento al ListBox2 y cuando te desplazas verticalmente se ve el efecto.

Código Delphi [-]
unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation,
  FMX.StdCtrls, FMX.Layouts, FMX.ListBox;

type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure ViewPortPositionChange(Sender: TObject; const OldViewportPosition,
                          NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to 20 do
  begin
    ListBox1.Items.Add(Format('%d',[I*12]));
    ListBox2.Items.Add(Format('%d',[I*15]));
  end;
  ListBox2.OnViewportPositionChange := ViewPortPositionChange;
end;

procedure TForm2.ViewPortPositionChange(Sender: TObject; const OldViewportPosition,
  NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
var
  P: TPointF;
begin
  P := ListBox1.ViewportPosition;
  P.Y := ListBox2.ViewportPosition.Y;
  ListBox1.ViewportPosition := P;
end;

end.

Saludos

jhonalone 12-05-2022 14:58:48

¡¡¡MILLONES DE GRACIAS, egostar!!!

Por aportarme la solución y por hacerlo tan rápido.
Implemento la solución en mi proyecto y te cuento.

Saludos.

jhonalone 13-05-2022 01:08:37

¡¡¡P E R F E C T O!!!

Sencillamente... ¡¡¡M A R A V I L L O S O!!!

Millones de gracias.

Eres muy G R A N D E egostar.

A pesar de la hora que es (la 1:08 de la noche) no he podido resistirme a darte las graacias.

Un saludo muy cordial.

egostar 13-05-2022 04:00:30

Hola jhonalone

Me alegra que te haya servido, FMX tiene muchas cosas interesantes y ésta es una de ellas. ^\||/

Saludos

egostar 13-05-2022 04:45:21

Una pequeña mejora.


Código Delphi [-]
begin
  ListBox1.OnViewportPositionChange := ViewPortPositionChange;
  ListBox2.OnViewportPositionChange := ViewPortPositionChange;
end;

procedure TForm2.ViewPortPositionChange(Sender: TObject; const OldViewportPosition,
  NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
begin
  if (Sender as TListBox).Name = 'ListBox1' then
    ListBox2.ViewportPosition := NewViewportPosition
  else
    ListBox1.ViewportPosition := NewViewportPosition;
end;

Saludos


La franja horaria es GMT +2. Ahora son las 17:39:22.

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