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)
-   -   ¿Cómo saber qué items seleccionados en TListBox? (https://www.clubdelphi.com/foros/showthread.php?t=90052)

jhonalone 28-03-2016 02:32:13

¿Cómo saber qué items seleccionados en TListBox?
 
Hola a todos.
Estoy intentando detectar todos items seleccionados en un FMX.TListBox para android. (En el caso de que sea posible).
Estoy intentando con esto:
Código Delphi [-]
for i  := 0 to ListBox1.Items.Count-1 do
if ListBox1.Selected[i]=True then  ShowMessage(ListBox1.Selected.Text);
Pero no me compila en FMX.
Agradecería si alguien tiene una solución, o si me confirma que no es posible, para no seguir intentándolo.
Saludos.

AgustinOrtu 28-03-2016 02:41:13

Por que no compila? Cual es el error?

jhonalone 28-03-2016 14:11:38

Hola, Agustin.

El mensaje exacto es "Class does not have a default property" y pone el cursor sobre los corchetes cuadrados de la [i] itinerante en
Código Delphi [-]
ListBox1.Selected[i]=True
He intentado hacerlo con paréntesis así
Código Delphi [-]
ListBox1.Selected(i)=True
y se para en el paréntesis con el mensaje: "Missing operator or semicolon".

Cuando NO cambio la propiedad MultySelectStyle del TListBox a None y quito la itinerancia, es decir con el código de la siguiente manera:

Código Delphi [-]
{for i  := 0 to ListBox1.Items.Count-1 do
if ListBox1.Selected[i]=True then } ShowMessage(ListBox1.Selected.Text);
me responde el mensaje con el último seleccionado. Con el último en el orden de selección, aunque haya más de uno seleccionado, independientemente de su indice en el TlistBox.

Todavía hay algo más "curioso". Antes de entrar en la lista, y para rehacerla, tenia este código:
Código Delphi [-]
ListBox1.Visible:=True;
ListBox1.ItemIndex := -1; // Si no seleciona ningún item lo sabremos por esto

for I := 0  to ListBox1.Items.Count-1 do
 ListBox1.Items.Delete(I);

ListBox1.Items.Add('uno');
ListBox1.Items.Add('Otro');
ListBox1.Items.Add('y otro');

Pues bien, al salir de la lista y volver a editarla, NO BORRA TODOS LOS ITEMS ANTERIORES.
A lo mejor borra uno o dos, y añade otra vez los tres items. (Aunque ha realizado la rutina completa)

Utilizando la propiedad ListBox1.Clear, ya no sucede esto. ¿¡Cosas.....!? Bueno, esto es una anécdota, no me preocupa, porque ListBox1.Clear funciona bien.

AgustinOrtu 28-03-2016 16:23:11

Cuando se eliminan los items items de una lista, se hace desde atras para adelante (primero se borra el ultimo, luego se borra el anteultimo, y asi)

Imaginate que borras el primero (indice 0). Ahora la lista tiene que mover los elementos para que el que tenia indice 1, ahora tenga indice 0. Es por eso que tu bucle for no elimina todos los elementos

Te dejo este código de prueba para que experimentes:

Código Delphi [-]
procedure TForm1.btnLimpiarBienClick(Sender: TObject);
var
  I: Integer;
begin
  for I := ListBox1.Items.Count - 1 downto 0 do
    ListBox1.Items.Delete(I);
end;

procedure TForm1.btnLimpiarMalClick(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ListBox1.Items.Count - 1 do
    ListBox1.Items.Delete(I);
end;

procedure TForm1.btnCopiarSeleccionadosClick(Sender: TObject);
var
  I: Integer;
begin
  Memo1.ClearContent;
  for I := 0 to ListBox1.Items.Count - 1 do
  begin
    if ListBox1.ListItems[i].IsSelected then
      Memo1.Lines.Add(ListBox1.Items[i]);
  end;
end;

procedure TForm1.btnCrearItemsClick(Sender: TObject);
begin
  CreateItems;
end;

procedure TForm1.CreateItems;
begin
  ListBox1.Items.Add('uno');
  ListBox1.Items.Add('Otro');
  ListBox1.Items.Add('y otro');
  ListBox1.ItemIndex := -1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.MultiSelectStyle := TMultiSelectStyle.Default;
  CreateItems;
end;

Aun asi, me sigue pareciendo mejor que se use el metodo Clear del ListBox que usando el bucle for :)

jhonalone 28-03-2016 20:13:25

Gracias por todo Agustín (MAESTRO).

¡¡¡CUANTO ME QUEDA POR APRENDER...!!!

Saludos.


La franja horaria es GMT +2. Ahora son las 13:54:30.

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