Ver Mensaje Individual
  #9  
Antiguo 10-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 10-04-2015 a las 08:20:32.
Responder Con Cita