Ir al contenido


Foto

List Box


  • Por favor identifícate para responder
46 respuestas en este tema

#1 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 12:03

Saludos

cual seria el modo de recuperar un list box ( anexo imagen )
la idea es que el operador seleccione un item de la lista y que los valores  ( son dos )
me deje separarlos y pueda mandarlos a el form1
pero separados asi como
que cuando de doble click
asigne en una variable el index del listbox y que cuando cierre el form mande las dos varibles a dos etiquetas ??

no se si soy claro

haaa y otra pregunta como le hago para agregar directamente aki imganes de mi escritorio ???


  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 abril 2009 - 12:25

Yo lo haria directamente con un TDBLookupListBox, ya que esta asociado a un dataset, luego no tendria que separar nada solo leer el campo necesitado desde el dataset.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 abril 2009 - 12:26

Hola nuevamente arroyoj, :)

Ummm.... es un tanto lioso estar trabajando con ListBox cuando se muestran en el registros con dos o más campos... Al menos eso pareciera ser.
Yo considero en todo caso emplear un TStringGrid ya que mantienes en cada columna los datos ordenados y es más fácil obtener cada campo.

Empleando el TListBox te verás obligado a partir el string seleccionado en dos o más.

Antes de ponerme a meter código me preguntaba si es posible que nos dieras una muestra del tuyo. De ese modo podemos ver como estás enfocando el tema y poder ajustar nuestras ideas a tu código. Considero que es lo mejor para tí­ porque de otro modo deberás adaptar mucho o poco el código según nuestros aportes.

Si en todo caso deseas trozar el string, habrí­a que ver algunas cuestiones técnicas. ¿Donde termina un campo y empieza otro? En la imagen veo que tienes algo como un código, y luego el apellido y nombre... ¿Cómo va la cosa? El "código" es un campo y el resto es otro? ¿O se trata de un campo código, apellido y nombre? Es decir... ¿son 2 o 3?
Separar el código del resto no es demasiado complicado... la cuestión es que si hay que partir el nombre del apellido... allí­ se complica.

Saludos,
  • 0

#4 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 12:48

si es verdad tienes toda la razon

les comento esto viene de aki


delphi
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var InputStr, comillas, comodin:string;
  3. begin
  4. InputStr:='nombre';
  5. if InputQuery(
  6.   'NOMBRE',
  7.   'Nombre del trabajador',
  8.   InputStr) then
  9.   comillas:='"';
  10.   comodin:= '%';
  11.   zquery1.Close;
  12.   zquery1.SQL.Clear;
  13.   zquery1.SQL.Text:='SELECT cuenta.folio, cuenta.nombre from cuenta where cuenta.nombre like '+comillas+
  14.                     InputStr + comodin + comillas +
  15.                     'GROUP BY cuenta.folio ORDER BY cuenta.nombre ASC' ;
  16.   zquery1.Open;
  17.   if Zquery1.RecordCount > 10 then
  18.       Application.MessageBox(
  19.       pchar(  'Afina tu busqueda has dado un rango demasiado amplio'),
  20.       pchar('Error'),
  21.       0+16+0)
  22.   else
  23.   begin
  24.     While not ZQuery1.Eof do
  25.   begin
  26.         while not zquery1.eof do
  27.           begin ;
  28.           ListBox1.Items.Add(Zquery1.Fields[0].text + '  ' + Zquery1.Fields[1].Text) ;
  29.           Zquery1.Next;
  30.           end;
  31.   zquery1.Close;
  32.   zquery1.SQL.Clear ;
  33.   end;
  34. end;
  35. end;


como ven los valores son dos
cuenta.folio y cuenta . nombre
digo el que en si me interesa recuperar es el
cuenta.folio
el nombre no me importa realmente recuperarlo pero si tengo que desplegarlo en la lista por si se da el caso de que exista mas de una persona con el mismo nombre pero distinto folio, los folios estan compuestos por 8 0 9 caracteres, aveces tienen una "T" al principio  a veces "T-"  a veces solo son los digitos numericos
Asi hicieron la base y no la puedo cambiar para reformatear los campos.

