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:
- 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 c++:
Ver original
//--------------------------------------------------------------------------- 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.