cs_NoFutur
Messages postés171Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention 6 mai 2007
-
19 janv. 2005 à 11:48
mythic_kruger
Messages postés241Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention10 novembre 2005
-
19 janv. 2005 à 18:49
Bonjour @Tous
Alors je vais vous expliquer le topo : J'utilise la version 5.0 de la listview. Le composant à la propriété multiselect à True, j'effectue une sélection multiple avec ma souris et j'ai besoin d'afficher un menu contextuel avec divers options et jusque là tout marche sans problème.
Lorsque je décide d'activer ou de désactiver certaines options du menu contextuel je passe par une boucle For... Each pour déterminer les items qui sont sélectionnés afin d'afficher ou non certaines options du menu ex :
For each item in List1.ListItems If item.selected True then select select + 1
next
If select >1 then (désactive une partie du menu) else (active une autre partie)
A partir de là lorsque j'affiche mon menu contextuel par clic droit je me rend compte qu'aprés avoir exécuté n'importe quel code dans ce menu je ne peux plus quitter mon application celle-ci reste en mémoire permanente je suis donc obligé d'utiliser l'instruction END pour forcer la sortie.
Je précise que j'utilise des fichiers a accés direct (mais oui ça existe encore :o)) et qu'avant de quitter l'application je cloture tous mes fichiers et qu'aucune autre fenêtre ne réside en mémoire. Par curiosité j'ai remplacé For Each par une boucle classique For I mais ya le même résultat et chose trés extraordinaire (on en revient au sujet du message) lorsque je désactive la boucle et que je réutilise le menu contextuel avec un code, l'application se décharge d'elle même lorsqu'on quitte sans besoin d'utiliser END.
Si vous avez une idée de comment et pourquoi il se passe ce truc bizarre merci de m'éclairer dans le cas contraire j'ai trouvé la solution en utilisant l'instruction END même si je ne suis pas fan de ce truc.
Dernière précision je ne bois que de l'eau plate lorsque je programme
Bien à vous !
cs_NoFutur
Messages postés171Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention 6 mai 2007 19 janv. 2005 à 14:09
"Select" est une variable que je définis dans ma procédure, elle est de type integer et n'existe pas en variable global. Pour qu'il n'y est pas d'ambiguité avec une autre variable dans mon code, je l'appelle "Selection", ici c'était juste pour donner un court exemple.
Voilà comment d'orgine il est construit :
Dim item as Listitem
Dim Selection as integer, i as integer
For each item in List1.ListItems If item.selected True then selection selection + 1
next
If selection > 1 then
désactive une partie du menu
else
active tout le menu
end if
Pour activer ou désactiver des portions de menu j'utilise aussi une boucle For i avec un "On error resume next" en début de procédure à cause des séparateurs qui ne gèrent pas la propriété enabled.
mythic_kruger
Messages postés241Date d'inscriptionjeudi 8 janvier 2004StatutMembreDernière intervention10 novembre 2005 19 janv. 2005 à 16:55
Rien de bien extraordinaire!
Fais une boucle; de 1 au nombre de ListItems. En plus, ça évite de déclarer un objet ListItem.
Pour le menu, la propriété enabled peut être gérée, je te conseille d' enlever le "on error resume next" puisqu' il ne peut y avoir d' erreur dans la boucle (un item standard avec caption "-" marche bien).
On récapitule (j'assume que tu as un menu principal appelé mnuFichier contenant 2 sous-menus mnuUnSeul et mnuPlusieurs, à activer selon une condition).
Dans l' évènement Mousedown du contrôle ListView:
If Button <> 2 Then exit sub
Dim i As Integer, maSomme As Integer
For i = 1 To ListView1.ListItems.Count If ListView1.ListItems(i).Selected True Then maSomme maSomme + 1
Next i
If maSomme = 1 Then
mnuUnSeul.Enabled = True
mnuPlusieurs.Enabled = False
Else
mnuUnSeul.Enabled = False
mnuPlusieurs.Enabled = True
End If
cs_NoFutur
Messages postés171Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention 6 mai 2007 19 janv. 2005 à 17:50
Ben en fait c'est pareil, ce que je n'ai pas précisé c'est que j'utilise aussi des boucles dans la condition if then parceque mon menu contextuel est assez long et quand la variable i de la boucle arrive sur un séparateur boum "erreur d'exécution 387" ce qui me semble normal d'ou la gestion de l'erreur.
Sinon c'est pile poil le code que j'ai fait, un peu modifié, mais même topo au niveau de la fenêtre ça ne veut pas se fermer. Toute façon te bil pas ya pas de soucis avec l'instruction END ça passe quand même je me débrouille juste de tout cloturer et décharger avant de l'utiliser.