Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326

    [delphi] verificare se in clipboard ci sono file da Cut (ctrl-x) o da Copy (ctrl-c)

    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

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    L'operazione di copia o spostamento del file viene effettuata dal tuo programma, oppure deleghi questa operazione interfacciandoti alla shell di Windows Explorer?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    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.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    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!
    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.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

    codice:
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.