Mostrando entradas con la etiqueta TListBox. Mostrar todas las entradas
Mostrando entradas con la etiqueta TListBox. Mostrar todas las entradas

miércoles, 23 de octubre de 2019

Editor simple de SQLite.

Son tan solo 200 líneas de código y desde ya, la librería de SQLite. Desde ya hay programas potentes y también portables como SQLite Studio, el cual uso y recomiendo. Volviendo al editor simple, lo hice para un uso muy específico y limitado, conecta a la base de datos que le indiquemos, muestra las tablas, permite ejecutar consultar cuyo resultado se muestra en un TDBGrid el cual cuenta con un par de opciones y ejecutar sentencias de actualizaciones que realiza mediante TZConnection.ExecuteDirect.
También tiene una opción para leer de un archivo un script SQL y luego ejecutarlo.
Creo que puede ser útil para quienes comiencen con SQLite, Lazarus y ZeosLib.


El código: descargar

unit principal;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, db, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, DBGrids, DbCtrls, ZConnection, ZDataset;

type
  TConexion=(Conectado, NoConectado);

type

{ TForm1 }

TForm1 = class(TForm)
  BBorrarMemo: TBitBtn;
  BCerrarConsulta: TBitBtn;
  btnSelBD: TBitBtn;
  btnConectar: TBitBtn;
  BCerrar: TBitBtn;
  btnDesconectar: TBitBtn;
  BExecute: TBitBtn;
  BConsulta: TBitBtn;
  btnLeerArchivo: TBitBtn;
  cbAutoCommit: TCheckBox;
  cbAutoSizeCol: TCheckBox;
  DataSource1: TDataSource;
  DBGrid1: TDBGrid;
  DBNavigator1: TDBNavigator;
  edBaseDeDatos: TEdit;
  edConexion: TEdit;
  Label1: TLabel;
  lbTablas: TListBox;
  Memo1: TMemo;
  OpenDialog1: TOpenDialog;
  ZConnection1: TZConnection;
  ZQuery1: TZQuery;
  procedure BBorrarMemoClick(Sender: TObject);
  procedure BCerrarConsultaClick(Sender: TObject);
  procedure BConsultaClick(Sender: TObject);
  procedure BExecuteClick(Sender: TObject);
  procedure btnLeerArchivoClick(Sender: TObject);
  procedure btnSelBDClick(Sender: TObject);
  procedure btnConectarClick(Sender: TObject);
  procedure BCerrarClick(Sender: TObject);
  procedure btnDesconectarClick(Sender: TObject);
  procedure cbAutoSizeColChange(Sender: TObject);
  procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  procedure FormCreate(Sender: TObject);
  procedure lbTablasDblClick(Sender: TObject);
private
  Conexion:TConexion;
  procedure MuestroTablas;
  function HayConexion:Boolean;
{ private declarations }
public
{ public declarations }
end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Conexion:=NoConectado;
end;

procedure TForm1.btnSelBDClick(Sender: TObject);
begin
  if OpenDialog1.Execute then edBaseDeDatos.Text:= OpenDialog1.FileName;
end;

procedure TForm1.btnLeerArchivoClick(Sender: TObject);
begin
 if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.BBorrarMemoClick(Sender: TObject);
begin
  Memo1.Clear;
end;

procedure TForm1.BCerrarConsultaClick(Sender: TObject);
begin
  ZQuery1.Close;
end;

procedure TForm1.BConsultaClick(Sender: TObject);
begin
  if not(HayConexion) then Exit;
  ZQuery1.Close;
  ZQuery1.SQL.Text:=Memo1.Text;
  ZQuery1.Open;
end;

procedure TForm1.BExecuteClick(Sender: TObject);
var
  n:Integer;
begin
  if not(HayConexion) then Exit;
  if ZConnection1.ExecuteDirect(Memo1.Text, n) then Memo1.Lines.Add('OK! '+IntToStr(n)+'      filas.');
end;

procedure TForm1.btnConectarClick(Sender: TObject);
begin
  if Conexion=Conectado then
  begin
    ShowMessage('Hay una conexión establecida, primero desconecte dicha conexión.');
    Exit;
  end;
  if not (FileExists(edBaseDeDatos.Text)) then exit;
  ZConnection1.Database:=edBaseDeDatos.Text;
  if not(cbAutoCommit.Checked) then ZConnection1.AutoCommit:=False;
  ZConnection1.Connect;
  if ZConnection1.Connected then
  begin
    edConexion.Text:='Conectado';
    edConexion.Font.Color:=clGreen;
    Conexion:=Conectado;
    MuestroTablas;
  end;
end;

procedure TForm1.BCerrarClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.btnDesconectarClick(Sender: TObject);
begin
  ZConnection1.Disconnect;
  edConexion.Text:='Desconectado';
  edConexion.Font.Color:=clRed;
  Conexion:=NoConectado;
  lbTablas.Clear;
end;

procedure TForm1.cbAutoSizeColChange(Sender: TObject);
begin
  if cbAutoSizeCol.Checked then DBGrid1.AutoFillColumns:=False else DBGrid1.AutoFillColumns:=True;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  ZConnection1.Disconnect;
  CloseAction:=caFree;
end;

procedure TForm1.lbTablasDblClick(Sender: TObject);
begin
  if not(HayConexion) then Exit;
  Memo1.Clear;
  Memo1.Lines.Add('SELECT * FROM '+lbTablas.Items[lbTablas.ItemIndex]+';');
  ZQuery1.Close;
  ZQuery1.SQL.Text:=Memo1.Text;
  ZQuery1.Open;
end;

procedure TForm1.MuestroTablas;
var
  ZQTablas:TZQuery;
begin
  lbTablas.Clear;
  ZQTablas:=TZQuery.Create(nil);
  ZQTablas.Connection:=ZConnection1;
  ZQTablas.SQL.Text:='SELECT name FROM sqlite_master WHERE type='+
  QuotedStr('table')+' and name <>'+QuotedStr('sqlite_sequence');
  ZQTablas.Open;
  if ZQTablas.RecordCount <1 then Exit;
  ZQTablas.First;
  while not(ZQTablas.EOF) do
  begin
    lbTablas.AddItem(ZQTablas.FieldByName('name').AsString,lbTablas);
    ZQTablas.Next;
  end;
  ZQTablas.Close;
  FreeAndNil(ZQTablas);
end;

function TForm1.HayConexion: Boolean;
begin
  if not(ZConnection1.Connected) then
  begin
    Memo1.Lines.Add('No hay establecida ninguna conexión.');
    Exit(False);
  end;
  Result:=True;
end;

end.


jueves, 5 de julio de 2018

TListBox: buscar.


El siguiente código se ejecuta cuando se presiona el botón buscar, si la cadena de texto ingresada coincide con algún ítem de la lista, el mismo es seleccionado.

procedure TFCProv.BBuscarClick(Sender: TObject);
var
  nombre, item:String;
  i, cant:Integer;
begin
  nombre:=UpperCase(edBuscar.Text);
  cant:=Length(nombre);
  for i:=0 to lbProv.Count-1 do
  begin
    item:=UpperCase(lbProv.Items[i]);
    if nombre=LeftStr(item,cant) then
    begin
      lbProv.ItemIndex:=i;
      Break;
    end;
  end;
end;


En este caso la lista contiene nombres de proveedores, está ordenada, convierte a mayúsculas la cadena a buscar y el elemento a comparar. La variable entera cant se utiliza para saber la cantidad de caracteres que ingresó el usuario y hacer la búsqueda parcial, es decir, si el usuario ingresa "Ac" y hay en la lista un elemento "ACME" se compara "AC" con "AC". Como lo que se quiere es solo marcar el elemento en la lista (lbProv.ItemIndex), se hace y se utiliza break para salir.

martes, 23 de enero de 2018

TListBox: conceptos básicos.

