PDA

Ver la Versión Completa : TListView:mostrar datos desde un bucle


Ziara
18-01-2008, 13:41:17
Hola, estoy probando sacar unos datos desde un bucle mediante el TListView, pero sólo he conseguido que se muestre la primera fila de datos, con esto:


TListItem * Itema;
Itema = ListView1->Items->Add();
//for(int i = 0; i<5; i++){
Itema->Caption = "tema1";
Itema->SubItems->Add("tema2");
//}


tal como está el código me muestra:

colum1 colum2 (esto es la cabecera)
tema1 tema2

pero, aun dejando el for sin comentar y suponiendo que asi debería sacarme cinco filas de datos tal como:

colum1 colum2 (esto es la cabecera)
tema1 tema2
... ...
tema1 tema2

NO lo hace, que estoy haciendo mal? :confused:

gracias

dec
18-01-2008, 14:10:09
Hola,

Es curioso, porque, creo que el problema está en usar la misma variable. Creo que esta instrucción:


Itema = ListView1->Items->Add();


... debería estar dentro del bucle. En Delphi podría usarse la magia del "width", que creo que no existe en C++ Builder:


for i := 0 to 5 do begin
with ListView.Items.Add do begin
Caption := 'Tema 1';
SubItems.Add('Subtema 1');
end;
end;


Aunque lo hago de memoria y puede que esté equivocándome, creo que por ahí van los tiros. ;)

Ziara
18-01-2008, 15:17:18
Tienes razón, eso funciona, gracias!

y... entonces si quisiera sacar los datos en un TListView como antes pero los datos los genera un bucle for o while como se haría?

dec
18-01-2008, 15:20:32
Hola,

Para "sacar" los datos del "TListView" (si entiendo bien) debes recorrer sus elementos o "items". Fíjate que la propiedad "Items" tiene a su vez una propiedad "Count". Se trata de recorrer los elementos, sabiendo que la cuenta empieza desde 0 hasta "Count -1".

Gabo
18-01-2008, 18:24:09
Ejemplo de insertar datos en un TListView:


while (!DataModule->DataSource->DataSet->Eof)
{
TListItem* lista= lvSalas->Items->Add();
lista->Caption=DataModule->DataSource->DataSet->FieldByName("CLIENTE_CODIGO")->AsString;
lista->SubItems->Add(DataModule->DataSource->DataSet->FieldByName("CLIENTE_NOMBRE")->AsString);
DataModule->DataSource->DataSet->Next();
}



Ejemplo de recorrer un TListView:


for (int i=0; i < ListView1->Items->Count; i++)
{
...=ListView1->Items->Item[i]->Caption;
...=ListView1->Items->Item[i]->SubItems [0][0];
}

Ziara
22-01-2008, 14:15:33
Hola otra vez, he estado mirando los códigos y en:


while (!DataModule->DataSource->DataSet->Eof)
{
TListItem* lista= lvSalas->Items->Add();
lista->Caption=DataModule->DataSource->DataSet->FieldByName("CLIENTE_CODIGO")->AsString;
lista->SubItems->Add(DataModule->DataSource->DataSet->FieldByName("CLIENTE_NOMBRE")->AsString);
DataModule->DataSource->DataSet->Next();
}
creo que

!DataModule->DataSource->DataSet

será como un archivo donde contiene los datos y mediante TListView los vas mostrando en pantalla.

Pero yo querría cómo mostrar datos en un TListView de un bucle for que va generando unos datos, pongo un ejemplo:
tengo en un Unit2.h


class Recorrer
{
private:
String cadena;
public:
void FuncionRec();
String DevCadena(void){return cadena;}
}
tengo un un Unit2.cpp


void Recorrer::FuncionRec()
{
int i;
for(i=0; i<5; i++)
{
cadena = "hola mundo";
cadena2="adios mundo";
}
}
Y ahora en el Form1 del Unit1 agrego el componente TListView y en Unit.cpp:


Recorrer *re = new Recorrer();
re->FuncionRec(); //llamo a la funcion que contiene el for

TListItem *Itema;
Itema = ListView1->Items->Add();
Itema->Caption = re->DevCadena();
Itema->SubItems->Add(re->DevCadena2());

delete re;
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 la propiedad Count de Items es para cuando recorres un TListView, pero si inicialmente no tengo nada :confused:

Ziara
23-01-2008, 13:59:17
El fallo está en que:

class Recorrer
{
private:
String cadena;
public:
void FuncionRec();
String DevCadena(void){return cadena;}
}se va machacando las variables cadena y cadena 2 por lo cual cuando en el Unit1 se llama a:

Recorrer *re = new Recorrer();
re->FuncionRec(); //llamo a la funcion que contiene el for

TListItem *Itema;
Itema = ListView1->Items->Add();
Itema->Caption = re->DevCadena();
Itema->SubItems->Add(re->DevCadena2());

delete re;ú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?