Editer un nom dans un TreeView

Le
Raymond Fournier
Bonjour a tous,
Je voudrais dans un treeView éditer le nom d'un nœud, mais en conservant les
neuf premiers caractères. Je ne vois pas de SelStart et SelLength . J’ai
pensé placer un textbox, mais il n’y a pas de propriété Top ou Left d’un
nœud. Il y a t-il une façon de sens sortir ?

Merci Raymond Fournier
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jacques93
Le #15412491
Bonjour Raymond Fournier,
Raymond Fournier a écrit :
Bonjour a tous,
Je voudrais dans un treeView éditer le nom d'un nœud, mais en conservant les
neuf premiers caractères. Je ne vois pas de SelStart et SelLength . J’ai
pensé placer un textbox, mais il n’y a pas de propriété Top ou Left d’un
nœud. Il y a t-il une façon de sens sortir ?




Il ne semble pas qu'il y ait de solution simple, le message,

TVM_GETEDITCONTROL :


permet de récupérer le contrôle de saisie associé au Treeview mais il
faut sous classer le contrôle. Un exemple (minimal) :


Non testé.

--
Cordialement,

Jacques.
Raymond Fournier
Le #15412371
"Jacques93" wrote:

Bonjour Raymond Fournier,
Raymond Fournier a écrit :
> Bonjour a tous,
> Je voudrais dans un treeView éditer le nom d'un nœud, mais en conservant les
> neuf premiers caractères. Je ne vois pas de SelStart et SelLength . J’ai
> pensé placer un textbox, mais il n’y a pas de propriété Top ou Left d’un
> nœud. Il y a t-il une façon de sens sortir ?
>

Il ne semble pas qu'il y ait de solution simple, le message,

TVM_GETEDITCONTROL :


permet de récupérer le contrôle de saisie associé au Treeview mais il
faut sous classer le contrôle. Un exemple (minimal) :


Non testé.

--
Cordialement,

Jacques.



Merci Jacques pour cette information. Je programme comme hobby et je ne
connais pas cette notion de sous classement et je ne vois pas comment m'en
servir. Je crois que je peux aller chercher la partir du nom que je ne veux
pas perdre dans TreeView1_BeforeLabelEdit et l’ajouter au nouveau nom dans
TreeView1_AfterLabelEdit.

Raymond Fournier
François Picalausa
Le #15412361
On 4月5日, 午後10:38, Raymond Fournier
"Jacques93" wrote:
> Bonjour Raymond Fournier,
> Raymond Fournier a écrit :
> > Bonjour a tous,
> > Je voudrais dans un treeView éditer le nom d'un nœud, mais en conservant les
> > neuf premiers caractères. Je ne vois pas de SelStart  et Se lLength . J’ai
> > pensé placer un textbox, mais il n’y a pas de proprià ©té Top ou Left d’un
> > nœud. Il y a t-il une façon de sens sortir ?

> Il ne semble pas qu'il y ait de solution simple, le message,

> TVM_GETEDITCONTROL :

>    
> permet de récupérer le contrôle de saisie associé a u Treeview mais il
> faut sous classer le contrôle. Un exemple (minimal) :

>    
> Non testé.

> --
> Cordialement,

> Jacques.

Merci Jacques pour cette information. Je  programme comme hobby et j e ne
connais pas cette notion de sous classement et je ne vois pas comment m'en
servir. Je crois que je peux aller chercher la partir du nom que je ne ve ux
pas perdre dans TreeView1_BeforeLabelEdit et l’ajouter au nouveau nom dans
TreeView1_AfterLabelEdit.

Raymond Fournier



Hello,

Si tu as de la place en dessous du treeview, un design acceptable pour
l'utilisateur et simple à réaliser serait probablement d'ajouter un
label et une textbox sous le contrôle, les deux étant mis à jour en
même temps que la sélection...

