PDA

Ver la Versión Completa : busqueda dentro de en un listbox


Max_E.
27-09-2006, 21:47:03
Hola ha todos.

quiera saber como realizar una busqueda de un monbre especifico dentro de todos los nombres que esten dentro de un listbox atraves de un edit, me explico,

quisiera que cuando este digitando la primera letra del nombre a buscar dentro de un edit, en el listbox enfoque el primer nombre que empieze con dicha letra y cuando se digite la segunda letra enfoque el primer nombre que empieze con esas 2 primeras letras haci cada ves que digite la siguiente letra del nombre.

pense utilizar for y pos(busqueda de una cadena dentro de otro cadena)buscar item por item desde el nombre que empieze con a hasta la z pero mi listbox tiene como 1000 nombres o mas y realizar esta busqueda desde la a hazta la z cada ves que digite una letra
la verdad no se si abra otra manera mas sencilla.

gracias a todos de ante mano.:)
file:///C:/WINDOWS/TEMP/moz-screenshot.jpgfile:///C:/WINDOWS/TEMP/moz-screenshot-1.jpgfile:///C:/WINDOWS/TEMP/moz-screenshot-2.jpgfile:///C:/WINDOWS/TEMP/moz-screenshot-3.jpgfile:///C:/WINDOWS/TEMP/moz-screenshot-4.jpgfile:///C:/WINDOWS/TEMP/moz-screenshot-5.jpg

Caral
27-09-2006, 21:57:35
Hola Max_E
Asi:

procedure TFBuscaNombre.Edit1Change(Sender: TObject);
var Filtro : String;
begin
If (Edit1.Text <> '') then
begin
ATNombres.Filtered := False;
If CBFiltro.Text = 'Nombre' then Filtro := 'Nombre Like '''+Edit1.Text + '*'''
else If CBFiltro.Text = 'Apellido' then Filtro := 'Apellido Like '''+ Edit1.Text + '*'''
ATNombres.Filter := Filtro;
ATNombres.Filtered := True
end
else ATNombres.Filtered := False;
end;


CBFiltro es un combobox, en donde indico si es por nombre o apellido la busqueda, con solo poner la primera letra va filtrando hasta encontrar lo requerido.
Saludos

Max_E.
27-09-2006, 23:29:19
hola:Gracias por ayudarme

El componente ATnombre no es un listbox, el listbox no tiene la propiedad filtered ni filter.
podrias decirme que componente es y si es un listbox como activo esta propiedad por que no la tiene como predeterminada.

gracias por tomarte el tiempo para responder.:)

Caral
28-09-2006, 00:08:15
Hola
ATNombre en este caso es el nombre de la tabla o query que usas.
Saludos

Max_E.
28-09-2006, 08:08:24
hola denuevo:

Hice la aplicación con la ayuda que me diste y utilice un Query que tiene su base de datos con datos de nombre, apellidos y área de trabajo, pero como muestro o enfoco los nombres en el listbox que se van filtrando mientras voy digitando el nombre en el edit.

creo que esa seria la ultima ayuda (ojala) para cerrar el tema. gracias por tu tiempo en leer y contestar mis dudas.

Caral
28-09-2006, 17:06:24
Hola Max_E
Aqui te envio un codigo para que busques en este caso Clientes, los nombres de las tablas por supuesto son los mios, tendras que poner los tuyos para que te funcione, pero el codigo funciona perfectamente y lo puedes aplicar si le pones un poco de atencion, es realmente facil.

unit UFBuscaCliente;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UDM1, DBCtrls, StdCtrls, DB, ADODB, Grids, DBGrids, ExtCtrls,
Buttons;