TListBox es un componente que muestra una lista de cadenas (strings) y resalta la seleccionada por el usuario. Se encuentra en la pestaña Standard de la paleta de componentes. Permite la multiselección pero en este ejemplo se usará la selección única.

Esta lista se compone de Items que son del tipo TString que es una clase abstracta.

Es como la implementación gráfica de un vector de cadenas, con propiedades y métodos que permiten su manipulación.

En el ejemplo se crea un programa que carga al comienzo la lista con algunos elementos y permite agregar, eliminar, borrar la lista, ordenarla, copiarla a un TMemo y recorrerla mostrando el recorrido en el Memo. También se muestra en un TEdit el elemento seleccionado.



unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

        { TForm1 }

    TForm1 = class(TForm)
                btnRecorrer: TBitBtn;
                btnListAMemo: TBitBtn;
                btnAgregar: TBitBtn;
                btnEliminar: TBitBtn;
                btnOrdenar: TBitBtn;
                btnBorrarTodo: TBitBtn;
                cbDuplicados: TCheckBox;
                edAgregar: TEdit;
                edSeleccionado: TEdit;
                lblSeleccionado: TLabel;
                ListBox1: TListBox;
                Memo1: TMemo;
                procedure btnRecorrerClick(Sender: TObject);
    procedure btnAgregarClick(Sender: TObject);
                procedure btnBorrarTodoClick(Sender: TObject);
                procedure btnEliminarClick(Sender: TObject);
                procedure btnListAMemoClick(Sender: TObject);
                procedure btnOrdenarClick(Sender: TObject);
                procedure FormCreate(Sender: TObject);
                procedure ListBox1Click(Sender: TObject);
    private
        function YaExiste (elemento: String): Boolean;
        { private declarations }
    public
        { public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnAgregarClick(Sender: TObject);
begin
  if Length(Trim(edAgregar.Text))<1 then exit;
  //Trim elimina espacios en blanco, Length el tamaño.
  //Si ingresa un dato en blanco no hace nada.
  if not (cbDuplicados.Checked) then if YaExiste(edAgregar.Text) then exit;
  //Si no se marcó Permitir duplicados entonces se llama a la función YaExiste, si devuelve True no se agrega.
  ListBox1.AddItem(edAgregar.Text,ListBox1);
  //Además del string a agregar hay que especificar el objeto.
  edAgregar.Clear;
  //Limpia el TEdit. edAgregar.Text:='' también es válido.
end;

procedure TForm1.btnRecorrerClick(Sender: TObject);
var
  i:Integer;
begin
  Memo1.Clear;
  Memo1.Lines.Add('');
  Memo1.Lines.Add('for i:=0 to ListBox1.Count-1 do'+#13#10+'  Memo1.Lines.Add(ListBox1.Items.Strings[i]);'+#13#10);
  for i:=0 to ListBox1.Count-1 do
    //TListBox es base 0 (cero) por eso desde 0 hasta cantidad-1
    Memo1.Lines.Add('ListBox1.Items.Strings['+IntToStr(i)+']: '+ListBox1.Items.Strings[i]);
    //ListBox1.Items.String[i] así se accede al texto de cada ítem.
end;

procedure TForm1.btnBorrarTodoClick(Sender: TObject);
begin
  ListBox1.Clear;
  //Limpia la ListBox
end;

procedure TForm1.btnEliminarClick(Sender: TObject);
begin
  if ListBox1.ItemIndex>=0 then ListBox1.Items.Delete(ListBox1.ItemIndex);
  //Si hay algún ítem seleccionado, entonces ItemIndex tendrá un valor mayor o igual a cero, caso contrario será -1.
end;

procedure TForm1.btnListAMemoClick(Sender: TObject);
begin
  Memo1.Lines.Add('Memo1.Lines:=ListBox1.Items;');
  Memo1.Lines:=ListBox1.Items;
  //Ya la propiedades Lines e Items son del mismo tipo TStrings basta con asignar una a la otra.
end;

procedure TForm1.btnOrdenarClick(Sender: TObject);
begin
  ListBox1.Sorted:=True;
  ListBox1.Sorted:=False;
  //El False se agrega para que si se agrega un nuevo elemento lo agregue al final y se pueda volver a ordenar.
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.AddItem('Devuan',ListBox1);
  ListBox1.AddItem('Linux mint',ListBox1);
  ListBox1.AddItem('Gentoo',ListBox1);
  ListBox1.AddItem('Arch Linux',ListBox1);
  ListBox1.AddItem('Ubuntu',ListBox1);
  ListBox1.AddItem('Debian',ListBox1);
  ListBox1.AddItem('Mangaro',ListBox1);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  edSeleccionado.Text:=ListBox1.Items.Strings[ListBox1.ItemIndex];
  //Se accede al texto Items.Strings y el índice lo tomamos de la propia lista ItemIndex que es el ítem seleccionado.
end;

function TForm1.YaExiste(elemento: String): Boolean;
//elemento es el texto de edAgregar
var
  i:Integer;
  ret:Boolean;
begin
  ret:=False;
  for i:=0 to listbox1.Count-1 do
    if elemento=listbox1.Items.Strings[i] then ret:=True;
  //Recorremos toda la lista buscando si ya existe.
  YaExiste:=ret;
end;

end. 


Como vemos, cuando ordenamos la lista, los elementos cambian el índice, no es solo un ordenamiento visual.

Para que la lista esté siempre ordenada basta con establecer la propiedad Sorted en True, de esta forma cuando se agregue un elemento, lo hará en la posición que le corresponda y no al final. Haciendo esto, el botón ordenar ya no tiene sentido y debe quitarse.

Código fuente: TListBox3.7z

Más entradas de ListBox.

miércoles, 6 de septiembre de 2017

Arrastrar y soltar entre listas (Drag and Drop)

Lo primero a tener en cuenta es que lo que se arrastra de un contenedor tiene que ser compatible con el contenedor receptor. Lo habitual es que se arrastren y suelten strings (cadenas) entre listas de strings, es lo más básico. En el ejemplo se arrastrará y soltará desde una lista del tipo TFileListBox a otra del tipo TListBox.

Hay que preparar ambos objetos, el TFileListBox para que permita arrastrar sus ítems y a TListBox para que acepte lo que le llega de TFileListBox.

En un Form crear ambos componentes y dejarles su nombre por default (TFileListBox1 y ListBox1).

Desde el inspector de objetos seleccionamos FileListBox1 y establecemos dmAutomatic en la propiedad DragMode. Con esto solo conseguimos que los elementos contenidos en esa lista se puedan arrastrar. Y con este elemento no es necesario hacer más nada.

Ahora seleccionamos también desde el inspector de objetos ListBox1, en Eventos, definimos OnDragDrop y OnDragOver. (definimos = hacer click en el botón con los ‘…’).

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if (Source is TFileListBox) then ListBox1.AddItem(FileListBox1.items[FileListBox1.ItemIndex],ListBox1);
end;


ListBox1 agregará ítems que provengan de objetos del tipo TFileListBox.


procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
        State: TDragState; var Accept: Boolean);
begin
  Accept:=(Source is TFileListBox);
end;


ListBox1 aceptará que objetos del tipo TFileListBox le suelten ítems.


Arrastrar y soltar entre listas - Lazarus from https://lazarus-freepascal.blogspot.com on Vimeo.

viernes, 18 de agosto de 2017

TListBox 2 - seleccionar todo y arrastrar y soltar

Esta entrada es la continuación TListBox 1


Visualmente le hemos agregado 4 botones para seleccionar todos los ítems o elementos y otro para des-seleccionar. También hemos activado el drag and drop del ListBox1 hacia el ListBox2.

Cómo hacer el drag and drop entre dos ListBox?

Desde el inspector de objetos, seleccionamos ListBox1y vamos a la pestaña de eventos, allí debemos seleccionar dmAutomatic en DragMode.


Ahora pasamos al ListBox2 y debemos definir los eventos OnDragOver y OnDragDrop.


Para ello debemos hacer click sobre los ... tanto en OnDragDrop como en OnDragOver para que Lazarus nos escriba el código de los eventos.


En el evento OnDragOver tenemos que decir que pasa cuando "sobre vuela" sobre el ListBox2 un elemento arrastrado con el mouse.

procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
        State: TDragState; var Accept: Boolean);