y comento que pss ya que tenga lo de buscar por nombre
vendra la pesadilla de buscar por folio por que las busquedas tiene que ser muy amplias para que realmente los localices, y eso hace que la busqueda tarde un buen


  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.265 mensajes
  • LocationCosta Rica

Escrito 27 abril 2009 - 12:59

Hola
Otra vez no entiendo, pero aprendo.
Me parece que es un sencillo buscador???.
Por que no usar otro sencillo dbgrid?.
Saludos
  • 0

#6 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 01:54

si es un sencillo buscador
pero es  :$ ahun no se husar el DbGrid.
como le meto los datos y como los extraigo si me enseñan ya tendre una arma mas en el arsenal .

plis  :)
  • 0

#7 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 abril 2009 - 01:59

si es un sencillo buscador
pero es  :$ ahun no se husar el DbGrid.
como le meto los datos y como los extraigo si me enseñan ya tendre una arma mas en el arsenal .

plis  :)


Cambia el listbox por un dbgrid, luego en su propiedad datasource colocas un TDataSource enlazado con el ZQuery1.  Cambia el codigo que tienes por este:



delphi
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var InputStr, comillas, comodin:string;
  3. begin
  4. InputStr:='nombre';
  5. if InputQuery(
  6. 'NOMBRE',
  7. 'Nombre del trabajador',
  8. InputStr) then
  9. comillas:='"';
  10. comodin:= '%';
  11. zquery1.Close;
  12. zquery1.SQL.Clear;
  13. zquery1.SQL.Text:='SELECT cuenta.folio, cuenta.nombre from cuenta where cuenta.nombre like '+comillas+
  14.                   InputStr + comodin + comillas +
  15.                   'GROUP BY cuenta.folio ORDER BY cuenta.nombre ASC' ;
  16. zquery1.Open;
  17. if Zquery1.RecordCount > 10 then
  18.     Application.MessageBox(
  19.     pchar(  'Afina tu busqueda has dado un rango demasiado amplio'),
  20.     pchar('Error'),
  21.     0+16+0);
  22. end;



Ya veras que todo es casi automatico, cualquier duda preguntas...
  • 0

#8 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 02:33

ok si
asi es mas sencillo
solo que ahora ahunque el resultado de la busqueda sea grande pone los resultados en el grid
como se evita eso, por que si los dejo que los resultados sean muy grandes, (ya saben como son los usuarios)
puede que pongan por ejemplo solo "A" la busqueda tarda 90 segundos digo realmente no es mucho pero se trata de eliminar esos detalles en los que cuando contestan una llamada se tardan hasta 3 minutos para localizar al trabajador con el actual sistema hecho en PHP.

ahora viene la pregunta cuchicuchesca
como obtengo los valores ?? para asignarlos a el form inicial, ??

y otra
hay modo de quitarle las barras de desplazamiento ??

y si pido disculpas por habrir otro hilo y no incluir las mejoras del codigo
pero lo terminamos aka mejor



  • 0

#9 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 abril 2009 - 02:48

Bueno lo del resultado de la busqueda es discutible, al momento que le das el Open ya se trae los resultados, si quieres puedes tratar de lanzar un count antes de la busqueda, pero eso que quieres es mas dificil de conseguir.

Los valores lo obtienes a partir del Zquery al seleccionar un registro en el grid este queda en el query relacionado como activo.
  • 0

#10 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 03:09

papas

ya pense

nomas le pongo en el create del form
visible := false
en el query le pongo limit 12 asi si son mas de 10 no los dejo verlo
y si son 10 o menos lo hago visible
algo mas sencillo no seme ocurre
o hay algun modo de que en caso de que el query dure mas de determinado tiempo
se interumpa la operacion ??

y sigo sin saber como sacar los datos  ?? ?
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 abril 2009 - 03:12

jejejeje, pues me parece muy inteligente y creativa tu idea  ;)

Con respecto a lo de sacar los campos



delphi
  1. MiVariable := ZQuery1.FieldbyName('Campo1').AsString;


  • 0

#12 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 03:30

pero entonces no sacaria el dato del dbgrid sino del query
mmm no pss no por que entonces como le digo que fila del query es la que kiero que tome ???

