Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 26-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
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
  #22  
Antiguo 26-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
kbaby Va por buen camino
Entendido Gracias profe
Responder Con Cita
  #23  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
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
  #24  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
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
  #25  
Antiguo 28-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
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 19:24:26.
Responder Con Cita
  #26  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
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 19:57:48. Razón: informacion
Responder Con Cita
  #27  
Antiguo 28-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
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
  #28  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
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
  #29  
Antiguo 28-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
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
  #30  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
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 20:58:41.
Responder Con Cita
  #31  
Antiguo 28-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
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
  #32  
Antiguo 29-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
kbaby, antes que nada te recuerdo algo que tu habías dicho:
Cita:
Empezado por kbaby Ver Mensaje
y no puedo llevar algo que no haya yo enseñado.
Y esto lo hago no con la finalidad de ser pesado sino de hacerte notar de que muchas veces uno por ponerse a ser original termina descubriendo cosas que están fuera de nuestra comprensión y atentan con lo que estuvimos haciendo.

El que nos digas a nosotros que quieres hacer esto, hacer esto otro... y a riesgo de que nos saltes diciendo algo parecido a esto:

Cita:
Pero eso no lo vi en clase. ¿Hay una forma de hacerlo más fácil? No puedo usar algo que no me enseñaron.
Nos pone en una situación difícil. Porque sin conocer hasta donde llegan tus conocimientos no vamos a poder ayudarte.

Pusiste a disposición tu código fuente, lo estuve viendo... En cuanto a estética deja que desear, pero eso no es problema.
En cuanto a código... también deja que desear. Puede mejorarse.
Y es aquí donde voy a hacer una pausa para darte algunos consejos:
1. Declaración de variables. Debes declarar a tus variablesy controles de mejor manera. Un "l", un "t" no es adecuado. Termina confundiendo más. A veces es mejor tener un StringGrid1, que un t.
2. Mucho código puede reducirse y compartirse entre los controles. Aqui debo volver hacia lo que te dije al comienzo de este post: Al no saber hasta donde llegan tus conocimientos no sabría decirte y preguntarte el porqué no haces usos de procedimientos y funciones. Buena parte del código se ahorra teniendo funciones y procedimientos que hagan las tareas comunes e invocandolas cuando sea conveniente.

Cita:
Empezado por kbaby Ver Mensaje
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.
Creo que fui claro en mi post anterior. He dicho que cuando se hace el volcado desde el TListBox hacia el TStringGrid (te sugiero que empieces a llamar las cosas por su nombre, un StringGrid no es una tabla; es una rejilla en todo caso) perdemos la referencia hacia que elemento nos referimos.
Debido a ello es que cuando deseamos hacer el paso inverso no sabemos a quien atribuírsele.
¿Como se soluciona esto?
Lo he dicho en el post anterior: Una alternativa es que al volcar los datos, usar la primera columna para hacer referencia al índice en cuestión. De modo que con leer dicha celda sabemos a que índice o posición (ya sea del Apellido, DNI, o el que fuera) podemos aplicar el paso inverso valiendonos de un corrimiento por arriba y debajo de dicho indice.

No interesa si modificaste uno o varios campos. El proceso funciona igual. ¿Que importa si antes un campo tiene PEPE y lo sustituímos por PEPE? ¿Afectó en algo?
Si por cuestiones de "perfomance" deseas evitar recorrer todos los elementos, deberías llevar un registro de cuales son las celdas que han sido editadas. Y esto implicaría más código...
Y más código, sobre todo para ti y la funcionalidad que buscas, es más de lo que estarías dispuesto a hacer. Nuevamente volvemos a lo que te he dicho al inicio: ¿Cuanto sabes? ¿Que puedes usar? ¿Que no puedes usar?
¿Si te ofresco una solución, cuál es la probabilidad de que entiendas de lo que hablo?

Digo... si me baso en lo que pasó al explicarte sobre el uso de la función inc()... ¿que puedo esperar si te ofrezco un algoritmo que lleve registro de las celdas editadas y luego recorrerlas a fin de aplicar los cambios adecuados?
Un algoritmo como ese implica de una u otra forma el uso de una estructura de datos dinámica, ya sea que termine usando un array dinámico, un TList, un lo que sea.... lo más seguro es que termines diciendome nuevamente que no entiendes y/o que no viste nada de eso y no puedes usarlo.

kbaby, te he dicho que tus problemas están en la lógica. Y ahora lo veo también por la prisa que tienes de hacer tu "tarea".

Con respecto al error que dices, no me arroja error. El algoritmo que tienes funciona tanto para un apellido simple como para uno compuesto. Da lo mismo que pongas MARTINEZ que MARTINEZ VELASQUEZ. Si en el TListBox existe, lo encontrará. Lo acabo de probar, no alteré el código... FUNCIONA.

Habría que ver que es lo que realmente haz puesto tu, a lo mejor fue un despiste "de dedo".

kbaby, ¿Recuerdas como empezaste en el Club? Varios foristas salieron a tu ayuda y tu lograste dar con la solución.
¿Porqué no haces nuevamente eso? Analiza el problema, deja de pensar en TListBox, en TStringGrid.... borra de tu mente el código y piensa objetivamente sobre la raiz del problema. Olvidate de la PC, agarra un lapiz, y papel. Y describe tu problema. Todo en forma textual... ahora piensa un poco y redacta en la forma una solución.
¿Listo? Luego a cada oración, párrafo o idea buscale un sentido en programación.

Ese ejercicio te puede ayudar a comprender que los mayores problemas no están en el lenguaje sino en tu cabeza.
No es mi intensión llamarte tonto, ni nada de eso. Sino que lo que nos detiene a muchos aquí es que se meten en un código buscando que la idea se adapte a él, cuando es la inversa lo que debe suceder.

Hace tiempo te comunicaste conmigo pidiendome una opinión sobre que carrera te convenía. En vista a que quiere meterte en informática, y tal parece por lo que me comentaste, te gusta mucho esto de la programación.
No es por asustarte ¿pero sabes los golpes que nos damos a diario muchos aqui?
No pretendo decir que esto no es para cualquiera... porque no es ni lo uno ni lo otro.
Hazme caso kbaby... Piensa en frio. imagina a las cosas de manera más simple, buscale a los problemas una representación similar a algo real, algo que ya hayas resuelto. Incrementa tu habilidad de abstracción.
¿Me creerías si te digo que me imagino al TStringGrid como varias pilas de platos una al lado de la otra? ¿Me creerías si te digo que le encuentro al procedo del volcado inverso una analogía al proceso de desapilar las pilas de platos?

Si... tal vez te parezca que me he estado dando unos cuantos golpes y que he salido con unos extraños personajes de los años 70 que profetizaban la frase "paz y amor, viejo". Pero lo cierto es que prefiero no matarme buscando adaptar la idea al código, sino que la idea me de el código.

Lenguajes hay muchos, y cada uno te puede hacer más o menos fácil la vida. Y no tiene sentido que te aprendas el lenguaje.
Aqui muchos preferimos Delphi, a mi me gusta... pero ¿cuanto se de él? ¿Un 20%? ?Un 50%? ¡Pues que importa! si lo que realmente importa es resolver el problema....

Piensa en frio.
Tal vez estas palabras te sean rudas... No es mi intención que así sea.
Noto en ti muchas ganas de aprender y disfrutar de esto. Y ando buscando el modo de demostrarte, y creo que lo que ha estado sucediendo en este hilo lo está demostrando en parte, de que las cosas no se hacen de un día a otro.
A su tiempo.
Analiza en frio el problema, y mi propuesta. ¿Existe otra manera? Muy posiblemente. Me extraña que otros no se hayan animado a ofrecerte ayuda.

Esto si será rudo: No te voy a resolver el código, porque considero que allí no está el problema. Creo que hay un bosque que te tapa el arbol ¿O se trata de que un Arbol te tapa el bosque?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #33  
Antiguo 29-05-2008
Avatar de Fenareth
[Fenareth] Fenareth is offline
Miembro Premium
 
Registrado: oct 2007
Ubicación: Guadalajara, Jalisco, México
Posts: 494
Poder: 17
Fenareth Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
...Olvidate de la PC, agarra un lapiz, y papel. Y describe tu problema. Todo en forma textual... ahora piensa un poco y redacta en la forma una solución.
¿Listo? Luego a cada oración, párrafo o idea buscale un sentido en programación....
Para mí esta frase da exactamente en el clavo de lo que la programación es y resuelve, al final es un proceso de automatización y de manejo de información, pero no solucionará nada que no pueda ser resuelto por métodos convencionales y primitivos...

Si aún no encuentras esa respuesta convencional y primitiva cómo es que la automatizarás ? No puedes hacer más fácil algo que no sabes cómo se hace de ninguna manera...

El consejo que te da Delphius te permitirá darte cuenta de que el problema no es tan difícil como lo crees, simplemente te falta sentarte y realmente analizarlo...

Saludos
Responder Con Cita
  #34  
Antiguo 30-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
kbaby Va por buen camino
Bueno, yo he leido los dos post y pienso que entiendes como si yo no hiciera eso. Claro que lo hago, pero llega un momento que lo que yo he aprendido me pone una barrera que no me deja acceder a otras cosas. Yo solo puedo hacer cosas limitadas. Eso sí, nos dejaron indagar en libros, internet, foros, para aprender cosas nuevas e implantarlas en el proyecto final. Por eso estoy aquí, preguntando cosas de las que NUNCA he odio hablar.

Con respecto a la estetica... fue un programa que hice en 10 o 15 minutos rapidamente para que veas como lo tengo organizado en el aula de informatica... pero allí uso 3 formularios, imagenes, paneles.... En mi casa lo que hago es pensar en un codigo para luego, ponerlo allí, pues solo tengo 1 hora de informatica y alli no puedo pensarlo. En mi casa lo pienso y lo pruebo y me lo apunto en mi libreta de delphi.