begin
  Accept:=(Source is TListBox);
end;

Con esta línea de código indicamos que se acepte si viene de otro TListBox.

Es con el evento OnDragDrop donde especificamos que hacer con el elemento recibido, en este caso es agregar dicho elemento a la lista, pero podríamos definir cualquier otra acción.

procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  btnAgregarClick(Self);
end;

Como ya tenemos un procedimiento para agregar, que es el evento OnClick del botón Agregar, por qué no utilizarlo y evitar escribir el código dos veces.

Eso es todo respecto de arrastrar y soltar.

Seleccionar todo y desmarcar todo: como ya está definido, resulta algo muy sencillo, no obstante, hay que saber de su existencia para no reinventar la rueda.

procedure TForm1.btnTodoL1Click(Sender: TObject);
begin
  ListBox1.SelectAll;
end;

procedure TForm1.btnTodoL2Click(Sender: TObject);
begin
  ListBox2.SelectAll;
end;

No hace falta explicar nada, SelectAll lo dice todo.

Para hacer lo contrario, des-seleccionar todo:

procedure TForm1.btnQuitarL1Click(Sender: TObject);
begin
  ListBox1.ClearSelection;
end;

procedure TForm1.btnQuitarL2Click(Sender: TObject);
begin
  ListBox2.ClearSelection;
