Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2011
LucasBols LucasBols is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 10
Poder: 0
LucasBols Va por buen camino
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:
//---------------------------------------------------------------------------

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



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Access violation at address ... in module 'RLINK32.DLL' FelipeDiaz Varios 18 26-03-2016 21:39:00
Access violation at adress in module amaia Varios 0 11-11-2010 23:10:55
Error Access violation at address 00404CE8 in module bothy Varios 32 20-03-2010 23:32:07
error 'Access violation at address 0053CF79 in module project1' Renees Varios 3 15-03-2005 17:17:37
Access Violation in module 'qrpt35.bpl' alt126 C++ Builder 5 03-02-2005 12:04:35


La franja horaria es GMT +2. Ahora son las 14:55:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi