[R] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

[R] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#1

Message par Patrick22 »

Bonjour,

J'ai écrit un script, que j'utilise en include, dans lequel j'utilise une fonction enregistrée pour gérer le bouton "Annuler" de ma GUI :
GUIRegisterMsg(0x0111, "BarreAttente_WM_COMMAND")
Sans entrer dans le détail, je suis obligé d'en passer par là au lieu d'un simple GUIGetMsg() mais là n'est pas le souci.
Cette fonction fonctionne très bien et intercepte l'utilisation du bouton "Annuler" par son identifiant, son controlID.

Le code suivant l'utilisation de ce bouton affiche une table en utilisant _ArrayDisplay(). Cela fonctionnait aussi jusqu'au jour où la table ne s'est pas affichée :| . Après moult recherches et pistage de bug j'ai enfin trouvé :) :
Le controlID de mon bouton "Annuler" est récupéré par _ArrayDisplay() à son exécution via GUIGetMsg() dans sa boucle de gestion des événements "While 1 ... Wend" et correspond au controlID de son bouton "Exit" ! D'où l'absence d'affichage.

Je ne comprends pas bien pourquoi. :?: Est-ce parce que je l'ai intercepté via une fonction enregistrée et non un GUIGetMsg() et qu'ainsi l'événement est resté actif ? Si quelqu'un a une idée, une piste, je suis preneur.

Toujours est-il que ce n'est pas un bug de ma part. C'est une situation certes pas fréquente mais possible, la preuve.

Pour éviter ce problème il faut tester l'handle de la fenêtre ayant émise l'événement dans _ArrayDisplay(). C'est si peu fréquent que les codeurs ont simplement utilisé, comme je le fais aussi systématiquement :

Code : Tout sélectionner

 $iMsg = GUIGetMsg()
En fait il faut être plus rigoureux ici et le remplacer par :

Code : Tout sélectionner

 Local $aMsg = GUIGetMsg(1)
 $iMsg = $aMsg[0]
 If $iMsg > 0 And $aMsg[1] <> $hGUI Then $iMsg = 0
Ça a le même effet, n'entraine pas de régression et évite les cas "improbables".

D'où ma 2ème question : :?: Comment partager, faire étudier, peut-être valider et modifier le code de cet UDF ?
Modifié en dernier par Patrick22 le lun. 08 févr. 2016 20:25, modifié 1 fois.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#2

Message par mikell »

C'est intéressant, mais tes conclusions ne seront pas prises au sérieux si tu ne fournis pas un code qui reproduit cette situation
(la fonction _ArrayDisplay existe depuis pas mal de temps et à ma connaissance ce problème n'a jamais été évoqué)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#3

Message par jguinch »

Utiliser un _ArrayDisplay dans une function de type WM_COMMAND n'est pas du tout une bonne idée. Il faut sortir le _ArrayDispay de cette fonction.
Comme l'a dit Mikell, il faudrait qu'on voit un peu le code...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#4

Message par Patrick22 »

A la base il s'agit d'un script include pour automatiser l'utilisation des barres de progression, progressive ou continue. Il est complexe, un peu fourni et pas complètement finaliser. Si nécessaire je le mettrai en ligne.
Je vais d'abord essayer de reproduire le cas avec un exemple plus simple.

jguinch - Le ArrayDisplay n'est pas dans WM_Command mais dans le pgm principal qui utilise WM_Command pour détecter l'utilisation du bouton "Annuler" et alors sortir d'une boucle de traitements puis ensuite ArrayDisplay pour afficher la table produite par les traitements.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#5

Message par Patrick22 »

Voila. C'est fait. J'ai mis ça dans un ZIP et là :shock: j'ignore comment le mettre en fin de mon post !

Comment le faire ?

Edit - En attendant une solution plus propre, genre déposer le ZIP sur le site si ça peut se faire, voici le lien Cloud d'accès :
https://drive.google.com/file/d/0B7D-2F ... sp=sharing
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#6

Message par mikell »

Pour joindre un fichier il faut utiliser l'onglet "Fichiers joints" de la tab juste en dessous du bouton "Envoyer"

Sinon, j'ai réduit ton script au plus simple mais en respectant bien ses commandes
Simplifié, il fonctionne très bien. Utilisé avec ton include Array.au3 il montre aussi que les boutons "Annuler" de la gui et "Exit" de _ArrayDisplay ont effectivement le même ID mais sans incidence sur son exécution
Je n'ai pas eu le temps de chercher plus loin mais AMHA la vérité est ailleurs

Code : Tout sélectionner

#include "Array.au3"

$hGUI        = GUICreate("Titre fenêtre", 320, 120, -1, -1)
$iTexte1_Id  = GUICtrlCreateLabel("Texte", 20, 10, 280, 20)
$iProgre_Id  = GUICtrlCreateProgress(20, 28, 280, 20)
$iTexte2_Id  = GUICtrlCreateLabel("", 20, 53, 280, 20)
$iAnnuler_Id = GUICtrlCreateButton("Annuler", 125, 70, 70, 20)
GUISetState()
GUIRegisterMsg(0x0111, "BarreAttente_WM_COMMAND")

Local $aX[1]
$aX[0] = "Item 0"
$iFaits      = 0 
$iTotal      = 100 
$bAnnulation = False

For $i = 1 to 100
	Sleep(30)
	If $bAnnulation Then Exitloop 
	$iFaits = $iFaits + 1
	$iPourcentage = Ceiling(($iFaits/$iTotal)*100)
	GUICtrlSetData($iTexte2_Id, $iPourcentage & "%")
	GUICtrlSetData($iProgre_Id, $iPourcentage)
Next

_ArrayDisplay($aX)
If MsgBox(1+48+8192, "Stop", "- Fin traitement -") = 2 Then Exit


Func BarreAttente_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)
	If $nID = $iAnnuler_Id Then
		ConsoleWrite("- BarreAttente_WM_COMMAND - " & @CRLF _
								& "$nID = " & $nID & @CRLF _
								& "----------------------------" & @CRLF)
		$bAnnulation = True
	EndIf
	Return 'GUI_RUNDEFMSG' 
EndFunc ; ==> BarreAttente_WM_COMMAND

" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#7

Message par Patrick22 »

En effet le script est réduit mais ce n'était pas le but. Le script que j'ai fait est une réduction d'un autre plus compliqué dans lequel la structure par fonctions est essentielle et est conservée.
Bien que, vu la réduction, il est simplifiable c'est quand même avec celui que j'ai donné qu'il faut tester. Il n'a pas d'erreur, à priori, mais pourtant génère ce problème dans ArrayDisplay.
La vérité est bien par là :wink:

Pour le fichier à joindre, j'ai changé de lunettes et j'ai bien vu l'onglet concerné :D
Test probleme _ArrayDisplay.zip
(19.94 Kio) Téléchargé 97 fois
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#8

Message par mikell »

Je me suis mal exprimé. Pour évoquer un bug tu dois fournir un script le plus minimaliste possible, en virant toutes les fonctions custom susceptibles de provoquer un dysfonctionnement
Par exemple le script suivant, basique mais qui reproduit bien ton problème

Code : Tout sélectionner

#include <Array.au3>

Local $aX[1] = ["Item 0"], $bAnnulation

$hGUI = GUICreate("Title", 320, 120, -1, -1)
$iTexte1_Id  = GUICtrlCreateLabel("Texte", 20, 10, 280, 20)
$iTexte2_Id  = GUICtrlCreateLabel("", 20, 53, 280, 20)
$iProgre_Id  = GUICtrlCreateProgress(20, 28, 280, 20)
$iAnnuler_Id = GUICtrlCreateButton("Annuler", 125, 70, 70, 20)
GUISetState()

GUIRegisterMsg(0x0111, "WM_COMMAND")

For $i = 1 to 100
	Sleep(30)
	If $bAnnulation = True Then ExitLoop
	GUICtrlSetData($iProgre_Id, $i)
Next
GUIDelete($hGUI)

_ArrayDisplay($aX)
MsgBox(1+48+8192, "Stop", "- Fin traitement -") 

;=======================================

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)
	If $nID = $iAnnuler_Id Then $bAnnulation = True
	Return 'GUI_RUNDEFMSG' 
