FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Búsqueda en listbox
hola a todos
tengo el siguiente problema: tengo un listbox cargado con 10000 nombres de clientes y por cada entrada en la lista le he relacionado un ID de tipo integer este valor lo he almacenado de esta forma Código:
while not ZListas.Eof do // begin lis_clientes.Items.Add(ZListas.FieldByName('cliente').AsString + ^I + ZListas.FieldByName('Direccion').AsString); lis_clientes.Items.Objects[i] := pointer(ZListas.FieldByName('Id').AsInteger); inc(i); ZListas.Next; end; Gracias de antemano por cualquier alcance |
#2
|
||||
|
||||
Ok
Cita:
... en defintiva hay metodos de optimizacion que utilizaron los creadores del motor pero en todo caso en algun momento debe hacer un "barrido" de cada uno de los registros de tal tabla. Pero bueno, si lo que buscas es acortar la cantidad de lineas utilizadas en tu código fuente os dejo la siguiente:
Buscamos el puntero $12 y su posicion la guardamos en una variable, siendo un -1 = "not found". Saludos |
#3
|
||||
|
||||
En este caso y para modificar el mínimo código posible, yo optaría por una segunda lista (TStringList) "ordenada" por ID que te permita hacer la búsqueda. En la segunda lista guardaría el ID y en el Objects puedes guardar el indice de la primera lista donde se encuentra ese elemento.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#4
|
|||
|
|||
Si son solo dos datos ID + Nombre, mas eficiente seria almacenar en la lista valores en formato Name=Value, asi seria ID=Nombre,
para obtener el ID utilizar la propiedad Names[i] de la StringList y para obtener el nombre la propiedad Values[ID].. |
#5
|
||||
|
||||
Cita:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#6
|
||||
|
||||
Cita:
primero una consulta así ordenado por cliente este va a para a la lista, el usuario en un edit escribe y el la lista se van seleccionando las coincidencias parecida a la ayuda de windows 95 y para ello necesito la lista ordenada, no la ordeno son el metodo Sort de la lista ya que tarda demasiado, pero el caso es que las ID no estan ordenadas y una búsqueda binaria no es viable, ahora mi pregunta es el método: no entiendo bien el Pointer(12) a que se refiere? que es el 12? el ID del cliente???, la búsqueda así es secuencial? gracias por cualquier respuesta |
#7
|
||||
|
||||
Sip
Cita:
Cita:
En todo caso respondo la pregunta:
Creo que la cosa ahora se entiende más. |
#8
|
||||
|
||||
ok gracias por el alcance.. a proposito el id se encuentra en el tag del edit donde el user escribe
|
#9
|
||||
|
||||
Me olvidaba
Cita:
Eso fue copiado de la misma VCL del Delphi, creo responde a la pregunta. A lo otro un poco mas concreto: Simplemente pones la linea que deje, y obtienes la posicion, con la posicion obtendras el nombre... por ejemplo
Creo que ahorras algo de código, suerte! |
#10
|
||||
|
||||
Y bueno, ¿qué no sería mejor usar un dbgrid con índices bien puestos en la tabla y consultas sql apropiadas?
// Saludos |
#11
|
||||
|
||||
Cita:
|
#12
|
||||
|
||||
Ok
Cita:
Saludos! |
#13
|
||||
|
||||
Cita:
// Saludos |
#14
|
||||
|
||||
Cita:
// Saludos |
#15
|
||||
|
||||
bien solo necesitaba que la lista vaya mostrando las coincidencias mientras el usuario escribe, un dbgrid no seria eficiente para ello me parece al tratarse de muchos registros
gracias por todo |
#16
|
||||
|
||||
Cita:
He usado 25000 líneas para maximizar los resultados y he realizado las búsquedas utilizando las dos formas; La inicial (secuencial) y usando dos listas para obtener búsqueda dicotómica. Sorpredentemente al buscar un único elemento, casi no se aprecia, lo que significa que la secuencial se hace más rápido de lo que yo pensaba; Ahora, si el proceso se maximiza (por ejemplo haciendo 1000 búsquedas seguidas) la diferencia es apreciable (más que apreciable). Revisad el código si queréis, veréis que la diferencia para usar la lista auxiliar son unas pocas líneas. La diferencia está en usar:
o esto:
Link al ejemplo.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. Última edición por Neftali [Germán.Estévez] fecha: 21-06-2007 a las 12:10:15. Razón: Corregido el link |
#17
|
||||
|
||||
Realmente impresionante los tiempos Neftali.
Dejo una pregunta: ¿no estaremos reinventando la rueda? Aunque no he estudiado a fondo la implementación de un índice de Bases de datos, se supone que es muy parecido, entonces, ¿por qué implementar nosotros ese índice?(Básicamente es lo que hace Neftali) ya que tenemos la Base de Datos, que lo haga ella . Si tenemos el ID, y ese campo es clave primaria de la tabla, hacer una consulta del tipo: "select NombreCliente from clientes where id = 32" debe ser inmediata. Si la consulta incluye parámetros y está preparada de antemano, más aún. Si hablamos de bases de datos en red, peor aún, ya que otro usuario (o el mismo usuario desde otra ventana) puede insertar/borrar/modificar un cliente y tenemos que recargar esos datos del servidor, o tendremos que implementar un servicio de sincronización... o sea, que nos vamos metiendo en camisas de once varas. Quizás este punto no lo haya tenido en cuenta david_uh, no sé, ya nos contará. Creo que lo dejo claro, tirar siempre de la base de datos y que me resuelva el problema. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 21-06-2007 a las 16:10:57. |
#18
|
||||
|
||||
Cita:
Supongo que si empezaramos de cero y los datos los tuvieramos en la Base de Datos, pues tal vez esa sería la mejor solución (y digo tal vez, porque no conocemos más detalles del problema en concreto). También estaría la posibilidad de un TClientDataSet, dependiendo del tráfico de red generado y de las consultas que se fueran a relalizar. Si se necesitan velocidad y muchas consultas de este tipo, esto puede ser una solición también óptima, ya que no necesita tráfico de red (sólo la carga inicial) y la velocidad en local es inigualable (por muchos íncides y preparadas que tengamos las consultas). Lo de siempre, no creo que exista una mejor solución para todos los casos, depende, depende, depende,...
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#19
|
||||
|
||||
De verdad que no entiendo porqué no usar un clientdataset u otro dataset en memoria y un dbgrid. Por otra parte, algo pasa con el ejemplo, que lo ejecuto y cargo los datos pero éstos nunca aparecen ni la busqueda presenta nada. ¿Hay algo que no sepa?
// Saludos |
#20
|
||||
|
||||
Cita:
¿No será el tema del separador en el DATOS.TXT? Que no te lo está cogiendo bien; Recuerdo cuando hablamos del tema (hace no mucho en otro hilo), que si estaban configurados distintos había problemas. No todas formas no lo tengo claro, porque en la cadena de conexión ya va incluído el ;
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
.txt a listbox | molinero1 | Varios | 3 | 26-04-2007 15:03:07 |
busqueda dentro de en un listbox | Max_E. | Varios | 7 | 01-10-2006 07:51:52 |
listbox | gsilvei | Varios | 2 | 06-09-2006 04:20:44 |
Uso de ListBox | Luli | Varios | 3 | 14-04-2005 19:26:30 |
listbox | cesarjbf | OOP | 1 | 16-10-2003 13:17:21 |
|