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 :

Infobulles et Coordonnées des composants


Sujet :

Composants FMX Delphi

  1. #1
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut Infobulles et Coordonnées des composants
    Bonjour à tous,

    j'ai découvert avec horreur que les magnifiques infobulles avaient disparu sous FMX (ou alors elles sont bien cachées...).
    Au demeurant, ce que je voulais faire était un peu sioux du coup j'ai du refaire ça moi même. Mais j'ai un soucis sur le positionnement de l'infobulle en question :

    pour l'afficher, je me contente (un peu bourrin) de capter le OnMouseMove du composant, et d'afficher le composant TCallOut. le problème arrive : comment positionner le TCallOut pour que la pointe de la fleche soit dans le contrôle appelant ? En fait, le problème se pose dans le cas de composants imbriqués : le TCallOut doit être fils de la form de départ, sinon son affichage sera tronqué dans le composant qui le possède. En plus, je préfère utiliser un seul infobulle et remplir son contenu en fonction du composant appelant.
    Mais la se pose un autre problème : si le composant est dans un autre qui est dans un autre et ainsi de suite, je récupère comment les coordonnées ?
    j'ai essayé TControl.LocalToAbsolute, mais je sais pas trop ce que je récupère, et en plus ca ne s'applique qu'à un TControl.

    Je sais pas si ma demande est claire...

    imaginons (désolé de pas pouvoir vous donner le code pascal masi j'ai pas XE2 au boulot...) :

    Form1 contient edit1 et rectangle1
    rectangle1 contient edit2 et rectangle2
    rectangle2 contient button1

    je voudrais que mon callOut puisse être invoqué à partir de tous ces composants et du coup je dois être capable de récupérer les coordonnées d'un controle par rapport à la fenêtre de l'appli... C'est plus clair ?

    MErci à tous.
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  2. #2
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    En créant dynamiquement un TCallOut avec son Parent := "FormAppelante" et affecter la Position du TCallOut avec les coordonnées de la position de la souris ?

  3. #3
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par free07 Voir le message
    En créant dynamiquement un TCallOut avec son Parent := "FormAppelante" et affecter la Position du TCallOut avec les coordonnées de la position de la souris ?
    Pour la création dynamique c'est pas forcément nécessaire, si j'arrive à récupérer des coordonnées par rapport à la fiche de l'appli.

    En fait, le problème vient du fait (très pratique je le reconnais) que FMX permet à n'importe quel composant d'être un container pour un autre composant. Et ceci implique que le point 0,0 soit toujours relatif au container de niveau immédiatement supérieur.
    Le probleme vient aussi de l'impossibilité de transtyper entre TWinControl et TConrol et les autres. La solution que j'avais imaginé était de "remonter" tous les conatiners jusqu'à retrouver ma fiche de départ, masi la propriété Parent n'est pas disponible dans tous les controles (par exemple TEdit n'est pas un descendant de TWinControl, donc la chaine est rompue, je ne peux pas remonter comme ça)...
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  4. #4
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Je comprends pas vraiment pourquoi tu veux remonter tous les containers pour remonter jusqu'à la fiche, il suffit de mémoriser ta fiche lors de sa création avec Self
    Ca suffit pas ?

  5. #5
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par free07 Voir le message
    Je comprends pas vraiment pourquoi tu veux remonter tous les containers pour remonter jusqu'à la fiche, il suffit de mémoriser ta fiche lors de sa création avec Self
    Ca suffit pas ?
    ben non en fait. Le soucis est pas de repére la fiche, je l'ai depuis le début. Non le soucis est que dnas certains ca, le composant déclenchant l'infobulle est au niveau 1 de la fiche (son container est al fiche elle même), mais elle peut etre au niveau 3 : le container est un TEdit qui a pour container un TREctangle par exemple. Dans ce cas, comme chaque coordonée est relative au container parent, il faut bien que je remonte chaque container parent (dont le nombre est différent suivant les composants) afin de cumuler toutes les valeurs. Je vais faire un petit dessin ca sera plus simple...

    voila j'ai mis l'image.
    Chaque coordonnee est relative au container : par exemple pour le bouton 3, il est a 50 pts du coin du petit rectangle blanc qui le contient. Donc pour remonter jusqu'à la fiche, il est a
    50,50 (bouton) + 300,200 (rectangle blanc) + 100,100 (rectangle bleu) soit 450,350.
    pour le bouton2 :
    200,100 (bouton) + 100,100 (rectangle bleu) soit 300,200 par rapport à la fiche...

    Plus clair ?
    Images attachées Images attachées  
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  6. #6
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Plus clair pas vraiment car je ne vois pas dans quel but tu veux retrouver la position du composant pour lequel tu veux afficher le TCallOut.

    Je pensais plutôt à ceci :
    Dans l'événement MouseEnter du composant, faire apparaitre le TCallOut avec les positions de la souris ( TPlatform.GetMousePos )
    Et faire disparaitre le TCallOut lors de l'événement MouseLeave du composant en question.
    C'est pas ce que tu veux ?

  7. #7
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par free07 Voir le message
    Plus clair pas vraiment car je ne vois pas dans quel but tu veux retrouver la position du composant pour lequel tu veux afficher le TCallOut.
    Pour pouvoir afficher le CallOut au bon endroit...

    Citation Envoyé par free07 Voir le message
    Je pensais plutôt à ceci :
    Dans l'événement MouseEnter du composant, faire apparaitre le TCallOut avec les positions de la souris ( TPlatform.GetMousePos )
    Et faire disparaitre le TCallOut lors de l'événement MouseLeave du composant en question.
    C'est pas ce que tu veux ?
    Ca ne marchera pas, car leMouseLeave est invoqué dès que la souris bouge sur le callout. Sauf à déclarer le HitTest à false mais ça m'arrange pas.
    Mon soucis est pas de provoquer l'affichage du callout (ca c'estpas le soucis) ni même sa disparition, mais bien d'être capable de le positionner correctement (à 50 pts plus a droite que le "left" du contrôle, et la pointe de la fleche du callout centré verticalement sur le controle appelant).
    En fait, si j'ai mis le dessin c'est pour faire comprendre mieux mon soucis :
    • un composant s'affiche dans le canvas du container parent, donc si mon callout est plus grand que le controle appelant ca marche pas (ce qui sera presque toujours le cas) car dans ce cas l'affichage est tronqué. Donc il faut que mon callout ait pour container la fiche de l'appli
    • mais du coup, comme chaque système de coordonnées se fait par rapport au container directement parent, il faut bien que je puisse remonter jusqu'à la source.
    • il peut y avoir un nombre différents de containers entre la fiche de l'appli et le controle déclenchant le callout


    TPlatform.GetMousePos va bien me renvoyer la position de la souris sur l'écran, si je retranche la position de la fiche surl'écran, j'obtiens les coordonnées de la souris sur la fiche. Mais ca me permet aps de positionner correctement par rapport au controle, puisque justement je n'ai aps la position du controle par rapport à la fiche.

    En fait mon soucis c'est exactement ça : comment obtenir la position d'un controle par rapport à la fiche, en faisant abstraction de tous les contaners qui pourraient se trouver entre la fiche et le contrôle...
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 3 601
    Points : 10 305
    Points
    10 305
    Billets dans le blog
    6
    Par défaut
    Si tu peux connaître en même temps la position du curseur sur l'écran et sur le contrôle, tu dois être capable de déduire la position du contrôle sur la fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TopLeftCtrlOnForm.X:=MouseScreenPos.X-Form.Left-MouseCtrlPos.X; en pseudocode
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    Pour pouvoir afficher le CallOut au bon endroit...
    Ca ne marchera pas, car leMouseLeave est invoqué dès que la souris bouge sur le callout.
    Je ne pense pas que cela soit un problème, si l'utilisateur déplace la souris sur le contrôle et qu'il veut lire le message affiché par le CallOut, il corrigera la position de la souris de lui même.

    Citation Envoyé par arkhamon Voir le message
    TPlatform.GetMousePos va bien me renvoyer la position de la souris sur l'écran, si je retranche la position de la fiche sur l'écran, j'obtiens les coordonnées de la souris sur la fiche.
    Et comme la souris sera sur le contrôle en question si tu positionnes le CallOut en rapport avec les positions de la souris comme on vient d'indiquer et bien le CallOut apparaitra aussi sur le contrôle, effectivement si tu veux qu'il apparaisse précisement par rapport à l'angle gauche dudit contrôle, cela ne marchera pas, mais en même temps, l'utilisateur le fera apparaitre ou il veut précisément si tu repositionnes le CallOut lors du MouseMove, c'est en tout cas la solution que j'adopterai à défaut.
    Mais j'ai pas testé, à voir...

  10. #10
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par free07 Voir le message
    Je ne pense pas que cela soit un problème, si l'utilisateur déplace la souris sur le contrôle et qu'il veut lire le message affiché par le CallOut, il corrigera la position de la souris de lui même.
    Pas très user friendly tout ça...

    Citation Envoyé par free07 Voir le message
    Et comme la souris sera sur le contrôle en question si tu positionnes le CallOut en rapport avec les positions de la souris comme on vient d'indiquer et bien le CallOut apparaitra aussi sur le contrôle, effectivement si tu veux qu'il apparaisse précisement par rapport à l'angle gauche dudit contrôle, cela ne marchera pas, mais en même temps, l'utilisateur le fera apparaitre ou il veut précisément si tu repositionnes le CallOut lors du MouseMove, c'est en tout cas la solution que j'adopterai à défaut.
    Mais j'ai pas testé, à voir...
    Je pense finalement avoir trouvé la solution : en plus de ce que je mettais au dessus, on doit bien pouvoir récupérer le controle qui est sous le curseur de la souris et du coup j'aurai ce qu'il me faut.

    Dès que je trouve je poste ça...
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  11. #11
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    Pour pouvoir afficher le CallOut au bon endroit...


    Ca ne marchera pas, car leMouseLeave est invoqué dès que la souris bouge sur le callout. .
    Citation Envoyé par arkhamon Voir le message
    Pas très user friendly tout ça...
    Effectivement, mais de toute façon ( et j'y ai pensé après avoir posté ) si tu déplaces ton CallOut dans l'événement MouseMove et bien la souris ne pourra jamais passé sur le CallOut vu que celui ci se déplacera en même temps qu'elle donc le problème du MouseLeave n'éxiste pas

  12. #12
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par free07 Voir le message
    Effectivement, mais de toute façon ( et j'y ai pensé après avoir posté ) si tu déplaces ton CallOut dans l'événement MouseMove et bien la souris ne pourra jamais passé sur le CallOut vu que celui ci se déplacera en même temps qu'elle donc le problème du MouseLeave n'éxiste pas
    Ca pour le coup j'y avais pas pensé. Me demande quand même si ça va pas finir par énerver l'utilisateur...
    A voir...
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  13. #13
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    Ca pour le coup j'y avais pas pensé. Me demande quand même si ça va pas finir par énerver l'utilisateur...
    A voir...
    Vi, si un contrôle a une taille importante, cela risque d'être agaçant...
    Ou alors tu supprimes l'affichage au bout d'un certain temps avec l'utilisation d'un timer, à voir aussi...
    Pour afficher l'aide des contrôles, j'ai plutôt choisi la solution du StatusBar et d'y afficher les messages d'aide lorsque l'utilisateur passe la souris sur un contrôle.

  14. #14
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    J'utilise aussi le statusbar pour les info générales. La en fait un controle TEdit contient une valeur finale, et je me sers de l'infobulle pour lister les lignes ayant permis de calculer le résultat. Du cop le statusbar est pas pratique pour ça...
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

Discussions similaires

  1. [Delphi] Icone des composants dans la palette
    Par jacquesberger dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/04/2004, 15h42
  2. [MFC] acces a des composants
    Par abignon dans le forum MFC
    Réponses: 7
    Dernier message: 26/03/2004, 11h58
  3. [Kylix] Trouver des composants pour Kylix 3
    Par busy999 dans le forum EDI
    Réponses: 2
    Dernier message: 17/02/2003, 14h01
  4. Réponses: 1
    Dernier message: 26/01/2003, 15h13
  5. Réponses: 1
    Dernier message: 02/01/2003, 12h45

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