IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

faire des drags&drops depuis l'extérieur suivant le format


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut faire des drags&drops depuis l'extérieur suivant le format
    Salut tout le monde,
    Je dois réaliser une application qui permet via des drag&drop de récupérer des informations qui peuvent être de formats diverses et variés (image, texte, URL, etc...) et de faire des traitements en conséquance. Par exemple si je fais un copier d'une image sous IE, il faudrait ke je puisse la réafficher dans mon appli.

    Pour l'instant j'arrive (je me suis basé sur un exemple) à récupérer le lien de l'image et à l'afficher (le lien) dans un TMemo.

    Ma question est la suivante: connaissez-vous des fonctions/API/Interfaces qui permettent d'analyser ce que contient le presse-papier de windows et de déterminer le format de l'objet copié ?

    Merci.
    --
    "Qui fait le malin tombe dans le ravin"

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut


    il suffit de regarder le source de la fameuse vcl et tu trouve

    regarde du cote de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumClipboardFormats(format);
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    En fait, après différentes recherches, je suis tombé sur la fonction Clipboard.HasFormat(). J'ai cruque ce serait l'outil idéal mais en fait je me suis rendu compte en testant différentes combinaisons sous word (qui me sert de référence pour gérer le drag&drop) que lors d'un drag, les objets (images ou textes) ne sont pas stockées dans le presse-papier. Je ne peux donc pas utiliser les méthodes de clipboard pour analyser le format de l'objet.

    Pour l'instant mon code ressemble à ceci et me permet juste de copier du texte à partir d'une application acceptant le drag&drop vers l'extérieur (pas Delphi ni winpad) par exemple firefox ou Notepad++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    unit F_DragDrop;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleCtnrs, StdCtrls, ActiveX, ComObj, ShellAPI, ComCtrls, ExtCtrls;
     
    type
      TfmMain = class(TForm, IDropTarget)
        paMain: TPanel;
        re: TRichEdit;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
     
      public
        { Déclarations publiques }
        function DragEnter(const dataObj: IDataObject;grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
        function DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
        function DragLeave: HResult; stdcall;
        function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
      end;
     
    var
      fmMain: TfmMain;
     
    implementation
     
    {$R *.dfm}
     
    procedure TfmMain.FormCreate(Sender: TObject);
    begin
      OleInitialize(nil);
      OleCheck(RegisterDragDrop(Handle, Self));
    end;
     
    procedure TFmMain.FormDestroy(Sender: TObject);
    begin
      RevokeDragDrop(Handle);
      OleUninitialize;
    end;
     
    function TFmMain.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    begin
      Result  := S_OK;
    end;
     
    function TFmMain.DragOver(grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    Var n : int64;
    Begin
      Result := S_OK;
    end;
     
    function TFmMain.DragLeave: HResult;
    begin
     Result := S_OK;
    end;
     
    function TFmMain.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    var
      aFmtEtc: TFORMATETC;
      aStgMed: TSTGMEDIUM;
      pData: PChar;
     
    begin
      if (dataObj = nil) then
        raise Exception.Create('IDataObject-Pointer is not valid!');
      with aFmtEtc do
      begin
        cfFormat := CF_TEXT;
        ptd := nil;
        dwAspect := DVASPECT_CONTENT;
        lindex := -1;
        tymed := TYMED_HGLOBAL;
      end;
      OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
      try
        pData := GlobalLock(aStgMed.hGlobal);
        re.Clear;
        re.SetSelTextBuf(pData);
      finally
       GlobalUnlock(aStgMed.hGlobal);
       ReleaseStgMedium(aStgMed);
      end;
      Result := S_OK;
    end;
     
    end.
    Comme vous pouvez le voir, les iformatoins que je récupère du drag depuis l'application extérieure est stockée dans IDataObject. Ce que j'aimerais c'est pouvoir obtenir le type de celui-ci.
    --
    "Qui fait le malin tombe dans le ravin"

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    J'ai vu un lien intéressant à propos des processus qui entrent en jeu lors d'un drag&drop : http://www.wideman-one.com/gw/tech/D...DropTheory.htm

    D'après ce que j'ai compris, lors du passage au drop (dans mon code delphi donc) je récupère un IObjectData à partir duquel on peut otenir l'IEnumFormatEtc correspondant. Pour cela il faut utiliser la fonction EnumFormatEtc. Le seul problème c'est que je ne comprends pas à quoi correspond le premier paramètre (le second correspondant à la variable qui contiendra le format). Siquelqu'un a une idée ?
    --
    "Qui fait le malin tombe dans le ravin"

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yop !

    Tu plaisantes ou t'as oublié ton meilleur ami ?
    Google, "EnumFormatEtc +delphi" -> 493 réponses, déjà avec les trois premières, tu sais quasiment tout !

    HTH,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    ok j'avance. D'après ce que j'ai vu, il n'y a que deux choix pour le premier paramètre : DATADIR_GET ou DATADIR_SET. Je saisis pas trop encore la nuance mais j'ai pu déduire que chaque fois que l'on désire récupérer des informations sur la source du D&D (Drag&Drop) il suffit d'utiliser DATADIR_GET.

    Mais en fin de compte ce n'est qu'un détail. Finalement je suis parvenu à obtenir ce que je cherchais mais il s'avère que ce n'est pas la bonne méthode et que je doive changer mes directives. En effet il s'avère hasardeux, limite masochiste de vouloir effectuer directement eds traitements en fonction du type de l'information. Je me contente à présent de récupérer l'information et de voir si c'est du texte/HTML (auquel cas je l'affiche directement) ou autre chose (alors je le stocke dans une base pour pouvoir l'exploiter par la suite).

    Sinon pour ceux qui se demandent comment récupérer les formats d'un IDataObject voici comment j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function TFmMain.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult;
    var
      aFmtEtc: TFORMATETC;
      aStgMed: TSTGMEDIUM;
      pData: PChar;
     
      tmpFormat: TFormatEtc;
      pFmtName: PChar;
      formats: IEnumFORMATETC;
     
    begin
      mo.Lines.Clear; // mo est un TMemo
      if (dataObj = nil) then
        raise Exception.Create('IDataObject-Pointer is not valid!');
      OleCheck(dataObj.EnumFormatEtc(DATADIR_GET, formats));
      while (formats.Next(1, tmpFormat, nil) = S_OK) do
      begin
        pFmtName := AllocMem(255);
        GetClipboardFormatName(tmpFormat.cfFormat, pFmtName, 254);
        mo.Lines.add(string(pFmtName));
        FreeMem(pFmtName);
      end;
    end;
    ++ tout le monde.
    --
    "Qui fait le malin tombe dans le ravin"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. Réponses: 2
    Dernier message: 08/11/2006, 18h13
  3. [Débutant]Faire un drag'n'drop
    Par lionrouge dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 10/06/2006, 01h20
  4. [VB.NET] Drap and Drop depuis l'extérieur
    Par Jarodnet dans le forum Windows Forms
    Réponses: 8
    Dernier message: 02/02/2006, 10h21
  5. Faire un drag and drop depuis IE vers un TListView
    Par ALEX77 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 11/11/2004, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo