Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-06-2007
Avatar de Lester
Lester Lester is offline
Miembro
 
Registrado: may 2003
Ubicación: Cienfuegos, Cuba.
Posts: 106
Poder: 22
Lester Va por buen camino
Question Realizar búsquedas en un ListBox mediante un Edit

Hola a todos...

La aplicación que estoy haciendo tiene un ListBox, que lo cargo de datos desde un fichero texto y tiene a su vez un Edit al que quiero que realize una búsqueda en el antedicho ListBox. Lo que quiero hacer es que el usuario teclee parte de la palabra o texto a buscar en el Edit y cuando de clic al botón "Buscar" entonces que haga que el ListBox me lo señale y vaya a la línea donde lo encontró, parecido a lo que hace el viejo Notepad. Tengo acá unos ejemplos de un Edit que a medida que vas escribiendo el va filtrando en el ListBox lo que aparece, pero es solamente cuando inicia con las letras que vas introduciendo, diferente por completo de lo que quiero, pues el texto que quiero buscar se puede encontrar en una línea del ListBox, pero en cualquier posición.

Desde ya muchas gracias a todos...
__________________
Lester Espinosa Martínez

[ Guía de estilo | La otra guía de estilo | Buscador | Trucos | My personal blog ]
Responder Con Cita
  #2  
Antiguo 07-06-2007
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Hola, creo q esto te puede servir, lo he hecho asi rapido, no lo he probado mucho, pero en mis mini-Tests hace lo q tu quieres:

Código Delphi [-]
procedure BuscaPalabra(Palabra: String; ListBox: TListBox; CaseSensitive: Boolean = False);

...

procedure TForm1.BuscaPalabra(Palabra: String; ListBox: TListBox;
  CaseSensitive: Boolean);
var
  n: Integer;

  function doCaseSensitive(LaPalabra: String): String;
  begin
    if not CaseSensitive then
      Result:=LowerCase(LaPalabra)
    else
      Result:=LaPalabra;
  end;

begin
  Palabra:=doCaseSensitive(Palabra);
  // busca
  for n:=0 to ListBox.Items.Count - 1 do
    if Pos(Palabra, doCaseSensitive(ListBox.Items[n])) > 0 then
      begin
        ListBox.ItemIndex:=n;
        Exit;
      end;
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  BuscaPalabra(Edit1.Text, ListBox1);
end;


Lo unico, q he hecho q filtre despues de soltar una tecla en el TEdit, en lugar de un boton, pero vamos, q eso tiene facil solucion!

Saludos.

Última edición por xEsk fecha: 07-06-2007 a las 16:57:13.
Responder Con Cita
  #3  
Antiguo 07-06-2007
Avatar de Lester
Lester Lester is offline
Miembro
 
Registrado: may 2003
Ubicación: Cienfuegos, Cuba.
Posts: 106
Poder: 22
Lester Va por buen camino
Unhappy Respuesta a xEsk

Socio, muchísimas gracias por responderme y por la rapidez con que me has respondido, pero tu código no parece muy legible..., me lo podrías explicar un poco...???

Desde ya muchas gracias...
__________________
Lester Espinosa Martínez

[ Guía de estilo | La otra guía de estilo | Buscador | Trucos | My personal blog ]
Responder Con Cita
  #4  
Antiguo 07-06-2007
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Por supuesto!

La primera línea de código es la declaración del procedimiento: BuscaPalabra
Los tres parámetros que se le pasan son:
- Primero: la palabra a buscar dentro de un ListBox
- Segundo: el ListBox donde buscaremos esta palabra
- Tercero: para definir si sera sensible a mayúsculas y minúsculas, este es un parámetro booleano opcional, con lo de opcional me refiero a q si cuando llamas estre proceso (BuscaPalabra) no "defines" el tercer parámetro este será "False" por defecto.

Ahora expliquemos q hace el procedimiento en si:

La variable N de tipo entero, servirá para recorrer todos los Items del ListBox.
Luego hay una procedimiento "declarado" en las variables (function doCaseSensitive(LaPalabra: String): String;), que su única función es: Si la variable CaseSensitive esta activada, pues transforma LaPalabra pasada por parámetros en minúsculas, en caso contrario deja el texto en su formato original.

Después de esto, viene el código q busca la palabra dentro del ListBox.

- El primer paso es convertir la Palabra (pasada por parámetros) a minúsculas (si fuera necesario).
- El segundo paso es ya el de recorrer el ListBox en busca de la palabra. Para eso usamos el for desde 0 hasta el total de Items del ListBox - 1. En cada paso del for, comprobamos si el Item actual del ListBox contiene la Palabra, para esto usamos la función Pos (System).