Yo pienso que hago todo lo posible por aprender, no he llegado al extremo de imaginarme esas cosas que me dijiste el final, pero si a dibujarlo e intentar solucionar las cosas "dificiles" con procedimientos faciles...

Lo de "t" a la <rejilla> y lo de l al <listbox> tienen ese nombre porque así me enseño mi profesor. Nos dijo que para ser mas rapidos, usaramos variables cortas y facil de recordar... en ningun momento lo eleji yo.

Hoy estuve en informatica, ya me queda muy poco por acabar. Os cuento de lo que hace mi proyecto ^^
- Añade a personas (al listbox)
- Las modifica (aunque al modificar una, se borra todas del .txt).
- Puedes bucar a personas por DNI, apellidos, telefono (gracias Delphius).
- Puedes ver el estado del hotel (% de habitaciones ocupado, gente dentro...)
- Mi super boton close; (para salir :P)

¿Qué me queda?
- Arreglar lo de modificar a las personas y que se guarde.
- Poder buscar y ver en el StrinGrid1 (lo dije bien ehh) todas las personas que sus apellidos sean MARTINEZ LOPEZ y no solo, la primera.


Eso es todo.

Espero que no pienses que soy un vago que lo quiere todo hecho. Me he leido la caraocultadedelphi, el libro que me compre en la feria del libro por 1€ (si ese), he consultado en personas que saben (sin encontrar ayuda por parte de ellas), he venido al foro y entré, desde el primer miomento que di programacion. Yo tengo aun la idea en mi mente de poder ser informatico, alomejor programando no valgo (cosa que no me preocupa, intentare conseguir la meta) pero dentro de la informatica hay muchisimos campos.

Gracias.

PD: Lo de apellidos compuesto ya se porque me tiro error, por el error de "dedo".
Gracias

Última edición por kbaby fecha: 30-05-2008 a las 17:48:49.
Responder Con Cita
  #35  
Antiguo 30-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
kbaby Va por buen camino
Pues aquí, desde el último post, estaba indagando un codigo para borrar del LISTBOX a una persona que tengo volcada en un StringGrid. Pues el código que se me ocurrio fue este:

Código Delphi [-]
var a,i:integer;
begin
  a:=t.row;
  for i:= 0 to 3 do l.items.delete(a+i);

Pero el problema es el siguiente si mi listbox es:
0-dni
1-nombre
2-apellidos
3-telefono
4-(y asi, sucesivamente).

Lo que hara es borrar el dni y entonces "nombre" pasara a la posicion "0" y así todos bajan una. Por lo siguiente, al repetir el FOR, borrará a+1 "posicion 2" ... el telefono de la persona...

Bueno voy a seguir intentando sacar codigo (te estoy haciendo caso, con papel y lapiz).

--------------------Minutos despues.......---------------------------

Aquí estoy, se me iluminó la bombilla y... tachán! Mirad que código mas sencillo para borrar a una persona (dni,nombre,apellido,ciudad) sin borrar las otras.
Código Delphi [-]
var a,i:integer;
begin
  a:=t.row;
  l.items.delete(a-1);
  l.items.delete(a-1);
  l.items.delete(a-1);
  l.items.delete(a-1);

Última edición por kbaby fecha: 30-05-2008 a las 17:59:03.
Responder Con Cita
  #36  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por kbaby Ver Mensaje
Bueno, yo he leido los dos post y pienso que entiendes como si yo no hiciera eso. Claro que lo hago, pero llega un momento que lo que yo he aprendido me pone una barrera que no me deja acceder a otras cosas. Yo solo puedo hacer cosas limitadas. Eso sí, nos dejaron indagar en libros, internet, foros, para aprender cosas nuevas e implantarlas en el proyecto final. Por eso estoy aquí, preguntando cosas de las que NUNCA he odio hablar.
kbaby, en ningún momento te he dicho que seas flojo. Sino que estás un poco impaciente. Lo mejor es hacer las cosas a su ritmo.
Con respecto a lo que te había comentado antes, si te lo digo es porque al intentar explicarte el uso de inc() tu mismo dijiste que no puedes poner nada que no haya sido visto.

Y si no puedo estar seguro de que has visto o no haz visto... ¿de que modo te puedo ser de ayuda?

Ahora, si estás aqui con la finalidad de ver cosas nuevas y mejorar el código. Entonces, aquel comentario que mi hiciste sobre de que no puedes poner nada visto está de más y tus preguntas debieron hacerse de otro modo para que nosotros si te pudieramos ofrecer alternativas.
Por el modo en que redactabas tus dudas se vee reflejado el deseo de "apagar un incendio" y no de ver buscar alternativas.

Si para el trabajo final puedes poner otras cosas y sustituir algunos códigos te sugeriría que te evitaras ese código para abrir y guardar en el archivo.
Es mucho más cómodo el método LoadFromFile y SaveToFile del cual disponen tanto el TStringGrid como como el TListBox y te aseguras de que lo está "escrito" en pantalla se guardará.
También podría ser útil el uso de funciones y procedimientos.
Mucho código del cual empleas puede concentrarse en unas pocas funciones y/o procedimientos y con ello evitar repitir código.

En ocasiones tener un:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Indice: integer;
begin
  Indice:= BuscarPaciente(Edit1.Text; BUSCAR_POR_DNI);
  if Indice <> -1
    then ...
    else MessageBox(....)
end;

Es mucho más conveniente que estar implementando en varios controles el mismo o similar código. En este ejemplo, BuscarPaciente es una función que recibe en el primer parámetro el texto a buscar, el segundo parámetro es una constante definida y sirve para establecer el criterio de búsqueda.
Si Se diseña un algoritmo que busque por cualquier criterio, puede usarse en distintas partes y sin ningún cambio, sólo basta con suministrar el criterio adecuado.

El algoritmo que te yo te di como ejemplo puede fácilmente ser adaptado a esta necesidad con unos pocos cambios.

[quote=kbaby;290150]
Con respecto a la estetica... fue un programa que hice en 10 o 15 minutos rapidamente para que veas como lo tengo organizado en el aula de informatica... pero allí uso 3 formularios, imagenes, paneles.... En mi casa lo que hago es pensar en un codigo para luego, ponerlo allí, pues solo tengo 1 hora de informatica y alli no puedo pensarlo. En mi casa lo pienso y lo pruebo y me lo apunto en mi libreta de delphi.
[/delphi]
El comentario que te hice sobre estética no fue con la intención de atacar. Sino un comentario que debe ser tomado con ligereza. Si lees bien, he dicho: "pero ese no es el problema".

Y no lo es porque yo pongo atención a la lógica y no a la pantalla... Yo dejo la interfaz para el último, y si tengo que ir haciendola, la hago burdamente.
Sólo lo hice para recordarte de que al final debes mejorarla.
El problema de la gran mayoría de los sistemas es de lógica y no de interfaz. Por eso a mi poco me importa como se vea... fue un simple recordatorio para cuando termines.


Cita:
Empezado por kbaby Ver Mensaje
Yo pienso que hago todo lo posible por aprender, no he llegado al extremo de imaginarme esas cosas que me dijiste el final, pero si a dibujarlo e intentar solucionar las cosas "dificiles" con procedimientos faciles...
Ninguno nace aprendiendo.
Yo no me creo genio, ni un experto. Esta profesión, como cualquier otra requiere de constancia. Y las cosas no salen de un día a otro.
De hecho, hay un algoritmo que yo todavía lo tengo trabado (pero gracias a Dios, no es vital) y el compañero Seoane me lo dió vueltas en una patada.
Hay cosas que nos salen, otras que no.
Y con el tiempo comprenderás que lo que cuesta ahora en un futuro lo verás como (perdón por la palabra) una estupidez.

Yo te he recalcado algo: analizalo en frio.
Y es así porque he notado que en el momento en que posteabas te quedabas esperando a que posteara. Y ni bien yo posteaba no pasaban muchos minutos y ya había un post tuyo diciendo que tenías problemas para entender mis propuestas.
Algunas veces las soluciones no se hallan en minutos ni en días. Aprenderás esta lección cuando estés estudiando en la universidad y/o salgas a la calle.
No desesperes, porque es lo último que debes perder.


Cita:
Empezado por kbaby Ver Mensaje
Lo de "t" a la <rejilla> y lo de l al <listbox> tienen ese nombre porque así me enseño mi profesor. Nos dijo que para ser mas rapidos, usaramos variables cortas y facil de recordar... en ningun momento lo eleji yo.
Es cierto lo que te comenta el profesor. Es preferible variables cortas. ¿Pero una sola letra?
kbaby, los extremos son peligrosos: Muchas son muchas, pocas son pocas.
¿Te gusta leer esto?:

Código Delphi [-]
ComboQueTieneLosHorariosDeLosPacientes.ItemIndex := 5;

¿Y esto otro?:
Código Delphi [-]
a.Expr := '(5 x %2');

En el primero tenemos un caso en que hay demasiado información. En el segundo en el que hay poca.
Mientras que el primer caso se sobre entiende que se trata de un Combo, en el segundo, No sabemos que es a, y el porqué existe lo que pareciera ser una Propiedad llamada Expr que vaya a saber que hace.

Lamento decirlo pero tu profesor tiene razón parcialmente.

Cita:
Empezado por kbaby Ver Mensaje
Hoy estuve en informatica, ya me queda muy poco por acabar. Os cuento de lo que hace mi proyecto ^^
- Añade a personas (al listbox)
- Las borra (la que tu quieras)
- Las modifica (aunque al modificar una, se borra todas del .txt).
- Puedes bucar a personas por DNI, apellidos, telefono (gracias Delphius).
- Puedes ver el estado del hotel (% de habitaciones ocupado, gente dentro...)
- Mi super boton close; (para salir :P)

¿Qué me queda?
- Arreglar lo de modificar a las personas y que se guarde.
- Poder buscar y ver en el StrinGrid1 (lo dije bien ehh) todas las personas que sus apellidos sean MARTINEZ LOPEZ y no solo, la primera.
Me alegra saber que te queda poco.
Creo que te he dado buenas pistas. ¿Las repasamos desde tu punto de vista como la entiendes? Yo entiendo el problema... hace falta que aquí comprendamos tu visión de la propuesta.
Te propongo que redactes lo que entiendes de mi propuesta.

