Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Mostrar informacion en un ListView

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Mostrar informacion en un ListView Responder citando

Hola a todos,

Estoy implementando un sniffer en Builder c++ y tengo una función donde va recibiendo paquetes y yo en esos paquetes puedo ir sacando información, como dir IP origen, destino, protocolo... Ahora, de alguna forma tengo que sacar esos datos y lo más ajustado mi idea, es un ListView con ViewStyle: vsReport, donde viene cada columna (IP origen, IP destino...) y fila a fila iría mostrando los datos de los paquetes sniffados.

Corregirme si me equivoco con ello y en cualquier caso, como muestro la información?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Depende de si quieres definir las columnas sobre la marcha o no. Si las columnas las tienes definidas puedes hacer esto:
Código:
TListItem *pItem;
pItem = ListView1->Items->Add();
pItem->Caption = IpOrigen;
pItem->SubItems->Add(IpDestino);

Si además quieres definir las columnas:
Código:
TListColumn *pColumn;
TListItem *pItem;
pColumn = ListView1->Columns->Add();
pColumn->Caption = "IP Origen";
pColumn = ListView1->Columns->Add();
pColumn->Caption = "IP Destino";

El resto sería igual.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola,

eso más o menos lo tenía claro, de momento tengo esto:

en un Unit2.cpp

Código:
void Recorrer::FuncionRec()
{
int num=0;
     TListItem * Itema;
     for(int i = 0; i<5>ListView1->Items->Add();
        Itema->Caption = cadena;
        Itema->SubItems->Add(cadena2);

     }
}


supongamos que la función for por cada iteración me saca un paquete, en realidad sería la función pcap_next_ex, y que en cadena y cadena 2 me va sacando la ip origen y destino de dicho paquete.

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

Código:
Recorrer *re = new Recorrer();

re->FuncionRec();

delete re;


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.

Ya que si estoy capturando paquetes estaría bien que a cada paquete capturado se vaya mostrando la información en el ListView y no tener que esperar a que termine de capturar "X"paquetes para poder visualizar toda la información. Además, cuando pasa eso, la aplicación parece que se cuelga un poquito o va algo lento y eso que estoy probando con capturar 4 paquetes. Sad

Alguna idea? gracias por adelantado.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdonar, hubo un error en el Unit2.cpp sería lo siguiente:

Código:
void Recorrer::FuncionRec()
{
int num=0;
     TListItem * Itema;
     for(int i = 0; i<5>ListView1->Items->Add();
        Itema->Caption = cadena;
        Itema->SubItems->Add(cadena2);

     }
}


el for como la función pcap_next_ex() que captura los paquetes
cadena es un AnsiString que almacena el valor de IP origen
cadena2 otro AnsiString que almacena el valor de IP destino
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No se que pasa, que cuando limito el código por la opción CODE me sale "arreguntao" ... en fin:

lo que hay dentro del for es:
Código:

    {
        num++;
        cadena = "hola mundo" + (AnsiString(num));
        cadena2= "adios mundo" + (AnsiString(num));
        Itema = Form1->ListView1->Items->Add();
        Itema->Caption = cadena;
        Itema->SubItems->Add(cadena2);

     }


y el for -------> for(int i = 0; i<5; i++)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Cita:
No se que pasa, que cuando limito el código por la opción CODE me sale "arreguntao" ... en fin:

Debes marcar la opción "Deshabilitar HTML en este mensaje" para que no confunda los "< >" con etiquetas HTML. También puedes deshabilitarlo para todos los mensajes en las opciones de tu perfil.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

zankiu escribió:
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".

El problema es, que mientras estas dentro del bucle no se puede procesar la cola de mensajes de la aplicación. Para forzar a que se procese debes usar la línea siguiente (o bien cambiar el diseño del programa para no tener que esperar dentro de un bucle que dure demasiado):
Código:
Application->ProcessMessages();

Un ejemplo:
Código:
for (int i = 0; i < 5; i++)
{
    ListView1->Items->Add()->Caption = "Prueba";
    // Si no añadimos la línea siguiente los cambios
    // no se visualizaran hasta que acabe el bucle
    Application->ProcessMessages();
    Sleep(1000);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, gracias por la corrección, no tenia ni idea.

Y con el
Código:

Application->ProcessMessages();


lo que se consigue es que el mismo "reglón" va cambiando, pero me interesaría que a cada iteración del for mostrada por el ListView1 se escriba (no sobrescriba) a medida que va haciéndose las iteraciones. Me imagino que con el código que he mostrado no se puede hacer eso... alguien puede orientarme un poco de cómo poder hacer dicha implementación?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Podrías poner todas las partes del código donde se haga referencia al ListView ? (No olvides marcar la casilla "Deshabilitar HTML en este mensaje" para que se vea correctamente).
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Estoy usando el ejemplo que he estado poniendo aqui para hacer las pruebas, creo que la idea es la misma.

tengo un Unit2.cpp, donde incluyo Unit1.h en la cabecera para poder acceder al ListView1 que está contenido en un Form1 de Unit1
Código:

void Recorrer::FuncionRec()
{
int num=0;
     TListItem * Itema;
     for(int i = 0; i<5; i++)
     {

        num++;
        cadena = "hola mundo" + (AnsiString(num));
        cadena2= "adios mundo" + (AnsiString(num));
        Itema = Form1->ListView1->Items->Add();
        Itema->Caption = cadena;
        Itema->SubItems->Add(cadena2);

     }
}


supongamos que la función for por cada iteración me saca un paquete, en realidad sería la función pcap_next_ex, y que en cadena y cadena 2 me va sacando la ip origen y destino de dicho paquete.


y en el Unit1.cpp

Código:

Recorrer *re = new Recorrer();

re->FuncionRec();

delete re;


Y como habia dicho anteriormente, tal y como está, me muestra las cinco iteraciones de golpe en el ListView1, y lo que quiero es que me muestre en el ListView1 las iteraciones una a una a medida que se vaya haciendo las iteraciones y que no se vayan machacando sino que se vaya mostrando un reglón tras otro.

Supongo que para lo que necesito no va por aqui los tiros...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Estas seguro que no tienes ninguna otra referencia a ese ListView en el código? es que según te entiendo lo que ocurre es que cada vez es como si borraras el contenido (ListView1->Clear(); ) y volvieras a rellenarlo en vez de irse añadiendo al final.

Si pruebas el código que puse más arriba y lo repites veras que volverá a añadir las siguientes entradas al final sin borrar las anteriores, que es lo que supongo que quieres. Pero en el trozo de código que has puesto aparentemente está bien.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola de nuevo,

Cita:
Estas seguro que no tienes ninguna otra referencia a ese ListView en el código?


No tengo más referencias al ListView, y es cierto, me aparece todas las iteraciones, pero hasta que no sale del for no me aparece las iteraciones en el ListView, pero lo que busco es que me vaya a apareciendo una a una a medida que se vaya haciendose, no se si me explico.

Cita:
Si pruebas el código que puse más arriba y lo repites veras que volverá a añadir las siguientes entradas al final sin borrar las anteriores, que es lo que supongo que quieres.


Ya lo probé pero con

Código:
Application->ProcessMessages();
Sleep(1000);


dentro del for sí que me va machacando las variables.

de todas formas gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

El ’Sleep’ no hay que utilizarlo, lo puse en el ejemplo solo para provocar un retardo para que se vea el efecto. Solo es necesario 'Application->ProcessMessages();' y lo único que hace es forzar a que se procese la cola de mensajes mientras estas dentro del bucle, de otro modo solo se procesaría después de salir del bucle.

Igual que usando el ejemplo en un proyecto vacio funciona en tu código debería funcionar, por eso te preguntaba si estabas seguro de que no hay ninguna otra referencia en el código a ese ListView, porque en lo que muestras aparentemente está todo bien.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.