Page 1 sur 1

[..] Valider/invalider Item possible ?  

Posté : ven. 26 mars 2021 10:58
par Yle
Bonjour

Est-il possible de valider ou invalider des onglets créés par Guictrlcreatetabitem ?
J'ai 3 onglets (Page0,1,et 2)
Quand je réponds 1 au mot de passe sur la Page0, je vais sur Page1 (ceci fonctionne)
Ensuite je rentre 1 mais là je ne peux plus aller sur Page0...

Voici mon code

Code : Tout sélectionner

#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$GUI = GUICreate("Example", 400, 400, -1, -1, -1, $WS_EX_ACCEPTFILES)

$page = guictrlcreatetab(5,5,390, 390)

$page0 = guictrlcreatetabitem("Choix 0")
$menu0 = guictrlcreatelabel("", 10, 10)  	; la page infos de la page 0
$MotDePasse = guictrlcreatebutton("Mot de Passe", 50 , 50, 105, 20)
guictrlsetfont(-1, 8.5, 500, 0, "verdana")

$page1 = guictrlcreatetabitem("Choix 1")
$menu1 = guictrlcreatelabel("", 10, 10)  	; la page infos de la page 1
$ok1 = guictrlcreatebutton("OK 1", 100, 100, 40, 20)

$page2 = guictrlcreatetabitem("Choix 2")
$menu2 = guictrlcreatelabel("", 10, 10)  	; la page infos de la page 2
$ok2 = guictrlcreatebutton("OK 2", 150, 150, 40, 20)


guictrlcreatetabitem("") 		; item de fin
guictrlsetstate($page,$gui_disable) ; blocage des item
guictrlsetstate($page0, $gui_enable); on montre Page 0

guisetstate(@sw_show)

while 1
	$msg = guigetmsg()
	switch $msg
		case $gui_event_close
			Exit

		case $ok1
			$rep1 = InputBox("Contrôle 1", "Entrez 1", "1")
			guictrlsetstate($page0,$gui_enable); on montre Page 0

		case $ok2
			$rep2 = InputBox("Contrôle 2", "Entrez 2", "2")
			guictrlsetstate($page0,$gui_enable); on montre Page 0

		case $MotDePasse
			$rep = InputBox("Contrôle du Mot de Passe", "Entrez 1 ou 2", "1")

			if $Rep = 1 then
				GUICtrlSetState($Page0,$gui_enable)
				GUICtrlSetState($Page1,$gui_enable+$gui_show)
				GUICtrlSetState($Page2,$gui_disable)
			EndIf
			if $Rep = 2 then
				GUICtrlSetState($Page0,$gui_enable)
				GUICtrlSetState($Page2,$gui_enable+$gui_show)
				GUICtrlSetState($Page1,$gui_disable)
			EndIf

		case $page
			if guictrlread($page) = 0 then					; page accueil
				guictrlsetstate($menu0,$gui_show)
			endif

			if guictrlread($page) = 1 then					; page bourse
 				guictrlsetstate($menu1,$gui_show)

			endif

			if guictrlread($page) = 2 then					; page libre
 				guictrlsetstate($menu2,$gui_show)
			EndIf
	EndSwitch
WEnd

Re: [..] Valider/invalider Item possible ?

Posté : ven. 26 mars 2021 13:46
par TommyDDR
Pouvez-vous détailler "Je ne peux plus aller sur la page 0" ?
Vous cliquez sur l'onglet "Choix 0" ?

Vous effectuez guictrlsetstate($page,$gui_disable) ; blocage des item
ce qui vous empêchera de cliquer sur vos onglets, malheureusement, vous ne pouvez pas bloquer un seul onglet (pas avec un GUICtrlSetState en tout cas)

Re: [..] Valider/invalider Item possible ?

Posté : ven. 26 mars 2021 14:17
par Yle
Bonjour

Oui au départ, je verrouille tous les onglets et je déverrouille Page0
Ensuite qd on clique sur 1, je veux que Page2 soit verrouillé mais que Page0 et 1 soient accessibles.

Mais si on ne peut pas faire comme ça, je vais mettre un mot de passe à entrer sur chaque Item afin de pouvoir y accéder.

Merci qd même

Re: [..] Valider/invalider Item possible ?

Posté : ven. 26 mars 2021 14:38
par TommyDDR
En fait, quand vous verrouillez $page, vous verrouillez tous les onglets au clic (essayer de ne verrouiller que page2, vous comprendrez).

Voilà une façon pour y arriver (c'est juste pour vous montrer, ce n'est pas propre du tout) :
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>

Global $tabDisabled[0]

$GUI = GUICreate("Example", 400, 400, -1, -1, -1, $WS_EX_ACCEPTFILES)

$page = guictrlcreatetab(5,5,390, 390)

$page0 = guictrlcreatetabitem("Choix 0")
$menu0 = guictrlcreatelabel("", 10, 10)   ; la page infos de la page 0
$MotDePasse = guictrlcreatebutton("Mot de Passe", 50 , 50, 105, 20)
guictrlsetfont(-1, 8.5, 500, 0, "verdana")

$page1 = guictrlcreatetabitem("Choix 1")
$menu1 = guictrlcreatelabel("", 10, 10)   ; la page infos de la page 1
$ok1 = guictrlcreatebutton("OK 1", 100, 100, 40, 20)

$page2 = guictrlcreatetabitem("Choix 2")
$menu2 = guictrlcreatelabel("", 10, 10)   ; la page infos de la page 2
$ok2 = guictrlcreatebutton("OK 2", 150, 150, 40, 20)

guictrlcreatetabitem("")      ; item de fin

disableTab(1)
disableTab(2)

guisetstate(@sw_show)

GUIRegisterMsg($WM_NOTIFY, disableTabs)

