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

C++Builder Discussion :

Drag and drop "de l'extérieur"


Sujet :

C++Builder

  1. #1
    Invité
    Invité(e)
    Par défaut Drag and drop "de l'extérieur"
    J'ai déjà pas mal utilisé les drag and drop entre les différents composants d'une fiche. 8)

    Je voulais récupérer, dans mon code, le nom d'un fichier que l'on glisse de l'explorateur windows dans mon appli et dans l'évènement OnDragOver de mon composant (TTreeView), je ne vois rien arriver. Le curseur de la souris reste en "panneau interdiction".
    Et pourtant ça fonctionne même dans le bloc-notes...


    Quelqu'un a une solution ?

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Est ce que les propriétés DragKind et DragMode sont correctements positionnées ?

  3. #3
    Invité
    Invité(e)
    Par défaut DragKind & DragMode
    DragMode vaut dmAutomatic
    DragKind vaut dkDrag

    Vous pouvez facilement faire l'essai, il suffit de créer une fiche.
    Exécuter.
    Ouvrir l'explorateur, glisser un fichier sur la fiche...

    Le curseur reste à "Panneau interdiction"

    On doit pouvoir le faire en récupérant les messages windows, mais lesquels ? :

  4. #4
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 35
    Points : 34
    Points
    34
    Par défaut ;-)
    Salut,
    Met ca dans le oncreate de la form qui recoit le drag
    DragAcceptFiles(Handle, true);

    Ciao

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Regarde l'evenement OnDragOver et positionne Accept à true.
    Ensuite tu géres le OnDragDrop pour recevoir les informations glissée.

  6. #6
    Invité
    Invité(e)
    Par défaut Accept = true;
    C'est ce que j'ai fait :

    void __fastcall TForm1::FormDragOver(TObject *Sender, TObject *Source,
    int X, int Y, TDragState State, bool &Accept)
    {
    Accept = true; // (1)
    }

    Le curseur de la souris reste en "interdit".
    Et si on met un point d'arrêt sur la ligne (1), on n'y passe jamais...

    Essayez, vous verrez...

  7. #7
    Invité
    Invité(e)
    Par défaut No réponses ?
    Pas de solutions ?

  8. #8
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut Re: No réponses ?
    Citation Envoyé par Kaji
    Pas de solutions ? :?
    Non désolé, j'ai essayé aussi et effectivement ca ne marche pas.
    Si je trouve quelque chose je ferai un post.

    bon courage,

    McFoggy

  9. #9
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut
    Ca y est j'ai trouvé.

    Il faut intercepter un message Windows particulier : WM_DROPFILES.

    J'ai fait un petit exemple :

    Voila la définition de ma Form de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    private:	// Déclarations utilisateur
    public:		// Déclarations utilisateur
    	__fastcall TForm1(TComponent* Owner);
     
    	BEGIN_MESSAGE_MAP
    		MESSAGE_HANDLER(WM_DROPFILES, TMessage, WMDropFiles);
    	END_MESSAGE_MAP(TForm)
     
    	virtual void __fastcall WMDropFiles(TMessage &Message);
    };
    Voila son implémentation
    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
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	DragAcceptFiles(Handle,true);
    }
     
    void __fastcall TForm1::WMDropFiles(TMessage &Message)
    {
    	HANDLE hd;
    	int nbFiles;
    	char fileName[MAXPATH];
     
    	// Récup du handle de Drag and Drop
    	hd = (HANDLE)Message.WParam;
    	// Récup du nbre de fichiers droppés
    	nbFiles  = DragQueryFile(hd, 0xFFFFFFFF, fileName, MAXPATH - 1);
     
    	for (int i = 0; i < nbFiles; i++)
       {
    		// Pour chaque fichier droppé, on récup son nom
    		DragQueryFile(hd, i, fileName, MAXPATH - 1);
    		// et on l'affiche
    		ShowMessage(AnsiString("Le fichier : ") + AnsiString(fileName) + AnsiString(" a été draggé."));
       }
     
    		// On dit au système de libérer la mémoire utilisée
    		// pour la gestion du drag and drop
    	DragFinish(hd);
    }
    Bon courage pr la suite ...

    McFoggy

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Voila la solution à ton probleme.
    J'ai une fiche (TForm1) et un memo (TMemo1).
    Voila ce que tu dois faire.

    Dans l'entete d'unité, ajoutes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <ShellAPI.hpp>
    tu déclares ensuite une MESSAGE_MAP qui prendra en compte le message WM_DROPFILES :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected:
        BEGIN_MESSAGE_MAP
            VCL_MESSAGE_HANDLER(WM_DROPFILES, TMessage, HandleWMDropFiles)
        END_MESSAGE_MAP(TForm)
    tu déclares la fonction qui va faire le boulot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private:	// Déclarations utilisateur
        void __fastcall HandleWMDropFiles(TMessage &Message);
    Dans le source du programme :
    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
     
    void __fastcall TForm1::HandleWMDropFiles(TMessage &Message)
    {
        // un buffer pour les noms de fichier
        char *pstrBuffer = new char[MAX_PATH];
     
        // la structure du message
        HDROP hDrop = (HDROP) Message.WParam;
     
        // récupere le nombre de fichier
        int iCount = DragQueryFile(hDrop, 0xffffffff, NULL, 0);
     
        // efface les messages
        Memo1->Lines->Clear();
     
        // récupérer les fichiers
        for (int iIndex = 0; iIndex < iCount; iIndex++) {
            DragQueryFile(hDrop, iIndex, pstrBuffer, sizeof(char) * MAX_PATH);
     
            // ajouter, ici remplacer par TreeView->AddItem ou autre
            Memo1->Lines->Add(pstrBuffer);
        }
     
        // détruire le buffer
        delete [] pstrBuffer;
    }
    Dans le formcreate (ou le constructeur comme tu veux), tu ajoutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        DragAcceptFiles(Handle, true);
    et c'est tout
    Tu dois remplacer l'ajout de la ligne au memo par la gestion de la TreeView.
    Tu devras aussi gérer le fait qu'un utilisateur glisse un répertoire si tu veux aller chercher ce qui à dedans (algo récursif).

    Bon courage.

  11. #11
    Invité
    Invité(e)
    Par défaut Merci
    Merci , vous êtes super cools !!!

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je cherche une méthode pour faire l'opération dans l'autre sens, mais je n'ai pas trouvé de solution (drag n drop de l'application vers un dossier de Windows).

    Existe-t'il une solution à partir de la méthode OnDragOver ? (avec l'objet Source)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TTestFrm::OnDragOver(TObject *Sender, TObject *Source,
    			int X, int Y, TDragState State, bool &Accept)
    {
    	if (Source == TestListView)
    		Accept = true;
    	else
    		Accept = false;
    }

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 92
    Points : 46
    Points
    46
    Par défaut PB Drag and Drop "de l'extérieur"
    Bonjour,

    En cherchant la manière de faire glisser des documents du bureau vers mon application (sous Builder C++ XE7), j'ai trouvé la discussion ci-dessous et appliqué les procédures.

    Sur différentes configurations testées :

    - Fonctionnement OK sur un poste fixe de 2018, sous Windows 10
    - Non fonctionnement sur mon portable de développement de 2016, sous Windows 10 avec Builder C++ XE7 installé.
    - Non fonctionnement sur une machine plus ancienne (Imac avec un système Windows 10 sous Bootcamp qui était auparavant en Windows 7)

    Sur les postes qui ne fonctionnent pas, on ne passe jamais dans les procédures HandleWMDropFiles ou WMDropFiles.

    Le problème vient-il d'un paramètre système, car les m^mes procédures fonctionnent très bien d'un côté, et pas du tout de l'autre ?

    Merci pour toute aide.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/10/2009, 09h20
  2. [VB.NET] Microsoft TreeView drag and drop ?
    Par bigtoof dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/05/2004, 14h50
  3. [JSP][DRAG AND DROP]
    Par hamed dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 23/01/2004, 17h36
  4. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 09h23

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