EndFunc ; ==> BarreAttente_WM_COMMAND
ça permet de mettre en évidence les éléments beaucoup plus facilement, et donc de trouver la solution plus vite
Dans ton code le problème se manifeste par une confusion d'IDs, mais on peut le retrouver sous d'autres formes dans des codes très différents
Rien à voir avec _ArrayDisplay(), la cause c'est le "internal message handler" d'AutoIt dans GuiRegisterMsg, la solution c'est simplement d'utiliser "Return 0"

Code : Tout sélectionner

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)
    If $nID = $iAnnuler_Id Then 
       $bAnnulation = True
       Return 0
     EndIf
  Return 'GUI_RUNDEFMSG' 
EndFunc ; ==> BarreAttente_WM_COMMAND
Un peu comme dans l'exemple du fichier d'aide pour GuiRegisterMsg quoi...

La vérité était ailleurs :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#9

Message par Patrick22 »

Bonjour,

Le dernier exemple qu tu donnes est en effet une bonne réduction de mon script. Il a une différence principale avec le précédent : La ligne de code "GUIDelete($hGUI)". Ça change tout puisque c'est cette ligne qui déclenche le problème. Le précédent script ne pouvait que fonctionner :) .

Désactiver ou activer l'utilisation du "internal message handler" d'AutoIt ne change rien...Et je suppose :( que tu n'as pas testé la correction que tu proposes ! Certes le ControlId du bouton "Annuler" n'est pas pris par _ArrayDisplay() pour celui de son bouton "Exit script" et la table s'affiche MAIS mais mais : Elle ne se ferme plus sauf par la croix. L'utilisation du bouton "Exit script" est toujours interceptée par ma fonction enregistrée même bien sûr s'il n'y a pas annulation de la barre de progression.

Donc pour l'instant il n'y a pas d'autre solution que de modifier _ArrayDisplay().
La vérité serait-elle vraiment par là ? :wink:
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#10

Message par mikell »

Evidemment que si, j'ai testé :roll: et ça marche très bien en rajoutant juste ça dans le fichier Test_ArrayDisplay.au3 de ton zip :

Code : Tout sélectionner

Func BarreAttente_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)

	If $nID = BarreAttente_Commarea("$iAnnuler_Id") Then
		ConsoleWrite("- BarreAttente_WM_COMMAND - " & @CRLF _
								& "$nID = " & $nID & @CRLF _
								& "----------------------------" & @CRLF)
		BarreAttente_Traitements("ANNULATION")
		Return 0    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	EndIf

	Return 'GUI_RUNDEFMSG' ; 'GUI_RUNDEFMSG' = $GUI_RUNDEFMSG]
EndFunc ; ==> BarreAttente_WM_COMMAND
Comment veux-tu fermer un _ArrayDisplay() qui est une fonction bloquante autrement que par la croix de sa gui ou son bouton 'Exit Script' ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#11

Message par Patrick22 »

Donc on a testé tous les deux le code simplifié que tu propose en deuxième, celui-ci :

Code : Tout sélectionner

#include <Array.au3>

Local $aX[1] = ["Item 0"], $bAnnulation

$hGUI = GUICreate("Title", 320, 120, -1, -1)
$iTexte1_Id  = GUICtrlCreateLabel("Texte", 20, 10, 280, 20)
$iTexte2_Id  = GUICtrlCreateLabel("", 20, 53, 280, 20)
$iProgre_Id  = GUICtrlCreateProgress(20, 28, 280, 20)
$iAnnuler_Id = GUICtrlCreateButton("Annuler", 125, 70, 70, 20)
GUISetState()

GUIRegisterMsg(0x0111, "WM_COMMAND")

For $i = 1 to 100
   Sleep(30)
   If $bAnnulation = True Then ExitLoop
   GUICtrlSetData($iProgre_Id, $i)
Next
GUIDelete($hGUI)

_ArrayDisplay($aX)
MsgBox(1+48+8192, "Stop", "- Fin traitement -")

;=======================================

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)
   If $nID = $iAnnuler_Id Then
      $bAnnulation = True
		ConsoleWrite("Coucou ! " & @CRLF)
		Return 0
   EndIf
   Return 'GUI_RUNDEFMSG'
