[..] Valider/invalider Item possible ?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 145
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

[..] Valider/invalider Item possible ?  

#1

Message 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
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1960
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

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

#2

Message 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)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 145
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

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

#3

Message 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
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1960
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

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

#4

Message 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)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 145
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

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

#5

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

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

#6

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