Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Hola kbaby... el siguiente código es un ejemplo de lo que buscas:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var indice: integer;
    i: integer;
begin
  // primero buscamos el dato. Supuesto: que siempre estamos buscando un DNI
  indice := ListBox1.Items.IndexOf(Edit5.Text);
  if indice <> -1
     then begin
             for i := 1 to 4 do  //este cuatro corresponde a la cantidad
               // de datos a mostrar. En este caso son: DNI, Nombre, Apellido,
               // Teléfono
               begin;
                 // mostrar cada dato en una celda distinta
                 // De hecho, lo mostramos en la primera fila
                 // [columna,fila]
                 StringGrid1.Cells[i,1] := ListBox1.Items[indice];
                 inc(indice);
               end;
          end
     else ShowMessage('DNI no encontrado');
end;

El código funciona, siempre que busques el DNI. Si buscas el apellido o cualquier otro dato no vas a obtener lo que deseas... Hice el supuesto de que siempre están disponibles todos los datos, de otro modo el algoritmo falla. Para hacerte una idea de porque funciona. piensa al listBox como una lista. Y cada elemento ocupa una posición.

Código:
0 - DNI
1 - Nombre
2 - Apellido
3 - Teléfono
4 - DNI
5 - Nombre
6 - Apellido
7 - Teléfono
¿Ves algo extraño? ¿No parece haber una correlación entre 0 y 4?¿Lo mismo que para 1 y 5?
Es por ello que al encontrar la posición del DNI, la copio a la posición [1,1] del stringGrid, luego, exploro las siguientes 3 posiciones y las añado a la posición [i,1]. ¿Porqué sacamos siempre el valor del Indice? Pues porque si te fijas, al final de cada bucle FOR incremento (la función inc()) la variable indice en 1. Y esto hace que con cada pasada, se obtenga el siguiente elemento del ListBox.

Inc(indice) es análogo a indice := indice + 1;
inc(indice, 2) es análogo a indice := indice + 2;

Analiza el código que te pasee y ve de que manera se adapta a lo que buscas.

Muchas de las cosas que preguntas tienen tanto de lógica como del uso del uso de las propiedades de los objetos que empleas. No temas pulsar F1 al seleccionar un objeto. Por ejemplo, si no sabes como usar el StringGrid, arrastra uno al form, seleccionalo y presiona F1. Obtendrás la ayuda.

El inglés no es pretexto, habiendo traductores on-line como off-line.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #2  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
Tio, muchas gracias, me entere fenomenal. Ahora viene la segunda parte... ver si yo puedo. Ahora te aviso.
Responder Con Cita
  #3  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
Primer problema que me surge:

"Estoy intentando que el programa lea un archivo .txt previamente creado con los datos puestos:

nombre
apellido
nombre
apellido

(esto es una prueba)

Bueno el problema es que cuando le doy a "recuperar" pues me lo lee y sale en el LISTBOX pero con un espacio entre nombre y apellido... así:

pepe
//aqui hay un espacio que no había
gomez
// aquí tambien
juan
// aqui tambien
lopez

El codigo es:

Código Delphi [-]var f:textfile;
n:string;
begin assignfile(f,'nombres.txt');
reset(f);
while not eof(f) do begin readln(f,n); edit1.Text:=n; button1.Click; //añadir ¿en mis apuntes sale ke tengo que poner esto... pq?
button2.Click; //lo que hace es volcar
end;
closefile(f);
end;

end.
Responder Con Cita
  #4  
Antiguo 26-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
kbaby, el TListBox cuenta con los métodos LoadFromFile y SaveToFile que hace todo el trabajo más fácil.

LoadFromFile abre un archivo y lo muestra. SaveToFile lo guarda.
El archivo que se genera es como aparece en el ListBox. Cada texto en un "renglón". Es decir que si en un ListBox tienes esto (cada uno en una linea):

Código:
Hola como estas kbaby
yo aqui un poco adivinando
lo que hace ese button1.click
y también desorientado con el button2.click
Tu archivo quedará escrito en la misma forma.

El problema con ese código puede deberse al Readln() ya que eso hace que se pase al siguiente "renglón". El porque en tus apuntes invocas a un Button1.Click y luego a un Button2.Click lo desconozco... es cosa de tus apuntes... y pues... no estoy allí para ver que es lo dicen.

Si nos aportaras más datos podría saber el modo de ayudarte.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
kbaby, el TListBox cuenta con los métodos LoadFromFile y SaveToFile que hace todo el trabajo más fácil.

