J'ai un problème extraordinaire !

Signaler
Messages postés
171
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007
-
Messages postés
241
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005
-
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 !

Generation Software
http://www.gen-software.com

5 réponses

Messages postés
241
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005

Est-ce que le mot Select est un mot réservé? Quel type de variable utilises-tu?
Messages postés
171
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007

"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.

Cordialement

Generation Software
http://www.gen-software.com
Messages postés
241
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005

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


PopupMenu mnuFichier
end sub

Et ça marche au poil, en dépit de cet article:
http://support.microsoft.com/default.aspx?scid=kb;en-us;240946
Messages postés
171
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007

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.

Merci quand même
@++++

Generation Software
http://www.gen-software.com
Messages postés
241
Date d'inscription
jeudi 8 janvier 2004
Statut
Membre
Dernière intervention
10 novembre 2005

C'est pas tout à fait le même code vu que le mien fonctionne ;)