Ver Mensaje Individual
  #15  
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.

Así queda el ejemplo sin el uso de la tecla Ctrl:
Código Delphi [-]
implementation  

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
  ori      := Point( X, Y );
  CtrlPress:= True;
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
  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
  begin
    ShowMessage('Inténtalo otra vez');
    TImage(Sender).Left := ImageArray[img.Tag-1].Left;
    TImage(Sender).Top  := ImageArray[img.Tag-1].Top;
  end;
  CtrlPress:= False;
end;
end.
Este último código deja la imágen en el shape cuando la elección es correcta, en caso contrario, la regresa a la posición de orígen.

Saludos
__________________
Daniel Didriksen

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