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 pasNext...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_RUNDEFMSGEndFunc ;==>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))NextFunc 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_RUNDEFMSGEndFunc ;==>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
#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 ExitLoopWEnd
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 !
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)
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
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é
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
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.