Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Drag&Drop con delphi

Drag&Drop con delphi

E-mail Stampa PDF

L'atto di muovere un oggetto, tenendo premuto un pulsante del mouse, è detto dragging, e quello che accade quando il trascinamento finisce, rilasciando il pulsante, è detto dropping.
Con Delphi è molto semplice programmare il dragging & dropping. Sarà possibile infatti importare oggetti esterni nella applicazione oppure spostare elementi di essa.

Esempio di Drag&Drop

Avviamo un nuovo progetto VCL e nella form inseriamo una immagine. Nell' Object Inspector, dopo aver selezionato l'immagine, impostiamo tra le sue proprietà il DragMode con il valore dmManual.
In questo modo creeremo una applicazione nella quale potremo spostare l'immagine che abbiamo introdotto. tutti i ragionamenti che spiegheremo potranno essere applicati a qualsiasi altro componente grafico.

Le fasi che ci porteranno al drag and drop sono:

  1. Abilitazione al trascinamento(drag) da parte dell'oggetto trascinato
  2. Descrizione del metodo OnDragDrop, che ci dice cosa deve fare l'oggetto trascinato quando viene rilasciato.
  3. Abilitazione all'accettazione di un altro oggetto da parte della destinazione prescelta.

DragMode

I vari componenti di una applicazione consentono due tipi di trascinamento: dmAutomatic e dmManual. Questi valori di DragMode sono usati per controllare la possibilità di trascinamento, cioè se è impostato in modalità manuale l'utente non sarà in grado di iniziare il trascinamento, fino a quando quest'ultimo non verrà abilitato, se invece è impostato in automatico, appena verrà premuto il pulsante del mouse sull'oggetto in questione, verrà iniziato il trascinamento, senza bisogno di abilitazione. Per semplicità impostatelo sulla modalità automatica.

OnDragDrop

Questa funzione viene eseguita quando l'oggetto, nel nostro caso l'immagine, viene rilasciato. Un esempio di procedura è questo:

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if
Source is TImage then
begin
TImage(Source).Left := X;
TImage(Source).Top := Y;
end
;
end
;

Il parametro Source nell'evento OnDragDrop è l'immagine spostata, ma l'origine dell'evento è la form nella quale l'immagine viene mossa. Il parametro source è un generico TObject, quindi per accedere alle sue proprietà dovremo specificare che tipo di oggetto stiamo trattando, nel nostro caso sarà una TImage.

Se invece volessimo usare l'evento che ci comunica l'immagine quando ha finito il trascinamento useremo l' OnEndDrag.

Accept

Un oggetto per essere rilasciato su di un altro ha bisogno del permesso della sua destinazione. Per fare ciò useremo l'evento della form OnDragOver che viene attivato dal trascinamento sulla form stessa. Sebbene il parametro "Accept" sia impostato sul valore true , se non forniamo la funzione relativa a questo evento il trascinamento e il rilascio del nostro oggetto non sarà consentito

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) ;
begin

Accept := (Source is TImage) ;
end
;

Eseguendo il programma vedremo che spostando la nostra immagine sulla form la sua posizione diventa effettiva solo alla fine del trascinamento, questo perché l'evento OnDragDrop scatta alla fine del processo.

BeginDrag

Se il DragMode è dmAutomatic, allora il trascinamento inizia in automatico appena viene premuto il pulsante del mouse, ma se è impostato in modalità manuale allora dovremo abilitarlo. Il metodo più comune è di abilitarlo usando una altro evento, in questo esempio useremo una combinazione Ctrl+MouseDown per iniziare lo spostamento. Impostiamo il DragMode della TImage sul valore dmManual e scriamo la funzione legata all'evento MouseDown dell'immagine:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) ;
begin
if
ssCtrl in Shift then Image1.BeginDrag(True) ;
end
;

BeginDrag ha come parametro un valore booleano, se gli viene passato "true" il trascinamento inizia immediatamente, altrimenti non inizierà se non muoviamo il mouse ad una certa distanza. Non dimenticatevi il tasto Ctrl.

 

Drag and drop degli elementi di una ListBox

In questo esempio applichiamo quello spiegato in precedenza, per selezionare e spostare gli elementi all'interno di una listbox.

var 
// Dichiarazione di una variabile che deve conservare le coordinate del punto iniziale del trascinamento

StartingPoint : TPoint;

implementation

...

//Assicurarsi che il DragMode si impostato su dmAutomatic
procedure TForm1.FormCreate(Sender: TObject) ;
begin
ListBox1.DragMode := dmAutomatic;
end;

//Inizio della procedura memorizzando le coordinate del mouse
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) ;
begin
StartingPoint.X := X;
StartingPoint.Y := Y;
end;

//Durante il trascinamento autorizziamo la stessa ListBox ad accettare se stessa
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) ;
begin
Accept := Source = ListBox1;
end;

//Evento finale del drag&drop nel quale viene calcolato la posizione elemento di partenza e
// e la sua posizione finale, e successivamente lo stesso viene spostato.

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer) ;
var
DropPosition, StartPosition: Integer;
DropPoint: TPoint;
begin
DropPoint.X := X;
DropPoint.Y := Y;
with Source as TListBox do begin
StartPosition := ItemAtPos(StartingPoint,True) ;
DropPosition := ItemAtPos(DropPoint,True) ;

Items.Move(StartPosition, DropPosition) ;
end;
end;

Drag and drop di un elemento esterno alla form

Questo argomento è stato trattato in un altro articolo che troverete qui.

Ultimo aggiornamento ( Venerdì 29 Aprile 2011 07:23 )  
Loading

Login




Chiudi