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 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 20
kbaby Va por buen camino
La PRIMERA DUDA la he resuelto solo!!! Siii!!! En la linea

Código Delphi [-]
 indice := l.Items.IndexOf(Edit3.Text);

La modifique haciendo esto:

Código Delphi [-]
 indice := (l.Items.IndexOf(Edit3.Text))-2;

Con este cambio, en la variable indice, metera el item que yo pongo en el edit pero bajandolo dos casillas (por el -2).

Siguiente duda: ¿Y si ahora hay dos personas con los mismo apellidos... hermanos? Solo me sale la primera... ¿alguna manera?
Responder Con Cita
  #2  
Antiguo 28-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
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:

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

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.
Creo que eso ya te lo había dicho. El algoritmo es simple, y he recalcado que si buscabas cualquier otro dato obtendrías otros resultados.

Cita:
Empezado por kbaby Ver Mensaje
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.
Primeramente sería oportuno que nos indicaras de que modo estás volcando la información desde el TListBox hacia el StringGrid. Y si me explicaras mejor lo que estás buscando hacer...

El problema kbaby es que tu estás empleando un método para guardar y leer archivos un tanto incompatible con los controles que estás usando.
Habiendo la posibilidad de emplear SaveToFile y LoadFromFile tanto para ListBox como para StringGrid el trabajo se hace más fácil.

Pero si es como dices, que no puedes emplear nada fuera de lo que viste ¿De que sirve que te indiquemos de que manera lo hacemos, si es mucho más probable de que sea algo complejo y/o algo que no has visto ni tienes en tus apuntes?
A lo que voy, es que si te estás basando en tus apuntes, poco puedo imaginarme el modo de hacerte más fácil los ejemplos. No se que tienes en tus apuntes, y eso me condiciona mucho.

Y es posible que también lo sea para otros foristas.

Cita:
Empezado por kbaby Ver Mensaje
La PRIMERA DUDA la he resuelto solo!!! Siii!!! En la linea

Código Delphi [-]
 indice := l.Items.IndexOf(Edit3.Text);



La modifique haciendo esto:

Código Delphi [-]
 indice := (l.Items.IndexOf(Edit3.Text))-2;



Con este cambio, en la variable indice, metera el item que yo pongo en el edit pero bajandolo dos casillas (por el -2).

Siguiente duda: ¿Y si ahora hay dos personas con los mismo apellidos... hermanos? Solo me sale la primera... ¿alguna manera?
Me alegro que vayas comprendiendo y logrando las cosas por ti mismo. ¿No es gratificante?

¿A que te refieres? ¿A que si buscas en el ListBox, a los Martinez (un ejemplo) te liste a todos los martinez?
Hay manera de hacerlo... y puede que se me ocurra una, y vuelvo al tema que comenté antes... existe la posibilidad de que lo haga de un modo al que para ti resulte chinesco.
Si pudiera conocer hasta que punto es compatible las opciones que te ofrecemos con los contenidos que tu estás estudiando sería más fácil.

El mayor problema, es el TListBox. y la manera en que estás guardando los datos. Una opción sería guardar los datos separados y delimitados por comas o algún otro caracter... y emplear las propiedades CommaText, DelimiterChar, DelimiterText, pertenecientes a Items. Pero es posible que esto sea el chinesco que a ti no te agradaría.

kbaby, lamentablemente para ayudarte del mejor modo es conociendo lo que sabes, y haz estado estudiando.
Lamento decirtelo, pero no se me ocurre, por el momento, un modo de demostrarte una solución de más bajo nivel como para el que tu comprendieras.

El método (algoritmo) más sencillo que se me está ocurriendo es algo similar a este:
1. Iniciar una variable i al valor 2. La usaremos para ir recorriendo lal ListBox.
2. Mientras i sea menor a la cantidad de elementos hacer:
2.1. Si el item i-ésimo es igual al valor buscado
2.1.1. incrementamos una variable j. Sera usada para ir agregando las filas a la "tabla". Inicialmente debe valer cero.
2.1.2. agregamos a la fila j-ésima:
2.2.2.1. en la primera columna el DNI. Cuya posición es igual a i - 2.
2.2.2.2. en la segunda columna el Nombre. Cuya posición es igual a i - 1.
2.2.2.3. en la tercera columna el Apellido. Cuya posición es igual a i.
2.2.2.4. en la cuarta columna la ciudad. Cuya posición es igual a i + 1.
2.2. incrementar a la variable i en 4.

¿Porqué lo redacté así? Para que descubras que lo que necesitas es dominar el arte de lógica, en vez de buscarle un sentido en el uso de propiedades y métodos.
Además lo hago con la finalidad de que lo pienses tu, y le encuentres solución.

El algoritmo que te pasé lo que hace es ir dando saltos de 4 en 4 sobre los items del TListBox. Si en dicha posición el contenido del ListBox es igual al buscado suceden las siguientes cosas:
1. incrementa una variable j. Es decir j = j + 1.
2. agrega en la posición [1,j] lo almacenado en el listbox, posición i - 2.
3. agrega en la posición [2,j] lo almacenado en el listbox, posicion i - 1.
etc...

