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

Delphi Discussion :

[D7] Treeview - Annuler l'effet d'un double clic


Sujet :

Delphi

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [D7] Treeview - Annuler l'effet d'un double clic
    Bonjour à tous,

    J'ai un treeview qui contient un arbre (extraordinaire !!! ).
    Lorsque je double clique sur un élement (treeNode), j'ouvre une fenetre.

    Seulement, il y a un comportement automatique qui fait s'ouvrir ou se refermer l'arborescence du noeud lors du double clic sur celui ci.... Je n'en veut pas.

    Comment l'enlever ?

    Merci d'avance.
    David.

  2. #2
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Salut

    Il faut que tu mettes sa propriété autoexpand à "False"

  3. #3
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    C'est fait, mais ce n'est pas ca.

    Autoexpand, c'est lors du simple clic.
    Cette propiété est à False par défaut...
    David.

  4. #4
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Oups, j'ai mal lu le topic....

    Je vais chercher de mon coté...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Je n'ai pas trouvé d'autres solutions que d'hériter TCustomTreeview et d'intercepter la notification de l'expand pour la bloquer dans le cas d'un double-clic.
    Ca m'a intéressé de le faire pour voir, je te donne le fruit de ma recherche :
    (Attention, par défaut le treeview fonctionne normalement, il faut positionner la propriété DblClicEnabled = False pour que ça réagisse comme tu le veux. J'en ai fait une propriété publiée donc tu pourras la changer directement dans l'inspecteur d'objet ...)
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    unit MyTreeView;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Controls, ComCtrls, CommCtrl;
     
    type
      TMyTreeView = class(TcustomtreeView)
      private
        fCanExpand : Boolean;
        fDblClicEnabled: Boolean;
        procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
        procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
      public
        constructor Create(AOwner: TComponent); override;
      published
        property Align;
        property Anchors;
        property AutoExpand;
        property BevelEdges;
        property BevelInner;
        property BevelOuter;
        property BevelKind default bkNone;
        property BevelWidth;
        property BiDiMode;
        property BorderStyle;
        property BorderWidth;
        property ChangeDelay;
        property Color;
        property Ctl3D;
        property Constraints;
        // Permet de bloquer le double clic pour ouvrir/fermer arbre :
        property DblClicEnabled : Boolean read fDblClicEnabled write fDblClicEnabled;
        property DragKind;
        property DragCursor;
        property DragMode;
        property Enabled;
        property Font;
        property HideSelection;
        property HotTrack;
        property Images;
        property Indent;
        property MultiSelect;
        property MultiSelectStyle;
        property ParentBiDiMode;
        property ParentColor default False;
        property ParentCtl3D;
        property ParentFont;
        property ParentShowHint;
        property PopupMenu;
        property ReadOnly;
        property RightClickSelect;
        property RowSelect;
        property ShowButtons;
        property ShowHint;
        property ShowLines;
        property ShowRoot;
        property SortType;
        property StateImages;
        property TabOrder;
        property TabStop default True;
        property ToolTips;
        property Visible;
        property OnAddition;
        property OnAdvancedCustomDraw;
        property OnAdvancedCustomDrawItem;
        property OnChange;
        property OnChanging;
        property OnClick;
        property OnCollapsed;
        property OnCollapsing;
        property OnCompare;
        property OnContextPopup;
        property OnCreateNodeClass;
        property OnCustomDraw;
        property OnCustomDrawItem;
        property OnDblClick;
        property OnDeletion;
        property OnDragDrop;
        property OnDragOver;
        property OnEdited;
        property OnEditing;
        property OnEndDock;
        property OnEndDrag;
        property OnEnter;
        property OnExit;
        property OnExpanding;
        property OnExpanded;
        property OnGetImageIndex;
        property OnGetSelectedIndex;
        property OnKeyDown;
        property OnKeyPress;
        property OnKeyUp;
        property OnMouseDown;
        property OnMouseMove;
        property OnMouseUp;
        property OnStartDock;
        property OnStartDrag;
        { Items must be published after OnGetImageIndex and OnGetSelectedIndex }
        property Items;
     
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('eb', [TMyTreeView]);
    end;
     
    { TMyTreeView }
     
    constructor TMyTreeView.Create(AOwner: TComponent);
    begin
      inherited;
      fCanExpand := True;
      fDblClicEnabled := True;
    end;
     
    procedure TMyTreeView.CNNotify(var Message: TWMNotify);
    begin
      case Message.NMHdr^.code of
         TVN_ITEMEXPANDING:
         begin
           if not(fCanExpand) then
           begin
             Message.Result := 1;  // Blocage du Collapse/Expand
             fCanExpand := True;
           end;
         end;
      end;
      inherited;
    end;
     
    procedure TMyTreeView.WMLButtonDblClk(var Message: TWMLButtonDblClk);
    begin
      if not(fDblClicEnabled) then
        fCanExpand := False;
      inherited;
    end;
     
    end.
    Voilà, j'espère que ça répond à ce que tu veux faire.
    Bon courage
    Eb.

  6. #6
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Je viens d'essayer cela et ca marche, seulement cela d'oblige à deployer completement tout arborescence à l'ouverture de ta fiche, mais cela peut te convenir
    Voila ce que j'ai fais:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls;
     
    type
      TForm1 = class(TForm)
        TreeView: TTreeView;
        procedure FormCreate(Sender: TObject);
        procedure TreeViewDblClick(Sender: TObject);
        procedure TreeViewExpanding(Sender: TObject; Node: TTreeNode;
          var AllowExpansion: Boolean);
        procedure TreeViewCollapsing(Sender: TObject; Node: TTreeNode;
          var AllowCollapse: Boolean);
      private
        { Déclarations privées }
        CanExpand : boolean;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
      //On autorise le deploiement
      CanExpand := true;
      //ici on rempli l'arbre soit manuellement soit automatiquement
     
     
      //On le deploie
      TreeView.FullExpand;
     
      //ensuite on interdit le deploiement automatique
      CanExpand := False;
     
    end;
     
    procedure TForm1.TreeViewDblClick(Sender: TObject);
    begin
      Showmessage('DoubleClicked');
    end;
     
    procedure TForm1.TreeViewExpanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    begin
      AllowExpansion := CanExpand;
    end;
     
    procedure TForm1.TreeViewCollapsing(Sender: TObject; Node: TTreeNode;
      var AllowCollapse: Boolean);
    begin
      AllowCollapse := CanExpand;
    end;
     
    end.

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour ebastien,

    Fiouf... Tout ca pour ça ???

    Tu as l'air d'avoir bien cerné le problème,
    L'ennui, c'est que je ne sait pas comment me servir de ta solution...

    - Je crée une nouvelle fiche: Ok.
    - J'écrase le contenu avec ton code: Ok.
    - ...

    Ca ne me donne pas un composant, ca.

    Peux tu décrire les étapes STP.
    David.

  8. #8
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Bien pensé, bien réalisé, efficace !

    ebastien
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  9. #9
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Ok, j'ai compris:

    Composant->Nouveau->hériter...

    Seulement, j'ai fait une bourde.

    J'ai dabord essayé en faisant juste "OK", puis j'ai tout fermé.

    J'ai recommencé en faisant "Installer", et il me dit:
    [Erreur] myTreeView.pas(9): Identificateur redéclaré : 'myTreeView'.

    Je ne suis pas à l'aise avec ca, pouvez vous m'aider ?

    PS: Merci Medgir, mais ca m'ennuie de tout déployer au lancement.
    David.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Effectivement, c'est un composant. Il faut donc l'installer.
    Je suis en D6 mais je pense qu'en D7 c'est pareil :
    - Tu enregistres le code dans un .pas
    - Menu Composant / Installer un composant
    - Onglet Dans un nouveau paquet

    Nom unité = le .pas
    Nom du Paquet = Ce_que_tu_veux.dpk

    Et tu dois avoir le composant dans ta palette (la procedure Register définissant l'onglet 'eb' de la palette mais tu peux l'appeler comme tu veux je ne serai pas offensé )

    ps : Merci Yurck, je suis flatté !

  11. #11
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Ma seconde solution ne te convient pas?

  12. #12
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Medgir,

    Merci pour ton aide, mais je préfère la solution de ebastien.
    (mais la tienne a du bon, je l'utiliserais dans un autre cas de figure)

    En fait, il faut quand même pouvoir ouvrir/fermer les noeuds, mais pas avec le double clic.
    David.

  13. #13
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Ok, pas de problemes...

    Bon code...

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Je ne sais pas comment D7 gère les installations de composant.
    Si quelqu'un a D7 ce serait plus facile car manifestement, les menus ont changé depuis D6.
    L'as-tu déjà défini dans un paquet ?
    Si oui, tu ouvres le paquet dans lequel tu as ton unité (Ouvrir un projet, fichier de type "Paquets Delphi" et, si le code de l'unité est ok, tu cliques sur installer (clic droit dans le gestionnaire de projet)
    Bon courage.

  15. #15
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    En fait, j'aimerais dabord tenter la solution de MedGIR, mais un peu modifiée.
    Car l'autre me pose un souci de portabilité, j'aimerais pouvoir trimbaler les sources.
    Et s'il faut créer un composant à chaque fois...

    En fait, dans le onDblClic, je met le CanExpand à false (pour le remettre à true une fois que mon travail est fini),
    mais ca ne marche pas, il développe avant même de rentrer dans l'évenement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfrmMain.tvLieuxDblClick(Sender: TObject);
    begin
      CanExpand := false;
      if (tvLieux.Selected<>nil) then begin
        alLieuModExecute(self);
      end;
    end;
    procedure TfrmMain.tvLieuxCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean);
    begin
      AllowCollapse := CanExpand;
    end;
    Sur quel évenement il passe avant le tvLieuxCollapsing ?
    Ou sinon, dans tvLieuxCollapsing, il n'y a pas moyen de savoir si ca vient du + ou du noeud ?
    David.

  16. #16
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Extra !!!

    J'ai trouvé l'idéal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TfrmMain.tvLieuxCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean);
    var vPoint:   TPoint;
    begin
      vPoint := tvLieux.ScreenToClient(Mouse.CursorPos);
      AllowCollapse := htOnButton in tvLieux.GetHitTestInfoAt(vPoint.X,vPoint.Y);
    end;
     
    procedure TfrmMain.tvLieuxExpanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
    var vPoint:   TPoint;
    begin
      vPoint := tvLieux.ScreenToClient(Mouse.CursorPos);
      AllowExpansion := htOnButton in tvLieux.GetHitTestInfoAt(vPoint.X,vPoint.Y);
    end;
    Ca s'devine pas... Merci les chinois: http://topic.csdn.net/t/20020403/11/619070.html

    Merci à tous pour votre participation, sans vous, je ne serait jamais tombé dessus (et puis comme ça, ca fait plusieures réponses différentes ).
    David.

  17. #17
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2002
    Messages : 144
    Points : 157
    Points
    157
    Par défaut
    Chapeau bas...


    Excellent, j'etais encore en train de me prendre la tete dessus ce sujet....

    No comment...

  18. #18
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    C'est grace à toi MedGIR.

    Tu m'a orienté vers le onExpanding, et je me suis contenté de faire une recherche sur:
    "treeview1.onExpanding" dans google.
    David.

  19. #19
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bien vu effectivement !
    Juste un petit truc, ce système ne te permettra pas d'ouvrir/fermer un noeud par programme. Peut-être n'en auras-tu pas besoin mais si c'est le cas, plutôt que de tester le clic sur le bouton +-, tu peux tester le non clic sur le label comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AllowCollapse := not(htOnLabel in TvLieux.GetHitTestInfoAt(vPoint.X,vPoint.Y));
    Comme ça, tu peux appeler sans problème la méthode Collapse/Expand du TTreenode.
    Bon courage!
    Eb.

  20. #20
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Encore mieux.

    En plus, c'est vrai, je vais être ammené a m'en servir.

    J'adore les conversations constructives comme celle ci.

    Merci à vous tous.
    David.

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

Discussions similaires

  1. Comment annuler les effets d'une macro sur les feuilles?
    Par jolzeviking dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/06/2008, 14h29
  2. Annuler un effet SmartArt
    Par filiph79 dans le forum Powerpoint
    Réponses: 1
    Dernier message: 14/01/2008, 13h46
  3. Suppression double-clic sur TreeView
    Par tolliv dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/12/2006, 08h27
  4. annuler l'effet de la css
    Par nebil dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 24/07/2006, 10h23
  5. Réponses: 8
    Dernier message: 24/04/2006, 13h00

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