Qui n'a jamais voulu regarder le contenu d'une variable pendant l'exécution de son script ? Voire même changer cette valeur à la volée ?
Tout ça sans devoir arrêter / modifier / relancer le script.
Si vous êtes dans ce cas, cet UDF est fait pour vous.
Utilisation :
-Appuyez sur la touche ² pour activer l'inspection.
-Entrez le nom d'une variable "$t1" pour l'exemple
-Cliquez sur la valeur à modifier
-Changez la valeur
-Fermer la fenêtre
PS : Vous pouvez aussi visualiser tout type de données (un Ubound par exemple) mais la modification ne s'effectuera pas.
► Afficher le texteUDF
Code : Tout sélectionner
#include-once
#include <Array.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $Inspect_Gui
Global $Inspect_Liste
Global $Inspect_Variable
Global $Inspect_Edit
Global $Inspect_Item = -1
Global $Inspect_SubItem = 0
Global $Inspect_Combo
Global $Inspect_Check
Global $Inspect_HotKey = ""
Global $Inspect_TailleDebutListe = 80
Func Inspect_SetHotKey($Key)
If($Inspect_HotKey = "") Then
HotKeySet($Inspect_HotKey)
EndIf
$Inspect_HotKey = $Key
HotKeySet($Inspect_HotKey, "Inspect_Inspect")
EndFunc
Func Inspect_InitGuiAff()
If(IsHWnd($Inspect_Gui)) Then Return False
Local $Taille[2] = [500, 400+$Inspect_TailleDebutListe]
$Inspect_Gui = GUICreate("Inspect", $Taille[0], $Taille[1])
GUISetOnEvent($GUI_EVENT_CLOSE, "Inspect_StopInspect", $Inspect_Gui)
GUICtrlCreateLabel("Item à inspecter :", 20, 15, $Taille[0]-40, 15, $SS_CENTER)
$Inspect_Combo = GUICtrlCreateCombo("", 20, 40, $Taille[0]-150, 20)
GUICtrlSetOnEvent($Inspect_Combo, "Inspect_ComboChange")
GUICtrlCreateButton("Ok", $Taille[0]-120, 39, 50, 23)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
GUICtrlSetOnEvent(-1, "Inspect_ValideInspect")
$Inspect_Check = GUICtrlCreateCheckbox("Auto Ok", $Taille[0]-65, 43, 60, 15)
$Inspect_Liste = _GUICtrlListView_Create($Inspect_Gui, "", 0, $Inspect_TailleDebutListe, $Taille[0], $Taille[1]-$Inspect_TailleDebutListe, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_AddColumn($Inspect_Liste, "Variable", 150)
_GUICtrlListView_AddColumn($Inspect_Liste, "Valeur", 240)
_GUICtrlListView_AddColumn($Inspect_Liste, "Type", 80)
_GUICtrlListView_SetExtendedListViewStyle($Inspect_Liste, $LVS_EX_GRIDLINES)
GUICtrlSetResizing($Inspect_Liste, $GUI_DOCKALL)
OnAutoItExitRegister("inspect_quit")
EndFunc
Func Inspect_RemplireListeVar()
If(Not(@Compiled)) Then
Local $Variables = Inspect_SourcesGetVariables(@ScriptFullPath)
GUICtrlSetData($Inspect_Combo, "")
GUICtrlSetData($Inspect_Combo, $Variables[1], 1)
For $i = 1 To $Variables[0]
GUICtrlSetData($Inspect_Combo, StringLeft($Variables[$i], 50))
Next
EndIf
EndFunc
Func Inspect_Inspect()
$Inspect_Variable = ""
GUISetState(@SW_SHOW, $Inspect_Gui)
EndFunc
Func Inspect_ComboChange()
If(BitAND(GUICtrlRead($Inspect_Check), $GUI_CHECKED)) Then
Inspect_ValideInspect()
EndIf
EndFunc
Func Inspect_ValideInspect()
Local $Execute
_GUICtrlListView_DeleteAllItems($Inspect_Liste)
$Inspect_Variable = GUICtrlRead($Inspect_Combo)
$Execute = Execute($Inspect_Variable)
Local $Inspect_Items[1]
Switch UBound($Execute, 0)
Case 0
$Inspect_Items[0] = _GUICtrlListView_AddItem($Inspect_Liste, $Inspect_Variable)
_GUICtrlListView_AddSubItem($Inspect_Liste, $Inspect_Items[0], $Execute, 1)
_GUICtrlListView_AddSubItem($Inspect_Liste, $Inspect_Items[0], VarGetType($Execute), 2)
Case 1
ReDim $Inspect_Items[UBound($Execute, 1)]
For $i = 0 To UBound($Execute, 1)-1
$Inspect_Items[$i] = _GUICtrlListView_AddItem($Inspect_Liste, $Inspect_Variable & "[" & $i & "]")
_GUICtrlListView_AddSubItem($Inspect_Liste, $Inspect_Items[$i], $Execute[$i], 1)
_GUICtrlListView_AddSubItem($Inspect_Liste, $Inspect_Items[$i], VarGetType($Execute[$i]), 2)
Next
Case 2
ReDim $Inspect_Items[UBound($Execute, 1)][UBound($Execute, 2)]
For $j = 0 To UBound($Execute, 1)-1
For $i = 0 To UBound($Execute, 2)-1
$Inspect_Items[$j][$i] = _GUICtrlListView_AddItem($Inspect_Liste, $Inspect_Variable & "[" & $j & "][" & $i & "]")
_GUICtrlListView_AddSubItem($Inspect_Liste, $Inspect_Items[$j][$i], $Execute[$j][$i], 1)
_GUICtrlListView_AddSubItem($Inspect_Liste, $Inspect_Items[$j][$i], VarGetType($Execute[$j][$i]), 2)
Next
Next
EndSwitch
GUIRegisterMsg($WM_NOTIFY, "INSPECT_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "INSPECT_WM_COMMAND")
GUISetState(@SW_SHOW, $Inspect_Gui)
EndFunc
Func INSPECT_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $tNMHDR, $hWndFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $Inspect_Liste
Switch $iCode
Case $NM_CLICK ; used for sub item edit
Local $aHit = _GUICtrlListView_SubItemHitTest($Inspect_Liste)
If ($aHit[0] <> -1) And ($aHit[1] > 0) Then
$Inspect_Item = $aHit[0]
$Inspect_SubItem = $aHit[1]
Local $iSubItemText = _GUICtrlListView_GetItemText($Inspect_Liste, $Inspect_Item, $Inspect_SubItem)
Local $iLen = 220
Local $aRect = _GUICtrlListView_GetSubItemRect($Inspect_Liste, $Inspect_Item, $Inspect_SubItem)
$Inspect_Edit = _GUICtrlEdit_Create($Inspect_Gui, $iSubItemText, $aRect[0] + 3, $aRect[1]+$Inspect_TailleDebutListe-2, $iLen, 17, BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT))
_GUICtrlEdit_SetSel($Inspect_Edit, 0, -1)
_WinAPI_SetFocus($Inspect_Edit)
HotKeySet("{ENTER}", "Inspect_FinEdit")
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func Inspect_FinEdit()
INSPECT_WM_COMMAND($Inspect_Gui, $WM_COMMAND, BitShift($EN_KILLFOCUS, -16), $Inspect_Edit)
EndFunc
Func INSPECT_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iCode = BitShift($wParam, 16)
Switch $lParam
Case $Inspect_Edit
Switch $iCode
Case $EN_KILLFOCUS
HotKeySet("{ENTER}")
Local $iText = _GUICtrlEdit_GetText($Inspect_Edit)
_GUICtrlListView_SetItemText($Inspect_Liste, $Inspect_Item, $iText, $Inspect_SubItem)
Local $Inspect_VariableTab = _GUICtrlListView_GetItemText($Inspect_Liste, $Inspect_Item)
Local $VarType = _GUICtrlListView_GetItemText($Inspect_Liste, $Inspect_Item, 2)
_WinAPI_DestroyWindow($Inspect_Edit)
$Inspect_Item = -1
$Inspect_SubItem = 0
Local $VarFormated = $iText
Switch $VarType
Case "Int32"
$VarFormated = Number($VarFormated)
Case "Bool"
If($VarFormated = "False") Then
$VarFormated = False
Else
$VarFormated = Not(Not($VarFormated))
EndIf
Case "Ptr"
$VarFormated = Ptr($VarFormated)
Case "Binary"
$VarFormated = StringToBinary(BinaryToString($VarFormated))
EndSwitch
Local $Assign = Execute($Inspect_Variable)
Local $Dim1
Local $Dim2
Switch UBound($Assign, 0)
Case 0
$Assign = $VarFormated
Case 1
$Dim1 = StringSplit($Inspect_VariableTab, "[", 3)
$Dim1 = $Dim1[1]
$Dim1 = StringSplit($Dim1, "]", 3)
$Dim1 = $Dim1[0]
$Assign[$Dim1] = $VarFormated
Case 2
$Dim1 = StringSplit($Inspect_VariableTab, "[", 3)
$Dim2 = $Dim1[2]
$Dim1 = $Dim1[1]
$Dim1 = StringSplit($Dim1, "]", 3)
$Dim1 = $Dim1[0]
$Dim2 = StringSplit($Dim2, "]", 3)
$Dim2 = $Dim2[0]
$Assign[$Dim1][$Dim2] = $VarFormated
EndSwitch
Assign(StringTrimLeft($Inspect_Variable, 1), $Assign)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func Inspect_StopInspect()
GUISetState(@SW_HIDE, $Inspect_Gui)
EndFunc
Func Inspect_SourcesGetVariables($FileName)
Local $Variables[1] = [0]
Local $RegExp = "\s(\$[\w]+)"
If(FileExists($FileName)) Then
$Variables = StringRegExp(FileRead($FileName), $RegExp, 3)
$Variables = _ArrayUnique($Variables)
_ArraySort($Variables, 0, 1)
EndIf
Return $Variables
EndFunc
Func inspect_quit()
_GUICtrlListView_Destroy($Inspect_Liste)
GUIDelete($Inspect_Gui)
EndFunc
► Afficher le texteExemple
Code : Tout sélectionner
#include "_Inspect.au3"
Inspect_SetHotKey("²")
Inspect_InitGuiAff()
Inspect_RemplireListeVar()
Global $test = 7
Global $t1[5]= [1, 2, 3, 4, 5]
Global $t2[5][2]= [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
While(True)
ToolTip($t1[3])
Sleep(10)
WEnd
Édit : Je viens de voir que je n'ai pas mis à jour le script depuis bien longtemps alors que celui-ci à changé (C'est chose faite maintenant !)
Le programme n'est plus mis en pause lors d'une visualisation de variable !