SELECTEUR ALPHANUMERIQUE (VB.NET 2010

Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 18 juin 2012 à 08:10
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 7 juil. 2012 à 20:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54389-selecteur-alphanumerique-vb-net-2010

Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
7 juil. 2012 à 20:53
Pour moi à cette heure, l'utilisation présenté ci dessus n'est pas "propre", il vaut mieux faire ainsi :

1-supprimer meslettres qui ne me semble pas utile
2-écrire la sub comme suit :
Private Sub ClickMesLettres(ByVal sender As System.Object, ByVal e As System.EventArgs)
dim lbl as label = directcast(sender, label)
For Each ctrl As Control In Controls 'pour chaque control sur la form
If TypeOf ctrl Is label then
if ctrl.name = sender.name
.forecolor = Color.Black
.backcolor = Me.BackColor
else
.backcolor = Color.LightGreen
.forecolor = Color.Red
ExecutionSelecteur(lbl)
....
...

qu'en penses tu ?
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
7 juil. 2012 à 20:42
en effet Henry, mais dans son cas (la source si dessus) je repose donc le cas de la list of label. je m'explique par code.
Si je fais :
' ici avec des boutons pour faire un calendrier (mon prochain dépot de source pour VBfrance)
Private Sub CreerBpMois()
' création dynamique des controls BP et des zones de tags.
' sur 5 lignes et 7 colones
For semaines As Integer = 1 To 6

For jours As Integer = 1 To 7 ' 0=dimanche, 6=samedi et 7=re dimanche
Dim Bp As New Button
With Bp
.Tag = NomJours(jours) & "_" & semaines.ToString & ":" & (7 * (semaines - 1) + jours).ToString
.Size = New Size(60, 24)
.Location = New Point((jours - 1) * (.Size.Width + 1), 20 + semaines * (.Size.Height + 1))
.Name = ""
'.Text = .Tag.ToString 'pour débugage
.Visible = False
.ImageAlign = ContentAlignment.MiddleLeft
.TextImageRelation = TextImageRelation.Overlay
.Font = New Drawing.Font("arial", 8)
.FlatStyle = FlatStyle.Flat
.FlatAppearance.BorderSize = 2
.Cursor = Cursors.Hand
' active le menucontextuel "menu1" à chaque bouton
.ContextMenuStrip = Menu1
End With

' ajoute les évenements
'ici l'événement clik "bouton gauche" (attention le choix du bouton cliqué ne se fait que sur mouse.down pas sur click !)
AddHandler Bp.Click, AddressOf bp_click

'ajoute ces controls à la form
Controls.Add(Bp)
'ajoute ces controls à la liste en mémoire
listeBpJours.Add(Bp)
Next
Next
End Sub 'création des bp invisibles sur 5 lignes et 7 colones

j'archive les références de ces boutons dans la list of T, ok
mais à quoi peut elle bien servir puisque je suis obligé de caster le sender en bouton !

Private Sub bp_click(ByVal sender As Object, ByVal e As System.EventArgs)
For i = 0 To listeBpJours.Count - 1
With listeBpJours(i)
If .Name = sender.Name Then
' cette ligne ci dessus léve une liaison tardive !!!!!!!!!!!!!!!!!!!
End If
End With
Next

End Sub 'clic souris sur un bouton du calendrier actif

Donc si je dois caster autant le faire qu'une fois ! non ?
et donc autant écrire :
Private Sub bp_click(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles listeBpJours(sender).click
Dim Ce_Bp As Button = CType(sender, Button) 'cast le sender en bp
MessageBox.Show(Ce_Bp.Name)

End Sub 'clic souris sur un bouton du calendrier actif

Tu vois ou je veux en venir ?
Pourquoi faire une liste des control créer dynamiquement ?
j'ai reussi à passer à bp_click un button au lieu d'un object, mais il me manque le e.sytemEventArgs, grrrrrrr

comme ceci :

Private Sub bp_click(ByVal sender As Button, ByVal e As System.EventArgs) 'Handles listeBpJours(sender).click
' Dim Ce_Bp As Button = CType(sender, Button) 'cast le sender en bp
' MessageBox.Show(Ce_Bp.Name)
For i = 0 To listeBpJours.Count - 1
With listeBpJours(i)
If .Name = sender.Name Then

End If
End With
Next

End Sub 'clic souris sur un bouton du calendrier actif
cela pourrait marcher sauf que :
AddHandler Bp.Click, AddressOf bp_click 'léve une erreur de convertion implicite ! la boucle est bouclé ?
non pas encore j'ai donc essayé cela :
AddHandler Bp.Click, AddressOf bp_click(Bp, ?????) et là je bloque :/

@ te lire et merci pour tes lectures de mes romans lol
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
7 juil. 2012 à 20:26
Bonsoir,

Pour ton problème, il y a 3 manière de "caster" :
- CType : Cast de base, tolère la conversion en Int32 vers énumération par exemple
- DirectCast : Convertit le type uniquement si cela correspond exactement (Label hérite de Control, donc, c'est possible, mais pas de conversion de Int32 vers Enum par exemple). Plus rapide de le CType
- TryCast : Essayes de convertir (avec CType), en cas d'échec, retourne False, True sinon.

Faire avec DirectCast est dans ton cas, je pense conseillé

Ces méthodes sont toujours plus rapides que les liaisons tardives.
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
7 juil. 2012 à 20:14
Aprés lecture et travail sur ce code proposé, je dois avertir qu'il est rempli de liaison tardive.
Ex : DAns la sub clikmesletres : If .Name = sender.name Then... léve une erreur par exemple.
placer la balise strict à on pour la voir.
je cherche une façon de faire autre que le cast du sender, qui rendrait utile la list of
De plus le AddHandler n'autorise qu'un object pour le sender, donc je ne vois d'autre solution que le caster en label.
@ suivre donc ;)
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
3 juil. 2012 à 08:17
Bonjour,
je suis d'accord avec toi mais aussi surpris tout de même de voir de "gros" logiciel qui tourne sous .net (solidworks par exemple). Je pense que je ne dois pas bien l'utiliser.
Je vais faire un test comparatif entre l'utilisation des list of t et la recherche direct dans le container.control. Merci de ta lecture. bonne journée.
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
2 juil. 2012 à 20:45
Bonsoir,

Si la consommation mémoire est ta priorité, .NET n'est pas le plus approprié.

Faire une 2ième liste ne coutera pas tellement plus en RAM, car seul les références vers les objets seront faites.
Mais coté performance (vitesse), ce n'en sera que mieux.
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
2 juil. 2012 à 20:36
bien aprés essais (et sans réponse de ta part - en espérant que tout aille bien pour toi), je poursuis.
1- le CG.collector ne change rien du tout dans une form.load
la seul façon de faire tomber la ram de 22Mo à 9Mo est de :
Me.WindowState = FormWindowState.Minimized
Me.Visible = False
[traitement]
'affiche la form à la fin pour moins de mémoire (22Mo vs 9Mo !)
' GC.Collect() ' ne change rien pfffff
Me.Visible = True
Me.WindowState = FormWindowState.Normal

franchement c'est saoulant le .net il doit y avoir mieux non de zeus !!!! ^_^
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
25 juin 2012 à 08:12
Merci pour la réponse, en fait ma "vrai" question était plutôt la suivante.
Que vaut il mieux ?
Prendre une zone mémoire pour y placer les contrôles créés ou les rechercher dans le container.controls avec ce code :
For Each ctrl As Control In Controls 'pour chaque control sur la form
'cache tous les boutons qui n'ont pas le tag toujours visible
If TypeOf ctrl Is Button AndAlso Not ctrl.Tag Is "tjvisible" Then ctrl.Visible = False

J'arrive à 8Mo aprés minimize de la form, cela devient un peu plus résonable pour laisser le programme tourner en tache de fond.
kenavo
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
24 juin 2012 à 23:20
Faire du C# n'arrangera pas les choses, car c'est le même framework.

L'avantage du List(Of T), c'est que c'est une collection typée, donc au lieu de chercher le label "LblCarA" dans Container.Controls, tu accèdes directement à ce label sans devoir transtyper.

Il y a aussi les Dictionnary(Of ..., ...) si l'index est plus complexe.

Concernant la mémoire, elle est gérée par le GC, Garbage Collector, mais pour qu'il fasse le ménage, il a besoin de stopper le programme, donc, lors de lourds traitements, il ne travaillera pas souvent, pareil, il faut un minimum de mémoire à libérer avant qu'il n'agisse.

Le fait de mettre la fenêtre en réduit, lui donne peut être un signal indirect.

Pour forcer le ménage : GC.Collect (je crois).
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
24 juin 2012 à 19:35
salut, Nhenry.
J'ai déja posté des sources qui traite des controls dynamique, à ce propos une prochaine arrive bientôt.
Cependant je ne les place pas dans une collection ou list (of T) car je ne vois pas l’intérêt à part remplir la mémoire (qui est déja bien rempli avec VB.NET ! 25Mo pour une simple form qui place des boutons en dynamique ça mal aux fesses ! En plus elle ne cesse de monter ! il faut minimiser la fenetre pour retrouver une valeur "nomrale" de 1 ou 2M de ram.
Peux tu m'éclairer stp. cdlt ADN
Je commence à me demander si programmer en C++ ou C# ne serait pas plus performant que le VB, ais-je tors ? cela viens t'il du management du .NET ? @ te lire.
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
24 juin 2012 à 14:38
Bonjour,

Code simple, mais peut être utile pour créer des contrôles dynamiquement.

En .NET :
- Retires l'import automatique de Microsoft.VisualBasic.
- Actives Option Explicit et Option Strict
- A la place de Collection, utilises plutot List(Of T)

Avec un peu plus de commentaire, ta source serait très utile.
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
18 juin 2012 à 08:10
oui d'accord, c'est donc une création dynamique de control.
Astuces et questions :

AddHandler x.Click, AddressOf ClickMesLettres
1- X n'est pas clair, préfère plutôt un style LblChar ou autre.
2- Tu peux préférer x.Mousedown qui te permet de connaitre le bouton cliqué, la molette, parfois c'est utile ;)

ce qui m’amène à te demander pourquoi placer les labels dans une collection ? qu'elle est l’intérêt ?

Merci de ta lecture et bonne prog.
Rejoignez-nous