1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 37
    Points : 29
    Points
    29

    Par défaut Créer des contrôles non rectangulaires (gestion du clic sur une forme)

    Bonjour.

    Je développe une appli où l'interface va contenir un panneau où sont déposés des objets qui doivent réagir à la souris.
    Ces objets vont former une sorte d'organigramme ou de réseau donc avec des nœuds compacts mais pas rectangulaires, mais surtout des liaisons linéaires dans toutes les directions.

    Si j'utilise un TControl ou un descendant, la zone de réaction à la souris est un rectangle ce qui n'est pas du tout ce que je veux obtenir (dans le cas d'une liaison, c'est uniquement sa diagonale qui doit réagir).
    Précision : ce que je cherche à produire est proche de ce qu'on obtient par exemple avec un diagramme réalisé sous LibreOffice Draw avec des formes reliées par des flèches ; on ne peut les sélectionner qu'en étant précisément dessus et le rectangle englobant un cercle n'a aucun effet au clic sur un cercle adjacent.

    Ma solution actuelle est de simplement dessiner sur le panneau une représentation des objets et définir en parallèle une liste de formes géométriques de façon qu'à chaque clic sur le panneau contenant ces objets je passe en revu la liste pour trouver dans quelle forme la souris se trouve.

    Je ne trouve pas ça très propre, surtout dans le cadre d'une programmation objet. Par ailleurs d'autres langage ont une propagation du clic du contrôle interne au contrôle conteneur. Je n'ai pas réussi à trouver comment réaliser ce mécanisme sous Lazarus. L'idée serait de laisser Lazarus gérer le clic, trouver le contrôle cliqué, que ce contrôle décide s'il est concerné (dans le rectangle englobant la forme -> dans la forme réellement) et sinon qu'il passe la main aux autres contrôles contenu dans le panneau et sous lui.

    Connaissez-vous un moyen de réaliser ça ?

    Les TShape ne sont donc pas utiles ici.

    Je peux créer un TControl personnalisé qui décidera si un clic est dedans ou dehors la forme qu'il a, mais comment transmettre le clic à d'éventuels contrôles qui se trouveraient dessous, mais toujours dans le panneau ? Faut-il que je passe par le panneau pour transmettre l'événement ou que ce soit lui qui soit personnalisé et qui gère l'événement sur la liste (ordonnée par un z-index) de ses contenus ?

    Merci de vos conseils.

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 873
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 873
    Points : 8 079
    Points
    8 079

    Par défaut

    Salut,

    en avançant sur la pointe des pieds et en prenant des pincettes, je dirais "TRegions" ?

    Je n'ai jamais joué avec (sauf une fois en Delphi il y a longtemps pour faire une zone transparence si je me souviens bien), donc à voir, faire des recherches, tout ça tout ça...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre actif
    Inscrit en
    juin 2012
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 167
    Points : 291
    Points
    291

    Par défaut

    En ce qui concerne le premier niveau pourquoi ne pas se baser sur la couleur de l'objet se trouvant sous le pointeur de la souris ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 37
    Points : 29
    Points
    29

    Par défaut

    @Jipété, merci pour l'info, j'ignorais l'existence de cet objet.

    Voici de la doc dessus : http://wiki.freepascal.org/LCL_Tips#...dow_or_control
    Je vais voir ce que cela donne avec la souris en particulier. Sur ce lien rien n'est dit et je pense que le paragraphe suivant n'a pas de rapport direct avec les TRegion.

    @mm_71, je ne comprends pas. Comment connaître cette couleur ?
    Ceci dit dans mon appli je ne pense pas qu'il y aura beaucoup de couleurs différentes.

  5. #5
    Membre actif
    Inscrit en
    juin 2012
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 167
    Points : 291
    Points
    291

    Par défaut

    @mm_71, je ne comprends pas. Comment connaître cette couleur ?
    Mets un label et une image quelconque sur un formulaire et dans l'évènement on mousemove de l'image:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      Label1.caption:=IntToHex(Image1.Canvas.Pixels[X,Y],6);
    end;
    Normalement on devrait pouvoir le faire avec le onmousemove de tout le formulaire mais on dirait qu'il y-a un problème:

    https://www.developpez.net/forums/d1...l-unite-graph/

    Ceci dit dans mon appli je ne pense pas qu'il y aura beaucoup de couleurs différentes.
    Il faudrait une couleur différente pour chaque contrôle différent.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2012
    Messages : 37
    Points : 29
    Points
    29

    Par défaut

    Je viens de faire un test simple avec les TRegion :
    - réduire l'affichage du contrôle à un rectangle plus petit,
    - fixer le curseur à autre chose que la flèche pour qu'il change au survol du contrôle.

    Résultat décevant : le curseur change en dehors de la zone visible mais où se trouve bien le contrôle. Donc Ceci permet de créer une transparence du contrôle (je vois les autres contrôles qui sont disposés derrière) mais n'agit pas sur la souris, tel quel avec le code trouvé sur le lien.
    A moins qu'il n'y ait un paramètre à fixer quelque part que je ne connais pas (encore).

    Point néanmoins intéressant, si on peut fixer la transparence par un bitmap et si on peut obtenir ce bitmap en retour, alors on peut avoir une forme quelconque et un moyen rapide de savoir si on est dedans ou dehors à la façon de mm_71 (transparence sur le bitmap à la position du pixel cliqué ou pas).

    @mm_71, c'est une solution du point de vue du conteneur, pas des contenants. Et malheureusement difficile d'attribuer des couleurs différentes ne serait-ce que par raison esthétique. Au pire on double le canvas du contrôle d'un bitmap qui mime le contenu et où cette fois la couleur est quelconque car invisible. Mais ça consomme en ressources.

    Voici peut-être une solution, en particulier en bas avec WMNCHitTest et htTransparent
    https://stackoverflow.com/questions/...nother-control


    [Edit]
    En fait TRegion fait bien le boulot.
    Un test plus approfondi qu'un simple changement de curseur au survol, en réagissant au clic, réagit bien comme souhaité : seule la région définie permet de déclencher l'événement, en dehors ce sont d'autres contrôles qui peuvent être dessous qui reçoivent l'événement.
    Reste ce comportement avec le curseur. Il est d'autant plus curieux qu'avant de faire ce dernier test j'ai cherché à intercepter les messages et trouvé une méthode à l'aide de WMNCHitTest ; elle permet bien d'intercepter TOUS les événements souris, clic comme survol, mais n'est pas appelée quand le changement de curseur a lieu !

    Pour ma part je considère avoir trouvé la solution au problème que j'ai à l'instant. Je ne ferme pas le sujet de suite car je n'en suis qu'au début de ce développement et risque de devoir revenir sur cette question et peut-être apporter des précisions sur le cas du curseur ou faire part de mes recherches sur le WMNCHitTest (mais là tout de suite, mon cerveau ressemble trop à de la marmelade après des heures de zapping entre des pages de résultats de recherche ...).

    Merci de votre aide.

  7. #7
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 447
    Points : 3 844
    Points
    3 844

    Par défaut

    salut

    attention cette méthode n'est valable que pour windows dans mes souvenir
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre expert
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 489
    Points : 3 543
    Points
    3 543

    Par défaut

    hello,
    peut-être aussi regarder du côté de l'exemple Lazarus shapedcontrols : <répertoire lazarus>\examples\shapedcontrols

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. [Lazarus] Créer un contrôle non rectangulaire
    Par FlorentA dans le forum Lazarus
    Réponses: 2
    Dernier message: 11/10/2013, 00h30
  2. [PPT-2007] Incrémenter la valeur d'une variable suite au clic sur une forme.
    Par BrItneY dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 07/09/2010, 14h48
  3. Créer des interpolations non linéaires
    Par Melem dans le forum Flash
    Réponses: 4
    Dernier message: 13/08/2009, 17h11
  4. Comment créer des contrôles indicés en VB2005?
    Par michel perraut dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/09/2007, 13h13
  5. Créer des contrôles en runtime
    Par cryborg dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 23/01/2007, 15h32

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