LoadFromFile abre un archivo y lo muestra. SaveToFile lo guarda.
El archivo que se genera es como aparece en el ListBox. Cada texto en un "renglón". Es decir que si en un ListBox tienes esto (cada uno en una linea):

Código:
Hola como estas kbaby
yo aqui un poco adivinando
lo que hace ese button1.click
y también desorientado con el button2.click
Tu archivo quedará escrito en la misma forma.

El problema con ese código puede deberse al Readln() ya que eso hace que se pase al siguiente "renglón". El porque en tus apuntes invocas a un Button1.Click y luego a un Button2.Click lo desconozco... es cosa de tus apuntes... y pues... no estoy allí para ver que es lo dicen.

Si nos aportaras más datos podría saber el modo de ayudarte.

Saludos,

Problema solucionado, fue simplemente ir probando, el código quedaría así:

Código Delphi [-]
var i:integer;
begin
  t.rowcount:=l.items.count div 4 +1;
  for i:=0 to (l.items.count-1)div 4 do
  begin
  t.cells[1,I+1]:=l.items[i*4];
  t.cells[2,I+1]:=l.items[i*4+1];
  t.cells[3,I+1]:=l.items[i*4+2];
  t.cells[4,I+1]:=l.items[i*4+3];
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var f:textfile; i:integer;
begin
  assignfile (f,'nombres.txt');
  rewrite(f);
  for i:=0 to l.items.count-1 do
  writeln (f,l.items[i]);
  closefile(f);
end;

procedure TForm1.Button4Click(Sender: TObject);
var f:textfile;
    n:string;
  begin
  assignfile(f,'nombres.txt');
  reset(f);
  while not eof(f) do
     begin
     readln(f,n);
     edit1.Text:=n;
     readln(f,n);     //lo que he hecho es añadir esto
     edit2.Text:=n; //y esto por cada item que tenga, como en mi caso son 4, pues sería esto.
     readln(f,n);
     edit4.Text:=n;
     readln(f,n);
     edit5.Text:=n;
     button1.Click; //esto hace añadir. si lo quito falla... así que lo dejo mejor.
     button2.Click; //lo que hace es volcar en la tabla todo el contenido del listbox.
     end;
  closefile(f);
end;

end.

Lo que hace el boton añadir es irse esto:

Mete la 1º linea del .txt en el edit1.text, luego la 2º linea en el edit2.text y así hasta las cuatro lineas y luego las añade al listbox.
Esto lo repite hasta llegar al final.

Luego lo vuelca en la tabla. He quitado lo de volcarlo porqueno me interesa volcar TODO.

Duda: ¿Cabe la posibilidad de recuperar la información del .TXT en el LISTBOX sin tener que hacerlo de mi manera tan "cutre"?.

Última edición por kbaby fecha: 26-05-2008 a las 19:29:24.
Responder Con Cita
  #6  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
Primer problema que me surge:

"Estoy intentando que el programa lea un archivo .txt previamente creado con los datos puestos:

nombre
apellido
nombre
apellido

(esto es una prueba)

Bueno el problema es que cuando le doy a "recuperar" pues me lo lee y sale en el LISTBOX pero con un espacio entre nombre y apellido... así:

pepe
//aqui hay un espacio que no había
gomez
// aquí tambien
juan
// aqui tambien
lopez

El codigo es:

Código Delphi [-]
 
var f:textfile;
    n:string;
  begin
  assignfile(f,'nombres.txt');
  reset(f);
  while not eof(f) do
     begin
     readln(f,n);
     edit1.Text:=n;
     button1.Click; //añadir ¿en mis apuntes sale ke tengo que poner esto... pq?
     button2.Click; //lo que hace es volcar
     end;
  closefile(f);
end;

end.
Responder Con Cita
  #7  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
¿Por qué utilizas el Inc(indice)?

Es lo único que no me ha quedado claro.


Yo pulso f1, y lo leo, pero no veo como se adapta lo que a mí me han enseñando y no puedo llevar algo que no haya yo enseñado. Ahora si yo el " Inc(indice)" lo adapto a lo que me han enseñado pues sí.

Espero me comprendas.
Responder Con Cita
  #8  
Antiguo 26-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Cita:
Empezado por kbaby Ver Mensaje
¿Por qué utilizas el Inc(indice)?

Es lo único que no me ha quedado claro.


Yo pulso f1, y lo leo, pero no veo como se adapta lo que a mí me han enseñando y no puedo llevar algo que no haya yo enseñado. Ahora si yo el " Inc(indice)" lo adapto a lo que me han enseñado pues sí.