Para el caso de la búsqueda de todos los pacientes con determinado apellido, el algoritmo que tienes en volcar te debe ser de orientación.
De hecho haste esta pregunta ¿Que diferencia existe entre volcar toda la información de un TListBox de volcar sólo la que coincide con cierto criterio?

Una pista más:
Por "cada item" hacer:
1. ¿Es igual a criterio?.
1.1. SI: entonces agreamos sus datos a la rejilla
1.2. NO: entonces no hacemos nada.

Lo de guardar los datos es la inversa de volcar. Pasar lo que haya en el TStringGrid hacia el TListBox. He aquí que para hacerlo debemos contemplar una situación que ya he explicado y me gustaría "oir" que es lo que entiendes y no entiendes de mi propuesta. ¿Cómo te lo estabas imaginando?



Cita:
Empezado por kbaby Ver Mensaje
Espero que no pienses que soy un vago que lo quiere todo hecho. Me he leido la caraocultadedelphi, el libro que me compre en la feria del libro por 1€ (si ese), he consultado en personas que saben (sin encontrar ayuda por parte de ellas), he venido al foro y entré, desde el primer miomento que di programacion. Yo tengo aun la idea en mi mente de poder ser informatico, alomejor programando no valgo (cosa que no me preocupa, intentare conseguir la meta) pero dentro de la informatica hay muchisimos campos.

Gracias.
No pienso que eres vago, sino que estás apresurado. Y ello ye hace no ver las cosas del mejor modo.
Es bueno que leas libros, son de ayuda. Pero en los libros es posible que no encuentres la receta para preparar el algoritmo para buscar más de un paciente. Esto, lamentablemente, se aprende por ensayo y error.

Yo me vivo dando golpes con código kbaby... por algo he dicho y sigo sosteniendo: es una actividad mental, muy humana. Y al ser humanos, nos vemos movidos por miles de cosas.

Me alegro que sientas la convicción y ganas de estudiar sobre informática.
No digo que seas mal programador. Nunca he dicho eso...
Sólo te digo estas cosas para que te prepares, mentalmente, para cuando tengas dificultades.
No es agradable darse golpes... hay que aprender a vivir con ellos. Y no sólo en la vida profesional, sino en lo personal, en lo anímico, en lo sentimental, en lo existencial.

Muy cierto que la informática es amplia, y como te había comentado por MP: debes informarte y asesorarte bien sobre que del amplio abanico de posibilidades deseas enfocarte.

Yo no prefiero darte código kbaby... y me parece que es la decisión adecuada. Porque es necesario que logres ver donde está el problema... el porque te cuesta hallar el paso inverso (StringGrid a TListBox). Creeme que es lo mejor para ti, porque no sólo te sentirás mejor por encontrar tu mismo hecho el algoritmo sino porque comprenderás al problema y lograrás formular una solución.

Y creeme que te digo que la solución está en tus narices. Cuando la encuentres dirás, posiblemente algo como esto: "Pero que g... que soy. Si había sido una tontera".

¿Que diferencia a un TListBox de un TStringGrid?
Pues yo veo a un TStringGrid como una varios TListBox horizontales, uno debajo del otro.
ListBox1: [0][1][2][3][4]
ListBox2: [0][1][2][3][4]
....
ListBoxN: [0][1][2][3][4]

Puede que eso te sirva de ayuda.

Cita:
Empezado por kbaby Ver Mensaje
PD: Lo de apellidos compuesto ya se porque me tiro error, por el error de "dedo".
Gracias
No hay de que agradecer.
Puede que esa metida de dedo sea por impaciencia...

Hazme caso... redacta la comprensión que tienes de mis propuestas y vemos ¿Si?

No te sientas atacado. Si asi te has sentido, lo lamento, disculpa.
Lo que quiero es hacerte ver que esto es mucho más mental que lo que algunos piensan.
Y si deseas irte por las ingenierías, con más razón. Yo diría que repases por las dudas un poco de matemática, física y química. ¿Porqué crees que en los primeros años de la carrera verás más números que a la PC? ¿Sólo para hacer a las carreras más duras? ¿Porque son relleno? Cada materia tiene su propósito, no sólo forma parte de la cultura general.

kbaby, te deseo que tengas triunfos en la carrera. No cometas el mismo error que yo: no desesperes por unas cuantas LDC (lineas de código).

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

Última edición por Delphius fecha: 30-05-2008 a las 19:38:27. Razón: modificar etiqueta quote mal colocada
Responder Con Cita
  #37  
Antiguo 30-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
kbaby Va por buen camino
Cool

Antetodo... vaya pedazo de texto... tienes que escribir muy rápido jaja. Bueno vamos al grano.

Lo de que me ves impaciente es por el tiempo que tengo. Estamos en exámenes finales en España porque es final de curso. El proyecto queda una semana y me siento agobiado por el tiempo y por todo lo que me gustaría ponerle y nose.