no la puedo sacar directamente del dbgrid ??
o a ver si es mas facil como puedo mandar a la memoria de la makina ( esa que se husa en copy & paste ) el valor para despues ponerla en el otro form ????


  • 0

#13 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 abril 2009 - 03:37

lo que sucede es que un control al estar ligado con un dbgrid lo selecciones en el dbgrid se selecciona en el query.  Cualquier registro seleccionado en el dbgrid sera el registro activo en el Query.
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Moderador
  • PipPipPip
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 abril 2009 - 03:40

pero entonces no sacaria el dato del dbgrid sino del query
mmm no pss no por que entonces como le digo que fila del query es la que kiero que tome ???

no la puedo sacar directamente del dbgrid ??
o a ver si es mas facil como puedo mandar a la memoria de la makina ( esa que se husa en copy & paste ) el valor para despues ponerla en el otro form ????



Hola arroyoj,
Creo que va a ser necesario que te aclaremos algunas cosas oscuras de Delphi ;)

En realidad quien tiene los datos es el ZQuery. El DBGrid sólo es un componente que los muestra, pero en definitiva los datos están almacenados en el ZQuery.

En cuanto seleccionas un registro del TDBGrid, éste le avisa al ZQuery que el registro seleccionado es el activo. De este modo cuando lees el campo, estás leyendo el campo del registro que en el momento está activo.

¿Me explico?

Los componentes se comunican, informandose de los registros activos, los estados, etc.

Creo que te va a ser de mucha ayuda leer La Cara Oculta de Delphi 4.

Saludos,
  • 0

#15 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 27 abril 2009 - 04:29

