PDA

Visualizza la versione completa : [DELPHI] Verificare se nella Clipboard ci sono file tagliati o copiati


123delphi321
12-03-2011, 20:41
Ciao a tutti,

sto facendo un programma dove devo poter fare taglia/copia e incolla dei file in una cartella.

ho cercato sulla rete ed ho trovato vari esempi....

l'unica cosa che non capisco e' come faccio a capire se una file nel clipboard e' da tagliare o da copiare

l'utente puo fare copia o taglia dall'explorer di windows per poi incollarlo nel in una cartella selezionata dal mio programma.

avete suggerimenti?

grazie

alka
15-03-2011, 11:12
L'operazione di copia o spostamento del file viene effettuata dal tuo programma, oppure deleghi questa operazione interfacciandoti alla shell di Windows Explorer?

deleted_29
15-03-2011, 14:14
da quanto mi risulta nella clipboard non c'è alcuna segnalazione di "copia" o "taglia".
Te ne accorgi quando hai registrato il clipboardviewer
---
Lato-Explorer però non sarei così categorico, dumpa il contenuto prima di taglia/copia, magari qualcosa salta fuori (anche se non credo)

Temo quindi che dovrai suzzarti questo
http://msdn.microsoft.com/en-us/library/bb776904(VS.85).aspx#delete_on_paste

123delphi321
15-03-2011, 20:03
Originariamente inviato da alka
L'operazione di copia o spostamento del file viene effettuata dal tuo programma, oppure deleghi questa operazione interfacciandoti alla shell di Windows Explorer?

ciao,

uso un componente cxshellview della devexpress.
il copia o taglia lo posso fare interfacciandomi con lo shell di windows explorer.

in pratica posso fare ctrl-c da windows explorer e poi ctrl-v nel mio programma.
nel mio programma, ho scritto una procedura che legge i nomi dei file inseriti nella clipboard e poi provvede a copiarli...
l'unica cosa che non riesco a capire se da windows explorer e' stato premuto ctrl-x o ctrl-c.

come viene segnalato nella clipboard che i file devono essere tagliati o copiati?

grazie

deleted_29
17-03-2011, 19:37
Originariamente inviato da 123delphi321
ciao,

come viene segnalato nella clipboard che i file devono essere tagliati o copiati?

grazie ho dedicato 30 secondi e ti confermo quanto ho scritto, ossia non viene affatto segnalato nella clipboard che i file vanno tagliati o copiati, ho dumpato CF_HDROP, indi per cui se non vuoi seguire la strada che ti ho segnalato sopra (di colloquio-shell) direi... che non ci riuscirai.

alka
18-03-2011, 02:30
Originariamente inviato da 123delphi321
nel mio programma, ho scritto una procedura che legge i nomi dei file inseriti nella clipboard e poi provvede a copiarli...


Ecco, ciò che dicevo io era proprio questo: non puoi gestire l'operazione in questo modo, cioè analizzare semplicemente un nome di file nella clipboard, ma interfacciarti direttamente alla shell e invocare quei metodi dell'interfaccia COM che ti mette a disposizione per effettuare l'operazione "Incolla" dei file che hai precedentemente contrassegnato per il "Taglia" o "Copia".

Devi fare tutto attraverso la shell, anche l'operazione di incollare, e non solo il primo step di tagliare/copiare uno o più file; in questo modo, facendo "Incolla" attraverso la shell, è quest'ultima che si occupa di recuperare l'informazione necessaria per capire come deve essere effettivamente trattato lo spostamento del file.

Se hai una licenza commerciale del componente DevExpress, puoi anche avvalerti direttamente del forum di supporto tecnico ufficiale per un aiuto mirato, dato che si tratta di un componente di terze parti.

Ciao! :ciauz:

deleted_29
18-03-2011, 13:28
Originariamente inviato da alka
...
Devi fare tutto attraverso la shell, anche l'operazione di incollare, e non solo il primo step di tagliare/copiare uno o più file...
Ciao! :ciauz:
mmm... a "occhio" non accade questo (se non incapsulato in qualche componente), bensì è l'applicazione a dover dire quando è finita la copia (più precisamente il taglia), come nel link che ho messo

Handling Delete-on-Paste Operations

Scenario: One or more files are cut from a folder in Windows Explorer and pasted into a namespace extension. Windows Explorer leaves the files highlighted until it receives feedback on the outcome of the paste operation.

Traditionally, when a user cuts data it immediately disappears from view. This might not be efficient, and it can lead to usability problems if the user becomes concerned about what has happened to the data. An alternative approach is to use a delete-on-paste operation.

With a delete-on-paste operation, the selected data is not immediately removed from view. Instead, the source application marks it as selected, perhaps by changing the font or background color. After the target application has pasted the data, it notifies the source about the outcome of the operation. If the target performed an optimized move, the source can simply update its display. If the target performed a normal move, the source must also delete its copy of the data. If the paste fails, the source application restores the selected data to its original appearance.

Note The Shell normally uses delete-on-paste when a cut/paste operation is used to move files. Delete-on-paste operations with Shell objects normally use an optimized move to move the files. To handle Shell data transfer properly, your application must be capable of detecting and handling delete-on-paste operations.

The essential requirement for delete-on-paste is that the target must report the outcome of the operation to the source. However, standard Clipboard techniques cannot be used to implement delete-on-paste because they do not provide a way for the target to communicate with the source. Instead, the target application uses the data object's IDataObject::SetData method to report the outcome to the data object. The data object can then communicate with the source through a private interface.

alka
18-03-2011, 16:09
Originariamente inviato da franzauker
mmm... a "occhio" non accade questo (se non incapsulato in qualche componente), bensì è l'applicazione a dover dire quando è finita la copia (più precisamente il taglia), come nel link che ho messo

E' esattamente ciò che ho detto io: al di là di chi deve avvertire e quando, su cui non sono entrato nel merito, quello che volevo far capire all'autore della discussione è che non può gestire manualmente tramite la classica Clipboard questa operazione, cioè con l'omonimo oggetto che Delphi mette a disposizione per questa risorsa (per intenderci), ma interagire con la shell per eseguire l'operazione attraverso le interfacce che questa mette a disposizione.

Poi, come viene fatto (e in questo caso il link fornisce i dettagli su come implementarlo) è un altro paio di maniche su cui non mi sono addentrato, per mancanza di tempo disponibile ad approfondire l'argomento.

deleted_29
18-03-2011, 17:55
Originariamente inviato da alka
che non può gestire manualmente tramite la classica Clipboard questa operazione, cioè con l'omonimo oggetto che Delphi mette a disposizione per questa risorsa (per intenderci) Integrerei con "non è tanto l'oggetto delphi [clipboard] a non farlo, quanto l'oggetto clipboard windows".
Come detto ho dumpato direttamente la struttura windows CF_HDROP per ulteriore verifica :ciauz:

123delphi321
18-03-2011, 20:08
certamente scrivero a devexpress.... nel frattempo sto continuanto a cercare in rete.

lato delphi, riesco a capire quando ci sono file nella clipboard che sono da tagliare (quindi eseguire un 'move' dei file) o da copiarwe (quendi eseguire un 'copy').

c'e' una sorta di flag da cui si evince l'azione da fare.

ancora, non ho capito come settare questo 'flag' come 'copy' o come 'move'

vi posto il codice che ho testato.
se volete provare in una form inserire Memo1 (Tmemo) e un button



procedure TFrameExplorer.Button1Click(Sender: TObject);
var
DropHandle, DropEffect, Effect : HDROP;
FileCount:Integer;
Counter:Integer;
FileName:array [0..MAX_PATH] of char;
const
DROPEFFECT_NONE = 0;
DROPEFFECT_COPY = 1;
DROPEFFECT_MOVE = 2;
DROPEFFECT_LINK = 4;
DROPEFFECT_SCROLL = $80000000;
begin
inherited;
Memo1.Lines.Clear;
OpenClipboard(0);
DropEffect := RegisterClipboardFormat('Preferred DropEffect');
DropHandle := GetClipboardData(CF_HDROP);
if DropHandle>0 then
begin
Effect := GetClipboardData(DropEffect);
if Effect=0 then Effect := DROPEFFECT_COPY
else Effect := PDWORD(Effect)^;
case Effect of
DROPEFFECT_COPY + DROPEFFECT_LINK:Memo1.Lines.Add('Copy');
DROPEFFECT_MOVE:Memo1.Lines.Add('Move');
end;

FileCount:=DragQueryFile(DropHandle,Cardinal(-1),nil,0);
for Counter := 0 to FileCount-1 do
begin
DragQueryFile(DropHandle, Counter, FileName, sizeof(FileName));
Memo1.Lines.Add(FileName);
end;
end;
CloseClipboard;
end;


grazie

Loading