Espero me comprendas.
Pues es una costumbre mia. Inc() es una función que lo que hace es incrementar una variable (no puede utilizarse con las propiedades de un objeto, por ejemplo... la propiedad ItemIndex) en un valor. Por defecto el incremento es de 1. Te explico:

cuando uno hace:

Código Delphi [-]
inc(tu_variable);

Lo que consigues es incrementar tu_variable en 1. Al hacer:

Código Delphi [-]
inc(tu_variable,5);

Lo que consigues es incrementar tu variable en 5.

De cualquier manera, puedes sustituir, como he dicho, a inc() por su equivalente:

Código Delphi [-]
tu_variable := tu_variable + 1 // 5, 300, 2321321, lo que se te ocurra.

¿El porqué uso la variable indice para incrementar? Pues... para ahorrarme otra variable. Si te fijas, la uso inicialmente para localizar la posición de un texto. Y si se dicha posición puedo saber la de los demás.

Si el archivo SIEMPRE contendrá TODOS los datos y en dicho ORDEN, con saber la posición del DNI se puede conocer la de los demás datos.
Por ejemplo:
Nombre ocupa la posición siguiente a indice. Lo que se traduce a Indice + 1.
Apellido ocupa la posición siguiente a Nombre. Traducido: indice + 2.
Telefono ocupa la posición siguiente a Apellido. Traducido: indice + 3.

Con cada paso del bucle FOR, no sólo me desplazo sobre la fila del StringGrid, sino también sobre el indice del ListBox.

¿Me vas entendiendo?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
Entendido Gracias profe
Responder Con Cita
  #10  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 19
kbaby Va por buen camino
Question

Aqui volviii Con dudas bueno en realidad son solo dos dudas.

1º Duda: Como acordamos, el codigo que funciona para buscar a los usuarios por DNI es el siguiente:

Código Delphi [-]
var indice: integer;
    i: integer;
begin
  indice := l.Items.IndexOf(Edit3.Text);
  if indice <> -1
     then begin
             for i := 1 to 4 do
               begin;

                 t.Cells[i,1] := l.Items[indice];
                 inc(indice);
               end;
          end
     else ShowMessage('Este DNI no pertenece a ningún usuario');
     Exit;
end;

Pero funciona eso porque los datos son:
0-DNI
1-NOMBRE
2-APELLIDOS
3-CIUDAD
4-DNI
5-NOMBRE
6-APELLIDOS
7-CIUDAD

Entonces, como dijiste, entre el 0 y el 3 existe una relacion. Pero y si yo lo que quiero ahora es ampliar el programa ¿y si busco por los APELLIDOS me salga en la tabla la persona con esos apellidos? Creo, que lo que hay que tocar es:

t.Cells[i,1] := l.Items[indice];

Pero como ya te dije, eso de INC no lo entendi bien. Por lo visto, va aumentando de 1 en 1 ¿no? Por eso sale el item 0, luego 1, 2,3...
Entonces si yo pongo en el EDIT de la busqueda los APELLIDOS... en la tabla me salen los items 3,4,5,6.
¿Como arreglo eso? Ya estoy indagando xD pero nada.


Otra cosa es la siguiente. Yo se volcar el contenido de mi LISTBOX en una TABLA (STRINGRID). AQUI TENEIS UN EJEMPLO:

MI TABLA
----------------------------------
|dni1 |nombre1 |apellido1 |
----------------------------------
----------------------------------
|dni2 |nombre2 |apellido2 |
----------------------------------
----------------------------------
|dni3 |nombre3 |apellido3 |
----------------------------------
----------------------------------
|dni4 |nombre4 |apellido4 |
----------------------------------

Y así, con todas las personas de mi listbox. Entonces si al nombre3 (un ejemplo) le cambio el nombre y se llama pepito en vez de juan... y le doy a GUARDAR... (guardar para que se guarden los cambios)... pierdo todas las otras personas y solo se me queda la persona "3" con sus cambios. ¿Por qué? ¿Qué manera usais vosotros para hacer lo que yo intento? Lo siento por ser tan... malo... pesimo.... en mis detalles.


gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda con código. wofox Varios 6 11-12-2007 00:16:21
Ayuda con un codigo JoNieve C++ Builder 0 21-04-2007 12:27:33
Ayuda con error en codigo :-( jorgegetafe Varios 6 07-02-2007 19:29:04
Codigo de Barras.... Ayuda!!!!! adolfoz Varios 14 15-11-2006 17:13:55
Ayuda con código de barras ramiretor Varios 0 28-06-2003 00:42:58


La franja horaria es GMT +2. Ahora son las 00:07:06.


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
Copyright 1996-2007 Club Delphi