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 VCL Delphi Discussion :

[TTreeView] TPopupMenu différent suivant l'item cliqué


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut [TTreeView] TPopupMenu différent suivant l'item cliqué
    Bonjour !

    Je suis en train de coder une petite appli pour générer des classes (je fais pas ça pour avoir le meilleur tools du monde, je veux juste m'entrainer à maitriser différents concepts liés à la POO).

    En gros ma MainForm est composé d'un TTreeView et au lieu d'avoir plein de boutons j'ai décidé de tout gérer avec des TPopupMenu.

    Ce que j'aimerais faire c'est que si l'utilisateur fait un clic droit sur une partie vide du TTreeView on a un popup "Ajouter une classe".
    Si on fait un clic droit sur une classe on aurait les Popup suivantes : "Editer Classe" "Supprimer Classe" "Ajouter un Membre" "Ajouter une property" "Ajouter une Methode".

    Et l'arbre se construit avec en noeud racine le nom de la classe (avec la classe elle-même dans Data) et des noeuds enfants correspondants à la visibilité (Privé, publics, protégés...) puis des noeuds enfants de ces derniers noeuds avec les différentés items possibles.

    J'ai créé une classe de base de type TItemClass dont héritent mes classes TMembre, TProperty et TMethode. Mais ce n'est pas trop le problème.

    J'ai créé autant de TPopupMenu que de "scénarios" possibles (il n'y a pas d'item cliqué, l'item cliqué est une classe, l'item cliqué est un TItemClass..etc...) et j'aimerais les associer dynamiquement à mon TTreeView.
    Pour celà j'utilise l'évènement OnClick et suivant le TreeView.Selected je renseigne la property PopupMenu de la TreeView.

    Mais j'ai un problème avec cette solution : un clic droit sur un item ne génère pas l'évènement OnClick. Du coup je suis obligé de faire un clic gauche sur l'item puis un clic droit dessus pour avoir le Popup menu d'édition/Suppression.

    D'où ma question : est-ce que je gère mal le problème : Les TPopupMenu "dynamiques" ça craint ?
    Ou alors il y a une possibilité qu'un clic droit puisse générer un évènement OnClick ?
    Peut-être existe-t-il des solutions moins complexes ?

    Merci d'avances pour vos réponses, j'espère avoir été assez clair dans mes explications.

    EDIT: J'ai réussi à faire générer l'évènement OnClick avec un clic droit en interceptant l'évènement OnMouseDown. Mais le TreeView.Selected ne change pas, il ne change qu'avec un réel clic gauche.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 669
    Points : 25 468
    Points
    25 468
    Par défaut
    Dans le PopupMenu, il y a OnPopup, ... ensuite il y a RightClickSelect, que personnellement, je n'aime pas (j'ai eu des soucis avec ...) donc à la main, on y arrive très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFrmTestDivers.PopupMenuTreePopup(Sender: TObject);
    var
       CursorPos: TPoint;
    begin
         GetCursorPos(CursorPos); 
         CursorPos := TreeView.ScreenToClient(CursorPos);
         MouseNode:= TreeView.GetNodeAt(CursorPos.X , CursorPos.Y);
         TreeView.Selected := MouseNode;
     
         // Ici faire de TMenuItem.Create et PopupMenuTree.Items.Add(...);
         MergeToPopupMenuTree();
    end;
    Au lieu de faire de Menu généré dynamiquement (c'est long et galère à affecter caption, tag, onClick, ...), tu peux mettre comme tu l'as dit, des popupMenu gérant chaque scénario, et merger à la volée ton Menu lié au TreeView à l'un des Menu scénario ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TFrmTestDivers.MergeToPopupMenuTree();
    var
       i: Integer;
       MenuItem: TMenuItem;
    begin
       PopupMenuTree.Items.Clear(); // Efface et libère les menus
       for i := 0 to PopupMenuToMerge.Items.Count - 1 do
       begin
          MenuItem:= TMenuItem.Create(PopupMenuToMerge);
          MenuItem.Caption := PopupMenuToMerge.Items.Items[i].Caption;
          MenuItem.OnClick := PopupMenuToMerge.Items.Items[i].OnClick;
          PopupMenuTree.Items.Add(MenuItem);
       end;
    end;

  3. #3
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Merci ShaiLeTroll, ça fonctionne super bien

    C'est plutôt astucieux comme méthode je trouve !

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/01/2008, 18h24
  2. Réponses: 2
    Dernier message: 08/05/2006, 21h08
  3. Réponses: 8
    Dernier message: 05/05/2006, 17h47
  4. Traitement des dates différent suivant le serveur
    Par le lynx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/09/2005, 11h14
  5. Action différente suivant les droits
    Par JMLD dans le forum XMLRAD
    Réponses: 2
    Dernier message: 27/04/2005, 17h25

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