Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Access violation in module rtl100.bpl en Win7

Estas en el tema de Access violation in module rtl100.bpl en Win7 en el foro de C/C++ en Foros del Web. Hola, Tengo una aplicación que usa ZEOSDBO, creación y destrucción dinámica de TImage, TLabel y TEdit dentro de un TScrollBox, un componente simple que usa ...
  #1 (permalink)  
Antiguo 06/11/2011, 18:37
 
Fecha de Ingreso: noviembre-2011
Mensajes: 8
Antigüedad: 13 años
Puntos: 0
Access violation in module rtl100.bpl en Win7

Hola,

Tengo una aplicación que usa ZEOSDBO, creación y destrucción dinámica de TImage, TLabel y TEdit dentro de un TScrollBox, un componente simple que usa FindFirstChangeNotification (TfisFileNotification de FISH 2000) y un TTimer.

Se debe mover una TImage ubicada en un TScrollBox origen hacia otro TScrollBox destino, cuando hago el seguimiento del código del evento OnDragDrop del TScrollBox destino, el procedimiento termina sin error (el seguimiento lo hago con BDS 2006), pero cuando ejecuto la aplicaci{on en W7 me salta el error "Access violation at address 2000697A in module 'rtl100.bpl'. Read of address EFEFEFBF"

Este error no salta en XP

Nota: W7 es de 64 bits

El objetivo de este TForm es:
  1. El usuario selecciona un directorio que contiene una o más imágenes en formato JPEG BMP y WMF
  2. Por cada imagen, la redimensiona a 200px de altura y su proporción en ancho
  3. Carga la miniatura en sbxEsc (TScrollBox origen)
  4. El usuario arrastra una imagen desde sbxEsc hasta sbxDoc (para conformar las imágenes que compondrán el documento) Acá salta el error

Este es el código (sbxDoc es el TScrollBox origen y sbxEsc es el TScrollBox destino):

Código c++:
Ver original
  1. //---------------------------------------------------------------------------
  2.  
  3. void __fastcall TfrmEscMas::sbxDocDragDrop(TObject *Sender, TObject *Source,
  4.     int X, int Y)
  5. {
  6.     try
  7.     {
  8.         int val_tag = ((TImage*)Source)->Tag;
  9.         AnsiString nomComp = ((TImage*)Source)->Parent->Name;
  10.  
  11.         if (((TImage*)Source)->Parent->Name == "sbxEsc")
  12.         {
  13.             TImage *img = new TImage(sbxDoc);
  14.             img->Parent = sbxDoc;
  15.  
  16.             img->Height = ((TImage*)Source)->Height;
  17.             img->Width = ((TImage*)Source)->Width;
  18.             img->Left = X;
  19.             img->Top = ESPACIO_SUP_IMG;
  20.             img->Constraints->MaxHeight = ANCHO_MAX_IMAGEN;
  21.             img->Constraints->MaxWidth  = ALTO_MAX_IMAGEN;
  22.  
  23.             img->AutoSize       = true;
  24.             img->Center         = true;
  25.             img->Proportional = true;
  26.             img->DragMode      = dmAutomatic;
  27.  
  28.             img->Picture->LoadFromFile(dirTempEscMas + "\\mini_" + ((TImage*)Source)->Hint);
  29.  
  30.             img->Hint = ((TImage*)Source)->Hint;
  31.             img->ShowHint = true;
  32.             img->Tag = 0;
  33.  
  34.             img->OnDragDrop  = imgSbxDocDragDrop;
  35.             img->OnDragOver  = imgSbxDocDragOver;
  36.             img->OnMouseDown = OnImageMouseDown;
  37.  
  38.             img->Refresh();
  39.  
  40.             for (int i = (sbxEsc->ControlCount-1); i > -1; i--)
  41.             {
  42.                 if (sbxEsc->Controls[i]->Hint == img->Hint)
  43.                 {
  44.                     TImage* img = (TImage*)sbxEsc->Controls[i];
  45.                     try { sbxEsc->RemoveControl(img); } catch (...) { ; }
  46.                     try { img->Picture->Bitmap->FreeImage(); } catch (...) { ; }
  47.                     try { img->Free(); } catch (...) { ; }
  48.                 }
  49.             }
  50.             reubicarImagenesPorDoc(sbxDoc);
  51.             reubicarImagenesPorDoc(sbxEsc);
  52.         }
  53.         else if (((TImage*)Source)->Parent->Name == "sbxDoc")
  54.         {    // mueve la imagen de lugar dentro del sbxDoc
  55.             // asigna la posicion del mouse donde fue soltado
  56.             ((TImage*)Source)->Left = X;
  57.             reubicarImagenesPorDoc(sbxDoc);
  58.         }
  59.  
  60.         lblImgPend->Caption = IntToStr(contarImgEnSbxEsc()) + " Imagenes pendientes";
  61.     }
  62.     __finally
  63.     {
  64.         Application->ProcessMessages();
  65.     }
  66. }
  67.  
  68. //---------------------------------------------------------------------------
  69.  
  70. typedef class IdxPosImg : public TObject
  71. {
  72. public:
  73.     int IDX;
  74.     int Pos;
  75.     AnsiString Ruta;
  76. } TIdxPosImg;
  77. typedef TIdxPosImg *PIdxPosImg;
  78.  
  79. //---------------------------------------------------------------------------
  80.  
  81. void TfrmEscMas::reubicarImagenesPorDoc(TScrollBox *sbx, TList *olst)
  82. {
  83.     TObjectList *lst = new TObjectList;
  84.     PIdxPosImg datos;
  85.     int idx, pos=(sbx->HorzScrollBar->Position*(-1))+ESPACIO_ENTRE_IMG; // posicion izquierda inicial
  86.     EstadoImagen est;
  87.  
  88.     lst->OwnsObjects = true;
  89.  
  90.     try
  91.     {
  92.         for (int i = 0; i < sbx->ControlCount; i++)
  93.         {
  94.             if (AnsiString(sbx->Controls[i]->ClassName()) == AnsiString("TImage"))
  95.             {
  96.                 datos = new TIdxPosImg;
  97.                 // anota el indice y la posicion de cada uno
  98.                 AnsiString Hint = sbx->Controls[i]->Hint;
  99.                 AnsiString Left = sbx->Controls[i]->Left;
  100.                 datos->IDX  = sbx->Controls[i]->Tag;
  101.                 datos->Pos  = sbx->Controls[i]->Left;
  102.                 datos->Ruta = sbx->Controls[i]->Hint;
  103.                 // agrega los datos al TObjectList
  104.                 lst->Add(datos);
  105.                 datos = NULL;
  106.             }
  107.         }
  108.  
  109.         lst->Sort(FuncOrdenar); // ordena los componentes en base a la posicion
  110.  
  111.         for (int i = 0; i < lst->Count; i++) // recorre la TObjectList ordenada
  112.         {
  113.             // para cada componente en el TScrollBox
  114.             for (int j = 0; j < sbx->ControlCount; j++)
  115.             {
  116.                 // si el indice del componente de la TObjectList
  117.                 // es igual al indice del componente del TScrollBox
  118.                 if ((((PIdxPosImg)lst->Items[i])->Ruta == sbx->Controls[j]->Hint) &&
  119.                     (AnsiString(sbx->Controls[j]->ClassName()) == AnsiString("TImage")))
  120.                 {
  121.                     // le asigna la posicion izquierda al componente del TScrollBox
  122.                     sbx->Controls[j]->Left = pos;
  123.                     for (int k = 0; k < sbx->ControlCount; k++)
  124.                     {
  125.                         AnsiString hint  = sbx->Controls[k]->Hint;
  126.                         AnsiString ruta  = sbx->Controls[j]->Hint;
  127.                         AnsiString clase = AnsiString(sbx->Controls[k]->ClassName());
  128.                         if ((sbx->Controls[j]->Hint == sbx->Controls[k]->Hint) &&
  129.                             (AnsiString(sbx->Controls[k]->ClassName()) == "TLabel"))
  130.                             sbx->Controls[k]->Left = pos;
  131.                     }
  132.  
  133.                     // anota la proxima posicion
  134.                     pos += ANCHO_MAX_IMAGEN + ESPACIO_ENTRE_IMG;
  135.                 }
  136.             }
  137.         }
  138.     }
  139.     __finally
  140.     {
  141.         try { lst->Clear(); } __finally { ; }
  142.         try { lst->Free(); } __finally { ; }
  143.     }
  144. }
  145.  
  146. //---------------------------------------------------------------------------

Agradezco cualquier ayuda o sugerencia.

Saludos.

Última edición por LucasBols; 06/11/2011 a las 18:41 Razón: [highlight]

Etiquetas: access, clase, const, module, string, violation, win7
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:17.