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

Lazarus Pascal Discussion :

Besoin d'un coup de main avec le TTreeView et les HitTests


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut Besoin d'un coup de main avec le TTreeView et les HitTests
    onjour,

    je bricole un TTreeView avec l'affichage pour les items de g à dr du OnButton, du OnStateIcon, du OnIcon et du OnItem et tout est mignon.

    Nom : treeview4fonts-v2.png
Affichages : 122
Taille : 17,6 Ko

    Mais il y a un problème avec le OnButton, qui devrait m'afficher un ShowMessage et ne le fait pas, alors que les 3 autres options réagissent bien.

    En gros j'ai ça comme code :
    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
    procedure TForm1.tvMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      HitTests: THitTests;
      aNode: TTreeNode;
    begin
      if tv.Selected = nil then tv.Items[0].Selected := True;
      HitTests := tv.GetHitTestInfoAt(X, Y);
      with tv.ScreenToClient(Mouse.CursorPos) do aNode := tv.GetNodeAt(X, Y);
     
      if aNode = nil then begin {ShowMessage('pâté avec le node...');} Exit;end;
     
      if (htOnButton in HitTests) then begin ShowMessage('tv2MouseDown2 '+aNode.Text); exit; end; // KC
      if (htOnStateIcon in HitTests) then begin ToggleTreeViewCheckBoxes(aNode); exit; end; // ok
      if (htOnIcon in HitTests)
      or (htOnItem in HitTests) then begin ShowMessage('tv2MouseDown1 '+aNode.Text); exit; end; // ok
    end;
    Ce qui se passe, de droite à gauche :
    un clic sur le texte (OnItem) ou l'image (OnIcon) --> ShowMessage du aNode.Text, ràs ;
    un clic sur la StateIcon affiche/cache la case-à-cocher, ràs ;
    un clic sur le bouton triangulaire rouge --> tout ce que je vois, c'est que le texte de l'item[0] tout en haut du treeview passe en sélectionné du noir au blanc et une fois blanc il y reste ; cependant, le triangle rouge bascule, mais le ShowMessage ne se montre pas...

    Pourquoi ? Comment le faire apparaitre ?
    Merci !

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 624
    Par défaut
    Bonjour,

    Que se passe-t-il au deuxième clic sur la même flèche rouge ? Toujours rien ?

    Salutations

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Yep !

    F9 et toutes les flèches visent à droite, comme sur mon image.
    J'en choisis une au hasard, je la clique, la flèche tourne de 90° dans le sens des aiguilles d'une montre et pointe vers le bas.
    Je reclique et elle se remet à sa place d'origine.
    Bref, un comportement normal sauf que je n'ai pas de ShowMessage.

    Je me suis amusé à rajouter deux test :
    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
      ...
      with tv.ScreenToClient(Mouse.CursorPos) do aNode := tv.GetNodeAt(X, Y);
     
      if htOnButton in HitTests then Caption:='MouseDown OnButton' // sur ouvert/fermé, OK
      else
      if htOnStateIcon in HitTests then Caption:='MouseDown OnStateIcon' // sur càc, OK
      else
      if htOnIcon in HitTests then Caption:='MouseDown OnIcon' // sur image, OK
      else
      if htOnItem in HitTests then Caption:='MouseDown OnItem'; // sur texte, OK
     
      if htOnButton in HitTests then ShowMessage('SM MouseDown OnButton') // sur ouvert/fermé, OK
      else
      if htOnStateIcon in HitTests then ShowMessage('SMMouseDown OnStateIcon') // sur càc, OK
      else
      if htOnIcon in HitTests then ShowMessage('SM MouseDown OnIcon') // sur image, OK
      else
      if htOnItem in HitTests then ShowMessage('SM MouseDown OnItem'); // sur texte, OK
     
    // Les 8 OK ci-dessus signifient que la Caption est bien modifiée comme espéré et que le ShowMessage est affiché
    // et j'ai modifié cette ligne de
      if (htOnButton in HitTests) then begin ShowMessage('tvMouseDown2 '+aNode.Text); exit; end; 
    //en
      if (htOnButton in HitTests) then begin ShowMessage('SM tvMouseDown2 '+aNode.Text); Caption := 'Ca test htOnButton'; exit; end; // et toujours PAS VU
      ...
    En résumé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      if htOnButton in HitTests then Caption := 'MouseDown OnButton' // sur ouvert/fermé, OK
      if htOnButton in HitTests then ShowMessage('SM MouseDown OnButton') // sur ouvert/fermé, OK
      if htOnButton in HitTests then begin ShowMessage('SM tvMouseDown2 '+aNode.Text);
        Caption := 'Ca test htOnButton'; exit; end; // et toujours PAS VU
      if (htOnButton in HitTests) then begin ShowMessage('SM tvMouseDown2 '+aNode.Text);
        Caption := 'Ca test htOnButton'; exit; end; // et toujours PAS VU
    Alors j'ai réactivé le message omis pour cosmétique juste avant les tests if htOn...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if aNode = nil then begin ShowMessage('pâté avec le node...'); Exit; end;
    et là, je constate que j'ai ce message avec le test if htOnButton in HitTests suivi du Exit alors que les 3 autres tests fonctionnent bien.
    Il y a une blagounette quelque part...

    Je vous laisse y réfléchir, cet après-midi j'ai dentiste puis courses, à ce soir !

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Bonsoir,

    J'ai simplifié et éclairci les choses en rajoutant deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      if tv.Selected = nil then tv.Items[0].Selected := True;
      HitTests := tv.GetHitTestInfoAt(X, Y);
      with tv.ScreenToClient(Mouse.CursorPos) do aNode := tv.GetNodeAt(X, Y);
    // les 2 lignes rajoutées (c'est très parlant) :
      aNode.Text := 'test_du_texte_du_node'; // SIGSEGV si clic sur open/close (htOnButton)
      ShowMessage(aNode.Text); // OK avec les 3 autres choix (htOnStateIcon, htOnIcon, htOnItem)
    Pourquoi le Node.Text est pourri si on utilise htOnButton et correct avec les 3 autres cas ?
    Ça me dépasse...

  5. #5
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 624
    Par défaut
    Bonjour,

    Je pense que le clic sur le bouton est consommé par le dépliement (et le repliement, ce à quoi je n'avais pas pensé quand j'ai fait la proposition de recliquer).

    Salutations

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Je pense que le clic sur le bouton est consommé par le dépliement ou le repliement
    Si je l'écris ainsi, c'est toujours bon ?
    Si "oui", comment dois-je faire pour savoir si c'est le dépliement qui est survenu, ou le repliement ?
    Je me base sur l'idée (peut-être stupide, avec moi plus rien ne m'étonne) que si je n'ai pas de ShowMessage (ce qui est le cas), alors il y a un risque pour que je n'aie pas autre chose...

    Pourtant, if (htOnButton in HitTests) then begin Caption := 'Ca test htOnButton'; exit; end; fonctionne bien.

    EDIT :
    Je pense que je vais m'en dépatouiller avec ça, genre écrire une information temporaire dans un fichier temporaire...

    Plus qu'à récupérer les informations du node cliqué (j'attends un jour ou deux avant le ).

    je pense que je suis en train de me prendre les pieds dans le tapis...
    Et comme j'ai d'autres soucis plus prioritaires, je mets ça en stand-by, je verrai plus tard.

    Merci,

Discussions similaires

  1. Besoin d'un coupe de main avec une classe sql
    Par mobscene dans le forum C#
    Réponses: 3
    Dernier message: 21/03/2007, 13h15
  2. Réponses: 4
    Dernier message: 16/03/2007, 10h07
  3. Besoin d'un coup de main avec HTML::Parser
    Par mobscene dans le forum Modules
    Réponses: 1
    Dernier message: 09/12/2006, 15h49
  4. Réponses: 3
    Dernier message: 23/10/2006, 02h07
  5. Besoin d'un coup de main avec print
    Par scaleo dans le forum Langage
    Réponses: 2
    Dernier message: 10/06/2006, 21h12

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