Jump to content
Sign in to follow this  
chrispbr

Switch Case Multiplo Botoes

Recommended Posts

Fala Pessoal. preciso da ajuda de vocês, tenho um form que tem inúmeras imagens, $pic1, $pic2, $pic3 ....(mais de 100) e quero que quando clicar nela ela abra, coloquei no Switch case, porem não teria uma maneira mais dinâmica do que repetir todas as variáveis?

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			GUISetState(@SW_HIDE,"Villain Range")
		Case $Pic1
			onOff()
		Case $Pic2
			onOff()
		Case $Pic3
			onOff()
		Case $Pic4
			onOff()
		Case $Pic5
			onOff()
		Case $Pic6
			onOff()
		Case $Pic7
			onOff()
		Case $Pic8
			onOff()
		Case $Pic9
			onOff()
		Case $Pic10
		

Share this post


Link to post
Share on other sites

Olá chrispbr.

 

Observe que as estruturas SWITCH...CASE ou IF...ELSEIF...ENDIF ou qualquer outra de múltiplas escolhas, são apenas formas diferentes de tratar o resultado de GUIGetMsg().

O que realmente importa é que o valor de $nMsg seja processado, portanto você tem a liberdade de fazer isso como melhor lhe convier.

 

Pelo exemplo que você postou, entendo o que quer fazer, mas fiquei em dúvida também:

Se todas as imagens ($Pic1, $Pic2, $Pic3...) fazem a mesma coisa (função onOff) porque não apenas chamar a função?

While 1
   $nMsg = GUIGetMsg()
   If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
   onOff()
   ...
Wend

Mesmo assim, chamar apenas uma função com objetivo semelhante é uma excelente idéia, porém no meu entendimento seria necessário enviar também um parâmetro para saber qual imagem ($Pic1, $Pic2...) que estamos ativando ou desativando. Nessa linha de pensamento, a quinta linha seria modificada para :

While 1
   $nMsg = GUIGetMsg()
   If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
   onOff($nMsg)
   ...
Wend

Dessa forma, a função onOff saberia qual imagem processar.

 

Mas finalmente o que eu acredito que seja mais apropriado é o fato de querer processar cada objeto (botão, listbox, checkbox, etc) de acordo, ou seja, dependendo do objeto que for clicado no Form chamar a função adequada ao objeto.

 

Como exemplo:

Func MINHA_FUNC()
   Local $Janela = GUICreate("Minha Janela", 615, 438, 192, 124)
   Local $Botao1 = GUICtrlCreateButton("Botão nto 1", 112, 112, 75, 25)
   Local $Botao2 = GUICtrlCreateButton("Botão nto 2", 392, 144, 75, 25)
   Local $Botao3 = GUICtrlCreateButton("Botão nto 3", 240, 272, 75, 25)
   Local $Objetos[3][2] = [ [ $Botao1, "BOTAO1()" ], _
                            [ $Botao2, "BOTAO2()" ], _
                            [ $Botao3, "BOTAO3()" ] ]
   GUISetState(@SW_SHOW)
   While True
      $nMsg = GUIGetMsg()
      If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
      For $Indice = 0 to UBound($Objetos)-1
         If $Objetos[$Indice][0] = $nMsg Then Execute($Objetos[$Indice][1])
      Next
   WEnd
   GUIDelete($Janela)
EndFunc   ;==>PRINCIPAL

Func BOTAO1()
   MsgBox(0, "Info", "Botão 1")
EndFunc

Func BOTAO2()
   MsgBox(0, "Info", "Botão 2")
EndFunc

Func BOTAO3()
   MsgBox(0, "Info", "Botão 3")
EndFunc

Adaptando a rotina, esta pode ser utilizada de várias formas, além da que mencionei acima...

Share this post


Link to post
Share on other sites

Olá chrispbr.

 

Observe que as estruturas SWITCH...CASE ou IF...ELSEIF...ENDIF ou qualquer outra de múltiplas escolhas, são apenas formas diferentes de tratar o resultado de GUIGetMsg().

O que realmente importa é que o valor de $nMsg seja processado, portanto você tem a liberdade de fazer isso como melhor lhe convier.

 

Pelo exemplo que você postou, entendo o que quer fazer, mas fiquei em dúvida também:

Se todas as imagens ($Pic1, $Pic2, $Pic3...) fazem a mesma coisa (função onOff) porque não apenas chamar a função?

While 1
   $nMsg = GUIGetMsg()
   If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
   onOff()
   ...
Wend

Mesmo assim, chamar apenas uma função com objetivo semelhante é uma excelente idéia, porém no meu entendimento seria necessário enviar também um parâmetro para saber qual imagem ($Pic1, $Pic2...) que estamos ativando ou desativando. Nessa linha de pensamento, a quinta linha seria modificada para :

While 1
   $nMsg = GUIGetMsg()
   If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
   onOff($nMsg)
   ...
Wend

Dessa forma, a função onOff saberia qual imagem processar.

 

Mas finalmente o que eu acredito que seja mais apropriado é o fato de querer processar cada objeto (botão, listbox, checkbox, etc) de acordo, ou seja, dependendo do objeto que for clicado no Form chamar a função adequada ao objeto.

 

Como exemplo:

Func MINHA_FUNC()
   Local $Janela = GUICreate("Minha Janela", 615, 438, 192, 124)
   Local $Botao1 = GUICtrlCreateButton("Botão nto 1", 112, 112, 75, 25)
   Local $Botao2 = GUICtrlCreateButton("Botão nto 2", 392, 144, 75, 25)
   Local $Botao3 = GUICtrlCreateButton("Botão nto 3", 240, 272, 75, 25)
   Local $Objetos[3][2] = [ [ $Botao1, "BOTAO1()" ], _
                            [ $Botao2, "BOTAO2()" ], _
                            [ $Botao3, "BOTAO3()" ] ]
   GUISetState(@SW_SHOW)
   While True
      $nMsg = GUIGetMsg()
      If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
      For $Indice = 0 to UBound($Objetos)-1
         If $Objetos[$Indice][0] = $nMsg Then Execute($Objetos[$Indice][1])
      Next
   WEnd
   GUIDelete($Janela)
EndFunc   ;==>PRINCIPAL

Func BOTAO1()
   MsgBox(0, "Info", "Botão 1")
EndFunc

Func BOTAO2()
   MsgBox(0, "Info", "Botão 2")
EndFunc

Func BOTAO3()
   MsgBox(0, "Info", "Botão 3")
EndFunc

Adaptando a rotina, esta pode ser utilizada de várias formas, além da que mencionei acima...

Primeiro obrigado por sua atenção, consegui adaptar e resolver meio problema, mais uma vez agradeço e lhe desejo sucesso em seus projetos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×