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
iComponenteX, iComponenteY: Integer;
bMoviendo: Boolean;
public
end;
var
Form1: TForm1;
PosLabel : Array[1..9] of TPoint;
implementation
{$R *.dfm}
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;
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;
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;
procedure TForm1.FormActivate(Sender: TObject);
var
R: TRect;
begin
R:= GetClientRect;
MapWindowPoints(Handle,0,R,2);
ClipCursor(@R);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ClipCursor(nil);
end;
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;
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.