• Viernes 19 de Abril de 2024, 15:14

Autor Tema:  Access violation in module rtl100.bpl en Win7  (Leído 2024 veces)

LucasBols

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Access violation in module rtl100.bpl en Win7
« en: Lunes 7 de Noviembre de 2011, 01:24 »
0
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

  • El usuario selecciona un directorio que contiene una o más imágenes en formato JPEG BMP y WMF
  • Por cada imagen, la redimensiona a 200px de altura y su proporción en ancho
  • Carga la miniatura en sbxEsc (TScrollBox origen)
  • 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: [Seleccionar]
//---------------------------------------------------------------------------

void __fastcall TfrmEscMas::sbxDocDragDrop(TObject *Sender, TObject *Source,
    int X, int Y)
{
    try
    {
        int val_tag = ((TImage*)Source)->Tag;
        AnsiString nomComp = ((TImage*)Source)->Parent->Name;

        if (((TImage*)Source)->Parent->Name == "sbxEsc")
        {
            TImage *img = new TImage(sbxDoc);
            img->Parent = sbxDoc;

            img->Height = ((TImage*)Source)->Height;
            img->Width = ((TImage*)Source)->Width;
            img->Left = X;
            img->Top = ESPACIO_SUP_IMG;
            img->Constraints->MaxHeight = ANCHO_MAX_IMAGEN;
            img->Constraints->MaxWidth  = ALTO_MAX_IMAGEN;

            img->AutoSize       = true;
            img->Center         = true;
            img->Proportional = true;
            img->DragMode      = dmAutomatic;

            img->Picture->LoadFromFile(dirTempEscMas + "\\mini_" + ((TImage*)Source)->Hint);

            img->Hint = ((TImage*)Source)->Hint;
            img->ShowHint = true;
            img->Tag = 0;

            img->OnDragDrop  = imgSbxDocDragDrop;
            img->OnDragOver  = imgSbxDocDragOver;
            img->OnMouseDown = OnImageMouseDown;

            img->Refresh();

            for (int i = (sbxEsc->ControlCount-1); i > -1; i--)
            {
                if (sbxEsc->Controls[i]->Hint == img->Hint)
                {
                    TImage* img = (TImage*)sbxEsc->Controls[i];
                    try { sbxEsc->RemoveControl(img); } catch (...) { ; }
                    try { img->Picture->Bitmap->FreeImage(); } catch (...) { ; }
                    try { img->Free(); } catch (...) { ; }
                }
            }
            reubicarImagenesPorDoc(sbxDoc);
            reubicarImagenesPorDoc(sbxEsc);
        }
        else if (((TImage*)Source)->Parent->Name == "sbxDoc")
        {    // mueve la imagen de lugar dentro del sbxDoc
            // asigna la posicion del mouse donde fue soltado
            ((TImage*)Source)->Left = X;
            reubicarImagenesPorDoc(sbxDoc);
        }

        lblImgPend->Caption = IntToStr(contarImgEnSbxEsc()) + " Imagenes pendientes";
    }
    __finally
    {
        Application->ProcessMessages();
    }
}

//---------------------------------------------------------------------------

typedef class IdxPosImg : public TObject
{
public:
    int IDX;
    int Pos;
    AnsiString Ruta;
} TIdxPosImg;
typedef TIdxPosImg *PIdxPosImg;

//---------------------------------------------------------------------------

void TfrmEscMas::reubicarImagenesPorDoc(TScrollBox *sbx, TList *olst)
{
    TObjectList *lst = new TObjectList;
    PIdxPosImg datos;
    int idx, pos=(sbx->HorzScrollBar->Position*(-1))+ESPACIO_ENTRE_IMG; // posicion izquierda inicial
    EstadoImagen est;

    lst->OwnsObjects = true;

    try
    {
        for (int i = 0; i < sbx->ControlCount; i++)
        {
            if (AnsiString(sbx->Controls[i]->ClassName()) == AnsiString("TImage"))
            {
                datos = new TIdxPosImg;
                // anota el indice y la posicion de cada uno
                AnsiString Hint = sbx->Controls[i]->Hint;
                AnsiString Left = sbx->Controls[i]->Left;
                datos->IDX  = sbx->Controls[i]->Tag;
                datos->Pos  = sbx->Controls[i]->Left;
                datos->Ruta = sbx->Controls[i]->Hint;
                // agrega los datos al TObjectList
                lst->Add(datos);
                datos = NULL;
            }
        }

        lst->Sort(FuncOrdenar); // ordena los componentes en base a la posicion

        for (int i = 0; i < lst->Count; i++) // recorre la TObjectList ordenada
        {
            // para cada componente en el TScrollBox
            for (int j = 0; j < sbx->ControlCount; j++)
            {
                // si el indice del componente de la TObjectList
                // es igual al indice del componente del TScrollBox
                if ((((PIdxPosImg)lst->Items[i])->Ruta == sbx->Controls[j]->Hint) &&
                    (AnsiString(sbx->Controls[j]->ClassName()) == AnsiString("TImage")))
                {
                    // le asigna la posicion izquierda al componente del TScrollBox
                    sbx->Controls[j]->Left = pos;
                    for (int k = 0; k < sbx->ControlCount; k++)
                    {
                        AnsiString hint  = sbx->Controls[k]->Hint;
                        AnsiString ruta  = sbx->Controls[j]->Hint;
                        AnsiString clase = AnsiString(sbx->Controls[k]->ClassName());
                        if ((sbx->Controls[j]->Hint == sbx->Controls[k]->Hint) &&
                            (AnsiString(sbx->Controls[k]->ClassName()) == "TLabel"))
                            sbx->Controls[k]->Left = pos;
                    }

                    // anota la proxima posicion
                    pos += ANCHO_MAX_IMAGEN + ESPACIO_ENTRE_IMG;
                }
            }
        }
    }
    __finally
    {
        try { lst->Clear(); } __finally { ; }
        try { lst->Free(); } __finally { ; }
    }
}

//---------------------------------------------------------------------------

Agradezco cualquier ayuda o sugerencia.

Saludos.