type
TFBuscaCliente = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
CBFiltro: TComboBox;
DBGrid1: TDBGrid;
ATClientes: TADOTable;
ATClientesCodCliente: TIntegerField;
ATClientesNombreCliente: TWideStringField;
ATClientesDireccion1: TWideStringField;
ATClientesDireccion2: TWideStringField;
ATClientesPais: TWideStringField;
ATClientesProvincia: TWideStringField;
ATClientesCanton: TWideStringField;
ATClientesDistrito: TWideStringField;
ATClientesApartado: TWideStringField;
ATClientesContacto: TWideStringField;
ATClientesTelefono: TWideStringField;
ATClientesExtencion: TWideStringField;
ATClientesFax: TWideStringField;
ATClientesEmail: TWideStringField;
ATClientesNoEnvEmail: TBooleanField;
ATClientesTerminos: TWideStringField;
ATClientesVendedor: TWideStringField;
ATClientesSuspendido: TBooleanField;
ATClientesExcento: TBooleanField;
ATClientesFechaIngreso: TDateTimeField;
ATClientesLimiteCredito: TFloatField;
ATClientesNotas: TMemoField;
DSClientes: TDataSource;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
DBText1: TDBText;
DBText2: TDBText;
Label3: TLabel;
DBText3: TDBText;
Label4: TLabel;
DBText4: TDBText;
DBText5: TDBText;
Label5: TLabel;
Label6: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ATClientesCatPrecio: TWordField;
DBListBox1: TDBListBox;
procedure Edit1Change(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure BitBtn1Click(Sender: TObject);
procedure DBGrid1DblClick(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Cod_Cliente: string;
Nombre_Cliente: string;
NombreCliente: string;
end;

var
FBuscaCliente: TFBuscaCliente;

implementation

{$R *.dfm}

procedure TFBuscaCliente.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
ATClientes.Filtered := False;
If CBFiltro.Text = 'Código' then Filtro := 'CodCliente Like '+Edit1.Text
else If CBFiltro.Text = 'Nombre' then Filtro := 'NombreCliente Like '''+ Edit1.Text + '*'''
else If CBFiltro.Text = 'Teléfono' then Filtro := 'Telefono Like '''+ Edit1.Text + '*''';
ATClientes.Filter := Filtro;
ATClientes.Filtered := True
end
else ATClientes.Filtered := False;
end;

procedure TFBuscaCliente.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
IF Key = VK_DOWN then
DbGrid1.SetFocus;
end;

procedure TFBuscaCliente.BitBtn1Click(Sender: TObject);
begin
CodCliente := ATClientesCodCliente.AsString;
Cod_Cliente := ATClientesCodCliente.AsString;
NombreCliente := ATClientesNombreCliente.AsString;
Nombre_Cliente := ATClientesNombreCliente.AsString;
Close;
end;

procedure TFBuscaCliente.DBGrid1DblClick(Sender: TObject);
begin
BitBtn1Click(DBGrid1);
end;

procedure TFBuscaCliente.BitBtn2Click(Sender: TObject);
begin
CodCliente := '';
Cod_Cliente := '';
NombreCliente := '';
Nombre_Cliente := '';
Close;
end;

procedure TFBuscaCliente.FormCreate(Sender: TObject);
begin
ATClientes.Open;
end;

procedure TFBuscaCliente.FormDestroy(Sender: TObject);
begin
ATClientes.Close;
end;

end.

Como veras aqui se aplican varias cosas en el filtro, codigo, nombre, telefono.
Yo no uso un listbox para esto, uso un dbgrid, ya que me da la informacion completa del cliente en este caso, no creo que tengas mas problemas de todos modos si necesitas algo me dices.
Saludos

Max_E.
01-10-2006, 07:46:58
hola denuevo::)

he hecho esto

Código Delphi [-] (http://www.clubdelphi.com/foros/#)unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; ComboBox1: TComboBox; DBGrid1: TDBGrid; Query1: TQuery; DataSource1: TDataSource; procedure FormCreate(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin query1.Open; end; procedure TForm1.Edit1Change(Sender: TObject); var Filtro : String; begin If (Edit1.Text <> '') then begin Query1.Filtered := False; case combobox1.ItemIndex of 0:Filtro := 'Nombre Like '+Edit1.Text + '*'''; 1:Filtro := 'Codigo Like '+Edit1.Text + '*'''; end; Query1.Filter := Filtro; Query1.Filtered := True end else Query1.Filtered := False; end; procedure TForm1.FormDestroy(Sender: TObject); begin Query1.Close; end; end.


1º hice una table con campos Nombre y codigo nada mas, llenando nombres y codigos al asar (jose - 3411, luis - 3415,.......).

2º coloque en el SQL del query
Select*
from busqueda (busqueda es el nombre de la tabla de 2 campos)

3º al ejecutar el programa no me salen errores, pero al digitar 'j' en el edit me sale el error (Query1: Field 'j' not found) y logico no busca nada o algo parecido

4º no se :( como le hiciste o que es
ATClientesCodCliente: TIntegerField;
ATClientesNombreCliente: TWideStringField; en tus codigos

quiza aqui este mi problema.

podrias explicame donde esta mi gravisimo error

Saludos y gracias por tu tiempo.

Max_E.
01-10-2006, 07:51:52
hola denuevo::)

he hecho esto


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
ComboBox1: TComboBox;
DBGrid1: TDBGrid;
Query1: TQuery;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
query1.Open;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
Filtro : String;
begin
If (Edit1.Text <> '') then
begin
Query1.Filtered := False;
case combobox1.ItemIndex of
0:Filtro := 'Nombre Like '+Edit1.Text + '*''';
1:Filtro := 'Codigo Like '+Edit1.Text + '*''';
end;
Query1.Filter := Filtro;
Query1.Filtered := True
end
else Query1.Filtered := False;

end;

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

end.




1º hice una table con campos Nombre y codigo nada mas, llenando nombres y codigos al asar (jose - 3411, luis - 3415,.......).

2º coloque en el SQL del query
Select*
from busqueda (busqueda es el nombre de la tabla de 2 campos)

3º al ejecutar el programa no me salen errores, pero al digitar 'j' en el edit me sale el error (Query1: Field 'j' not found) y logico no busca nada o algo parecido

4º no se :( como le hiciste o que es
ATClientesCodCliente: TIntegerField;
ATClientesNombreCliente: TWideStringField; en tus codigos

quiza aqui este mi problema.

podrias explicame donde esta mi gravisimo error

Saludos y gracias por tu tiempo.