Con respecto a que no puedo usar nada de lo que no me hayan enseñado... es hasta un punto cierto. Yo puedo llevar un algoritmo "un cacho codigo, como yo lo llamo" a clase y exponerlo pero el profesor me preguntará... y bien... ¿por qué pusiste lo de inc(indice)? Al no saber la respuesta, el profesor puede que piense este chico no ha hecho el proyecto, se lo han hecho. Y no quiero que piense eso, para nada. Yo pido ayuda, pido información y comprension. Para poderle decir que:

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

es lo mismo que

Código Delphi [-]
a:= indice + 1;

pero de una manera mas "correcta" creo yo.


Una cosa que me gustaría preguntar del código que tengo para buscar es que significa la línea:

Código Delphi [-]
if Indice <> -1

Exactamente, ¿qué es eso de <> - 1? Sí tiene que comprobar que coincida... ese número qué hace ahí?.

Con respecto a lo de usar variables largas o cortas, seguiré tu consejo para mi proyecto. Lo intentaré cambiar, jaja.

Referente a lo de volcar al StrinGrid y volcar del StrinGrid al Listbox, sé cuales la diferencia, pero no se cómo. Yo me imaginaba un código que sea algo así:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Indice: integer;
begin
  Indice:= BuscarPaciente(Edit1.Text; BUSCAR_POR_APELLIDOS);
  if Indice <> -1
    then // bueno ahora yo pienso que debería encontrar la persona que tiene el apellido ese y volcar toda su información, pero cuando termine, seguir buscando hasta el final de la lista por si hay otra persona con ese mismo apellido y así volcarla.

Yo me acuerdo de haber utilizado el comando eof(f) pero para el botón de "recuperar" de mi listbox.


Con respecto a lo de utilizar otras formas de cargar/guardar cosas en el listbox estoy con mis orejas abiertas (más bien ojos) para escuchar lo que me expliques, mientras pueda explicarlo yo, puedo usarlo.

Cita:
¿Que diferencia a un TListBox de un TStringGrid?
Pues yo veo a un TStringGrid como una varios TListBox horizontales, uno debajo del otro.
ListBox1: [0][1][2][3][4]
ListBox2: [0][1][2][3][4]
....
ListBoxN: [0][1][2][3][4]
No se me abía ocurrido, lo veía una cosa totalmente.... muy diferente xD.

Espero que esto te sirva de ayuda para ayudarme o intentar que yo piense

Saludos,gracias.
Responder Con Cita
  #38  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por kbaby Ver Mensaje
Antetodo... vaya pedazo de texto... tienes que escribir muy rápido jaja. Bueno vamos al grano.
Algo. No mucho pero hago mi esfuerzo para escribir rápido. Lamentablemente no estoy demasiado acostumbrado a escribir sin mirar el teclado. Me cuesta un poco. Este texto lo escribí sin mirar. El truco está en usar la mayor candidad de dedos posibles, aunque,yo utilizo solamente entre 4 y 6 de los dedos cuanto mucho.

Cita:
Empezado por kbaby Ver Mensaje
Lo de que me ves impaciente es por el tiempo que tengo. Estamos en exámenes finales en España porque es final de curso. El proyecto queda una semana y me siento agobiado por el tiempo y por todo lo que me gustaría ponerle y nose.
Un motivo de impaciencia. Y si te sientes así... pues... Prepárate para la carrera. Se que no suena agradable pero es así.

Cita:
Empezado por kbaby Ver Mensaje
Con respecto a que no puedo usar nada de lo que no me hayan enseñado... es hasta un punto cierto. Yo puedo llevar un algoritmo "un cacho codigo, como yo lo llamo" a clase y exponerlo pero el profesor me preguntará... y bien... ¿por qué pusiste lo de inc(indice)? Al no saber la respuesta, el profesor puede que piense este chico no ha hecho el proyecto, se lo han hecho. Y no quiero que piense eso, para nada. Yo pido ayuda, pido información y comprension. Para poderle decir que:


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


es lo mismo que

[delphi]a:= indice + 1;
[delphi]



pero de una manera mas "correcta" creo yo.
Entendido. Pues comiezo de nuevo.

Inc() es una función. Y lo que hace es sumar a la variable que pases como parámetro cierta cantidad. Pero inc() tiene una particularidad, el segundo parámetro que recibe (la cantidad) puede ser omitido. ¿Que significa omitido? Que si no se pasa algún valor asume uno por defecto. Este valor por defecto es 1. Inc entonces se resume a esto:

Código Delphi [-]
variable := variable + cantidad;

De modo que si pones
Código Delphi [-]
inc(variable);
Obtienes lo mismo que hacer

Código Delphi [-]
Variable := variable + 1;

O igual a:

Código Delphi [-]
inc(variable,1);

Si pones 2, en vez de sumarle 1, suma 2.

¿Se entiende? Si te fijas. En una ocasión no paso el segundo parámetro, pero en los otros si. Si deseo que el incremento sea distinto a 5, entonces debo suministrar el segundo parámetro.

