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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 697
    Points : 9 424
    Points
    9 424

    Par défaut [Linux et Windows] Problème de changement erroné de sélection dans TShellTreeView

    Hello, it's me again.

    Je suis au bord du désespoir : j'ai besoin d'un TShellTreeView, à qui je demande bêtement de m'afficher les fichiers des dossiers, un truc tout simple -- enfin, je croyais...

    Au début ça commence bien : je clique sur test1, il s'ouvre et je vois son contenu. Bien.
    Je clique sur test2, ça referme test1 et ça m'affiche le contenu de test2, encore bien.
    Je clique sur test3, ça referme test2 et ça m'affiche le contenu de test3, toujours bien.
    Je clique sur test4, ça referme test3 et là, bim bam boum, au lieu de sélectionner le nom du dossier (comme les fois précédentes), ça sélectionne le premier fichier de sa liste...

    Nom : bug_dossier_stv.gif
Affichages : 47
Taille : 11,5 Ko

    Pourquoi ? Mais my God pourquoi ?

    Il y a peut-être une blagounette dans le code ci-dessous, mais je n'arrive pas à la trouver, d'autant plus qu'en cliquant juste sur les triangles à gauche des noms des dossiers, ça a un comportement bizarre : des fois ça s'ouvre du 1er coup, des fois non.
    Et j'ai mis ce bout de code car le comportement automatique ne fonctionne pas comme je le voudrais (pas de collapsing automatique, par ex.)
    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
    procedure TForm1.tvListMouseDown(Sender: TObject; Button: TMouseButton; // tvList c'est le TShellTreeView
      Shift: TShiftState; X, Y: Integer);
    var
      aNode: TTreeNode;
    begin 
      PreviousNode := CurrentNode;
      aNode := TTreeview(sender).GetNodeAt(X, Y);
      // il en manque mais ça n'a rien à voir
      CurrentNode  := aNode;
      if CurrentNode <> PreviousNode then begin
        tvList.BeginUpdate;
        if not CurrentNode.Expanded then begin
          CurrentNode.Selected := True;
          CurrentNode.Expand(False);
          if PreviousNode <> nil then
            if PreviousNode.Expanded then PreviousNode.Collapse(False);
        end;
        tvList.EndUpdate;
      end;
    Testé avec la wonderful 1.8.2...

    Ah, ça ne se voit pas sur ces copies d'écran réduites à l'essentiel, mais j'ai positionné les scrollbars à ssAutoBoth dans l'EDI et si j'en parle, c'est parce que je ne les vois jamais...

    EDIT : j'ai enlevé "et peut-être" dans le tag du titre, le problème est présent également dans XP sp2...
    Par contre, le ssAutoBoth des scrollbars du TShellTreeView a l'air d'y fonctionner correctement.
    /EDIT
    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

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 549
    Points : 3 811
    Points
    3 811

    Par défaut

    hello,
    tu peux essayer d'utiliser l'événement OnExpanding (au lieu d'utiliser l'événement OnMouseDown) du TshellTreeView comme ceci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.ShellTreeView1Expanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    begin
       PreviousNode := CurrentNode;
       CurrentNode := Node;
       if (PreviousNode <> nil) And (PreviousNode <> Node.Parent) then
          PreviousNode.Collapse(True);
    end;
    Cela a l'air de fonctionner sauf quand il y a plusieurs niveaux dans le noeud (voir Niveau2 dans l'animation qui suit ) :

    Nom : TshellTreeView.gif
Affichages : 32
Taille : 42,3 Ko

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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 697
    Points : 9 424
    Points
    9 424

    Par défaut

    Bonjour,

    Citation Envoyé par jurassic pork Voir le message
    tu peux essayer d'utiliser l'événement OnExpanding (au lieu d'utiliser l'événement OnMouseDown) du TshellTreeView
    merci de ton test, et de ton temps.

    Une chose m'ennuie, c'est l'obligation de viser juste pour choper le triangle pour ouvrir le nœud, à tel point que dans les options j'ai choisi tvoRowSelect à True et tvoShowButtons à False, et du coup bye-bye l'événement OnExpanding, retour au OnMouseDown, bien obligé.
    Mais je trouve ce RowSelect plus joli.

    Ensuite, comme j'avais le souvenir de grosses misères avec le TShellTreeView de D7, déjà !, j'ai basculé mon projet sur un TTreeview et j'allais presque crier "Victoire !" quand, paf !, le problème se remanifeste...
    Quelque part je préfère, je n'aurais pas bien compris que le TShelltv ait un problème qui ne serait pas présent dans son ancêtre.
    Mais du coup, rien n'est réglé,

    En repartant des exemples donnés, je constate qu'après quelques clics ici et là de bon fonctionnement répétitif, d'un coup et sans raison un clic sur test4diddl l'ouvre mais sélectionne le premier nœud enfant et ça, pour moi, c'est inconcevable.
    J'ai rajouté un point d'exclamation orange pour bien montrer le 'blème.
    Nom : test3_4.gif
Affichages : 27
Taille : 8,2 Ko

    Citation Envoyé par jurassic pork Voir le message
    Cela a l'air de fonctionner sauf quand il y a plusieurs niveaux dans le noeud (voir Niveau2 dans l'animation qui suit ) :
    Thx God, il n'y a pas plusieurs niveaux (tu veux ma mort ou quoi ? )

    EDIT : une seule image pour résumer : la barre de titre de la fenêtre est remplie au OntvListMouseDown par Caption := aNode.Text +' '+IntToStr(aNode.Level); et c'est parfaitement correct.
    Nom : diff_caption_selection.png
Affichages : 26
Taille : 6,1 Ko
    Alors pourquoi est-ce que j'ai un nœud de niveau 2 sélectionné ?
    /EDIT

    EDIT2 :
    Bonne nouvelle : le problème a l'air de disparaître (en tout cas je ne l'ai pas reproduit) en utilisant OntvListSelectionChanged; au lieu de OntvListMouseDown. J'attends un peu avant de cliquer sur , ces choses sont tellement capricieuses,
    /EDIT2
    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 697
    Points : 9 424
    Points
    9 424

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Bonne nouvelle : le problème a l'air de disparaître (en tout cas je ne l'ai pas reproduit) en utilisant OntvListSelectionChanged; au lieu de OntvListMouseDown. J'attends un peu avant de cliquer sur , ces choses sont tellement capricieuses,
    Confirmé, et bien fonctionnel également en réactivant le TShellTreeView

    Allez hop,
    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

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

Discussions similaires

  1. Réponses: 73
    Dernier message: 22/01/2010, 18h03
  2. Framework peut-être en problème
    Par Hartdrooz dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/10/2008, 18h01
  3. Réponses: 5
    Dernier message: 15/08/2006, 16h51

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