Jump to content

Duvida numa MsgBox quando oculto botões


Manhunt

Recommended Posts

Boa noite malta!

Eu venho aqui porque estou com uma duvida sobre como construir código, para um pequeno jogo que estou a construir para um trabalho para as aulas.

Eu tenho um jogo com 16 botões e ao clicar num botão, este esconde botões que estão na mesma linha horizontal e vertical, coisa que já consegui fazer. O meu problema, é que eu agora gostaria deter uma rotina que me permita exibir uma Message Box, caso consiga esconder todos os botões.

Alguém me consegue dar uma dica?

Ainda tentei construir isto, mas depois não consigo encaixar isto com os botões, pois sempre que clico num botão, aparece-me esta mensagem "montes de vezes", quando na realidade deveria só visualizar a mensagem depois dos 16 botões estarem escondidos. 😛

Sub vitoria()
 Dim botoes As String
 botoes = Btn11.Visible
 botoes = Btn12.Visible
 botoes = Btn13.Visible
 botoes = Btn14.Visible
 botoes = Btn21.Visible
 botoes = Btn22.Visible
 botoes = Btn23.Visible
 botoes = Btn24.Visible
 botoes = Btn31.Visible
 botoes = Btn32.Visible
 botoes = Btn33.Visible
 botoes = Btn34.Visible
 botoes = Btn41.Visible
 botoes = Btn42.Visible
 botoes = Btn43.Visible
 botoes = Btn44.Visible

 If botoes = False Then
	 MsgBox("Parabéns, acabou de ganhar o jogo e demonstrar que possui um bom calculo lógico! Experimente repetir o feito!", vbOKOnly, "Vitória!")
 End If
End Sub

Muito obrigado!

Edited by ribeiro55
Link to comment
Share on other sites

Já reparaste que estás a atribuir a botoes valores diferentes vezes sem conta? O único valor que vais ter no final é o de Btn44.Visible!

Em botoes = Btn11.Visible atribuis um valor booleano, mas logo a seguir em botoes = Btn12.Visible colocas botoes com o novo valor, e o anterior "desaparece".

O que tu queres é que TODOS os botões estejam escondidos.

botoes = Btn11.Visible OrElse Btn12.Visible OrElse ...
If Not botoes Then MsgBox("Parabéns")

Atribuição != Operação lógica.

Cumprimentos.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Sim, eu sei que não está bem feito, mas tenho andado às "marradas" com o código, pois não estava a conseguir acertar.

Eu peço desculpa, ainda sou um pouco amador nisto, embora até esteja com vontade de aprender mais, mas ainda é tudo novidade para mim.

Importaste-te de me explicar de outra maneira?

Fica tipo isto:

Sub vitoria()
 Dim botoes As String
 botoes = Btn11.Visible OrElse Btn12.Visible OrElse Btn13.Visible OrElse Btn14.Visible OrElse Btn21.Visible OrElse Btn22.Visible OrElse Btn23.Visible OrElse Btn24.Visible OrElse Btn31.Visible OrElse Btn32.Visible OrElse Btn33.Visible OrElse Btn34.Visible OrElse Btn41.Visible OrElse Btn42.Visible OrElse Btn43.Visible OrElse Btn44.Visible
 If Not botoes Then MsgBox("Parabéns")
End Sub

Esse código dá-me erro...

O que estou a fazer mal?

Edited by ribeiro55
Link to comment
Share on other sites

Declaraste uma variável botoes. Agora queres que ela te diga se tens todos os botões ocultos ou não. Quando fazes algo como botoes = Btn11.Visible, estás a atribuir a botoes o valor da propriedade Visible do Button Btn11. Contudo, logo de seguida, fazes botoes = Btn12.Visible. Ou seja, a botoes atribuis um valor diferente e o primeiro valor que estava lá foi "perdido".

Exemplo. O que estavas a fazer com o teu primeiro código era análogo a tentar somar valores inteiros desta forma:

soma = 2
soma = 5
soma = 3
MsgBox("A soma é " & soma.ToString)

Vais obter sempre a mensagem A soma é 3 e não 10. Para somar tens de fazer soma = 2 + 5 + 3.

Da mesma forma, tens de fazer algo deste género com o teu actual problema. A diferença é que não tens números, tens valores booleanos, ou seja, True e False. Porquê? A propriedade Visible de um Button é do tipo Boolean. Consequências deste facto:

  • Tens de utilizar operadores booleanos: And, Or ou Xor. Em vez dos dois primeiros, eu prefiro sempre utilizar AndAlso e OrElse que, apesar de terem o mesmo efeito, são mais eficientes.
  • Tens de atribuir o seu valor numa variável do tipo Boolean.

Vejamos o teu código:

Dim botoes As String
botoes = Btn11.Visible

Primeiro erro grave: estás a atribuir a uma String um valor booleano! botoes deve ser do mesmo tipo de dados da propriedade Visible:

Dim botoes As Boolean

De seguida, resolvendo o problema de quereres que botoes indique se todos os botões estão ocultos, qual o operador booleano a utilizar? Visto que Or só é False se TODAS as condições forem False (bastará que um seja True para que o resultado final seja True), então este é o operador indicado para o que pretendes - caso um botão esteja ainda visível, este operador indica-o de imediato, mesmo que todos os restantes estejam ocultos:

botoes = Btn11.Visible OrElse Btn12.Visible...

Por fim, a seguinte condição:

If Not botoes Then

Tendo tu botoes do tipo String, a condição não funcionará, pois uma String não pode ser convertida implicitamente num Boolean. A mudança do tipo de dados de botoes, debatida atrás, resolve logo o problema.

Dica final: não necessitas de fazer o seguinte:

If botoes = False Then

É uma redundância: If recebe o resultado de uma condição, ou seja, um Boolean, logo, sendo botoes do tipo Boolean, bastará colocá-la de forma directa para a condição funcionar:

If botoes Then      ' Executa se "botoes" for "True"
If Not botoes Then  ' Executa se "botoes" for "False" ("Not True" é "False")

Knowledge is free!

Link to comment
Share on other sites

Epá porreiro!

Claro que sim, só agora é que estou a entender o funcionamento da coisa. 😛

É claro que me dava erro pois o meu pensamento estava a partir mal desde o inicio, logo, o final nunca poderia ser nada daquilo que eu pretendia fazer, isto porque a estrutura inicial estava mal construida, às vezes também sou tão "tapadinho". 😄

Tens razão, isso tem mais do que lógica!

Por isso é que eu estruturava o código sempre de maneira diferente e o erro era sempre o mesmo. 😛

Muito obrigado pela explicação e pela dica! 👍

Dois conhecimentos que já apontei aqui nos meus apontamentos e que serão sem duvida uteis. 🙂

Link to comment
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
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.