Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cambiar de posición un TListItem (https://www.clubdelphi.com/foros/showthread.php?t=31020)

metalfox6383 25-04-2006 23:48:02

Cambiar de posición un TListItem
 
Hola:

Tengo en un "form" un objeto de tipo TListView con items agregados y mi necesidad me obliga a siempre dejar el objeto en modo de reporte. ¿Cómo puedo hacer para que un item ubicado en cierta posición pase a la posición que yo quiera? Es decir, el primer elemento hacer que se convierta en el tercero. Intenté cambiando la propiedad "Index" del item, pero me aparece un error diciéndome que es imposible cambiar una propiedad de sólo lectura.

Gracias.

dec 26-04-2006 00:20:32

Hola,

Poco elegante parece, y es probable que exista otro modo, pero, a mí se me ocurre este a bote pronto, y lo expongo por si sirviera de algo:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  nItem: TListItem;
begin
  { Nos proponemos con el siguiente código cambiar
    la posición del primer elemento de un "TListView".

    Queremos que en lugar del índice 0 dicho elemento
    pase a ocupar el índice 2 de la lista de marras.
  }

  // Vamos a insertar un nuevo Item en el índice 2
  nItem := ListView1.Items.Insert(2);

  { La propiedad Caption del nuevo Item la recogemos
    del Item que queremos "mover", y que, como luego
    se verá, en realidad no lo movemos tal cual, sino
    que lo copiamos, y luego lo borraremos.
  }
  nItem.Caption := ListView1.Items[0].Caption;

  { También nos interesan los "SubItems"..., así que
    nos hacemos con ello. Supongo que si nos intere-
    saran otros datos, como el "ImageIndex", no nos
    quedaría sino copiarlo también.
  }
  for i := 0 to ListView1.Items[0].SubItems.Count-1 do
    nItem.SubItems.Add(ListView1.Items[0].SubItems[i]);

  { Por último, borramos el Item que acabamos
    de copiar para volverlo a insertar (una
    copia) con distinto índice en la lista.
  }
  ListView1.Items[0].Delete;

end;

metalfox6383 26-04-2006 00:49:52

Interesante forma. Aunque era justo lo que quería evitar, copiar un item y borrar el anterior. Gracias. Usaré ese código.

Lepe 26-04-2006 09:07:44

Increible pero cierto, no hay métodos para cambiar de sitio un elemento.
Tambien así:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  nItem: TListItem;
begin
  listview.beginUpdate;
  nItem := Listview.items.insert(5);
  nitem.Assign(Listview.items[3]); // copiamos todas las propiedades
  nitem.subitems.Assign(listview.items[3].subitems); // y tambien los subitems
  listview.items[3].delete;
  listview.endupdate;  // eliminamos el posible parpadeo ;)
end;

Saludos


La franja horaria es GMT +2. Ahora son las 17:46: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