end;

ClearSelection, es todo.

El código entonces queda de la siguiente forma:

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

        { TForm1 }

    TForm1 = class(TForm)
                btnQuitarL1: TBitBtn;
                btnQuitarL2: TBitBtn;
                btnTodoL1: TBitBtn;
                btnAgregar: TBitBtn;
                btnAgregarTodos: TBitBtn;
                btnQuitar: TBitBtn;
                btnQuitarTodos: TBitBtn;
                btnTodoL2: TBitBtn;
                ListBox1: TListBox;
                ListBox2: TListBox;
                StaticText1: TStaticText;
                StaticText2: TStaticText;
                procedure btnAgregarClick(Sender: TObject);
                procedure btnAgregarTodosClick(Sender: TObject);
                procedure btnQuitarClick(Sender: TObject);
                procedure btnQuitarL1Click(Sender: TObject);
                procedure btnQuitarL2Click(Sender: TObject);
                procedure btnQuitarTodosClick(Sender: TObject);
                procedure btnTodoL1Click(Sender: TObject);
                procedure btnTodoL2Click(Sender: TObject);
                procedure ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
                procedure ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
                        State: TDragState; var Accept: Boolean);
    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
  ListBox1.ClearSelection;
end;

procedure TForm1.btnAgregarTodosClick(Sender: TObject);
begin
  ListBox2.Items:=ListBox1.Items;
  ListBox1.ClearSelection;
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.btnQuitarL1Click(Sender: TObject);
begin
  ListBox1.ClearSelection;
end;

procedure TForm1.btnQuitarL2Click(Sender: TObject);
begin
  ListBox2.ClearSelection;
end;

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

procedure TForm1.btnTodoL1Click(Sender: TObject);
begin
  ListBox1.SelectAll;
end;

procedure TForm1.btnTodoL2Click(Sender: TObject);
begin
  ListBox2.SelectAll;
end;

procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  btnAgregarClick(Self);
end;

procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
        State: TDragState; var Accept: Boolean);
begin
  Accept:=(Source is TListBox);
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.

Código fuente de TListBox-2

Al final del video presiono todos los botones sin sentido con el fin de demostrar que el programa funciona correctamente "a pesar del usuario".


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).