[attention, la section suivante est une approche simplifiée et
contient des inexactitudes]
Sinon, en ce qui concerne le sous classement, il s'agit de la
récupération de messages envoyés à l'une ou l'autre fen être.
Pour comprendre cela, il faut d'abord savoir que chaque application a
une boucle de message (en VB, le runtime permet d'en faire
abstraction) permettant de savoir quand un événement s'est produi t sur
une fenêtre. Le terme fenêtre regroupe les fenêtres au sens
"utilisateur", mais aussi les bouttons de commande, les textboxes, les
treeview, les pictureboxes, et beaucoup d'autres élément graphiqu es,
mais cependant pas tous. Certains éléments, comme c'est le cas po ur
les contrôles VB image ou label, ou toute instruction du type print,
line, circle, ... ont pour fenêtre, celle sur laquelle ils se
dessinent.
Lorsque l'on click sur une fenêtre, par exemple, Windows envoie un
message WM_CLICK à la fenêtre en question. Ensuite, la boucle de
message du runtime transforme le message WM_CLICK en appel de fonction
à l'événement Click du contrôle. Il existe naturellemen t de nombreux
autres messages, plus ou moins dépendant du type de fenêtre
utilisé.Certaines fenêtes renvoient aussi des messages à leu r parent
(par exemple, une listview notifie la fenêtre qui la contient d'un
changement de sélection par LVN_ITEMCHANGED)

Le sous-classement est la dénomination d'une technique permettant,
pour une fenête donnée, d'intercepter tous les messages reçu s avant
tout autre code (celui du contrôle, éventuellement adapté so us forme
d'événement par le runtime, y compris). Ceci permet:
- d'intercepter des événements non gérés de base par VB (comme le
défilement par roulette de souris)
- d'employer une fonctionnalité d'un contrôle nécessitant
d'interception d'un message particulier (par exemple:
http://faq.vb.free.fr/index.php?question9)
- de modifier l'impact d'un message sur lequel on a pas d'autre accès
(par exemple, interdire certains caractères dans une textbox cré ée par
un contrôle tiers, tel que le treeview)
[/imprécisions]

En Visual Basic le sous-classement peut-être fatal (pour tout travail
non enregistré)! Enregistrer souvent est *loin* d'être une mauvai se
idée! Une simple pression sur "Pause", "Stop", un point d'arrêt m al
placé, ou une erreur forçant la pause réalisera un crash...
irrémédiable :-)
(Une autre solution consiste à utiliser une dll activex prévue po ur le
sous-classement, ce qui évite beaucoup de problèmes lors du dà ©buggage)

Pour plus d'informations sur le sous-classement, voici quelques
addresses:
http://support.microsoft.com/kb/327866/en-us
http://support.microsoft.com/kb/168795/en-us
http://support.microsoft.com/kb/179398/en-us
http://support.microsoft.com/kb/185733/en-us


François
Jacques93
Le #15412321
Bonjour Raymond Fournier,
Raymond Fournier a écrit :
[...]
Merci Jacques pour cette information. Je programme comme hobby et je ne
connais pas cette notion de sous classement et je ne vois pas comment m'en
servir. Je crois que je peux aller chercher la partir du nom que je ne veux
pas perdre dans TreeView1_BeforeLabelEdit et l’ajouter au nouveau nom dans
TreeView1_AfterLabelEdit.




J'ai essayé avant de m'orienter vers cet exemple de sous-classement dont
François Picalausa a décrit le fonctionnement.

Un truc du genre, on sauvegarde l'ancien texte du Node :

Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
Debug.Print "Before Edit"
With TreeView1.SelectedItem
OldString = .Text
' on enlève les 9 premiers caractères
.Text = Mid(.Text, 10)
End With
End Sub


' On ajoute les 9 premiers caractères à la saisie effectuée.
Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, _
NewString As String)
Debug.Print "After Edit"
With TreeView1.SelectedItem
If Len(NewString) > 0 Then
.Text = left(OldString, 9) & NewString
Else
.Text = OldString
End If
End With
End Sub


Malheureusement cela ne marche pas pas. Le lien entre le texte du Node
et le texte de contrôle de saisie se fait pas, me semble t-il après ces
événements, et on a donc aucun moyen d'interférer (sauf erreur de ma
part). La solution proposée par François (zone de saisie indépendante)
est de loin la plus simple, car même pour récupérer les coordonnées x,y
de la zone de saisie, il faut déjà sous classer (sinon on récupère les
coordonnées du TreeView).

--
Cordialement,

Jacques.
Raymond Fournier
Le #15412261
"Jacques93" wrote:

Bonjour Raymond Fournier,
Raymond Fournier a écrit :
[...]
> Merci Jacques pour cette information. Je programme comme hobby et je ne
> connais pas cette notion de sous classement et je ne vois pas comment m'en
> servir. Je crois que je peux aller chercher la partir du nom que je ne veux
> pas perdre dans TreeView1_BeforeLabelEdit et l’ajouter au nouveau nom dans
> TreeView1_AfterLabelEdit.
>

J'ai essayé avant de m'orienter vers cet exemple de sous-classement dont
François Picalausa a décrit le fonctionnement.

