Ver Mensaje Individual
  #38  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 27
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