Manhunt Posted July 28, 2012 at 08:02 PM Report Share #470806 Posted July 28, 2012 at 08:02 PM (edited) 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 July 29, 2012 at 04:27 PM by ribeiro55 Link to comment Share on other sites More sharing options...
thoga31 Posted July 28, 2012 at 08:17 PM Report Share #470808 Posted July 28, 2012 at 08:17 PM (edited) 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 July 28, 2012 at 08:18 PM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
Manhunt Posted July 28, 2012 at 09:17 PM Author Report Share #470814 Posted July 28, 2012 at 09:17 PM (edited) 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 July 29, 2012 at 04:27 PM by ribeiro55 Link to comment Share on other sites More sharing options...
renafi Posted July 28, 2012 at 09:44 PM Report Share #470819 Posted July 28, 2012 at 09:44 PM Qual é o erro? Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist Link to comment Share on other sites More sharing options...
Manhunt Posted July 28, 2012 at 09:48 PM Author Report Share #470821 Posted July 28, 2012 at 09:48 PM Vou postar o erro para verem: Link to comment Share on other sites More sharing options...
thoga31 Posted July 28, 2012 at 09:50 PM Report Share #470822 Posted July 28, 2012 at 09:50 PM 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 More sharing options...
Manhunt Posted July 28, 2012 at 10:23 PM Author Report Share #470826 Posted July 28, 2012 at 10:23 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now