
List Box
#1
Posted 27 April 2009 - 12:03 PM
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 ???
#2
Posted 27 April 2009 - 12:25 PM
#3
Posted 27 April 2009 - 12:26 PM

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,
#4
Posted 27 April 2009 - 12:48 PM
les comento esto viene de aki
procedure TForm2.Button1Click(Sender: TObject); var InputStr, comillas, comodin:string; begin InputStr:='nombre'; if InputQuery( 'NOMBRE', 'Nombre del trabajador', InputStr) then comillas:='"'; comodin:= '%'; zquery1.Close; zquery1.SQL.Clear; zquery1.SQL.Text:='SELECT cuenta.folio, cuenta.nombre from cuenta where cuenta.nombre like '+comillas+ InputStr + comodin + comillas + 'GROUP BY cuenta.folio ORDER BY cuenta.nombre ASC' ; zquery1.Open; if Zquery1.RecordCount > 10 then Application.MessageBox( pchar( 'Afina tu busqueda has dado un rango demasiado amplio'), pchar('Error'), 0+16+0) else begin While not ZQuery1.Eof do begin while not zquery1.eof do begin ; ListBox1.Items.Add(Zquery1.Fields[0].text + ' ' + Zquery1.Fields[1].Text) ; Zquery1.Next; end; zquery1.Close; zquery1.SQL.Clear ; end; end; 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
#5
Posted 27 April 2009 - 12:59 PM
Otra vez no entiendo, pero aprendo.
Me parece que es un sencillo buscador???.
Por que no usar otro sencillo dbgrid?.
Saludos
#6
Posted 27 April 2009 - 01:54 PM
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

#7
Posted 27 April 2009 - 01:59 PM
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:
procedure TForm2.Button1Click(Sender: TObject); var InputStr, comillas, comodin:string; begin InputStr:='nombre'; if InputQuery( 'NOMBRE', 'Nombre del trabajador', InputStr) then comillas:='"'; comodin:= '%'; zquery1.Close; zquery1.SQL.Clear; zquery1.SQL.Text:='SELECT cuenta.folio, cuenta.nombre from cuenta where cuenta.nombre like '+comillas+ InputStr + comodin + comillas + 'GROUP BY cuenta.folio ORDER BY cuenta.nombre ASC' ; zquery1.Open; if Zquery1.RecordCount > 10 then Application.MessageBox( pchar( 'Afina tu busqueda has dado un rango demasiado amplio'), pchar('Error'), 0+16+0); end;
Ya veras que todo es casi automatico, cualquier duda preguntas...
#8
Posted 27 April 2009 - 02:33 PM
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
#9
Posted 27 April 2009 - 02:48 PM
Los valores lo obtienes a partir del Zquery al seleccionar un registro en el grid este queda en el query relacionado como activo.
#10
Posted 27 April 2009 - 03:09 PM
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 ?? ?
#11
Posted 27 April 2009 - 03:12 PM

Con respecto a lo de sacar los campos
MiVariable := ZQuery1.FieldbyName('Campo1').AsString;
#12
Posted 27 April 2009 - 03:30 PM
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 ????
#13
Posted 27 April 2009 - 03:37 PM
#14
Posted 27 April 2009 - 03:40 PM
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,
#15
Posted 27 April 2009 - 04:29 PM
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

#16
Posted 28 April 2009 - 02:49 PM
procedure TForm2.Button1Click(Sender: TObject); var InputStr, comillas, comodin:string; begin InputStr:='nombre'; if InputQuery( 'NOMBRE', 'Nombre del trabajador', InputStr) then comillas:='"'; comodin:= '%'; label1.Caption := StrLen(Pchar(InputQuery)) ; zquery1.Close; zquery1.SQL.Clear; zquery1.SQL.Text:='SELECT cuenta.folio, cuenta.nombre from cuenta where cuenta.nombre like '+comillas+ InputStr + comodin + comillas + 'GROUP BY cuenta.folio ORDER BY cuenta.nombre ASC LIMIT 11' ; zquery1.Open; if Zquery1.RecordCount > 10 then Application.MessageBox( pchar( 'Afina tu busqueda has dado un rango demasiado amplio'), pchar('Error'), 0+16+0) else dbgrid1.Visible := true end; procedure TForm2.Button3Click(Sender: TObject); begin close end; procedure TForm2.DBGrid1CellClick(Column: TColumn); begin Form1.edit1.text := Zquery1.FieldByName('folio').AsString ; end; procedure TForm2.FormActivate(Sender: TObject); begin zquery1.SQL.Clear ; dbgrid1.Visible := false end; 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
#17
Posted 28 April 2009 - 02:54 PM
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.
#18
Posted 28 April 2009 - 02:58 PM
si valido que la busqueda la realice apartir de que den mas de 10 caracteres
no necesito el limit
gracias por lo del Length
#19
Posted 28 April 2009 - 03:48 PM
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.
#20
Posted 28 April 2009 - 04:02 PM
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