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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 �prouv�
    Homme Profil pro
    VP of Research and Innovation
    Inscrit en
    Mai 2002
    Messages
    84
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : Canada

    Informations professionnelles :
    Activit� : VP of Research and Innovation

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    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
    Membre averti
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Mars 2002
    Messages
    35
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

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

    Ciao

  5. #5
    Membre �prouv�
    Homme Profil pro
    VP of Research and Innovation
    Inscrit en
    Mai 2002
    Messages
    84
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : Canada

    Informations professionnelles :
    Activit� : VP of Research and Innovation

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    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 exp�riment�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mars 2002
    Messages
    192
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    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 exp�riment�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mars 2002
    Messages
    192
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    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 �prouv�
    Homme Profil pro
    VP of Research and Innovation
    Inscrit en
    Mai 2002
    Messages
    84
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : Canada

    Informations professionnelles :
    Activit� : VP of Research and Innovation

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    11
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    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;
    }

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    93
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    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.

  13. #13
    Invit�
    Invit�(e)
    Par d�faut Merci
    Merci , vous �tes super cools !!!

+ 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