Hola amigos, ahora estoy ya intentando mejorar la aplicación y en vez de usar (nothrow) quiero usar try catch y en la siguiente funcion lo hago pero no se si hace lo que yo quiero ¿podeis decirme si se me pasa algo y ayudarme a corregirla?
Código PHP:
int __fastcall TForm2::CrearDivisionesImagen(TStringList *Divisiones, AnsiString RutaActual, int maxHeight, int maxWidth)
{
int auxMaxHeight, auxMaxWidth, divisiones = 0;
if(maxHeight == 0 || maxWidth == 0)
{
MessageBox(Application->Handle, "El tamaño del papel seleccionado no es válido. Usa A5, A4, o A3", "Error", MB_OK |MB_ICONERROR | MB_APPLMODAL);
divisiones = -3;
}
else
{
try
{ //Aqui divido la imagen en archivos mas pequeños
Graphics::TBitmap *bmp = new Graphics::TBitmap();
try
{
TRect src;
int i1,i2,j1,j2;
// Cargar imagen
bmp->LoadFromFile(RutaActual);
// Recorrer y crear las imagenes pequeñas
for(int i = 1, auxMaxWidth = bmp->Width; auxMaxWidth > 0;i++, auxMaxWidth -= maxWidth)
{
i1 = (i-1) * maxWidth;
i2 = i * maxWidth;
for(int j = 1, auxMaxHeight = bmp->Height; auxMaxHeight > 0; j++, auxMaxHeight -= maxHeight)
{
try
{
// nueva imagen
Graphics::TBitmap *bmpij = new Graphics::TBitmap();
// proteccion
try
{
bmpij->Width = maxWidth;
bmpij->Height = maxHeight;
j1 = (j-1) * maxHeight;
j2 = j * maxHeight;
src = Rect(i1,j1,i2,j2);
// Mismo formato
bmpij->PixelFormat = bmp->PixelFormat;
// Copiar a la imagen pequeña el "trozo" correspondiente
bmpij->Canvas->CopyRect(bmpij->Canvas->ClipRect, bmp->Canvas, src);
//Guardo las rutas de las divisiones en RutasDivisiones
Divisiones->Add( AnsiString().sprintf("%soutput_%d_%d.bmp", ExtractFilePath(Application->ExeName), i,j));
// Grabar
bmpij->SaveToFile(Divisiones->Strings[Divisiones->Count-1]);
AsignarImagen(Divisiones->Strings[Divisiones->Count-1]);
delete bmpij;
bmpij = NULL;
divisiones++;
}
catch(...)
{
delete bmpij;
delete bmp;
Application->MessageBoxA("Hubo un error al dividir las imagenes. Error desconocido. La aplicación se cerrará.", "Error", MB_OK | MB_ICONERROR);
divisiones = -2;
}
}
catch(...)
{
Application->MessageBoxA("Hubo un error al dividir las imagenes. No hay memoria suficiente.\nLa aplicación se cerrará.", "Error", MB_OK | MB_ICONERROR);
delete bmp;
divisiones = -1;
}
}
}
}
catch(...)
{
delete bmp;
Application->MessageBoxA("Hubo un error al dividir las imagenes. Error desconocido. La aplicación se cerrará.", "Error", MB_OK | MB_ICONERROR);
divisiones = -2;
}
delete bmp;
}
catch(...)
{
Application->MessageBoxA("Hubo un error al dividir las imagenes. No hay memoria suficiente.\nLa aplicación se cerrará.", "Error", MB_OK | MB_ICONERROR);
divisiones = -1;
}
}
return divisiones;
}
La idea es que divida la imagen y eso ya lo hacia pero ahora lo que quiero es que si hay cualquier error la funcion termine y retorne el valor que asigno a "divisiones", esté donde esté en la funcion, da igual que esté dentro de un for o no, tiene que salir retornando el valor que asigno a "divisiones". Los mensajes que pongo no van ahi sino que lo gestiono al salir de la aplicacion dependiendo del retorno pero los he puesto ahi para que lo veais mas claro.