EndFunc ; ==> BarreAttente_WM_COMMAND
Script auquel j'ai juste ajouté un "ConsoleWrite("Coucou ! " & @CRLF)" pour voir quand il passe dans "WM_COMMAND".
Comment veux-tu fermer un _ArrayDisplay() qui est une fonction bloquante autrement que par la croix de sa gui ou son bouton 'Exit Script' ?
Ça quand même je crois que beaucoup de personnes doivent le savoir...

Quand j'exécute, chaque fois que je clique sur le bouton "Exit script" de la fenêtre affichée par _ArrayDisplay(), cette fenêtre ne se ferme pas et j'ai une écriture supplémentaire en console qui montre que l'événement est intercepté par "BarreAttente_WM_COMMAND". Et ceci, que ce soit après une annulation de la barre de progression - puisque avec "Return 0" là où tu l'as mentionné la fenêtre de _ArrayDisplay() s'affiche bien - ou même sans annulation de la barre de progression.
J'ai aussi des "ConsoleWrite" dans _ArrayDisplay() qui montrent que l'événement lié au bouton "Exit script" n'est pas intercepté dans cette fonction.

Si chez toi le comportement est différent, il va falloir qu'on cherche la vérité plus loin :wink: .
Peut-être le système d'exploitation, bien que ça me semble peu probable ?
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#12

Message par mikell »

Sur mon XP x86 pas de problème, donc là je teste sur mon w7 x64 du boulot et en effet le bouton Exit ne marche pas
Mais je maintiens que le souci n'est pas dans _ArrayDisplay() mais bien en amont dans l'écriture de la fonction WM_COMMAND appelée par le GuiRegisterMsg

Code : Tout sélectionner

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)
   If $hWnd = $hGUI and $nID = $iAnnuler_Id Then   ;<<<<<<<<<<<<<
        $bAnnulation = True
        Return 0
   EndIf
   Return 'GUI_RUNDEFMSG'
EndFunc ; ==> BarreAttente_WM_COMMAND
Si tu n'es pas de cet avis, je t'engage vivement à poster un sujet "bug _ArrayDisplay()" sur le forum US où tu pourras t'adresser directement aux développeurs
C'est un topic que je suivrai avec plaisir :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#13

Message par Patrick22 »

Bon ben moi je tourne aussi sur XP x86 Service Pack 3 et ça ne marche pas :shock:.
J'aurais bien essayé sur le poste de ma compagne mais c'est une tablette Androïd :lol:.

Il y a donc un problème qui n'est pas reproductible sur des machines de même système d'exploitation.
Ce n'est donc pas que un problème de codage de la fonction.

De toute façon pour que ça fonctionne sur n'importe quel poste je suis bien obligé de modifier cet _ArrayDisplay().

Comme d'hab la vérité est bien caché :wink:.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#14

Message par mikell »

Non, pour que ça fonctionne sur n'importe quel poste il faut écrire correctement la fonction WM_COMMAND :P
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#15

Message par Patrick22 »

Oui, certes. Mais vu que la fonction a 6 lignes et une seule fonctionnalité, ça relève presque de la magie ou du vœux pieu. :)

J'ai une question quand même, histoire de bien baliser le cas :
Es-tu sûr d'avoir fait le test sur ton XP avec la 2ème version simplifiée du code que tu m'as fournie ? Celle qui contient l'instruction :
GUIDelete($hGUI)

La 1ère version ne le contient pas et en fait c'est son exécution qui perturbe le bon déroulement de la suite.

C'est d'ailleurs peut-être par là que ce trouve la vérité :wink:.
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#16

Message par orax »

Devoir ajouter un If $hWnd = $hGUI n'est quand même pas très intuitif, surtout quand on a qu'une seule fenêtre (donc logiquement un seul handle de GUI). En plus, dans les exemples de scripts de la doc, je n'ai pas vu qu'ils faisaient cette vérification (ce qui est normal puisqu'il n'y a pas besoin dans leurs exemples).

D'après le fichier Array.au3 du ZIP, tu n'utilises pas la dernière version d'AutoIt. Le problème ne vient peut-être pas de là mais avant de chercher plus loin je l'aurais mis à jour.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#17

Message par mikell »

