Ver Mensaje Individual
  #1  
Antiguo 18-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
Dudas con una funcion y el uso de try catch

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.
Responder Con Cita