| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Mie 23 Ene, 2008 6:14 pm Asunto: Mostrar informacion en un ListView |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 24 Ene, 2008 11:02 am Asunto: |
|
|
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 |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 28 Ene, 2008 10:45 am Asunto: |
|
|
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.
Alguna idea? gracias por adelantado. |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 28 Ene, 2008 11:02 am Asunto: |
|
|
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 |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 28 Ene, 2008 11:16 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 28 Ene, 2008 3:34 pm Asunto: |
|
|
| 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 28 Ene, 2008 4:14 pm Asunto: |
|
|
| 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 |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 28 Ene, 2008 4:55 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 28 Ene, 2008 5:12 pm Asunto: |
|
|
| 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 |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 28 Ene, 2008 5:35 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 28 Ene, 2008 6:17 pm Asunto: |
|
|
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 |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Mar 29 Ene, 2008 10:43 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 29 Ene, 2008 11:11 am Asunto: |
|
|
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 |
|
 |
|