@Patrick22
Sur mon XP j'ai systématiquement testé mon 2ème petit code (celui qui résume le tien) ET le code complet de ton fichier Test_ArrayDisplay.au3
Cela dit je ne suis pas sûr que mon XP bricolé et customisé soit réellement représentatif :mrgreen:

@orax
Il me semble qu'il n'y a pas vraiment de différence dans le fonctionnement des boucles While des différentes versions récentes de _ArrayDisplay()
Tester If $hWnd = $hGUI peut avoir du sens si le GuiRegisterMsg intéresse plusieurs gui créées par le même script, et peut-être aussi dans le cas où il y a la gui du script + celle générée par _ArrayDisplay Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#18

Message par Patrick22 »

@mikell
Bon ben ça c'est vu. Faudrait voir, par curiosité, avec d'autres postes.

@orax
Devoir ajouter un If $hWnd = $hGUI n'est quand même pas très intuitif
Et parfois un peu compliqué. Le script d'origine par exemple est une fonction dans un script utilisé en include ensuite.
$hGUI est local à la fonction. Le placer global n'est pas vraiment propre pour script-include. J'ai bien une parade avec une fonction perso de commarea mais là ça devient un peu compliqué.

Pour la nouvelle version d'AutoIt faut voir. Je ne crois pas que ça changera beaucoup le résultat mais c'est vrai qu'il vaut quand même mieux la mettre à jour avant de continuer sur le sujet.

Si tu as la nouvelle version, peut-être pourrais-tu essayer de tester ?
Fichiers joints
Test_GUIDelete_ArrayDisplay.zip
(1.07 Kio) Téléchargé 94 fois
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
Patrick22
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mer. 24 déc. 2014 17:29
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#19

Message par Patrick22 »

J'ai peut-être trouvé la solution de ce problème.
Dans le script principal faut dé-enregister la fonction lors de la suppression de la GUI de la barre de progression en plus d'utiliser "Return 0" dans cette fonction.

Code : Tout sélectionner

#include <Array.au3>

Local $aX[1] = ["Item 0"], $bAnnulation

$hGUI = GUICreate("Title", 320, 120, -1, -1)
$iTexte1_Id  = GUICtrlCreateLabel("Texte", 20, 10, 280, 20)
$iTexte2_Id  = GUICtrlCreateLabel("", 20, 53, 280, 20)
$iProgre_Id  = GUICtrlCreateProgress(20, 28, 280, 20)
$iAnnuler_Id = GUICtrlCreateButton("Annuler", 125, 70, 70, 20)
GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")

For $i = 1 to 100
   Sleep(30)
   If $bAnnulation = True Then ExitLoop
   GUICtrlSetData($iProgre_Id, $i)
Next
GUIDelete($hGUI)
GUIRegisterMsg(0x0111, "") ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<

_ArrayDisplay($aX)
MsgBox(1+48+8192, "Stop", "- Fin traitement -")

;=======================================

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
  Local $nID = BitAND($wParam, 0x0000FFFF)
   If $nID = $iAnnuler_Id Then
      $bAnnulation = True
		ConsoleWrite("Coucou ! " & @CRLF)
		Return 0 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   EndIf
   Return 'GUI_RUNDEFMSG'
EndFunc ; ==> BarreAttente_WM_COMMAND
Si tu sais ce que tu fais, tu ne peux faire que ce que tu sais déjà faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème GUIGetMsg() dans _ArrayDisplay() qui ne s'affiche pas.

#20

Message par mikell »

Oui c'est une solution... radicale

Ce qui me chagrine c'est qu'annuler l'ID concernée doit suffire pour permettre sa réattribution au bouton Exit de _ArrayDisplay
Pour le petit code [chez moi] ça marche :

Code : Tout sélectionner

GUIDelete($hGUI)
$iAnnuler_Id = 0
	
_ArrayDisplay($aX)
Dans le gros code ça doit être pareil. BarreAttente_Commarea("$iAnnuler_Id", 0) fait bien ce travail et donc [chez moi] l'ID est bien réattribuée, le script fonctionne correctement (ce qui est logique) et je ne vois absolument pas pourquoi il en serait autrement sur d'autres postes...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre