Ver Mensaje Individual
  #2  
Antiguo 09-03-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Puedes implementar algo sencillo y funcional aunque quizá no muy vistoso con objetos TShape (paleta "Additional") (cuadrados, rectángulos, círculos y elipses).

Para moverlos pones su propiedad DragMode en dmAutomatic y manejas los eventos OnDragOver y OnDragDrop del objeto sobre el cual coloques las figuras, por ejemplo, un panel.

Aquí te pongo un ejemplo completo:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Superficie: TPanel;
    Mesa: TShape;
    Silla: TShape;

    procedure SuperficieDragOver(
      Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);

    procedure SuperficieDragDrop(
      Sender, Source: TObject; X, Y: Integer);

    procedure ObjetoStartDrag(
      Sender: TObject; var DragObject: TDragObject);

  private
    Ancla: TPoint;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SuperficieDragOver(
  Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := Source is TShape;
end;

procedure TForm1.SuperficieDragDrop(
  Sender, Source: TObject; X, Y: Integer);
begin
  with Source as TShape do
  begin
    Left := X - Ancla.X;
    Top := Y - Ancla.Y;
  end;
end;

procedure TForm1.ObjetoStartDrag(
  Sender: TObject;
  var DragObject: TDragObject);
begin
  Ancla := (Sender as TShape).ScreenToClient(Mouse.CursorPos);
end;

end.

Asocia los eventos SuperficieDragOver y SuperficieDragDrop al panel Superficie y el evento ObjetoStartDrag a los Shape Mesa y Silla (estos deben estar dentro del panel y con su propiedad DragMode en dmAutomatic).

La variable Ancla que se inicializa en el evento OnStartDrag es para saber la posición relativa de la esquina superior izquierda del objeto respecto del punto desde donde se toma el objeto y así colocarlo correctamente al terminar de arrastrarlo.

Como te digo, no es muy vistoso pero bueno para algo esquemático en el que baste indicar los distintos objetos reales con figuras simples (puedes variar su color y pintarlo parejos o con rayitas).

Algo más sofisticado con la misma idea puedes lograrlo usando objetos TImage en lugar de TShape cargándolos con las imágenes que desees.

EDITO:

Amplío un poco la explicación. Los eventos OnDragOver y OnDragDrop los recibe el objeto sobre el cual se arrastran otros. OnDragOver sirve para que el objeto destino (Sender) determine si va a aceptar o no al objeto móvil (Source) y ajuste el parámetro Accept según el caso (en el ejemplo, el panel acepta al objeto móvil sólo si éste es un TShape). El evento OnDragDrop ocurre una vez que se suelta el objeto. En el ejemplo lo aprovechamos para ajustar las propiedades Left y Top del Shape (Source) para que efectivamente se mueva.

// Saludos

Última edición por roman fecha: 09-03-2005 a las 06:35:40. Razón: Ampliar explicación
Responder Con Cita