Page 1 sur 1

[R] Connaître le numéro d'onglet ouvert

Posté : jeu. 02 avr. 2020 15:29
par jpascal
Bonjour,

Je vais pour la première fois utiliser ce type de contrôle.

J'ai réussi à créer plusieurs onglets contenant chacun des listview.
Pour effectuer des traitement sur ces listview, j'aurais besoin de connaître le numéro d'onglet dans le quel je me trouve.

Je suis en GUIOnEventMode = 1

J'ai pensé utiliser un WM_NOTIFY comme j'ai l'habitude de le faire pour des Listview mais cela ne fonctionne pas.

1. Si je me contente d'utiliser des ID, voir dans mon second message les retours.

2. Si j'utilise des handles et donc les fonctions _GuiCtrlTab(), j'ai un retour mais les listview ne semblent plus attachées aux onglets.
J'imagine que cela est dû au fait que j'utilise GUICtrlCreateListView() alors que je devrais utiliser _GUICtrlListView_Create()
J'ai par le passé codé en utilisant les handles mais je trouve que cela complexifie le code (on m'avait d'ailleurs recommandé de préférer les fonctions native d'AutoIt).


Note : je sais déjà que l'on me répondra qu'avec du code ce serait plus simple de répondre à ma question mais mon projet étant déjà avancé, il m'est difficile de le poster.
J'espère une réponse théorique, à moi ensuite d'essayer de la mettre en place.

Merci d'avance pour votre attention.

Re: [..] Connaître le numéro d'onglet ouvert

Posté : jeu. 02 avr. 2020 15:35
par jpascal
J'ai tenté ça, bien sûr ça ne fonctionne pas.

$g_idTab = GUICtrlCreateTab(..)
...
For $iTab = 0 to 3
_ArrayAdd($g_aTab, GUICtrlCreateTabItem('onglet ' & $iTab)
; GUISetOnEvent(-1, 'TabClicked') ; Ne fonctionne pas
Next
...
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg, $wParam
   Local $iIDFrom, $iCode, $tNMHDR

   $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
;~     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
   $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
   $iCode = DllStructGetData($tNMHDR, "Code")
   Switch $iIDFrom
      Case $g_idTab
         ConsoleWrite($iCode & @CRLF)
         Switch $iCode
            Case $NM_CLICK ; The user has clicked the left mouse button within the control
               ConsoleWrite(@GUI_CtrlId & @CRLF)
               ; The return value is ignored by the tab control
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Re: [..] Connaître le numéro d'onglet ouvert

Posté : jeu. 02 avr. 2020 16:16
par jpascal
Voici la solution que j'ai trouvée. Y a-t-il plus simple ?

Global $g_aTab[0]

For $iTab = 0 To 1
   _ArrayAdd($g_aTab, GUICtrlCreateTabItem('onglet ' & $iTab))
Next

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg, $wParam
   Local $iIDFrom, $iCode, $tNMHDR

   $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
;~     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
   $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
   $iCode = DllStructGetData($tNMHDR, "Code")
   Switch $iIDFrom
      Case $g_idTab
         Switch $iCode
            Case $NM_CLICK ; The user has clicked the left mouse button within the control
               For $i = 0 To UBound($g_aTab)-1
                  If _GUICtrlTab_GetItemState($g_idTab, $i) Then ConsoleWrite('onglet ' & $i & @CRLF)
               Next
               ; The return value is ignored by the tab control
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Re: [..] Connaître le numéro d'onglet ouvert

Posté : jeu. 02 avr. 2020 17:45
par mikell
jpascal a écrit : jeu. 02 avr. 2020 16:16 Y a-t-il plus simple ?
Oh oui :mrgreen:

#include <GUIConstantsEx.au3>

$gui = GUICreate("My GUI Tab", 250, 200) ; will create a dialog box that when displayed is centered
$tab = GUICtrlCreateTab(10, 10, 200, 100)
GUICtrlCreateTabItem("tab0")
GUICtrlCreateTabItem("tab----1")
GUICtrlCreateTabItem("tab2")
GUICtrlCreateTabItem("")
$button = GUICtrlCreateButton("button", 20, 130, 50, 20)
GUISetState()

While 1
     $idMsg = GUIGetMsg()
     If $idMsg = $button Then _
         Msgbox(0,"", ControlCommand($gui, "", $tab, "CurrentTab", "")-1 )
     If $idMsg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
 

Re: [..] Connaître le numéro d'onglet ouvert

Posté : jeu. 02 avr. 2020 17:58
par jpascal
Mouhaha !

Le pire c'est que j'utilise cette fonction lorsque je récupère des infos de programmes externes.
Mais je n'ai même pas pensé à m'en servir pour ma GUI.

You are the best ! :-D

Re: [R] Connaître le numéro d'onglet ouvert

Posté : jeu. 02 avr. 2020 22:07
par Tlem
Bonsoir.
Puisque de toute façon l'include GuiTab.au3 est utilisé, perso, j'aurais préféré _GUICtrlTab_GetCurFocus($tab) car cela est plus explicite.
Qui si on le décortique le code de la fonction, cela correspond à GUICtrlSendMsg($tab, 0x132F, 0, 0)

:bisou:

Re: [R] Connaître le numéro d'onglet ouvert

Posté : ven. 03 avr. 2020 11:17
par mikell
Oui, il y a aussi _GUICtrlTab_GetCurSel ...
Mais
1) utiliser l'une ou l'autre dans la msgbox de mon script précédent donne un résultat curieux
2) j'aime bien les fonctions Control* . Elles sont très propres et efficaces, intégrées (pas d'include) et AMHA scandaleusement sous-utilisées :mrgreen:

Re: [R] Connaître le numéro d'onglet ouvert

Posté : ven. 03 avr. 2020 11:26
par Tlem
Quel genre de résultat curieux ?

Re: [R] Connaître le numéro d'onglet ouvert

Posté : ven. 03 avr. 2020 14:07
par mikell
Dans le script que j'ai posté, dès l'ouverture de la gui la msgbox sort de suite (et de manière continue) sans que je clique sur le bouton.
ça se produit quand je mets dans la msgbox une des 2 fonctions _GUICtrlTab_* mais pas quand j'y mets le ControlCommand

Re: [R] Connaître le numéro d'onglet ouvert

Posté : sam. 04 avr. 2020 14:27
par Tlem
D'autant plus étrange que chez moi cela ne le fait pas !!!
Et puis je ne vois pas comment cela pourrait ce produire, puisque la msgbox n'est exécutée que si $idMsg = $button

Un code qui permettrait de reproduire ce "dysfonctionnement" serait intéressent à consulter. ^^

Re: [R] Connaître le numéro d'onglet ouvert

Posté : sam. 04 avr. 2020 14:53
par mikell
J'ai trouvé :mrgreen:
La typo crétine qu'on s'obstine à oublier de remarquer... allez, on va dire que c'est la faute du confinement cérébro-émollient ^^
N'empêche, fallait le faire :oops:

While 1
     $idMsg = GUIGetMsg()
     If $idMsg = $button Then _  
           Msgbox(0,"1", ControlCommand($gui, "", $tab, "CurrentTab", "")-1 )
           Msgbox(0,"3", _GUICtrlTab_GetCurSel($tab))
     If $idMsg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd

Re: [R] Connaître le numéro d'onglet ouvert

Posté : sam. 04 avr. 2020 15:50
par Tlem
Ha oui effectivement. Bon c'est pas grave, il vaut mieux ça qu'un vrai bogue. ;)