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

Composants FMX Delphi Discussion :

[D10] Comment faire du drag-drop en FMX ? [Windows]


Sujet :

Composants FMX Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut [D10] Comment faire du drag-drop en FMX ?
    Comment faire du drag-drop en FMX ?

    Voici mon exemple :
    J'ai des TRectangle alignés dans un TLayout.
    Je souhaiterais les intervertir avec un glisser-déposer.

    Mes rectangles à déplacer ont leur DragMode à dmAutomatic.
    Le layout parent a son DragMode à dmManual, et les évènements DragOver et DragDrop.

    A l'exécution, je peux démarrer le glisser des rectangles, mais les évènements DragOver et DragDrop ne se déclenchent pas.
    J'ai comparé avec l'exemple de Paul (http://lookinside.free.fr/delphi.php?FMXBasedDragDrop), mais je ne vois pas ce que j'ai fait de différent (au niveau des DragMode et des évènements). Le pire, c'est que son projet compile et fonctionne bien.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Salut,

    je n'ai pas testé mon code depuis un moment, mais je sais qu'il y a eu des changements, notamment car maintenant AddPlatformService() lève une exception au lieu d'ignorer le code si un gestionnaire existe déjà (si mon souvenir est bon).

    sinon tu n'as pas oublié de désactiver le HitTest ? sinon la souris est sur le composant déplacé et le DragOver ne fonctionne pas (cf MouseMove)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    sinon tu n'as pas oublié de désactiver le HitTest ? sinon la souris est sur le composant déplacé et le DragOver ne fonctionne pas (cf MouseMove)
    Je ne comprend pas bien.
    J'ai essayé, et cette fois il ne se passe plus rien du tout : le glisser ne démarre même plus. Ca me semble logique, puisque sans HitTest, je ne peux plus agir sur les rectangles.

    Voici où j'en suis :
    Nom : FMX.png
Affichages : 853
Taille : 3,1 Ko
    3 TRectangles dans un TLayout.

    Mon code (qui est un copier-coller du tien) :
    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
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
    begin
      FMousePos.X := X;
      FMousePos.Y := Y;
      inherited;
    end;
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
    begin
      FMousePos.X := X;
      FMousePos.Y := Y;
      inherited;
    end;
     
    procedure TForm1.LayoutDragOver(Sender: TObject; const [Ref] Data: TDragObject; const [Ref] Point: TPointF; var Operation: TDragOperation);
    begin
      if(Data.Source is TRectangle) and (TControl(Data.Source).Parent <> Sender) then
        Operation := TDragOperation.Move
      else
        Operation := TDragOperation.None;
    end;
     
    procedure TForm1.LayoutDragDrop(Sender: TObject; const [Ref] Data: TDragObject; const [Ref] Point: TPointF);
    begin
      TControl(Data.Source).Parent := TFmxObject(Sender);
    end;
    En mettant des points d'arrêt dans ces deux évènements (OnDragOver et OnDragDrop), je vois qu'on n'y passe jamais (avec ou sans HitTest sur les TRectangle).
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  4. #4
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par Lung Voir le message
    En mettant des points d'arrêt dans ces deux évènements (OnDragOver et OnDragDrop), je vois qu'on n'y passe jamais (avec ou sans HitTest sur les TRectangle).
    Les évènements DragDrop et DragOver sont sur le Layout donc si sur le layout le Hittest est à false aucun évènement lié à la souris ne sera déclenché.
    Par contre je ne comprends pas bien le but du Drag and Drop dans le code.

    Parce qu'avec ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Data.Source is TRectangle) and (TControl(Data.Source).Parent <> Sender) then
    Le Rectangle n'a pas déjà le Layout comme Parent ? Parce que si oui tu ne passera jamais là dedans

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    en fait, je n'ai pas compris, tu utilises mon unité Drag&Drop (qui fonctionne très bien sous Android avec Berlin) ou tu utilises ton propre code ?

    quand je parlais du HitTest, c'est celui de mon TDragImage, sinon il est destinataire de DragOver et DrapDrop (cf mes commentaires "don't see me" et "see me") par contre il faut le réactiver pour qu'il chope le MouseMove
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Les évènements DragDrop et DragOver sont sur le Layout donc si sur le layout le Hittest est à false aucun évènement lié à la souris ne sera déclenché.
    C'était tout bêtement ça qui me manquait.
    Maintenant, mon projet test fonctionne bien :
    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
    procedure TForm1.LayoutDragOver(Sender: TObject; const [Ref] Data: TDragObject; const [Ref] Point: TPointF; var Operation: TDragOperation);
    begin
      if(Data.Source is TRectangle) and (Data.Source <> Sender) then
        Operation := TDragOperation.Move
      else
        Operation := TDragOperation.None;
    end;
     
    procedure TForm1.LayoutDragDrop(Sender: TObject; const [Ref] Data: TDragObject; const [Ref] Point: TPointF);
    var
      PositionPrec: Single;
    begin
      if(Data.Source is TRectangle) and (Data.Source <> Sender) then
      begin
        if(Sender is TRectangle) then
        begin
          PositionPrec := (Data.Source as TRectangle).Position.X;
          (Data.Source as TRectangle).Position.X := (Sender as TRectangle).Position.X;
          (Sender as TRectangle).Position.X := PositionPrec;
        end
        else if(Sender is TLayout) then
        begin
          (Data.Source as TRectangle).Position.X := Point.X;
          Rectangle1.Align := TAlignLayout.None;      Rectangle1.Align := TAlignLayout.Left;
          Rectangle2.Align := TAlignLayout.None;      Rectangle2.Align := TAlignLayout.Left;
          Rectangle3.Align := TAlignLayout.None;      Rectangle3.Align := TAlignLayout.Left;
        end;
      end;
    end;
    Maintenant que le concept fonctionne, je n'ai plus qu'à faire un truc propre ...

    Citation Envoyé par Thierry Laborde Voir le message
    Par contre je ne comprends pas bien le but du Drag and Drop dans le code.
    Pour l'instant, c'est juste un projet de test pour me familiariser avec le glisser-déposer en FMX.
    A terme, les rectangles représenterons des en-têtes de colonne, qu'il sera possible d'échanger pour modifier l'ordre des colonnes.

    Citation Envoyé par Thierry Laborde Voir le message
    Parce qu'avec ce test ...... Parce que si oui tu ne passera jamais là dedans
    Comme les évènements n'étaient même pas appelés, je n'avais pas encore réfléchit à ce que j'allais y mettre.

    Citation Envoyé par Paul TOTH Voir le message
    en fait, je n'ai pas compris, tu utilises mon unité Drag&Drop (qui fonctionne très bien sous Android avec Berlin) ou tu utilises ton propre code ?
    J'utilise mon propre code. Pour l'instant, ma cible c'est windows. Mais même là, je n'arrivais à rien.
    Pour androïde, on verra plus tard ...

    pour votre aide.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  7. #7
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    Un lien qui devrait également t'intéresser :

    http://firemonkeyblog.blogspot.ch/20...nkey-form.html

    Et notamment la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Layout1.Root.Captured := Layout1;
    En fait cela permet que le layout1 capture les événements de la souris même si le hittest est à False. Ce qui est pratique certaines fois, notamment dans les Drag and Drop.
    Dans le même genre tu as le AutoCapture qui est aussi intéressant.

  8. #8
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    @Lung

    Pour info ta boite de messages sur DVP est pleine et du coup on ne peut plus t'envoyer de MP.

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Un lien qui devrait également t'intéresser :
    http://firemonkeyblog.blogspot.ch/20...nkey-form.html
    Effectivement.
    Je vais tester cette solution pour comparer laquelle colle le mieux à ce que je cherche ...

    Citation Envoyé par Thierry Laborde Voir le message
    Pour info ta boite de messages sur DVP est pleine et du coup on ne peut plus t'envoyer de MP.
    J'en ai supprimé 2 ~ 3. Faut que je fasse du ménage ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

Discussions similaires

  1. [TListView] Comment faire du Drag&Drop ?
    Par XioN dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/10/2005, 11h30
  2. Réponses: 4
    Dernier message: 25/01/2005, 22h14
  3. Comment faire un Drag&Drop d'un TListBox vers un TDbCtrlGrid ?
    Par claude dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 14h08
  4. Comment faire un Drag&Drop vers Windows ?
    Par Lung dans le forum Composants VCL
    Réponses: 17
    Dernier message: 21/06/2004, 13h10
  5. Comment faire un Drag&Drop sur un tableau
    Par Stef.web dans le forum Composants VCL
    Réponses: 6
    Dernier message: 11/10/2003, 13h12

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