Es decir que en cada ocurrencia, agrega los items que corresponde a dichos datos. Recuerda que SIEMPRE que se mantenga el orden:
DNI
NOMBRE
APELLIDO
CIUDAD

el algoritmo podrá encontrar la información.

Ten presente que el StringGrid guarda sus datos del siguiente modo:

Código:
[1,1][2,1][3,1][4,1][5,1]
[1,2][2,2]...
...
[1,N][2,N]
Espero haberte dado una idea.
Disculpa que he haya extendido, pero no veo otro modo de demostrarte lo limitado que estamos para ayudarte si te proponemos alternativas que posiblemente tu no comprendas y que no estén en tus apuntes.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 28-05-2008 a las 20:24:26.
Responder Con Cita
  #3  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 20
kbaby Va por buen camino
Bueno yo voy a intentar darte mas información de lo que hago. Para guardar utilizo este código:

Código Delphi [-]
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);

Y cuando abro el programa, para "cargar" el listbox utilizo esto:

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;
     readln(f,n);
     edit2.Text:=n;
     readln(f,n);
     edit4.Text:=n;
     readln(f,n);
     edit5.Text:=n;
     button1.Click; //lo que va haciendo esto, es ir poniendo en edits cada item y añadirlo automaticamente. Por eso al final limpio los edits.
     end;
  closefile(f);
  edit1.text:='';
  edit2.text:='';
  edit4.text:='';
  edit5.text:='';
end;

1). En la tabla NO vuelco todo el contenido, solo la persona que se apellida Martinez Perez. Pero el caso es si hay dos personas con Martinez Perez. Como poner a los dos?.

2) Y la otra duda es, una vez volcada a Pepe Martinez Perez, si le tengo que cambiar algun dato, por ejemplo su nombre (cosa que hago desde la tabla, una vez volcado cuando lo busque...) pues le doy y borro su nombre y escribo ahora Jose. Le doy a guardar y se borra TODOS LOS ITEMS del listbox, menos la "persona" con sus 4 datos (DNI,NOMBRE,APELLIDOS,CIUDAD).


El código que utilizo para borrar lo que hay en la tabla y que se guarde es este:
l.items.clear;
edit1.text:=t.cells[1,1];
edit2.text:=t.cells[2,1];
edit4.text:=t.cells[3,1];
edit5.text:=t.cells[4,1];
button1.click;


¿Que pasa? Pues que borra toda la lista y añade a esa persona con sus cuatro datos, pero las otras las pierdo. ¿Alguna otra forma?

gracias.

Última edición por kbaby fecha: 28-05-2008 a las 20:57:48. Razón: informacion
Responder Con Cita
  #4  
Antiguo 28-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
Bueno, con respecto a buscar los martinez y mostrarlos te he propuesto una solución. ¿Porqué no la traduces a código? Sería un buen ejercicio para ti.

Con respecto al tema de porque borra el contenido del TListBox es simplemente porque al principio de todo invocas al método Clear.

No debes llamar al método Clear. Sino que debes realizar el paso inverso al algoritmo que te he pasado:
Analizemos la situación:
Antes ibamos saltando por los items de 4 en 4 y volcando la información. De este modo de cumplía lo siguiente.
Si buscamos por el apellido,
El DNI siempre está en la posición i - 2.
El Nombre siempre está en la posición i - 1
El Apellido siempre está en la posición i
La Ciudad siempre está en la posición i + 1

Por tanto, lo que hacíamos era agregar estos datos en el StringGrid del siguiente modo:
Celda[1,j] = La info de i - 2
Celda[2,j] = la info de i - 1
Celda[3,j] = la info de i
Celda[4,j] = la info de i + 1

A la inversa tenemos:

La info de i - 2 = Celda[1,y]
La info de i - 1 = Celda[2,y]
La info de i = Celda[3,y]
La info de i + 1 = Celda[4,y]

¿Se entiende? No debes hacer Clear, sino sustituir un dado de una celda por el de la posición en un índice:
Código Delphi [-]
ListBox1.Items[i] := StringGrid1.Cells[x,y];

¿Porque y? y no i?
El problema es que cuando agregamos desde el ListBox hacia el StringGrid perdemos referencia a la posición i-esima del campo Apellido de dicha persona. Lo más fácil es, que al agregar la información al StringGrid guardemos dicha posición para asi poder hacer el paso inverso. Tal vez, algo como esto:

Indice - DNI - Nombre - Apellido - Ciudad
De modo que en [1,j] tenemos la posición i-ésima del campo Apellido de los datos de la persona j-esima en el StringGrid.
En [2,j] su DNI.
En [3,j] su Nombre.
Y así sucesivamente.

¿Que significa ese j?
Pues la fila. De modo que si j es 1, nos referimos la persona que ocupa la fila 1 en el StringGrid. Ojo: no confundir a ese j con la posición i en el ListBox.
Cuando j vale 2, nos estamos refiriendo a la persona que ocupa la fila 2.

Por ejemplo, si en [1,1] tenemos el valor 6 quiere decir que en el ListBox, la información del apellido para dicha perona está en 6. Hacemos que i sea 6.
Por tanto:
1. El DNI está en i - 2. Es decir, 6 - 2 = 4. Item[4] = Celda[2,1].
2. El Nombre está en i - 1. Es decir, 6 - 1 = 5. Item[5] = Celda[3,1]
3. El Apellido está en i. Es decir, 6. Item[6] = Celda[4,1]
4. La Ciudad está en i + 1. Es decir, 6 + 1 = 7. Item[7] = Celda[5,1]

Cuando en [1,2] tenemos el valor 14, entonces:
DNI: 14 - 2 = 12. Item[12] = Celda[2,2]
Nombre: 14 - 1 = 13. Item[13] = Celda[3,2]
Apellido: 14. Item[14] = Celda[4,2]
Ciudad: 14 + 1 = 15. Item[15] = Celda[5,2]

¿Se entiende? Tendrás que modificar un poco tus códigos pero se consigue tener referencia a que persona estramos cambiando la información.

kbaby, te he dicho que esto se trata de lógica. No pienses en código... deja que el código salga del análisis de la situación y de un planteo del problema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 20
kbaby Va por buen camino
Una cosa que he notado es que el boton que tengo de "buscar" cuando en el edit pones una palabra con espacio en mi ejemplo: apellido1_apellido2 salta error. ¿por que?
Responder Con Cita
  #6  
Antiguo 28-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
Red face

Cita:
Empezado por kbaby Ver Mensaje
Una cosa que he notado es que el boton que tengo de "buscar" cuando en el edit pones una palabra con espacio en mi ejemplo: apellido1_apellido2 salta error. ¿por que?
kbaby, si no dices el error no te podré ayudar ¿Modificaste el código de buscar? ¿Si es así, como lo tienes?

Lo siento, pero si no aprendes a aportar verdaderamente la información que nos ayude a ayudarte no podemos seguir.
La paciencia tiene cierto límite. Yo he estado siendo paciente... pero ha sido dificil sacarte la información para que te pueda asesorar.

Cuando uno dice me sale error, ¿que puede ser?... Menos ganas de ayudar me dan.
Tu ya conoces como funciona esto... el que aporta detalles recibe soluciones y alternativas, el que no tiene dos opciones:
1. lamentarse
2. Ceder parte de su tiempo en explicar acabadamente su situación

Me parece fabuloso que estés dandole a esto de programación. Es admirable porque muchos cuando lo intentan y ven que las cosas no les va se tiran abajo...
Tu no te tiras abajo, nos tiras abajo. Posteo y inmediatamente posteas. Analiza primero en frio lo que te he dicho y luego adaptalo a tus necesidades.

Por hoy, lo dejamos. Vuelve en frio, y yo tambien.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 20
kbaby Va por buen camino
Lo siento por no saber expresarme, pero aquí esta todo. He montado el programa en un pispas puesto que no lo tengo en mi casa sino en el instituto. Así que aqui tienes mas o menos "mi proyecto" que en el instituto esta mucho mejor hecho.

http://rapidshare.com/files/11838241...ATICA.rar.html

Bajalo de ahí, y veras el problema al buscar algun item que contenga espacio y el problema al modificar una persona que esta en la tabla.

Gracias, más no se que poder ofrecerte.

Llevo toda la tarde, toda, toda pero no piyo nada ni lo saco por logica. Eso del I,J no lo comprendi bien, o eso creo. Voy a volver a leerlo.

Última edición por kbaby fecha: 28-05-2008 a las 21:58:41.
Responder Con Cita
  #8  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 20
kbaby Va por buen camino
Código Delphi [-]
ListBox1.Items[i] := StringGrid1.Cells[x,y];

Voy a comentarte. Segun ese codigo quiere decir que en el Item de posicion I (no se sabe, es una variable) se va a cambiar por la cadena que hay en la celda [x,y].

Pero ahora viene mi cuestion... siento ser tan pesado pero tengo muy poco tiempo y experiencia y por eso acudo aqui, a pedir ayuda y porque veo que es un sitio util ¿Cómo sabe el programa que vale I? Cuando yo pulse el button que le asigne el codigo, el no sabe que ITEM es... ni que CELDA he modificado. ... Eso es mi problema. 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 01:16:21
Ayuda con un codigo JoNieve C++ Builder 0 21-04-2007 13:27:33
Ayuda con error en codigo :-( jorgegetafe Varios 6 07-02-2007 20:29:04
Codigo de Barras.... Ayuda!!!!! adolfoz Varios 14 15-11-2006 18:13:55
Ayuda con código de barras ramiretor Varios 0 28-06-2003 01:42:58


La franja horaria es GMT +2. Ahora son las 18:09:55.


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