sábado, 12 de agosto de 2017

TListBox 1 - Pasar ítems entre dos ListBox


Al ListBox1 le hemos agregado los ítems desde el inspector de objetos; el ListBox2 lo hemos creado vacío. Ambos elementos fueron agregados al Form desde la paleta Standard. Los botones son del tipo TBitBtn, disponibles desde la paleta Additional, pero puede usarse en su lugar un TButton simple, claro que no se le podrá anexar una imagen, pero para este ejemplo es lo mismo.
También desde e inspector de objetos hemos marcado (True) la opción MultiSelect de ambos ListBox.

El código:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons;

type

        { TForm1 }

    TForm1 = class(TForm)
                btnAgregar: TBitBtn;
                btnAgregarTodos: TBitBtn;
                btnQuitar: TBitBtn;
                btnQuitarTodos: TBitBtn;
                ListBox1: TListBox;
                ListBox2: TListBox;
                StaticText1: TStaticText;
                StaticText2: TStaticText;
                procedure btnAgregarClick(Sender: TObject);
                procedure btnAgregarTodosClick(Sender: TObject);
                procedure btnQuitarClick(Sender: TObject);
                procedure btnQuitarTodosClick(Sender: TObject);
    private
        { private declarations }
    public
        function YaExiste (elemento:String):Boolean;
        { public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnAgregarClick(Sender: TObject);
var
  i:Integer;
begin
  if ListBox1.Count<1 then exit; //Si no hay elementos no hace nada
  for i:=0 to ListBox1.Count-1 do  //Recorre todo el ListBox1
    if ListBox1.Selected[i] then  //Si el ítem está seleccionado
       if not (YaExiste(ListBox1.Items.Strings[i])) then //Si el ítem a agregar ya existe no lo agrega
         ListBox2.AddItem(ListBox1.Items.Strings[i],ListBox2);  //Agrega el ítem
end;

procedure TForm1.btnAgregarTodosClick(Sender: TObject);
begin
  ListBox2.Items:=ListBox1.Items;
end;

procedure TForm1.btnQuitarClick(Sender: TObject);
var
  i:Integer;
begin
  if ListBox2.SelCount > 0 then  //Si hay ítems seleccionados
    for i:=ListBox2.Items.Count-1 downto 0 do  //Recorre todo el ListBox2
      if ListBox2.Selected[i] then   //Si el ítem está seleccionado
        ListBox2.Items.Delete(i);  //Borra el ítem
end;

procedure TForm1.btnQuitarTodosClick(Sender: TObject);
begin
  ListBox2.Clear;
end;

function TForm1.YaExiste(elemento: String): Boolean;
var
  i:Integer;
  ret:Boolean;
begin
  ret:=False;
  for i:=0 to ListBox2.Count-1 do
    if elemento=ListBox2.Items.Strings[i] then ret:=True;
  YaExiste:=ret;
end;

end.       

Si se intenta agregar un elemento que ya existe, lo ignora.
Pasar todos los elementos de una lista a otra es cuestión de una sola linea:

  ListBox2.Items:=ListBox1.Items;

Quitar todos los elementos de una lista, basta con:

  ListBox2.Clear;

 Código fuente del proyecto: TListBox-1.7z


Si queremos que los elementos de las listas se muestren siempre ordenados, desde el inspector de objetos, en ambas listas marcamos la propiedad Sorted (True).



No hay comentarios:

Publicar un comentario