Drag & Drop
(arrastrar y soltar)
Este proceso está definido entre:
La Componente donde comienza el
arrastre.
Propiedad DragMode := dmAutomatic;
La Componente donde se “suelta”.
Eventos:
– OnDragOver : indicar aquí de qué componentes
recibe.
– OnDragDrop : qué se hace con la información.
Ejemplo : El texto del LabeledEdit se
puede arrastrar y soltar en el ListBox
Propiedad
DragMode := dmAutomatic
Eventos
OnDragOver
OnDragDrop
Drag_and_Drop1.dpr
OnDragOver del ListBox
Forma General
procedure TForm1.ListBox1DragOver(
Sender, Source: TObject;
X, Y: Integer; State: TDragState;
var Accept:Boolean);
begin
El Componente
evento debe que recibe
analizar
Componente donde si la
la información
componente (dondeestá
receptora
comenzó
end; dispuesta el arrastre
a aceptar la
se “suelta”).
información.
OnDragOver del Listbox
(de quien recibe)
procedure TForm1.ListBox1DragOver(
Sender, Source: TObject;
X, Y: Integer; State: TDragState;
var Accept:Boolean);
begin
Accept := Source is TLabeledEdit;
end; Si Accept := TRUE aceptará de
cualquier componente.
OnDragDrop
(qué se hace con la información)
procedure TForm1.ListBox1DragDrop(
Sender, Source: TObject;
X, Y: Integer);
Var Linea : TLabeledEdit; Componente
Dónde comenzó
Lista : TListBox; que recibe
el arrastre
begin
Linea := Source as TLabeledEdit;
Lista := TListBox( Sender);
Lista.Items.add( Linea.Text );
Linea.Text := '';
end;
Drag & Drop
Verificar el funcionamiento de la
aplicación.
Puede ver que durante el arrastre
aparecen dos tipos de cursor:
Sobre las componentes no
habilitadas.
Sobre el ListBox (el único
componente habilitado)
Modificación para borrar las
líneas del ListBox
Modificar el ejercicio anterior para
permitir seleccionar una línea del
ListBox que será borrada al ser
arrastrada sobre el formulario.
Ver que en el ListBox la propiedad
DragMode := dmAutomatic
OnDragOver de Form1
(sólo recibe del ListBox)
procedure TForm1.FormDragOver(
Sender, Source: TObject;
X, Y: Integer;
State: TDragState;
var Accept: Boolean);
begin
Accept := Source is TListBox;
end;
OnDragDrop de Form1
(borra la línea seleccionada)
procedure TForm1.FormDragDrop(
Sender, Source:TObject;
X,Y:Integer);
begin
{ borra la línea seleccionada }
(Source as TListBox).DeleteSelected;
end;
Ejemplo : Drag_and_Drop2.dpr
Para cada Edit poner la propiedad
Dragmode = dmAutomatic
Evento DragOver del
Formulario
procedure TForm1.FormDragOver(Sender,
Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
//decir de quién recibe el formulario
Accept := Source is TEdit;
end;
Evento DragDrop del
Formulario
procedure TForm1.FormDragDrop(
Sender, Source: TObject; X, Y: Integer);
begin
//cómo se hace el arrastre?
Form1.Caption:=(Source as TEdit).Text;
end;
Inicio del Drag & Drop
El uso de la propiedad DragMode para iniciar el
arrastre puede interferir con el funcionamiento
normal del mouse.
Ej: en un Edit no se puede usar el mouse para
pasarle el foco.
Es conveniente dejar DragMode en dmManual y
usar los eventos que responden al mouse para
iniciar el arrastre con el método BeginDrag
Ejemplo : Drag_and_Drop3.dpr
Propiedad Evento OnMouseDown
Dragmode = dmManual Edit1.BeginDrag(False)
Veamos los parámetros del método BeginDrag
Método BeginDrag
Comienza el arrastre desde un control cuando la
propiedad DragMode es dmManual.
procedure BeginDrag(Immediate: Boolean;
Threshold: Integer = -1);
Si Immediate = TRUE, el arrastre comienza
inmediatamente.
Si Immediate = FALSE, el arraste comienza cuando el
mouse se desplaza la cant.de pixels indicada por
Threshold.
Método BeginDrag
ElElarrastre
2do.param se indica
inicia la
Ejemplos cantidad de pixels que
inmediatamente
debe desplazarse el
Edit1.BeginDrag( TRUE );
mouse para comenzar
Edit1.BeginDrag( FALSE ); el arrastre.
Es opcional.
Edit1.BeginDrag( FALSE, -2 );
Si no está o es <0, se
Edit1.BeginDrag( FALSE, 10 ); toma el valor por
defecto.
Si el 1er. parámetro es FALSE, el
arrastre NO comienza inmediatamente
Ejemplo : Drag_and_Drop3.dpr
Puede usarse el parámetro Sender para
escribir un único evento
procedure TForm1.Edit1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
TEdit( Sender ).BeginDrag( False );
end;
Ejemplo : Drag_and_Drop3.dpr
Si el arrastre debe comenzar con el botón
derecho del mouse
procedure TForm1.Edit1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ssRight in Shift then
TEdit(Sender).BeginDrag(False);
end;
Conj.de botones presionados