SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: LucasBols en Lunes 7 de Noviembre de 2011, 01:24

Título: Access violation in module rtl100.bpl en Win7
Publicado por: LucasBols en Lunes 7 de Noviembre de 2011, 01:24
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


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.