//---------------------------------------------------------------------------
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 { ; }
}
}
//---------------------------------------------------------------------------