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 :

Fonction équivalente à ObjectAtPoint mais pour un contrôle 3D


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut Fonction équivalente à ObjectAtPoint mais pour un contrôle 3D
    Bonjour,

    J'ai une fiche qui contient un Viewport3D dans lequel j'ai des contrôles 3D comme par exemple des Trectangle3D.
    J'aimerais connaître l'objet qui se situe aux coordonnées écran x et y dans la vue courante, je n'arrive pas à trouver...

    merci
    Franck

  2. #2
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    finalement j'ai trouvé une solution:

    voici un exemple de fonction qui retourne l'objet aux coordonnées x et y
    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
     
    Var 
      R:Trectf;
      i : integer;
     ctrl : Tcontrol3D;
    Begin
      result:=nil;
       with Viewport3D1 do 
        for i := childrencount-1 downto 0 do
        if children[i] is TControl3D then
        Begin
          Ctrl:=TControl3D(children[i]);
          R := Ctrl.ScreenBounds;
          if ptInRect(R,point(round(x),round(y))) then
          Begin
            result:=Ctrl;
            exit;
          End;
        End;
      End;

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je pense qu'il faut plutôt utiliser FMX.Controls3D.TControl3D.ObjectAtPoint qui si tout va bien tient compte des recouvrements et des transformations de l'objet
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    ObjectAtPoint est protégé, donc j'avais essayé de créer un type herité et de l'utilisé ainsi mais il me retournait systématiquement l'objet TViewport3D et non pas mon objet Rectangle3D.
    Pas grave, j'en reste avec ma fonction qui marche très bien.
    merci

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Alors, j'ai un peu creusé la question...c'est très con car le test est déjà fait par FMX

    TForm.Hovered est l'objet sous la souris, mais le problème est de déterminer quel est cet élément car le OnMouseMove par exemple ne se déclenche que pour l'objet sous la Souris et non son parent

    tu peux facilement faire le test en mettant un Timer sur la fiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      Ctrl: IControl;
    begin
      Ctrl := Hovered;
      if Assigned(Ctrl) then
      begin
        Label1.Text := Ctrl.GetObject.ClassName;
      end;
    end;
    Si tu places la souris sur un objet 3D dans le Viewport3D c'est bien lui qui sera remonté.

    l'objet est déterminé par TForm.ObjectAtPoint() pour un point en coordonnées écran (ClientToScreen)...


    sauf que si tu places le code sur MouseMove du Viewport ça ne donne rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    var
      Ctrl: IControl;
    begin
      Ctrl := ObjectAtPoint(ClientToScreen(TPointF.Create(Viewport3D1.Position.X + X, Viewport3D1.Position.Y + Y)));
      if Assigned(Ctrl) then
      begin
        Label2.Text := Ctrl.GetObject.ClassName;
      end;
    end;
    tout simplement car MouseMove n'est pas déclenché quand tu es sur un objet enfant

    j'ai un cube et un cylindre, si je joue sur HitTest ça marche
    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
     
    procedure TForm1.Viewport3D1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    var
      Ctrl: IControl;
    begin
     
      Cube1.HitTest := True;
      Cylinder1.HitTest := True;
     
      Ctrl := ObjectAtPoint(ClientToScreen(TPointF.Create(Viewport3D1.Position.X + X, Viewport3D1.Position.Y + Y)));
     
      Cube1.HitTest := False;
      Cylinder1.HitTest := False;
     
      if Assigned(Ctrl) then
      begin
        Label2.Text := Ctrl.GetObject.ClassName;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    Ok merci Paul,

    J'ai testé le hovered mais il ne m'affiche que le Viewport3D, le mousemove aussi mais je ne vais pas aller plus loin, je vais rester avec ma fonction qui me satisfait pleinement.

    merci encore.
    F.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/03/2015, 16h43
  2. Réponses: 10
    Dernier message: 16/01/2011, 22h16
  3. [VB6]Une fonction comme Trim(), mais pour les "-"
    Par Jihnn dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 13/04/2006, 19h43
  4. BeginUpdate mais pour les TWinControl
    Par Arrown dans le forum Composants VCL
    Réponses: 12
    Dernier message: 14/04/2005, 23h08
  5. Cherche composant comme TComPort mais pour l'USB
    Par Walm dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/04/2004, 15h57

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