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 & Drop "visible"


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut Drag & Drop "visible"
    Bonjour,

    Après avoir enfin réussi à permettre un Drag & Drop sur une fiche (depuis un label vers un autre label), j'aimerais que, lors du Drap & Drop, le label soit visible entièrement.
    Il est possible de changer le curseur, ou bien de mettre la valeur DkDock à la propriété DragKind, mais dans ce cas le label source est simplement limité par des pointillés (et en plus l'action doit être gourmande puisque c'est assez lent).

    Est-il possible de voir l'objet (ici le label) tel qu'il est pendant un évènement de type Drag & Drop ?

    Par avance, merci.
    Nuclear.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Es-tu bien conscient que tu ne nous a pas dis quelle bibliothèque graphique tu utilises?

    Dans de telles conditions, nous ne pouvons que te recommander d'investir dans une boule de cristal.
    Si un tel produit t'intéresse, fais attention, certains modèles sont fragiles, et se cassent souvent…

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Manifestement, vu les questions précédentes, cela doit être du C++ Builder. J'ai déplacé en conséquence, on pourra re-déplacer si ce n'était pas ça.

    Sinon, c'est un problème général, beaucoup se trompe entre le langage (C++), l'IDE (Builder, VS, Qt Creator) et le framework utilisé (Qt)... ça viendra avec le temps

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est malheureux, en effet…

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Je me permets de compléter les informations qui semblent manquer aux courageux qui osent m'aider.

    J'utiliser Borland C++ Builder 6.
    Apparemment, j'utilise la librairie VCL.

    Ma question tient toujours :
    est-il possible de voir l'objet (ici le label) tel qu'il est (et non juste représenté par des contours en pointillés) pendant un évènement de type Drag & Drop ?

    Par avance, merci.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    As-tu essayé un TStaticText qui est la version "Win Control" d'un TLabel qui est un "Graphic Control"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Oui je viens tout juste d'essayer.
    Cela ne semble pas changer.

    Je vais essayer de me pencher sur l'évènement OnDragOver et d'exploiter les paramètres X et Y.

    Merci.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Je me permets de me répondre à moi-même.
    Imaginons que ça intéresse quelqu'un...

    Finalement, j'ai récupéré un code assez trivial mais auquel je n'avais pas pensé.

    Dans l'évènement OnMouseDown (sachant que ClickG est un booléen -dont la portée est globale- et PosX et PosY des entiers globaux aussi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PosX=X;
    PosY=Y;
    ClickG=true;
    Dans l'évènement OnMouseUp :
    Dans l'évènement OnMouseMove :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (ClickG==true)
    	{
    	Label1->Left=Label1->Left+X-PosX;
    	Label1->Top=Label1->Top+Y-PosY;
    	}
    Pour que les autres contrôles ne clignotent pas pendant le déplacement, je me suis permis d'ajouter dans l'évènement OnActivate de la form (idée excellente récupérée sur le net)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->DoubleBuffered=true;

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    Citation Envoyé par Nuclear88 Voir le message
    -dont la portée est globale- et PosX et PosY des entiers globaux aussi
    Cela peut-être plutôt des membres privés de la classe TForm associé que des variables globales !

    En C++, on les nommera plutôt avec pv_ pour Private donc pv_PosX, pv_PosY et pv_ClickG
    En C++ Builder, norme VCL Delphi, F comme Field donc FPosX, FPosY et FClickG

    Citation Envoyé par Nuclear88 Voir le message
    OnActivate de la form ... DoubleBuffered
    C'est une propriété publiée, tu peux mettre sa valeur directement via l'IDE en DesignTime
    Pense que OnActivate est lancé à chaque récupération du Focus lors du changement de fenêtre au sein de ton programme.

    Finalement, ce n'est plus du Drag & Drop mais juste un déplacement d'un composant : Déplacer un contrôle en run-time

    Si cela t'intéresse, avec un TWinControl (TPanel, TStaticText), tu as aussi cette variante qui ne nécessite pas de calculer soit même le déplacement, juste au moment du OnMouseDown, ensuite Windows le fait pour nous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::PanelMovableMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      if (Sender->InheritsFrom(__classid(TPanel)))
      {
        ((TPanel*)Sender)->BringToFront();
        ((TPanel*)Sender)->Invalidate();
        ((TPanel*)Sender)->Perform(WM_LBUTTONUP, 0, 0);
        ((TPanel*)Sender)->Perform(WM_SYSCOMMAND, SC_MOVE + 2, 0); // Bloque tant que l'on maintient le bouton de la souris appuyé !
      }
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Merci pour tes explications ShaiLeTroll !
    J'en prends bonne note ! Par contre, je n'ai pas testé la solution que tu proposes avec un TWinControl.

    Cependant, j'avoue, la solution que j'ai postée ne répond pas vraiment à mon problème.
    Je pensais utiliser l'évènement OnMouseEnter d'un autre objet, je m'explique :

    alors que je "draggais" manuellement un label, je pensais détecter cette action en définissant un comportement sur un autre label -à l'aide de la méthode OnMouseEnter.
    Seulement, l'évènement OnMouseEnter ne s'éxécute que si le pointeur de la souris est "nu". S'il est déjà par dessus un autre contrôle, rien ne se passe.

    J'ai trouvé diverses pistes. Notamment l'évènement OnMouseDrag qui prend pour paramètre un DragObjet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void __fastcall TOrdre::Label1StartDrag(TObject *Sender,
          TDragObject *&DragObject)
    Mais la doc n'est pas très claire et je n'ai trouvé aucun exemple, nulle part.

    Je vais quand même définir mon objectif.
    J'ai 5 labels dont le caption est un nombre au hasard.
    J'aimerais permettre à l'utilisateur de les placer (ancrer ?) dans 5 contrôles et pouvoir vérifier, in fine, s'ils ont été classés par ordre croissant.

    Merci, avant tout, de vous être déjà penché sur mon problème.

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    Version Drag&Drop

    Je viens de regarder un Drag&Drop sur une application que j'ai modifié, c'est depuis un TListView vers un TBitBtn, l'image et le texte de l'item cliqué ne sont affichés que sur le TListView, dès que l'on sort cela prend la forme du curseur fleche+rectangle blanc

    Cela correspond à ShowDragImage

    Citation Envoyé par aide
    Comme TDragObject n'implémente pas les images de glissement (ne comptant que sur le curseur), ShowDragImage ne fait rien pour TDragObject. Les classes descendantes, telles que Vcl.Controls.TDragControlObject, peuvent redéfinir ShowDragImage pour afficher l'image de glissement.
    Si l'on fait la même chose avec l'explorateur de fichier, le texte et l'icone persiste au déplacement sur l'arborescence ou ailleurs, c'est donc possible

    Personnalisation du glisser-déplacer avec un objet déplacement

    Regarde TDragObject.AlwaysShowDragImages, tu dois pouvoir le passer à true durant le OnStartDrag,
    il doit falloir CREER ta propre instance de TDragControlObject\ TDragControlObjectEx,
    j'aurais même tendance à dire qu'il faudrait que tu fasse ta propre classe pour avoir accés à la méthode protégée TDragObject.GetDragImages qui te fournie une TDragImageList que tu pourras modifier !
    Tu dois même pouvoir redéfinir ShowDragImage


    Version MouseMove
    Il te suffit durant ton OnMouseMouse, d'utiliser la méthode ControlAtPos sur le Parent de zone de destination (celle du OnEnter)
    Tu pourras ainsi savoir si tu peux ancrer ton label dans la zone de drop !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Merci pour tes propositions ShaiLeTroll.

    Finalement, j'ai opté pour la version OnMouseMove que tu proposes.
    Après maintes recherches en ligne, je sais enfin utiliser la méthode ControlAtPos.

    Par contre, j'ai codé non pas dans l'évènement OnMouseMove mais dans OnMouseUp. Comme ça, au moment du relâchement du bouton gauche, le label peut s'insérer parfaitement.

    Cette méthode me plaît beaucoup. Cependant, compte tenu de mes 5 labels et de 5 tests de position nécessaires pour chacun d'entre-eux, ça risque d'être laborieux.

    Existe-t-il une propriété type "Name" ou une méthode "GetName()" pour le TObject *Sender (l'un des paramètres de OnMouseUp) ?

    Je pourrais ainsi coder quelque chose qui ressemblerait à ça : (ce code est purement fantasmé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TOrdre::Label1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    //Point(120,159) correspond à ma zone "destination"
    if (ControlAtPos(Point(120,159),false)==Sender->Name)
            {
            //avec le code suivant, j'ancre le label que je suis en train de manipuler
            //dans la zone de destination
            Sender->Left=80;
            Sender>Top=120;
            }
    }
    Merci encore pour ta participation.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Par défaut
    Finalement, j'ai trouvé la solution.
    Je l'ai d'ailleurs trouvée dans la FAQ du site

    Il faut d'abord convertir Sender, initialement pointeur sur TObject, vers un pointeur vers TLabel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TLabel *CeLabel;
    CeLabel = dynamic_cast <TLabel *> (Sender);
    //à partir de ce moment, on peut exploiter les propriétés de CeLabel
    if(ControlAtPos(Point(95,168),false)==CeLabel
    {
    CeLabel->Left=55;
    CeLabel->Top=128;
    }
    De cette manière, je peux copier ce code dans tous les TLabels, sans rien changer.

    Du coup, je passe le topic à "résolu".
    Merci.

+ 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

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