• Miércoles 24 de Abril de 2024, 02:18

Autor Tema:  Mostrar Datos En Un Tlistview Mediante Un Bucle  (Leído 2463 veces)

Ziara

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Mostrar Datos En Un Tlistview Mediante Un Bucle
« en: Miércoles 23 de Enero de 2008, 10:52 »
0
Hola a todos, querría saber cómo mostrar datos en un TListView de un bucle for que va generando unos datos, en Builder C++, pongo un ejemplo:

tengo en un Unit2.h

Código: Text
  1. class Recorrer
  2. {
  3.  private:
  4.           String cadena;
  5.  public:
  6.           void FuncionRec();
  7.           String DevCadena(void){return cadena;}
  8. }
  9.  

tengo un un Unit2.cpp

Código: Text
  1. void Recorrer::FuncionRec()
  2. {
  3.     int i;
  4.     for(i=0; i<5; i++)
  5.     {
  6.       cadena = "hola mundo";
  7.       cadena2="adios mundo";
  8.     }
  9. }
  10.  
  11.  

Y ahora en el Form1 del Unit1 agrego el componente TListView y en Unit.cpp:

Código: Text
  1. Recorrer *re = new Recorrer();
  2. re->FuncionRec();  //llamo a la funcion que contiene el for
  3.  
  4. TListItem *Itema;
  5. Itema = ListView1->Items->Add();
  6. Itema->Caption = re->DevCadena();
  7. Itema->SubItems->Add(re->DevCadena2());
  8.  
  9. delete re;
  10.  


Pero con lo anterior sólo me muestra el contenido del for una vez, ¿cómo se podría hacer que se mostrase las veces indicadas en la variable i? Porque he visto que hay una propiedad Count de Items que es para cuando recorres un TListView, pero si inicialmente no tengo nada en TListView no tengo nada que recorrer no?

saulillo

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: Mostrar Datos En Un Tlistview Mediante Un Bucle
« Respuesta #1 en: Miércoles 23 de Enero de 2008, 12:26 »
0
Hola.

haber, si no creo mal, tienes una funcion llamada recorrer, con un bucle for. El bucle se ejecuta unas 5 veces y cada vez haces q cadena valga "hola mundo" y cadena2 "adios mundo". Si haces una traza veras q si i=0, cadena="hola mundo", cadena2="adios mundo"; i=1, cadena="hola mundo", cadena2="adios mundo"; i=2...

Si quieres q lo muestre cada vez q entres al for, tendras q poner el ListView1->Items...  dentro del for.

Lo siento sino me he explicado bien, si no lo entiendes avisas e intento explicarlo mejor.

Ziara

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Mostrar Datos En Un Tlistview Mediante Un Bucle
« Respuesta #2 en: Miércoles 23 de Enero de 2008, 12:48 »
0
Hola de nuevo y gracias por contestar tan rápido,

Citar
haber, si no creo mal, tienes una funcion llamada recorrer, con un bucle for. El bucle se ejecuta unas 5 veces y cada vez haces q cadena valga "hola mundo" y cadena2 "adios mundo". Si haces una traza veras q si i=0, cadena="hola mundo", cadena2="adios mundo"; i=1, cadena="hola mundo", cadena2="adios mundo"; i=2...

Cierto, es lo que hace la funcion FuncionRec que es un método de la class Recorrer.

Citar
Si quieres q lo muestre cada vez q entres al for, tendras q poner el ListView1->Items... dentro del for.

Vale.. eso lo pillo, pero el problema es que la class está de un Unit2 y el Formulario (Form1) que contiene mi TListView está en un Unit1 y si incluyo las declaraciones del ListView en el Unit2 me da el siguiente error:

[C++ Error] Unit2.cpp(1): Unable to invoke Code Completion due to errors in source code


Tiene que haber alguna forma de mostrar los cinco reglones en el TListView del Unit1 llamando a la función que está en Unit2 no? alguna idea?

Espero haberme explicado bien.

Ziara

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Mostrar Datos En Un Tlistview Mediante Un Bucle
« Respuesta #3 en: Miércoles 23 de Enero de 2008, 13:57 »
0
El fallo está en que en:

Código: Text
  1. void Recorrer::FuncionRec()
  2. {
  3.    int i;
  4.    for(i=0; i<5; i++)
  5.    {
  6.      cadena = "hola mundo";
  7.      cadena2="adios mundo";
  8.    }
  9. }
  10.  

se va machacando las variables cadena y cadena 2 por lo cual cuando en el Unit1 se llama a:

Código: Text
  1. Recorrer *re = new Recorrer();
  2. re->FuncionRec();  //llamo a la funcion que contiene el for
  3.  
  4. TListItem *Itema;
  5. Itema = ListView1->Items->Add();
  6. Itema->Caption = re->DevCadena();
  7. Itema->SubItems->Add(re->DevCadena2());
  8.  
  9. delete re;
  10.  

únicamente muestra la última iteración en el ListView.

Hay alguna forma en un for de preservar los mismas variables sin que se machaquen y así poder mostrarla en el ListView, o si no... alguna alternativa?

giropau

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Mostrar Datos En Un Tlistview Mediante Un Bucle
« Respuesta #4 en: Domingo 27 de Enero de 2008, 20:57 »
0
Es raro que si incluyes el Unit1.h en el Unit2 te de ese error. Siempre lo he echo así y me funciona, debe ser que hay alguna otra cosa mal que salta cuando haces el include. Otra cosa que podrias hacer es hacer un array y que cada vuelta del bucle llene una posicion diferente. En tu caso serian dos arrays o una tabla bidimensional. Si lo haces así en el unit1 tendrias que hacer otro bucle para mostrar los valores. no se si es la mejor forma pero es una idea.

Ziara

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Mostrar Datos En Un Tlistview Mediante Un Bucle
« Respuesta #5 en: Lunes 28 de Enero de 2008, 11:07 »
0
Hola de nuevo

ya solucioné ese problema, si... es que soy tan lista que no sabía que se tenía que incluir el Unit1.h en la cabecera del Unit2.cpp  :rolleyes: Tengo lo siguiente:

en un Unit2.cpp:

Código: Text
  1. void Recorrer::FuncionRec()
  2. {
  3. int num=0;
  4.      TListItem * Itema;
  5.      for(int i = 0; i<5; i++)
  6.      {
  7.         num++;
  8.         cadena = "hola mundo" + (AnsiString(num));
  9.         cadena2= "adios mundo" + (AnsiString(num));
  10.         Itema = Form1->ListView1->Items->Add();
  11.         Itema->Caption = cadena;
  12.         Itema->SubItems->Add(cadena2);
  13.  
  14.      }
  15. }
  16.  

y en un Unit1.cpp llamo a la función:

Código: Text
  1. Recorrer *re = new Recorrer();
  2.  
  3. re->FuncionRec();
  4.  
  5. delete re;
  6.  

tal y como está ahora el código, hasta que no termina de hacer las cinco iteraciones no aparece en el ListView1 los datos, es decir, que sale "todo de golpe, las cinco iteraciones".

Pero yo quiero que vaya saliendo las iteraciones una a una, a media que se vaya ejecutando el código, dicho de otra manera, cuando se ejecuta la primera iteración, que aparezca ya el primer renglón en el ListView, cuando se ejecuta la segunda que aparezca el segundo reglon y así sucesivamente. ¿Alguna idea?

gracias