Hola bulc.
Bueno, de todos modos cambié un poquito el código para que te indique exáctamente cuando está dentro del shape, de modo que puedan estar lindantes.
Código Delphi
[-]
implementation {$R *.dfm}
var
ori : TPoint;
CtrlPress : Boolean = False;
ShapeArray : array of TShape;
ImageArray : array of TRect;
procedure TForm1.FormCreate(Sender: TObject);
var
i, cs, ci: Integer;
sh: TShape;
begin
Image1.BringToFront;
Image2.BringToFront;
Image3.BringToFront;
Image1.Tag := 1;
Image2.Tag := 2;
Image3.Tag := 3;
DoubleBuffered:= True;
for i:= 0 to ComponentCount-1 do
begin
if Components[i] is TShape then
begin
SetLength ( ShapeArray, Length( ShapeArray ) + 1 );
ShapeArray [High( ShapeArray )]:= TShape( Components[i] );
end;
if Components[i] is TImage then
begin
SetLength ( ImageArray, Length( ImageArray ) + 1 );
ImageArray[High( ImageArray )].Left := TImage( Components[i] ).Left;
ImageArray[High( ImageArray )].Top := TImage( Components[i] ).Top;
end;
end;
end;
procedure TForm1.ImagesMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then
begin
ori := Point( X, Y );
CtrlPress:= True;
end;
end;
procedure TForm1.ImagesMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if CtrlPress then
with TImage( Sender ) do
begin
Left := X - ori.X + Left;
Top := Y - ori.Y + Top;
end;
end;
procedure TForm1.ImagesMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
function IsInShape(I: TImage; S: TShape): Boolean;
begin
Result:= ((I.Left > S.Left)and(I.Top > S.Top)) and
((I.Left+I.Width < S.Left+S.Width)and(I.Top+I.Height < S.Top+S.Height));
end;
var
img: TImage;
i : Integer;
R : TRect;
ok : Boolean;
begin
if CtrlPress then
begin
CtrlPress:= False;
img := TImage( Sender );
ok := False;
for i:= Low( ShapeArray ) to High( ShapeArray ) do
if IsInShape(img, ShapeArray[i]) then
if img.Tag = ShapeArray[i].Tag then
begin
ok := True;
Break;
end;
if ok then
ShowMessage( '¡Correcto!' )
else
ShowMessage('Inténtalo otra vez');
TImage(Sender).Left := ImageArray[img.Tag-1].Left;
TImage(Sender).Top := ImageArray[img.Tag-1].Top;
end;
end;
end.
Saludos