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 :

Fonctionnement cassé de la commande GetNodeAt du TreeView [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut Fonctionnement cassé de la commande GetNodeAt du TreeView
    Bonjour,

    je fais face depuis plusieurs jours à un gros problème de fonctionnalité avec la tentative d'accéder au texte d'un TreeNode dans un TreeView posé sur une fiche et bien rempli, qui se solde par un SIGSEGV, le TreeNode semblant vide.

    Le code est tout simple :
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if tv1.Items.Count = 0 then  {If the tree is empty}
        with tv1.Items.AddFirst(nil, 'Root') do begin  {Add the root node}
          Selected := true;
          ImageIndex    := IMG_NODE_ROOT;
          SelectedIndex := IMG_NODE_ROOT;
          StateIndex := IMG_CHECKED;
        end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject); // fill tv
    var 
      i, maxi: integer;
    begin
      maxi := 6;
      // création de 6 nodes
      for i:=0 to maxi-1 do with tv1.Items.Add(tv1.Selected, 'subnode'+IntToStr(i+1)) do MakeVisible;
      ShowMessage('Pause pour choisir un subnode, puis Button2 pour action');
    end;
     
    procedure TForm1.Button2Click(Sender: TObject); // use it
    var 
      i: integer;
      P: TPoint;
      HT: THitTests;
      AnItem: TTreeNode;
    begin
      P.X := 0; // happy compilo
      GetCursorPos(P); // 2 lignes nécessaires pour Linux, sinon valeurs X Y en vrac
      P := tv1.ScreenToClient(P);
      if tv1.Selected = nil then Exit else ShowMessage('on continue');// vu
      HT := tv1.GetHitTestInfoAt(P.X, P.Y);
      AnItem := tv1.GetNodeAt(P.X, P.Y);
      if AnItem <> nil then
      //ShowMessage('OnButton2: '+ AnItem.Text); // SIGSEGV
        ShowMessage('OnButton2: '+ AnItem.GetTextPath) // SIGSEGV
      // et là, je ne vois JAMAIS ces ShowMessage...
    end;
    Je précise à tout hasard qu'on trouve partout sur le web ce type de code, exemple (à adapter) chez Embarcadero :
    https://docwiki.embarcadero.com/Code...odeAt_(Delphi), alors si quelqu'un pouvait me dire ce qui m'échappe, je l'en remercie infiniment par avance.

    Une dernière info : dans les options du treeview j'ai activé tvoRowSelect mais ça ne change rien.
    Laz 3.8 FPC 3.2.2 Linux Debian uptodate.
    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
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Salut JP !

    Quand tu cliques sur Button2, le curseur est-il dans le TreeView ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

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

    Citation Envoyé par tourlourou Voir le message
    Quand tu cliques sur Button2, le curseur est-il dans le TreeView ?
    Le curseur de qui de quoi ?

    Mais ta question m'a fait regarder plus en détail le code du Button2 où je viens d'y trouver une petite erreur (corrigée !) :
    lignes 36 et 37 un œil attentif lira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      //ShowMessage('OnButton7: '+ AnItem.Text); // SIGSEGV
        ShowMessage('OnButton7: '+ AnItem.GetTextPath) // SIGSEGV
    alors qu'en fait il s'agit de OnButton2 pour les lecteurs d'ici. Pourquoi ? Parce que je suis parti de quelques lignes de code dans une ardoise magique numérique où pour tester vite fait des trucs et des machins j'ajoute et rajoute des boutons (une chatte n'y retrouverait pas ses petits) et donc pour poster ici j'ai fait le ménage après un copier/coller vers une feuille blanche, histoire que les lecteurs s'y retrouvent, et il est resté ces histoires de nommage et numérotation des boutons : en fait, chez moi, les deux lignes avec OnButton7 sont dans le code du bouton 8 !

    Allez, je rentre dans les détails :
    Nom : img1.png
Affichages : 82
Taille : 31,3 Ko
    Voilà l'image1 avec à gauche un TreeView embarquant un RootNode et 6 subnodes après un clic sur Button7--fill tv.
    Un message s'affiche, je le valide puis je clique sur un des subnodes (subnode3 cette fois), ça le sélectionne et je clique sur Button8--use it, ce qui fait afficher un autre message dont le code est au milieu des quelques lignes le concernant.
    Nom : img2.png
Affichages : 82
Taille : 38,4 Ko
    Je valide puisque jusque là c'est tout bon, mais la dernière partie ne s'exécute pas, il est là mon mystère...

    Fil de l'eau :
    F9 puis
    je clique sur button7 le tv se remplit et le message s'affiche.
    je valide le message,
    je sélectionne un subnode,
    je clique sur Button8
    un second message s'affiche ("on continue"),
    je le valide et là je ne vois jamais ces ShowMessages...

    Le survol en mode pas-à-pas de P.X, P.Y à la ligne AnItem := tv1.GetNodeAt(P.X, P.Y); montre 330 100 et ce 100 n'est pas bon, le top du subnode3 est plutôt à environ 200 du top de l'écran, à 70 du top de la fiche.
    On dirait que le problème est là mais je ne sais pas comment faire pour avoir un top correct alors que le width l'est directement.
    J'espère que c'est plus clair.
    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
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Ce que je comprends du code du bouton :
    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
    procedure TForm1.Button2Click(Sender: TObject); // use it
    var 
      i: integer;
      P: TPoint;
      HT: THitTests;
      AnItem: TTreeNode;
    begin
      P.X := 0; // happy compilo : soit !
      GetCursorPos(P); // reçoit les coordonnées d’écran du curseur , mais le curseur est sur le bouton qu'on clique, non ?
      P := tv1.ScreenToClient(P); // transforme les coordonnées écran du curseur en coordonnées relatives au composant
      if tv1.Selected = nil then Exit else ShowMessage('on continue'); // vu : OK puisque sélectionné
      HT := tv1.GetHitTestInfoAt(P.X, P.Y); // retourne le type d'élément à cette position
      AnItem := tv1.GetNodeAt(P.X, P.Y); // retourne le noeud à cette position, mais s'il n'y en a pas car la position n'est pas la bonne ?
      if AnItem <> nil then
      //ShowMessage('OnButton2: '+ AnItem.Text); // SIGSEGV
        ShowMessage('OnButton2: '+ AnItem.GetTextPath) // SIGSEGV
      // et là, je ne vois JAMAIS ces ShowMessage... // donc AnItem toujours nil, donc pas de NodeAt !
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour à tous,

    Citation Envoyé par tourlourou Voir le message
    Ce que je comprends du code du bouton :
    Oui c'est ça, tu as tout bien décodé.

    Mais ce que je ne comprends pas ou plutôt, ce que je ne trouve pas, c'est la conversion pour avoir des valeurs X et Y correctes.

    Parfois je m'en approche, avec par ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //  GetCursorPos(P); // doit être commenté pour s'approcher du résultat /!\ /!\ /!\ /!\ /!\ 
      P := tv1.ClientToScreen(Mouse.CursorPos);   // clic sur subnode3 renvoie rien
      P := ClientToScreen(tv1.ScreenToClient(P)); // clic sur subnode3 renvoie rien
      P := ScreenToClient(tv1.ClientToScreen(P)); // clic sur subnode3 renvoie subnode5
      ScreenToClient(tv1.ClientToScreen(P));      // clic sur subnode3 renvoie subnode4
      ClientToScreen(tv1.ScreenToClient(P));      // clic sur subnode3 renvoie subnode4
      ClientToScreen(ScreenToClient(P));          // clic sur subnode3 renvoie subnode4
    J'en suis là et je ne vois pas comment avancer : j'ai juste besoin d'identifier le node choisi par clic et ça semble pire que les 12 travaux d'Hercule, la preuve :
    avec cette ligne en service,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ClientToScreen(tv1.ScreenToClient(P)); 
    clic sur 1 renvoie 4
    clic sur 2 renvoie 4
    clic sur 3 renvoie 5 
    clic sur 4 renvoie 5
    clic sur 5 renvoie 4
    clic sur 6 renvoie 4

    À vot' bon cœur, msieurs-dames,

    PS : une recherche sur le web (freepascal lazarus ScreenToClient) montre que nous sommes nombreux à patauger dans cette misère (ce qui ne me réconforte pas), le souci c'est que les solutions données ne semblent pas vouloir s'appliquer à mon cas : les gens cherchent à positionner un bouton ou à remplir une cellule de grille, moi j'ai besoin de connaitre le TTreeNode choisi dans le TTreeView.
    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

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Pour illustrer les référentiels de coordonnées :
    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.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      Memo1.Lines.add(P.X.ToString + ' , ' + P.Y.ToString);
    end; 
     
    procedure TForm1.tv1MouseEnter(Sender: TObject);
    begin
      Form1.OnMouseMove := nil;
    end;
     
    procedure TForm1.tv1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      Memo1.Lines.add(X.ToString + ' , ' + Y.ToString);
    end;
     
    procedure TForm1.tv1MouseLeave(Sender: TObject);
    begin
      Form1.OnMouseMove := @FormMouseMove;
    end;
    Pour avoir l'item cliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.tv1Click(Sender: TObject);
    var
      P: TPoint;
      AnItem: TTreeNode;
    begin
      P := tv1.ScreenToClient(Mouse.CursorPos);
      AnItem := tv1.GetNodeAt(P.X, P.Y);
      if AnItem <> nil then
        ShowMessage(AnItem.GetTextPath)
      else
        ShowMessage('ailleurs !')
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Merci pour tes efforts.
    Je pense ne pas avoir capté ta ligne meminstructions.Lines... d'où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.tv1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
    //meminstructions.Lines.add(X.ToString + ' , ' + Y.ToString);
      Memo1.Lines.add(X.ToString + ' , ' + Y.ToString);
    end;
    plus une micro-modif pour mieux me repérer (position de la virgule) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
    //Memo1.Lines.add(X.ToString + ' , ' + Y.ToString);
      Memo1.Lines.add(X.ToString + ', ' + Y.ToString);
    end;
    Un essai avec les 3 derniers subnodes :
    entrée subnode6 par le bord gauche de la fiche :
    FormMouseMove
    puis tv1MouseEnter--tv1MouseMove
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    18 , 121
    25 , 121
    9  lignes enlevées pour éclaircir
    60 , 126
    61 , 126
    et léger déplacement vers la droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    61 , 126
    61 , 125
    23 lignes enlevées 
    64 , 101
    64 , 102
    je suis monté au node 5 sans cliquer
    Je clique sans presque pas bouger puis je monte au 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    64 , 102
    64 , 101
    12 lignes enlevées
    65 , 85
    64 , 85
    je clique sans presque pas bouger, le node4 est sélectionné mais ça n'est pas vu ici.
    En fait, je ne vois pas trop comment récupérer ces infos ni comment les utiliser...

    D'un autre côté, j'ai trouvé un petit truc sympa là (https://forum.lazarus.freepascal.org...?topic=34427.0), je l'ai adapté à mon besoin mais je coince au transtypage... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button10Click(Sender: TObject);
    var
      pt: TPoint;
      t: TObject;
    begin
      pt.x:=0;    pt.y:=0;
      t := sender;
      pt := (t as tbutton).ControlToScreen(pt);
    //pt := (t as TTreeView).ControlToScreen(pt);
      pt := screentoclient(pt); // <--- Ajouté pour correction par l'OP
      ShowMessage(inttostr(pt.x)+'  '+inttostr(pt.y)); // 338 75 = left et top du button10
    end;
    Dessus ça fonctionne bien, mais inverser 2 lignes ne fonctionne plus (je m'en doutais) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ...
      t := sender;
    //pt := (t as tbutton).ControlToScreen(pt);
      pt := (t as TTreeView).ControlToScreen(pt); // transtypage incorrect à l'exécution
      pt := screentoclient(pt); // <--- Ajouté pour correction par l'OP
      ...
    Que faire ?
    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

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    En cliquant sur le bouton, la position à l'écran est celle de la souris lors du clic : si tu cliques sur le bouton, tu es dans le bouton, pas dans le TreeView : ça n'a pas de sens de chercher à exprimer ces coordonnées par rapport au TreeView pour en déduire où il serait dans le TreeView au dessus duquel on n'est pas, non ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bon, j'ai encore farfouillé dans le web et j'ai trouvé une pétite :
    https://forum.lazarus.freepascal.org...?topic=65565.0

    Il faut penser à rajouter les prototypes des fonctions et procédures, ainsi que le treeview et à partir de là on peut improviser, exemple :
    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
    procedure TForm1.tvShowHint(Sender: TObject; HintInfo: PHintInfo);
    var
      p: TPoint;
      tn: TTreeNode;
    begin
      p := Mouse.CursorPos;
      p := tv.ScreenToClient(p);
      tn := tv.GetNodeAt(p.X, p.Y);
      if tn <> nil then
      begin
    //  HintInfo^.HintStr := tvlist.GetHint(tn.AbsoluteIndex); // commenté car inutile pour moi
    //  HintInfo^.ReshowTimeout := 100; // commenté car inutile pour moi
        Memo1.Lines.Add(inttostr(p.X)+'  '+inttostr(p.Y) +' -- '+ tn.Text); // ajout moi
      end;
    end;
    Et tout ça m'aura permis de découvrir que pour jouer dans cette cour, il ne faut pas perdre de vue qu'il n'y a pas 2 options comme on le voit trop souvent partout pour les infos relatives au positionnement des objets (genre TRect.Top par ex.) mais 3 !
    On a les classiques options qui concernent l'écran (screen), on a aussi ce qui concerne la position et la taille de la fiche, et dans mon cas il fallait utiliser l'objet concerné, en l’occurrence pour moi ici le TreeNode !
    Un petit bout de la ligne Memo1.Lines.Add(inttostr(p.X)+' '+inttostr(p.Y) +' -- '+ tn.Text); :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Memo1
    34  92 -- Parent 5
    37  83 -- Parent 5
    38  77 -- Parent 4
    38  64 -- Parent 4
    38  55 -- Parent 3
    39  43 -- Parent 3
    40  37 -- Parent 2
    41  20 -- Parent 2
    41  14 -- Parent 1
    Il va juste falloir que je stabilise un peu la remontée des infos, parce que le mémo va vite être rempli et je n'y retrouverai rien.
    Mais le principe est là.
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    voilà donc ce que je voulais :
    Nom : img.png
Affichages : 54
Taille : 13,0 Ko
    à gauche une liste de TreeNodes dans un TreeView, à droite un TMemo pour stocker les résultats générés par les clics dans la liste (4 seulement, en désordre).

    et grand merci à Yves pour son coup de main, ainsi qu'à paweld (post précédent) qui m'a grandement aidé avec son code, sans le savoir, en me sortant cette énorme épine du pied !
    Je peux continuer mon chemin,

    Le code, adapté du lien vers mes besoins :
    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
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls, fgl;
     
    type
     
      TTVItem = class
        name: String;
        tvidx: Integer;
      end;
     
      { TTVList }
     
      TTVList = class(specialize TFPGObjectList<TTVItem>)
        function Add(aName: String; aTVIndex: Integer): Integer;
      end;
     
      { TForm2 }
     
      TForm2 = class(TForm)
        Memo1: TMemo;
        tv: TTreeView;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure tvMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
      public
      end;
     
    implementation
     
      var
        tvlist: TTVList;
     
    { TTVList }
     
    function TTVList.Add(aName: String; aTVIndex: Integer): Integer;
    var
      tvi: TTVItem;
    begin
      tvi := TTVItem.Create;
      tvi.name := aName;
      tvi.tvidx := aTVIndex;
      Result := inherited Add(tvi);
    end;
     
    { TForm2 }
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: Integer;
      tnp, tni: TTreeNode;
      aname: String;
    begin
      tvlist := TTVList.Create;
      for i := 1 to 5 do
      begin
        aname := Format('Parent %d', [i]);
        tnp := tv.Items.Add(nil, aname);
        tvlist.Add(aname, tnp.AbsoluteIndex);
      end;
    end;
     
    procedure TForm2.FormDestroy(Sender: TObject);
    begin
      tvlist.Free;
    end;
     
    procedure TForm2.tvMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      p: TPoint;
      tn: TTreeNode;
    begin
      p := Mouse.CursorPos;
      p := tv.ScreenToClient(p);
      tn := tv.GetNodeAt(p.X, p.Y);
      if tn <> nil then
        Memo1.Lines.Add(inttostr(p.X)+'  '+inttostr(p.Y) +' -- '+ tn.Text);
    end;
     
    end.
    enjoy !

    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    pour faire encore plus court et plus rapide pour étudier le code, j'ai enlevé tout ce qui ne me servirait à rien (et j'ai renommé le TreeView en tv1 et le TPoint en pt, pour l'alignement vertical du 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
    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
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls;
     
    type
     
      { TForm2 }
     
      TForm2 = class(TForm)
        Memo1: TMemo;
        tv1: TTreeView;
        procedure FormCreate(Sender: TObject);
        procedure tv1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
      public
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.lfm}
     
    { TForm2 }
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: Integer;
      aname: String;
    begin
      for i := 1 to 5 do begin
        aname := Format('Parent %d', [i]);
        tv1.Items.Add(nil, aname);
      end;
    end;
     
    procedure TForm2.tv1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      pt: TPoint;
      tn: TTreeNode;
    begin
      pt := Mouse.CursorPos;
      pt := tv1.ScreenToClient(pt);
      tn := tv1.GetNodeAt(pt.X, pt.Y);
      if tn <> nil then
        Memo1.Lines.Add(Format('%3.u,%3.u -- %s', [pt.x, pt.y, tn.Text]));
    end;
     
    end.
    En utilisant une fonte monospace, l'alignement du mémo à l'exécution est impeccable.
    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. Commande mail fonctionne en ligne de commande et pas dans script sh
    Par blumi31 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/02/2013, 08h27
  2. Code qui ne fonctionne qu'avec un command button
    Par Usgpa dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/07/2010, 15h56
  3. [ODBC] Connection fonctionne avec ligne de commande mais pas sur site
    Par maxeur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/03/2010, 14h33
  4. [Carte mère] fonctionnement mémoire, bus de commande et rôles de composants matériels
    Par new_wave dans le forum Composants
    Réponses: 0
    Dernier message: 15/03/2010, 19h11
  5. Réponses: 2
    Dernier message: 18/06/2008, 07h14

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