si
tengo la intencion de leerlo
nomas que se descuiden con la impresora
por que intente subir pdf`s al ipod y nomas no se puede

:s



  • 0

#16 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 28 abril 2009 - 02:49

Finalmente asi me quedo el codigo



delphi
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var InputStr, comillas, comodin:string;
  3. begin
  4. InputStr:='nombre';
  5. if InputQuery(
  6. 'NOMBRE',
  7. 'Nombre del trabajador',
  8. InputStr) then
  9. comillas:='"';
  10. comodin:= '%';
  11.  
  12. label1.Caption := StrLen(Pchar(InputQuery))  ;
  13.  
  14. zquery1.Close;
  15. zquery1.SQL.Clear;
  16. zquery1.SQL.Text:='SELECT cuenta.folio, cuenta.nombre from cuenta where cuenta.nombre like '+comillas+
  17.                   InputStr + comodin + comillas +
  18.                   'GROUP BY cuenta.folio ORDER BY cuenta.nombre ASC LIMIT 11' ;
  19. zquery1.Open;
  20. if Zquery1.RecordCount > 10 then
  21.     Application.MessageBox(
  22.     pchar(  'Afina tu busqueda has dado un rango demasiado amplio'),
  23.     pchar('Error'),
  24.     0+16+0)
  25. else
  26.   dbgrid1.Visible := true
  27. end;
  28.  
  29.  
  30. procedure TForm2.Button3Click(Sender: TObject);
  31. begin
  32. close
  33. end;
  34.  
  35. procedure TForm2.DBGrid1CellClick(Column: TColumn);
  36. begin
  37. Form1.edit1.text := Zquery1.FieldByName('folio').AsString ;
  38. end;
  39.  
  40. procedure TForm2.FormActivate(Sender: TObject);
  41. begin
  42. zquery1.SQL.Clear  ;
  43. dbgrid1.Visible := false
  44. end;
  45. end.



lo unico que ahora si creo le falta es
para que si introducen un criterio de busqueda de 1 o hasta de 10 letras los mande por un tubo por que si ponen que busque solamente "A" se keda mas de 90 segundo haciendo la consula, para despues decirte es muy grande
he estado buscondo referencias de " StrLen " pero no encuentro como husarlo me echan una mano pls


  • 0

#17 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 28 abril 2009 - 02:54

Saludos.

No lo tomes a mal, ¿pero para que limitas la consulta y luego la validas? No le veo sentido.

Me refiero a tu código LIMIT y luego RecordCount.

Para saber el tamaño de una cadena usa Length.

Returns the number of characters in a string or elements in an array.

Unit

System

Category

string handling routines

Delphi syntax:

function Length(S): Integer;

Description

In Delphi code, Length returns the number of characters actually used in the string or the number of elements in the array. In C++ code, use the method of the same name on the AnsiString or DynamicArray class.

For single-byte and multibyte strings, Length returns the number of bytes used by the string. For Unicode (WideString) strings, Length returns the number of bytes divided by two.

S is a string- or array-valued expression.


  • 0

#18 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 28 abril 2009 - 02:58

sip de hecho ya estuve revisando y
si valido que la busqueda la realice apartir de que den mas de 10 caracteres
no necesito el limit

gracias por lo del Length
  • 0

#19 Caral

Caral

    Advanced Member

  • Administrador
  • 4.265 mensajes
  • LocationCosta Rica

Escrito 28 abril 2009 - 03:48

Hola
Analizando el código y con afán de aprender, pienso en cosas que me son extrañas:

Limpias el query y usas Text.?
Haces un intrincada búsqueda (concatenando) a UNA solo tabla, (cuenta).?
Usas variables para algo que no se necesita, consumiendo memoria.?
Utilizas el LIKE en un sentencia sql para que solo te muestre dos campos.?
Pones un limite a la consulta de 11.?
No haces un recorrido de la tabla (eof) mas bien indicas que si los registros son mas de 10 te MalM?
Activas el form y limpias algo que ni esta activo?.

No se, me suenan tan raros estos puntos que quise saber el por que de ellos.
Saludos
PD: Solo como dato, en una consulta a una tabla con muuuuuchos registros el tiempo de consulta en mi caso no es mas de 2 segundos, contando que estoy en red, me es extraño que dure tanto esta.

  • 0

#20 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 28 abril 2009 - 04:02

Hola
Analizando el código y con afán de aprender, pienso en cosas que me son extrañas:

Limpias el query y usas Text.?
Haces un intrincada búsqueda (concatenando) a UNA solo tabla, (cuenta).?
Usas variables para algo que no se necesita, consumiendo memoria.?
Utilizas el LIKE en un sentencia sql para que solo te muestre dos campos.?
Pones un limite a la consulta de 11.?
No haces un recorrido de la tabla (eof) mas bien indicas que si los registros son mas de 10 te MalM?
Activas el form y limpias algo que ni esta activo?.

No se, me suenan tan raros estos puntos que quise saber el por que de ellos.
Saludos
PD: Solo como dato, en una consulta a una tabla con muuuuuchos registros el tiempo de consulta en mi caso no es mas de 2 segundos, contando que estoy en red, me es extraño que dure tanto esta.


sip lo limpio aki me dijeron que era sano antes de usarlo limpiarlo
si estoy mal o no asi quedara aprendido como un proceso inecesario
y uso text para asignar el contenido del query
pregunta hay otro modo ???

uso una tabla concatenada para buscar en dos tablas cuenta y status ( por hay aparece status.status )

uso las variables por que luego me dice que los caracteres como la doble comilla son invalidos
descubri que si lo asigno a una variable y lo concateno no hay ese problema
si estoy mal diganme

uso like por que necesito que sea la busqueda en donde si el operador del programa sabe que busca a un

" perez gomez odilon " pueda buscar "perez gomez o" y le aparescan odin olaf odilon y los que resulten por que la
base de datos esta mal capturada tienen nombre incompletos en ocasiones y abreviaciones etc etc por eso uso el like y el comidin " % " por que para usar el comodin deve de ser con like si voy mal me dicen

pongo un limite de consulta de 11 ( eso ya lo explique )

eso de limpiar algo que no esta activo
si la regue creo

u mmmm

sip cuando haces una busqueda con parametros like generalmente como es con un comodin tardan mas
si fuera una busqueda con " = " seria en friega pero como es de localizacion tengo que usar like


esto no es para otra cosa que me digan si estoy mal

si estoy mal aprendere
pero si nadien dice estas mal no aprengo


GRACIAS CARAL
  • 0