| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 01 Ene, 2004 2:52 pm Asunto: List Index out of bounds(266) |
|
|
Este es el error que salta en mi aplicación y no entiendo el porqué . Se que normalmente este error salta cuando se intenta acceder a un valor que está fuera de un rango determinado, pero no logro averiguar donde está ese rango ni de qué valor se trata, en el entorno de desarrolo me dice que es un "EStringListError", es la única pista que tengo, y a continuación os pongo el código en el cual me salta:
//En el OnConnect de un TNMPOP3....
StatusBar1->Panels->Items[1]->Text = "Conectado";
AnsiString ruta = ExtractFilePath(Application->ExeName);
lista->Items->Clear();
Memo1->Lines->Clear();
barra->Progress = 0;
barra->Visible = false;
int i = NMPOP31->MailCount;
barra->MaxValue = NMPOP31->MailCount;
TListItem *ite;
AnsiString recibido;
barra->Visible = true;
for (int a=1;a<=i;a++){
if (NMPOP31->Connected==true){
TStringList *liste = new TStringList;
StatusBar1->Panels->Items[2]->Text = NMPOP31->Status;
NMPOP31->GetMailMessage(a);
ite = lista->Items->Add(); //Aquí me salta el error.
ite->ImageIndex = 0;
ite->Caption = NMPOP31->MailMessage->From;
ite->SubItems->Add(NMPOP31->MailMessage->Subject);
ite->SubItems->Add(IntToStr(NMPOP31->MailMessage->Attachments->Count));
ite->SubItems->Add(NMPOP31->MailMessage->MessageId);
liste->AddStrings(NMPOP31->MailMessage->Head);
recibido = liste->Strings[3].TrimLeft();
ite->SubItems->Add(recibido);
barra->Progress++;
try {
NMPOP31->MailMessage->Attachments->SaveToFile(ruta+"\entrante\\"+"lista"+IntToStr(a)+".txt");
NMPOP31->MailMessage->Body->SaveToFile(ruta+"\entrante\\"+IntToStr(a)+".txt");
NMPOP31->MailMessage->Body->SaveToFile(ruta+"\entrante\\"+IntToStr(a)+".html");
}
catch (EFCreateError &E){
NMPOP31->Abort();
NMPOP31->Disconnect();
Application->MessageBoxA("Se produjo un error al procesar el mensaje actual, la recepción de mensajes quedará retenida.",
"Error en el mensaje",MB_OK|MB_ICONSTOP);
}
delete liste;
}
}
/*Es la segunda vez que topo con este problema y en la primera ya tuve que abandonar , espero tener más suerte esta vez.
AH! y Mucha salud para todos en este nuevo año .*/ _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Jue 01 Ene, 2004 3:49 pm Asunto: |
|
|
¿Que añades a la lista?
| Código: |
ite = lista->Items->Add(); //Aquí me salta el error.
|
Dentro del Add debería haber un AnsiString a añadir a la lista. además esa asignación es un poco extraña, pues lista->Items->Add devolverá un número indicando la posición donde se ha añadido a la lista. Y sin embargo en tu codigo ite no es un entero. Luego creo que algo lo estas haciendo mal.
¿Que reprensenta en tu programa lista?
ciao y Feliz Año tuqui. _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 01 Ene, 2004 5:42 pm Asunto: |
|
|
Gracias Xyvy por tu interés , a ver si me explico:
lista es un TListView (inicialmente vacío), previamente a la entrada al bucle he creado un objeto de la clase TListItem con la siguiente línea:
TListItem *ite;
y según se recorre el bucle voy añadiendo items al TListView, los items que se añaden son de la nueva clase creada.
ite = lista->Items->Add();
el método Add() espera un objeto de la clase TListItem por lo que la asignación se hace con la línea anterior. Esta forma de añadir los items la aprendí de este foro así que seguramente habrá alguien que lo sepa explicar mejor. Saludos. _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
Publicado: Jue 01 Ene, 2004 7:39 pm Asunto: |
|
|
Hola!
Un error del tipo "out of bounds" salta porque tratas de acceder a más elementos de los que en realidad tiene la lista. Es decir, supón que tienes un TListBox con 3 elementos, estos iran numerados desde el 0 al 2 y si tratas de acceder un un elemento que no existe te dará el error. Por ejemplo:
| Código: |
for(int x=0;x<ListBox->Items->Count;x++)
ShowMessage(ListBox->Items->Strings[x]);
|
Esto funcionará bien pero si el for lo cambias por:
| Código: |
for(int x=0;x<ListBox->Items->Count+1;x++)
|
Te dará el error List index out of bounds(3) . Comprueba bien en tu código que no tratas de acceder a un elemento que no existe en la lista
Espero haberme explicado bien y que te hasyas orientado un poco del posible error. |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 01 Ene, 2004 9:45 pm Asunto: |
|
|
Gracias Marky, pero ya tenía mas o menos claros esos conceptos. Siguiendo tu consejo he repasado la composición del "FOR" y creo que la tengo bien:
fot (int a=1;a<=i;a++){
//Rellenamos el TListView...
}
Donde i corresponde al NMPOP3->MailCount.
Sigo con el problema . _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 01 Ene, 2004 11:26 pm Asunto: |
|
|
he llegado a la conclusión de que es muy posible de que el fallo esté en el servidor de correo, ya que el error saltaba justo al intentar abrir el mensaje número 46.
Tras borrar un montón de mensajes y dejar la bandeja de entrada únicamente con 41 mensajes el programa ya funciona OK y no salta el error de marras. También y antes de borrar mensajes probé a cambiar el bucle "FOR" por un "While" y también saltaba el mismo error por eso sigo creyendo que el fallo no es del código, lo cual no quiere decir que tal vez exista un código capaz de saltarse ese error.
Todas las ideas serán bienvenidas, gracias. _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Jue 01 Ene, 2004 11:31 pm Asunto: |
|
|
Tienes razón perdona Tuqui, por eso pregunté que era lista pues si era una TStringList estaba mal, pero claro no lo es, luego debe estar correcto.
Me podrías decir que vale la variable i cuando te salta el error si depuras el bucle con paso a paso.
Tus valores mínimo y maximo para el bucle son correctos de cara a leer todos los mensajes pues en la ayuda de GetMailMessage, especifica claramente de 1 a MailCount, aunque quizás suceda el error en los TList precisamente por eso.
Por favor si lo depuras mira a ver que vale la i.
Ciao y suerte. _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 02 Ene, 2004 2:56 pm Asunto: |
|
|
Hey XyVy , la variable " i " la utilizo para almacenar el valor de MailCount al principio y antes de entrar en el bucle, por tanto ese valor en teoría no debe alterarse durante la ejecución de dicho bucle, de hecho lo he comprabado y así es: el valor es siempre el mismo (la cuenta del total de mensajes en la bandeja de entrada).
De todas formas a día de hoy el número de mensajes se ha incrementado sobrepasando otra vez el número en el cual antes me daba el error y ya no lo da, debe haber brujas por algún lado . _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Vie 02 Ene, 2004 3:19 pm Asunto: |
|
|
Entiendo Tuqui, aunque mi pregunta no era por saber si el valor superaba o no superaba el MailCount, sino saber en que numero concreto te daba el error.
En fín sino te dá, pues nada, pero hay que intentar no dejar las cosas al azar, y depurar los errores para corregirlos adecuadamente, porque vale imaginate que tienes muchos mensajes, quizás no te salte el error, pero y si estas haciendo una aplicación y luego se la vas a pasar a un usuario a priori no sabes que comportamiento va a tener el programa si dejas el error sin controlar.
En fin hagas lo que hagas suerte!! _________________ OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins. |
|
| Volver arriba |
|
 |
|