while 1
   $msg = guigetmsg()
   switch $msg
      case $gui_event_close
         Exit

      case $ok1
         $rep1 = InputBox("Contrôle 1", "Entrez 1", "1")

      case $ok2
         $rep2 = InputBox("Contrôle 2", "Entrez 2", "2")

      case $MotDePasse
         $rep = InputBox("Contrôle du Mot de Passe", "Entrez 1 ou 2", "1")

         if $Rep = 1 then
            enableTab(0)
            enableTab(1)
            disableTab(2)
            GUICtrlSetState($Page1,$GUI_SHOW)
         EndIf
         if $Rep = 2 then
            enableTab(0)
            disableTab(1)
            enableTab(2)
            GUICtrlSetState($Page2,$GUI_SHOW)
         EndIf

      case $page
         if guictrlread($page) = 0 then               ; page accueil
            guictrlsetstate($menu0,$GUI_SHOW)
         endif

         if guictrlread($page) = 1 then               ; page bourse
            guictrlsetstate($menu1,$GUI_SHOW)

         endif

         if guictrlread($page) = 2 then               ; page libre
            guictrlsetstate($menu2,$GUI_SHOW)
         EndIf
   EndSwitch
WEnd

Func enableTab($tabNumber)
   disableTab($tabNumber, False)
EndFunc

Func disableTab($tabNumber, $disable = True)
   Local $find = _ArrayFindAll($tabDisabled, $tabNumber)
   If($disable) Then
      If($find == -1) Then
         _ArrayAdd($tabDisabled, $tabNumber)
      EndIf
   Else
      If(UBound($find) > 0) Then
         _ArrayDelete($tabDisabled, $find[0])
      EndIf
   EndIf
EndFunc


Func disableTabs($hwnd, $msg, $wparam, $lparam)
   Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
   Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
   Local $iCode = DllStructGetData($tNMHDR, "Code")

   If($hWndFrom == GUICtrlGetHandle($page) And $iCode == -552) Then
      Local $tabPos = WinGetPos($hWndFrom)
      Local $mpos = MouseGetPos()
      Local $pageNum = _GUICtrlTab_HitTest(GUICtrlGetHandle($page), $mpos[0]-$tabPos[0], $mpos[1]-$tabPos[1])
      Local $find = _ArrayFindAll($tabDisabled, $pageNum[0])
      If(UBound($find) > 0) Then
         Return True
      EndIf
   EndIf
   Return $GUI_RUNDEFMSG
EndFunc
L'un des soucis de ce code, c'est qu'on ne peut pas récupérer l'index d'un GUICtrlCreateTabItem, donc on ne peux pas se servir de $page0 $page1 $page2, mais il faut utiliser les index 0 1 et 2 directement (si quelqu'un sait faire, je serais curieux de savoir comment)

Re: [..] Valider/invalider Item possible ?

Posté : mar. 06 avr. 2021 09:12
par Yle
Bonjour,

Effectivement sacrée usine à gaz.
Je vais plutôt bloquer cet item en mettant un mot de passe dès qu'on clique dessus.
Cela empêchera certaines personnes de voir ce qu'il y a derrière cet item.

Encore merci et bon e journée. Je clos.

Re: [..] Valider/invalider Item possible ?

Posté : mar. 06 avr. 2021 11:47
par Tlem
Bonjour.
Éventuellement, voici une solution alternative mais avec quelques contraintes (tout dépend des besoins).

Code : Tout sélectionner

#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>

Global $tabDisabled[0]
Global $ok1 = 4096, $ok2 = 4096

$GUI = GUICreate("Example", 400, 400, -1, -1, -1, $WS_EX_ACCEPTFILES)

$page = guictrlcreatetab(5,5,390, 390)

$page0 = guictrlcreatetabitem("Choix 0")
$menu0 = guictrlcreatelabel("", 10, 10)   ; la page infos de la page 0
$MotDePasse = guictrlcreatebutton("Mot de Passe", 50 , 50, 105, 20)
guictrlsetfont(-1, 8.5, 500, 0, "verdana")

guictrlcreatetabitem("")      ; item de fin

guisetstate(@sw_show)


while 1
   $msg = guigetmsg()
   Select

		Case $msg = $gui_event_close
			Exit


		Case  $msg = $MotDePasse
			$rep = InputBox("Contrôle du Mot de Passe", "Entrez 1 ou 2", "1")
			If $rep = 1 Or $rep = 2 Then
				$page1 = guictrlcreatetabitem("Choix 1")     ; Ajout du TabItem 2
				$menu1 = guictrlcreatelabel("", 10, 10)   ; la page infos de la page 1
				$ok1 = guictrlcreatebutton("OK 1", 100, 100, 40, 20)
				GUICtrlCreateTabItem("")     ; Ne pas oublier cette ligne.
				GUICtrlSetState($MotDePasse, $GUI_DISABLE) ; Désactive le bouton mot de passe pour éviter de recréer le TabItem
			EndIf

		Case $msg = $ok1
			$rep1 = InputBox("Contrôle 1", "Entrez 1", "1")
			If $rep1 = 1 Or $rep = 2 Then
				$page2 = guictrlcreatetabitem("Choix 2")     ; Ajout du TabItem 3
				$menu2 = guictrlcreatelabel("", 10, 10)   ; la page infos de la page 2
				$ok2 = guictrlcreatebutton("OK 2", 150, 150, 40, 20)
				GUICtrlCreateTabItem("")     ; Ne pas oublier cette ligne.
				GUICtrlSetState($ok1, $GUI_DISABLE) ; Désactive le bouton "OK 1" pour éviter de recréer le TabItem
			EndIf

		Case $msg = $ok2
         $rep2 = InputBox("Contrôle 2", "Entrez 2", "2")

   EndSelect
WEnd