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

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
jpascal
Niveau 5
Niveau 5
Messages : 134
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#1

Message 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.
Modifié en dernier par jpascal le jeu. 02 avr. 2020 17:58, modifié 2 fois.
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

jpascal
Niveau 5
Niveau 5
Messages : 134
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#2

Message 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
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

jpascal
Niveau 5
Niveau 5
Messages : 134
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#3

Message 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
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5973
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

Message 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
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

jpascal
Niveau 5
Niveau 5
Messages : 134
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#5

Message 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
AutoIt 3.3.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11545
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#6

Message 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:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5973
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#7

Message 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:
" 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
Tlem
Site Admin
Site Admin
Messages : 11545
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#8

Message par Tlem »

Quel genre de résultat curieux ?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5973
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#9

Message 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
" 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
Tlem
Site Admin
Site Admin
Messages : 11545
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#10

Message 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. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5973
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#11

Message 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
" 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
Tlem
Site Admin
Site Admin
Messages : 11545
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#12

Message par Tlem »

Ha oui effectivement. Bon c'est pas grave, il vaut mieux ça qu'un vrai bogue. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Répondre