Que hace el Pos? El pos lo q hace es buscar un String dentro de otro String y nos devuelve la posición del primer carácter, en caso de no encontrar la palabra nos devuelve 0.

Así pues, después de comprobar q el resultado devuelto es superior a 0, nos queda el ultimo paso, q es seleccionar el Item q contiene la palabra, para esto: ListBox.ItemIndex:=n; y luego Exit; para "abortar" el proceso y no seguir buscando.

El útlimo procedimiento el "TForm1.Edit1KeyUp" lo que hace es llamar el procedimiento BuscaPalabra, si te fijas no le paso el tecer parametro, porqué no quiero que sea CaseSenstive (sensible a mayúsculas y minúsculas), si quisieras que lo fuera, solo añadele el parametro True, asi: BuscaPalabra(Edit1.Text, ListBox1, True);

Última edición por xEsk fecha: 07-06-2007 a las 17:47:16.
Responder Con Cita
  #5  
Antiguo 07-06-2007
Avatar de Lester
Lester Lester is offline
Miembro
 
Registrado: may 2003
Ubicación: Cienfuegos, Cuba.
Posts: 106
Poder: 22
Lester Va por buen camino
Question Te paso mi código para ver que tengo mal...

Este es mi código a ver qué es lo que hago mal que no me funciona...

Código Delphi [-]
function LowerCaseSensitive(LaPalabra: String): String;
  begin
   Result:=LowerCase(LaPalabra)
end;

Procedure Busqueda(PalabraBuscar : String);
var
 I : Integer;
begin
 PalabraBuscar := LowerCaseSensitive(PalabraBuscar);
  // busca
  for i:=0 to Form1.ListBox1.Items.Count - 1 do
    if Pos(PalabraBuscar, LowerCaseSensitive(Form1.ListBox1.Items[i])) > 0 then
      begin
        Form1.ListBox1.ItemIndex:=i;
        Exit;
      end;
end;


procedure TForm1.Button5Click(Sender: TObject);
begin
 Busqueda(Edit1.Text);
end;
__________________
Lester Espinosa Martínez

[ Guía de estilo | La otra guía de estilo | Buscador | Trucos | My personal blog ]
Responder Con Cita
  #6  
Antiguo 08-06-2007
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
He probado el código, y funciona bien. Con lo q me entra una duda, y a lo mejor "funciona" pero no hace lo q tu quieres??

Otras cosas.

Por lo que deduzco, "te da igual" el CaseSensitive, así pues te puedes ahorrar la función que transforma el texto a "minúsculas", y usar directamente la función (LowerCase del propio delphi) q transforma a minúsculas. La función quedaría así:

Código Delphi [-]
Procedure Busqueda(PalabraBuscar : String);
var
 I : Integer;
begin
 PalabraBuscar := LowerCase(PalabraBuscar);
  // busca
  for i:=0 to Form1.ListBox1.Items.Count - 1 do
    if Pos(PalabraBuscar, LowerCase(Form1.ListBox1.Items[i])) > 0 then
      begin
        Form1.ListBox1.ItemIndex:=i;
        Exit;
      end;
end;

Otra cosa, yo te recominedo, q si este procedure solo lo vas a usar en este Form, lo crearas como parte del TForm, así te ahorras de hacer referencia al "Form1" dentro del procedure Busqueda.

El código seria algo así:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button5: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    procedure Button5Click(Sender: TObject);
  private
    Procedure Busqueda(PalabraBuscar : String); // declaras aqui el procedure
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// y aqui el codigo del procedure
Procedure TForm1.Busqueda(PalabraBuscar : String);
var
 I : Integer;
begin
 PalabraBuscar := LowerCase(PalabraBuscar);
  // busca
  for i:=0 to ListBox1.Items.Count - 1 do
    if Pos(PalabraBuscar, LowerCase(ListBox1.Items[i])) > 0 then
      begin
        ListBox1.ItemIndex:=i;
        Exit;
      end;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 Busqueda(Edit1.Text);
end;

end.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Realizar una conexion FTP mediante Delphi KeyMan Varios 21 24-09-2007 15:45:46
TpFIBDataSet para realizar busquedas Hagen Conexión con bases de datos 0 09-10-2006 18:08:19
Búsquedas en Google mediante voz vtdeleon Noticias 5 23-04-2006 07:57:41
Busquedas con Edit romansiux Conexión con bases de datos 2 07-05-2005 18:33:11
Ayuda al usuario para realizar búsquedas rochi Conexión con bases de datos 19 28-04-2005 09:57:31


La franja horaria es GMT +2. Ahora son las 13:38:42.


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
Copyright 1996-2007 Club Delphi