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):
//---------------------------------------------------------------------------
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.