Un truc du genre, on sauvegarde l'ancien texte du Node :

Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
Debug.Print "Before Edit"
With TreeView1.SelectedItem
OldString = .Text
' on enlève les 9 premiers caractères
.Text = Mid(.Text, 10)
End With
End Sub


' On ajoute les 9 premiers caractères à la saisie effectuée.
Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, _
NewString As String)
Debug.Print "After Edit"
With TreeView1.SelectedItem
If Len(NewString) > 0 Then
.Text = left(OldString, 9) & NewString
Else
.Text = OldString
End If
End With
End Sub


Malheureusement cela ne marche pas pas. Le lien entre le texte du Node
et le texte de contrôle de saisie se fait pas, me semble t-il après ces
événements, et on a donc aucun moyen d'interférer (sauf erreur de ma
part). La solution proposée par François (zone de saisie indépendante)
est de loin la plus simple, car même pour récupérer les coordonnées x,y
de la zone de saisie, il faut déjà sous classer (sinon on récupère les
coordonnées du TreeView).

--
Cordialement,

Jacques.



Merci des informations. Je vais commencer avec l'idée du textBox en dessous
du TreeView, même si je considère que ce n'est pas très esthétique. Je vais
me pencher sur le sous-classement lorsque j'aurais quelque instant.

Raymond Fournier
Raymond Fournier
Le #15412041
"Raymond Fournier" wrote:



"Jacques93" wrote:

> Bonjour Raymond Fournier,
> Raymond Fournier a écrit :
> [...]
> > Merci Jacques pour cette information. Je programme comme hobby et je ne
> > connais pas cette notion de sous classement et je ne vois pas comment m'en
> > servir. Je crois que je peux aller chercher la partir du nom que je ne veux
> > pas perdre dans TreeView1_BeforeLabelEdit et l’ajouter au nouveau nom dans
> > TreeView1_AfterLabelEdit.
> >
>
> J'ai essayé avant de m'orienter vers cet exemple de sous-classement dont
> François Picalausa a décrit le fonctionnement.
>
> Un truc du genre, on sauvegarde l'ancien texte du Node :
>
> Private Sub TreeView1_BeforeLabelEdit(Cancel As Integer)
> Debug.Print "Before Edit"
> With TreeView1.SelectedItem
> OldString = .Text
> ' on enlève les 9 premiers caractères
> .Text = Mid(.Text, 10)
> End With
> End Sub
>
>
> ' On ajoute les 9 premiers caractères à la saisie effectuée.
> Private Sub TreeView1_AfterLabelEdit(Cancel As Integer, _
> NewString As String)
> Debug.Print "After Edit"
> With TreeView1.SelectedItem
> If Len(NewString) > 0 Then
> .Text = left(OldString, 9) & NewString
> Else
> .Text = OldString
> End If
> End With
> End Sub
>
>
> Malheureusement cela ne marche pas pas. Le lien entre le texte du Node
> et le texte de contrôle de saisie se fait pas, me semble t-il après ces
> événements, et on a donc aucun moyen d'interférer (sauf erreur de ma
> part). La solution proposée par François (zone de saisie indépendante)
> est de loin la plus simple, car même pour récupérer les coordonnées x,y
> de la zone de saisie, il faut déjà sous classer (sinon on récupère les
> coordonnées du TreeView).
>
> --
> Cordialement,
>
> Jacques.

Merci des informations. Je vais commencer avec l'idée du textBox en dessous
du TreeView, même si je considère que ce n'est pas très esthétique. Je vais
me pencher sur le sous-classement lorsque j'aurais quelque instant.

Raymond Fournier



Re bonjour a tous,
Je crois avoir fait du progrès pour éditer un texte d'un nœud dans un
treeview. J'ai décidé lors que j'édite le texte, d'afficher que le texte qui
peu être modifier. Pour cela j'utilise l'Api SendMessage:

Dim editHWnd As Long

' get the handle of the TreeView's Edit control
editHWnd = SendMessage(TreeView1.hWnd, TVM_GETEDITCONTROL, 0, ByVal 0&)

'Afficher nouveau nom
SendMessage editHWnd, WM_SETTEXT, 0&, ByVal "BlaBla"

Cette façon fonctionne à l'exception que sous le texte "BlaBla" que l'on
peut éditer, il y a le texte original qui est plus long.

J'aimerais ne pas voir l'ancien texte ?

Merci de vos conseils.
Raymond Fournier
Publicité
Poster une réponse
Anonyme