Cita:
Empezado por kbaby Ver Mensaje
Una cosa que me gustaría preguntar del código que tengo para buscar es que significa la línea:


Código Delphi [-]
if Indice <> -1


Exactamente, ¿qué es eso de <> - 1? Sí tiene que comprobar que coincida... ese número qué hace ahí?.
Para ello deberías entender el funcionamiento o la estructura de un TListBox, y otros componentes similares.
Los métodos de busqueda, por lo general devuelven un índice o una referencia sobre la posición que tienen en la lista.
Y la mayoría de estas listas comienzan a contar desde cero.

Si lees la ayuda sobre IndexOf() y/o otros métodos de busqueda notarás que se devuelve el valor -1 en caso de no encontrarse el elemento.

Por ello una vez buscado, se hace dicha comprobación para tomar las acciones necesarias en caso haberse encontrado y/o no encontrado.

Cita:
Empezado por kbaby Ver Mensaje
Con respecto a lo de usar variables largas o cortas, seguiré tu consejo para mi proyecto. Lo intentaré cambiar, jaja.
A la larga te beficiará.

Cita:
Empezado por kbaby Ver Mensaje
Referente a lo de volcar al StrinGrid y volcar del StrinGrid al Listbox, sé cuales la diferencia, pero no se cómo. Yo me imaginaba un código que sea algo así:


[delphi]procedure TForm1.Button1Click(Sender: TObject);
var Indice: integer;
begin Indice:= BuscarPaciente(Edit1.Text; BUSCAR_POR_APELLIDOS); if Indice <> -1
then // bueno ahora yo pienso que debería encontrar la persona que tiene el apellido ese y volcar toda su información, pero cuando termine, seguir buscando hasta el final de la lista por si hay otra persona con ese mismo apellido y así volcarla.


Yo me acuerdo de haber utilizado el comando eof(f) pero para el botón de "recuperar" de mi listbox.
Bueno... volvamos desde el comienzo...

Este caso de búsqueda es un tanto peculiar. Puesto los métodos de búsqueda devuelven la primera coincidencia.

Necesitamos que se recorra la lista. Eso lo sabemos... ¿Cómo?
Tu comprendes que el orden de los datos en la lista tiende a "repetirse" cada 4 lugares.
Independientemente de cual seal el campo buscado (DNI, Nombre, Apellido, Ciudad), debemos hacer "saltos" de 4 en 4. para ir hacia la información correspondiente de una persona a otra.
Si nos basamos en ello podemos hacer un algoritmo que haga lo siguiente:

Supongamos que buscamos por apellido. El primer apellido a localizar está en la posición 2. Si icrementamos 2 en 4, nos ponemos en el apellido de la segunda persona ¿No es cierto?
¿Me sigues?

Entonces, por cada salto, comparamos si en dicha posición el contenido del listBox es igual al buscado.
Si es igual entonces sabemos que dos posiciones antes (si buscamos por apellido) encontraremos el DNI. Una posición antes, el nombre, la que le sigue corresponde a ciudad.
Por tanto, esos datos son agregados.

¿Cuando termina el algoritmo? Cuando la variable que usamos para ir saltanto por los indices es mayor a la cantidad de elementos del ListBox.

Dentro de ese texto que te he redactado. Esta el algoritmo. Ve si tu lo descubres. Sino volvemos.

Ahora, ¿cual es el probema cuando volcamos estos datos?
Que cuando lo hacemos no sabemos si al final nos referimos a los datos de la primera persona (cuyos datos ocupan los 4 primeros lugares en el TListBox), de la segunda (cuyos datos ocupan los siguientes 4), o de la vigesima...
¿Porqué? Porque en ningún momento de la búsqueda guardamos en algún lugar que esta persona es la primera, es la segunda, la que sea...

¿Cómo lo planteo yo?
Fácil:
Cuando encontramos una coincidencia en el algoritmo anteriormente descripto, lo primero que guardo (en la primera columna del StringGrid) es dicha posición o índice. Por ejemplo, si encontré una condicencia en la posición 6. Guardo en la primera columna ese 6. Los demás datos van en las siguientes columnas.

Bueno... ese el volcado.
Ahora, el paso inverso.

Lo primero que hago, es leer la primera columna. Encuentro el 6.
Entonces, si el criterio de búsqueda fue por apellido, se que los demás datos de esta fila corresponden a los datos que se ubican en las posiciones 4, 5, 6 y 7.
¿De donde obtuve esos números? Fácil:
Si el 6 el dato correspondiente al apellido, entonces se que el DNI está dos lugares antes ( 6 - 2). El nombre está un lugar antes: ( 6 - 1), El apellido entonces está en 6. Y la ciudad en la siguiente posición ( 6 + 1).

Solo me queda hacer:

ListBox1.Items[4] := StringGrid1.Cells[2,1].
...
ListBox1.Items[7] := StringGrid1.Cells[5,1].

¿Porqué desde 2? Recuerda que en la primera, estabamos guardando indice del apellido asociado a dicha persona.

