Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Drag and drop di file esterni all'applicazione

Drag and drop di file esterni all'applicazione

E-mail Stampa PDF

In questo articolo verrà spiegato come implementare il drag and drop di file esterni all'applicazione, cioè come trascinare dei file da  windows explorer all'interno della form.

Per fare questo useremo alcune funzioni contenute nella API di windows e la cui importazione è contenuta nell'unità ShellAPI, percui la prima cosa da fare è inserire all'interno della direttiva uses la suddetta unit:

Uses
...
ShellAPI, 
...

La successiva istruzione da aggiungere alla form è la funzione che gestirà i messaggi di tipo WM_DROPFILES che chiameremo AcceptFiles:

type
  TForm1 = class(TForm)
  ...
public
  ...
  procedure AcceptFiles( var msg : TMessage ); message WM_DROPFILES;
  ...

Ora dovremo attivare la capacità di ricevere i file da parte della form, epr fare questo utilizzeremo la funzione DragAcceptFiles che avrà come parametri l'handler della form e il valore booleano che rappresenta il consenso o meno all'accettazione dei file:

procedure TForm1.Button1Click(Sender: TObject);
begin
  DragAcceptFiles(Handle,True);
end;

In questo caso è stato inserito dentro una funzione collegata all'evento di un click su un pulsante, ma potremo inserirla dentro il gestore dell'evento OnCreate per attivarla dall'avvio dell'applicazione, in generale questa la potrete inserire ovunque riteniate più opportuno.

Ora non manca altro che scrivere l'implementazione della precedente funzione di gestione dei messaggi (AcceptFiles)

procedure TForm1.AcceptFiles( var msg : TMessage );
const
  cnMaxFileNameLen = 255;
var
  i,nCount     : integer;
  FileName : array [0..cnMaxFileNameLen] of char;
begin
  // Ricaviamo quanti file sono stati trascinati
  nCount := DragQueryFile( msg.WParam,
                           $FFFFFFFF,
                           FileName,
                           cnMaxFileNameLen );

  // Interroga windows su un file alla volta
  for i:=0 to nCount-1 do begin
    DragQueryFile(msg.WParam, i, FileName, cnMaxFileNameLen );

    // Ora che abbiamo il nome del file nella variabile FileName
// possiamo farne quello che vogliamo

    memo1.Lines.add(FileName);
  end;

  // Comunica al sistema che l'operazione sul messaggio è finita
  DragFinish(msg.WParam);
end;

Come è possibile vedere dai commenti sono state usate le funzioni DragQueryfile e DragFinish per inserire i nomi di tutti i file trascinati all'interno di un memo, naturalmente questo è solo un esempio e avremo potuto usarli a nostro piacimento.

Con DragFinish viene liberata la memoria che il sistema alloca per il trasferimento dei nomi dei file.

DragQueryfile usa tre parametri, il primo identifica la struttura che contiene i nomi dei file, il secondo è l'indice che identifica un nome della lista dei file trascinati, se il suo valore è $FFFFFFFF allora verrà restituito il numero totale dei file trascinati. Il terzo parametro è l'indirizzo del buffer che verrà eventualmente riempito con un nome di un file nella lista. Il quarto parametro indica la dimensione del buffer.

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

Login




Chiudi