Ver Mensaje Individual
  #36  
Antiguo 29-11-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
bulc,

Cita:
Empezado por Bulc
No sé si me he explicado bien. Lo que quiero es evitar que un Drag de TLabel, salga fuera del TForm y si se levanta el botón del ratón, se pierda.
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    txtSiete: TLabel;
    Button2: TButton;
    txtNumero: TLabel;
    txtUno: TLabel;
    txtNueve: TLabel;
    Button3: TButton;
    procedure FormDrapDrop(Sender, Source: TObject; X, Y: Integer);
    procedure FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure LabelDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    iComponenteX, iComponenteY: Integer;
    bMoviendo: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  PosLabel : Array[1..9] of TPoint;

implementation

{$R *.dfm}

// Asigna nuevas coordenadas a un Tlabel en Drag&Drog
procedure TForm1.FormDrapDrop(Sender, Source: TObject; X, Y: Integer);
begin
   if Source is TLabel then
   begin
      TLabel(Source).Left := X;
      TLabel(Source).Top := Y;
   end;
end;

// Activa Drag&Drog para un TLabel
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
   if Source is TLabel then
      Accept := (Source is TLabel);
end;

// Realiza Acciones en Modo Drag&Drog
procedure TForm1.LabelDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
   if (Source is TLabel) then
   begin
      if (TLabel(Source).Name = 'txtSiete') and (State = dsDragEnter) then
      begin
         txtSiete.Enabled := False;
         txtSiete.Visible := False;
         PlaySound('Correcto.wav',0, SND_FILENAME or SND_ASYNC);
         ShowMessage('Número Correcto');
      end;

      if (TLabel(Source).Name <> 'txtSiete') and (State = dsDragEnter) then
      begin
         PlaySound('Incorrecto.wav',0, SND_FILENAME or SND_ASYNC);
         ShowMessage('Número Incorrecto');
      end
   end;
end;

// Activa el Clipping Status
procedure TForm1.FormActivate(Sender: TObject);
var
   R: TRect;
begin
   R:= GetClientRect;
   MapWindowPoints(Handle,0,R,2);
   ClipCursor(@R);
end;

// Remove el Clipping Status
procedure TForm1.Button2Click(Sender: TObject);
begin
   ClipCursor(nil);
end;

// Inicializa el Form1
procedure TForm1.FormCreate(Sender: TObject);
begin

   txtUno.DragMode := dmAutomatic;
   PosLabel[1].X := txtUno.Left;
   PosLabel[1].Y := txtUno.Top;

   txtSiete.DragMode := dmAutomatic;
   PosLabel[7].X := txtSiete.Left;
   PosLabel[7].Y := txtSiete.Top;

   txtNueve.DragMode := dmAutomatic;
   PosLabel[9].X := txtNueve.Left;
   PosLabel[9].Y := txtNueve.Top;

end;

// Reset el Form1
procedure TForm1.Button3Click(Sender: TObject);
begin

   txtUno.Left := PosLabel[1].X;
   txtUno.Top := PosLabel[1].Y;

   txtSiete.Left := PosLabel[7].X;
   txtSiete.Top := PosLabel[7].Y;
   txtSiete.Enabled := True;
   txtSiete.Visible := True;

   txtNueve.Left := PosLabel[9].X;
   txtNueve.Top := PosLabel[9].Y;

end;

end.
El código anterior hace Drag&Drop de 3 TLabel (Números) y verifica si se selecciono el número correcto. Este ejemplo hace uso de la función ClipCursor la cual limita el movimiento del cursor solo a la coordenadas sobre las cuales se definió y muestra como remover el Clipping Status.

La aplicación esta implementada en el siguiente link: http://terawiki.clubdelphi.com/Delph...op_Numeros.rar

Espero sea útil

Nelson.
Responder Con Cita