¿Que hago ahora?
Me desplazo a la segunda fila y repito el proceso:
Leo lo que que hay en la primera columna, y veo.... digamos que es 14. Si hacemos cuenta... se que esta es la tercera persona de la lista. Cuyo datos abarcan la posiciones 12, 13, 14 y 15.

Por tanto... me queda que:
ListBox1.Items[12] := StringGrid1.Cells[2,2];
...
ListBox1.Items[15] := StringGrid1.Cells[5,2];

Nota la diferencia... si bien en el StringGrid, estamos en la segunda fila... sabemos que en el ListBox esta es la tercera persona.

¿Cuando finaliza el algoritmo?
Cuando se ha lkegado al final del StringGrid.

Entonces, de esta manera, consigues sólo traspasar los datos de aquellas personas que estén en el StringGrid hacia el ListBox.
En realidad no interesa si sólo modificó una vocal, todos los campos... si antes decia Pepe, y no se modificó se sobrescribe con Pepe. Y si ahora dice Ana, va a decir Ana.

¿Cúal es el requisito fundalmental de todo esto?
Que no se llame al método Clear del TListBox. Porque eso borra todo, y por tanto se pierden referencia a los datos. Allí tienes una falla.

Tu algoritmo de guardar debe recorrer los elementos del ListBox e ir guardandolos. Creo que eso no te resultará un problema.

No lo llames a menos que se trate de abrir otros datos. Y si lo haces debes asegurarte de "limpiar" lo que tengas en el STringGrid porque se tratan de datos nuevos.

Cita:
Empezado por kbaby Ver Mensaje
Con respecto a lo de utilizar otras formas de cargar/guardar cosas en el listbox estoy con mis orejas abiertas (más bien ojos) para escuchar lo que me expliques, mientras pueda explicarlo yo, puedo usarlo.


No se me abía ocurrido, lo veía una cosa totalmente.... muy diferente xD.

Espero que esto te sirva de ayuda para ayudarme o intentar que yo piense

Saludos,gracias.
Bueno... eso eso lo puedes ver para más adelante.

Eso es todo por el momento.


Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #39  
Antiguo 30-05-2008
Avatar de kbaby
kbaby kbaby is offline
Miembro
 
Registrado: oct 2007
Ubicación: Granada
Posts: 178
Poder: 17
kbaby Va por buen camino
Vale Delphius aquí estuve pensando pero creo que con tus palabras ya me das todo "machacado" aunque yo sea duro y no me entere. He hecho un nuevo código para que busque el DNI de la persona y lo pase a la tabla. Sólo busca a una persona, a la primera, pero no importa, lo que quiero hacer es que funcione el código hecho por mi. Aquí te lo pongo y me dices si tienes erratas, porque se me ejecuta el programa, pincho en el boton y ... "no hace nada ".

---> CORRECCIÓN: Ya si me funciona y me busca a la persona !!! Bien !!! el fallo estaba en el signo > del while que antes puse < jaja.

Código Delphi [-]
procedure TForm1.Button12Click(Sender: TObject);
var salto:integer ;
begin
  salto:=0;
  while l.items.count > salto do
     If edit7.text = l.Items[salto] then begin
          t.cells[salto+1,1]:=l.Items[salto];
          t.cells[salto+2,1]:=l.items[salto+1];
          t.cells[salto+3,1]:=l.items[salto+2];
          t.cells[salto+4,1]:=l.items[salto+3];
          inc(salto,4);
          end;



end;
end.

Ya tengo un boton de BUSCAR creado por mi jojojo gracias tio.

Última edición por kbaby fecha: 30-05-2008 a las 22:44:26.
Responder Con Cita
  #40  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Kbaby, vas entiendo.... el error está en que salto debe recibir inialmente el valor igual a la posición - 1 del campo a buscar. Es decir que:
Si estamos buscando Apellido, Salto debe valer incialmente 2.
Si estamos buscando Nombre, Salto debe valor inicialmente 1.
Si estamos buscando DNI, Salto debe valer inicialmente 0.
Si estamos buscando Ciudad, Salto debe valor inicialmente 3.

Recuerda que StrinGrid comienza en cero por ello:
[0] -> DNI
[1] -> Nombre
...
[3] -> Ciudad

el inc(salto,4) debe hacerse fuera del IF. Ten presente que por más que encuentre, o no... debe seguir recorriendo la lista.

Otro problema, estás sobreescribiendo la primera fila. Necesitas de otra variable, que se incremente en 1 sólo cuando haya una coincidencia, de modo que con Cells[salto +- ?,otra_variable] se consiga ir iterando fila a fila en cada condidencia.

Creo que con esto ya lo tienes.
Ya te lo di bastante regalado.

EDITO:
Otra cosa que veo, es que como dije antes, además de esos campos necesigas guardar el valor de salto para tener referencia e implementar el algoritmo de volcado inverso (desde el STringGrid hacia el TListBox).

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

Última edición por Delphius fecha: 30-05-2008 a las 22:48:11.
Responder Con Cita
Respuesta



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:12:15.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi