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 30-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
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
  #2  
Antiguo 30-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
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
  #3  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
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
  #4  
Antiguo 30-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
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
  #5  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 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
  #6  
Antiguo 30-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
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
  #7  
Antiguo 30-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
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
  #8  
Antiguo 30-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
Fin del problema (no del hilo).

Aquí tengo el codigo made in kbaby para buscar a todos los que tienen el mismo DNI (o lo que sea).

Código Delphi [-]
procedure TForm1.Button5Click(Sender: TObject);
var salto,casilla:integer ;
begin
  panel2.visible:=false;
  edit3.Visible:=false;
  button5.Visible:=false;
  salto:=0;
  casilla:=0;
  while l.items.count > salto do begin
     If edit3.text = l.Items[salto] then begin
          t.cells[1,casilla+1]:=l.Items[salto];
          t.cells[2,casilla+1]:=l.items[salto+1];
          t.cells[3,casilla+1]:=l.items[salto+2];
          t.cells[4,casilla+1]:=l.items[salto+3];
          t.rowcount:=t.rowcount+casilla;
          inc(casilla);
          end;
     inc(salto,4);
     end;
end;

Funciona de maravilla jajaja.

He añadido al código un contador el de t.rowcount porque conforme encuentre a una persona la mesa en la tabla y aumente una fila.

Ahora lo siguiente que voy a hacer, es una vez volcado en la tabla (una persona o dos o las que sean) si la modifico, guardarla y que no se borren las otras. YeahhH!!!!

Última edición por kbaby fecha: 30-05-2008 a las 23:14:28. Razón: El código fallaba porque el inc estaba en lugar equivocado, gracias Delphius.
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 04:31:41.


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