Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Busqueda Winamp (https://www.clubdelphi.com/foros/showthread.php?t=19299)

vtdeleon 09-03-2005 22:31:17

Busqueda Winamp
 
Saludos a Tod@s,

Como puedo hacer una busqueda tipo winamp, rápida, eficiente y que ocupe poca memoria?

Que componente utilizaron o que instruccion?:confused:

b3nshi 10-03-2005 04:40:43

una solucion
 
la verdad que no se como lo harán en el winamp, pero una solcuion que te puedo dar, es que cuando hagan clic en el boton de busqueda, o presionen la "j", como se hace en el winamp, se carguen todos los nombres de archivos (no la ruta completa), en una base de datos, y dsp podes usar un componente que en estos momentos no me acuerdo como se llama para buscarlo, es algo asi como un edit. Digamos que despues cuando se elija el archivo te tiene que devolver el valor de la posicion que ocupa en la lista original, y dsp simplemente posicionar ahi el tema y que empiece a reproducir. Se entiende??? Si necesitas que sea mas claro decime y te ayudo. Esta es la solucion que se me ocurre.

vtdeleon 10-03-2005 12:42:21

Gracias por tu respuesta, pero...
Me refiero a la pantalla que sale en Winamp cuando presionamos "J" (Jump to File). Esta hace un filtro muy eficiente, sin importar que las palabras esten en orden o no.

Ej:

Quiero buscar la musica de Alejandro Sanz - Amiga Mia.

puedo digitar en esa pantalla "Mia Sanz" ó "Amiga Alej" y me filtra perfectamente, puedo poner "Sanz alejandro" y hace un filtro de toda la lista que tengo de ese artista.

Que instruccion usaron?? (SQL???:confused: LIKE %..%:confused: )

Entiendes??

mamcx 10-03-2005 16:22:49

La clausula LIKE es la solucion basica que todos usan. Te puede funcionar asi que intentalo. Otra opcion es usar SOUNDEX (si lo soporta nativamente tu BD).

Para hacerlo RAPIDO usa una HashTable+SOUNDEX y te deberia resultar bueno el resultado...(sino estoy mal en Delphi la hashtable se llama buckettable?)

Ahora, este tipo de cosas se hacen con un componente de busqueda de texto completa, y TAL VEZ winamp use algun componente de estos. De hecho estoy trabajando en un proyecto para hacer una libreria de estas, pero lastima que esta en ALPHA y todavia no se puede usar :(.

vtdeleon 10-03-2005 20:17:11

Cita:

Empezado por mamcx
Para hacerlo RAPIDO usa una HashTable+SOUNDEX y te deberia resultar bueno el resultado...(sino estoy mal en Delphi la hashtable se llama buckettable?)

Disculpame Compañero,

Pero no se absolutamente nada de Hastable Soundex y Buckettable!!:(

Donde puedo buscar mas informacion de ellos, para saber.:D

vtdeleon 13-03-2005 05:00:50

??????????????????

mamcx 15-03-2005 03:15:39

Mira en las ayudas sobre

Soundex

TBucketList

La idea es que usas BucketList para almacenar cada palabra y SOundex para hacer comparaciones...

Quiero decir, en vez de algo directo como:


if 'Ejemplo' in ListaString

Es

if Bucket('Ejemplo') in Soundex(ListaString)

PD: Obvio que esa sintaxis me la invente ;)

vtdeleon 15-05-2005 00:23:04

Solucionado
 
Saludos.

Creo haber encontrado la solucion. Me he empe~ado un poco en eso hasta conseguirlo:D.
Le mostrare el codigo para que el que le interese y para optimizar el mismo;).
Estoy habierto a sugerencias

Este formulario contiene: 1 edit, 1 dbgrid y 1 query

Código Delphi [-]
procedure Tfrmbuscar.FormCreate(Sender: TObject);
   begin
     vbusca.Clear;//Edit
     Codigo:='';//DECLARADA PRIVATE
     cadena:=TStringList.Create;//DECLARADA PRIVATE
       Query1.Close;
       with Query1.SQL do begin
         Clear;
         Add('select Codemp, Nombre, apellidos');//+column );
         Add('from empleados');//+tabla);
       end;
       Query1.Open;
   end;
   
   procedure Tfrmbuscar.vbuscaKeyUp(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   var
     n:integer;
   begin
 if (Length(trim(vbusca.Text))>0) then
     if key in [VkKeyScanA('A')..VkKeyScan('Z'), VkKeyScanA('0')..VkKeyScan('9'),
      VK_BACK, vk_space, vk_delete] then begin
         cadena.CommaText:=vbusca.Text;
       with Query1 do begin
         Close;
         if cadena.Count<>nkey then begin
           condi:=' (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+'0';
           for n:= 1 to cadena.Count-1 do begin
             condi:=condi +' and (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+inttostr(n);
           end;
           if SQL.Count>2 then
             sql.Delete(2);
           sql.Insert(2,'where '+condi);
         end;
         for n:=0 to ParamCount-1 do begin
           ParamByName('data'+inttostr(n)).AsString:=cadena[n];
         end;
         nkey:=n;
         if not Prepared then
           Prepare;
         Open;
       end; 
     end;{ else key:=  #0;}
   end;

Hasta Luego

sakuragi 26-08-2005 18:51:38

vtdeleon

gracias por el aporte

lo estoy checando

nomas unas preguntas. si no es mucha molestia


"cadena" es
Código Delphi [-]
 private
     cadena:TstringList;

las valiables

"nkey"
"condi"
"ParamByNAme" esta no creo que sea variable pero tambien me marca error
"prepare"

todas esas me marcan "undeclared indetifier"


saludos

gracias

vtdeleon 26-08-2005 19:04:41

Cita:

Empezado por sakuragi
las valiables

"nkey"
"condi"
"ParamByNAme" esta no creo que sea variable pero tambien me marca error
"prepare"

todas esas me marcan "undeclared indetifier"

El nkey en una variable Integer
condi es String
ParamByName viene referenciado del Query1
prepare es un metodo del Query1

sakuragi 26-08-2005 20:45:08

esta linea me marcava error en "ParamByName"

Código Delphi [-]
 ParamByName('data'+inttostr(n)).AsString:=cadena[n];
entonses le puse "parameters"
Código Delphi [-]
 Parameters.ParamByName('data'+inttostr(n)).AsString:=cadena[n];

ahora me marco error en el "AsString"
se lo cambie por "value"
Código Delphi [-]
ParamByName('data'+inttostr(n)).Value:=cadena[n];

"prepare" me seguia marcando error creo que es "prepared"
Código Delphi [-]
if not Prepared then
           Prepare;

pues lo cambie por "prepared" no se si este bien pero el error se quito


nkey y condi lo puse variables locales

ya todo esto lo corri y se me traba


probe muchos mesajes para sever donde esta el erro

y el en el open del query

una sentencia sql a de estar mal hecha =S


bueno gracias

ati si te fuenciona tal y como esta?

o tengo que poner otras cosas que no se muestran en el codigo
puesto

saludos:confused:

vtdeleon 26-08-2005 20:55:55

Cita:

Empezado por sakuragi
entonses le puse "parameters"
Código Delphi [-]
Parameters.ParamByName('data'+inttostr(n)).AsString:=cadena[n];

Al parece usas los componentes ADO
Cita:

Empezado por sakuragi
"prepare" me seguia marcando error creo que es "prepared"
Código Delphi [-]
if not Prepared then
Prepare;

Esto no es muy necesario, pero prepara el query para la sentencia
Cita:

Empezado por sakuragi
nkey y condi lo puse variables locales

Ponlo Private, no locales del procedimiento

Cita:

Empezado por sakuragi
y el en el open del query

una sentencia sql a de estar mal hecha =S

No se que base de datso usas, pero para esto use FireBird. Y funciona

sakuragi 26-08-2005 21:12:04

gracias

alamejor es por eso

yo toy usando ms sql server 2000 con ado delphi7

entonses nesesito cambir unas sentencias para sql server

lo intentare

saludos

sakuragi 26-08-2005 21:24:10

ah se me paso comentar

si me puede esplicar que hacen esa sentencias sql

Código Delphi [-]
condi:=' (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+'0';
Código Delphi [-]
condi:=condi +' and (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+inttostr(n);

como no conosco FireBird. si ,me puede esplicar ala mejor las puedo pasar a ms sql server

"
"containing" que es?

saludos

vtdeleon 26-08-2005 21:32:43

Saludos

Esa sentencia concatena los campos. Para no tener dos campos divido, decidi unirlos con ||, le agregue otro de esos para el espacio ya que si no lo hago
Código:

Tabla original
 ================
 nombre                                apellido
 Alberto                          Gonzalez
 Casimiro                        Boneti
 Maria                                Perez
 **********************
 Resultado
 Empleados
 
Alberto Gonzalez
 Casimiro Boneti
 Maria Perez
 ************
 Un solo campo


vtdeleon 27-08-2005 06:47:14

Saludos

Cita:

Empezado por sakuragi
"containing" que es?

La palabra misma (traducida al espa~ol) lo dice todo

sakuragi 31-08-2005 18:06:14

hola de nuevo

al ir borrando lo que escribiste caracter por caracter te lo actualiza?

por que como lo pase el ms sql.

me pasa eso no me va actualizando al ir quitando caracter por caracter.

saludos

gracias

vtdeleon 31-08-2005 18:26:55

Saludos

Dices qeu no actualiza al pulsar caracter por caracter?
Es extra~o ya qe el codigo esta puesto en el evento OnKeyUp del Edit de busqueda. Revisa bien tu codigo

sakuragi 31-08-2005 18:56:38

todo funciona bien

al ir pulsando caractec x caracter te va mostrando el filtro actulizando

nomas pregunto si al hacerlo al reves

ir quitando "vk_back" caracter X caracter se va filtrando actualizando.

para saber si el codigo original lo hace,

para saber yo si lo pase mal el codigo o es algo que le falta, para buscarle:


ya que por ejemplo:

busco , computadora

me va a rojar toas la palabras con computadora

emtonses si le voy quintado un caracter
"computador"

el filtro no se me regresar a computador se queda en "computadora"

asi susesivamente

saludos

espero haver sido claro

=P

vtdeleon 31-08-2005 19:17:34

Saludos

hmm, no se si entendi bien.(faltan comas y puntos en algunas oraciones):rolleyes:

Chequea bien tu codigo y/o BD, ya que me funciona a la perfeccion. Por cada pulsacion de uno de estas teclas
Código Delphi [-]
if key in [VkKeyScanA('A')..VkKeyScan('Z'), VkKeyScanA('0')..VkKeyScan('9'),
       VK_BACK, vk_space, vk_delete] then begin
Va filtrando*

*Me gustaria que hubiera alguna opinion sobre el codigo planteado, ya que no es muy practico porque (en red) carga mucho y a medida qeu se encuentren mas registro, mas lentoe es.


La franja horaria es GMT +2. Ahora son las 21:18:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi