2009-04-16 11 views
10

Sviluppiamo un'applicazione per database. L'utente richiede una nuova funzionalità: copia i BLOB negli Appunti in modo che Windows Explorer possa incollarli come nuovi file. Una soluzione è salvare i BLOB in una cartella temporanea e aggiungere questi file temporanei negli Appunti.Come si copiano dati arbitrari negli Appunti come file?

Ma sto cercando una soluzione migliore. È possibile agganciare l'azione Incolla in Esplora risorse e salvare i BLOB sul percorso di destinazione da solo?

risposta

5

Direi che explorer esegue la copia sui file di destinazione, quindi non c'è modo di farlo direttamente scrivere i file di destinazione, questo ha senso, perché i nomi dei file sorgente possono provenire solo dall'applicazione che ha copiato i dati negli Appunti, che non devono necessariamente essere Explorer. OTOH i nomi dei file di destinazione potrebbero effettivamente differire, perché i file di lo stesso nome potrebbe già esistere nella cartella di destinazione e solo explorer può creare i nomi modificati per i file di destinazione (ad esempio anteponendo "Copia di" o aggiungendo "(2)" al nome del file di base)

Sarà necessario fornire il formato degli appunti per Windows Explorer o che può incollare i file. Lo documentation of standard clipboard formats suggerisce che CF _ HDROP è quello giusto. Con questo formato di appunti si fornisce un elenco di nomi di file di origine, ma i file devono necessariamente esistere, quindi è necessario salvarli sul disco.

Si potrebbe provare a rendere il processo il più leggero possibile, però. Di solito quando un utente copia i dati negli Appunti viene inserito immediatamente, indipendentemente dal fatto che verrà utilizzato per un'operazione di incolla. Per la tua applicazione ciò significherebbe che avresti bisogno di creare i file e inserire l'elenco di nomi di file negli Appunti, ogni volta. Tuttavia, Windows supporta una modalità chiamata Delayed Rendering, che viene utilizzata esattamente per tali casi. Fondamentalmente si mette solo uno stub vuoto dei dati negli appunti e solo quando un'altra applicazione tenta di accedere ai dati verrà richiesta dalla propria app. Quindi potresti implementarlo in un modo che solo quando l'utente tenta di incollare i file in explorer li salverà sul disco e restituirà l'elenco dei nomi di file.

1

È passato un po 'di tempo da quando ho giocato con il copia/incolla, ma sono abbastanza sicuro che puoi fare ciò che stai suggerendo (inserisci il blob come nuovo file negli appunti).

Mi sembra di ricordare che, a seconda di come si aggiunge agli appunti, è possibile specificare il tipo di dati che si sta copiando. Penso che se ottieni correttamente quel tipo di dati, sarai in grado di incollare come se avessi copiato da Windows Explorer.

cercherò di scavare qualche dettaglio in più, questa sera se ho avuto la possibilità (non ho tutti i miei preferiti qui al lavoro) ...

[Edit] Dai un'occhiata alla the wxWidgets documentation on drag and drop. Era quello con cui avevo lavorato e fornisce alcuni suggerimenti sui tipi di dati.

In cosa stai scrivendo? Delphi?

[Modifica2] Penso che questo potrebbe effettivamente essere un limite di Windows (?). Potrebbe essere solo la documentazione di wxWidgets, ma c'è lo a suggestion that you only copy filenames rather than the files themselves. Se questo è il caso, devi prima ottenere il tuo suggerimento originale di creare un file temporaneo :-(

13

Non l'ho mai provato, ma penso che sia effettivamente possibile. Si prega di dare un'occhiata alla documentazione MSDN per Shell Clipboard Formats.CFSTR_FILECONTENTS e CFSTR_FILEDESCRIPTOR sono i formati che probabilmente dovresti gestire.

Inoltre, ho trovato un articolo su Code Project che fornisce un programma dimostrativo: How to drag a virtual file from your app into Windows Explorer.

Aggiornamento: Un esempio scritto in .NET:

+0

Cose interessanti - grazie per i collegamenti :-) –

+0

Grazie anche a me. Impara qualcosa di nuovo ogni giorno! –

7

Dall'articolo MSDN Handling Shell Data Transfer Scenarios

  • I file esistenti dovrebbero essere offerti con il formato CF_HDROP.
  • Offrire dati di tipo file con i formati CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR . Questo approccio consente all'obiettivo di creare un file da un oggetto senza la necessità di conoscere lo spazio dei dati sottostanti. Dovresti normalmente presentare i dati come un'interfaccia IStream. Questo meccanismo di trasferimento dati è più flessibile di un oggetto di memoria globale e utilizza molta meno memoria. altri

Due buoni articoli da leggere da MSDN sono:

Quando ho iniziato a lavorare su utilizzando gli appunti per trasferire i file ho stampato fuori tutti e tre gli articoli e leggerli più volte.

La gestione delle interfacce può essere abbastanza complicata. Ho trovato due buone librerie là fuori per aiutare con questo.

The Drag and Drop Component Suite for Delphi. Se scorri verso il basso sulla home page vedrai alcune domande frequenti sono una buona lettura. Ci sono anche molte applicazioni di esempio con il download. Penso che le demo di AsyncSource dovrebbero essere utili per quello che stai cercando. La suite è freeware con fonte. Il codice sembra essere ben commentato.

Attualmente sto utilizzando il componente [email protected] da Quasidata. Non è gratuito ma è molto economico. Inizialmente ho utilizzato Transfer @ Once perché al momento era supportato meglio della suite di componenti Drag and Drop. Tuttavia, questa situazione si è invertita. Transfer @ Once non supporta ancora Delphi 2009. Quando riesco a spostare la mia applicazione, probabilmente cambierò componenti. Il codice Transfer @ Once è incluso con l'acquisto. Personalmente ho trovato il codice Drag and Drop per essere molto più facile da leggere e seguire.