Jump to content
PauloFMarques

Ajuda em If's

Recommended Posts

PauloFMarques

Boa tarde, recorro mais uma vez à vossa ajuda.

Necessitava de saber qual a melhor forma de criar ciclos em que existem muitas condições.

Ou seja, Eu tenho 8 checkbox's, e tenho de comprar se estão ou não "checked". e tenho de fazer isso para todas elas.

Ou seja, tenho:

Checkbox1

Checkbox2

Checkbox3

Checkbox4

Checkbox5

Checkbox6

Checkbox7

Checkbox8

E tenho de ver se :

if Checkbox1.checked =true and Checkbox2.checked =true and Checkbox3.checked =true and Checkbox4.checked =true and Checkbox5.checked =true and Checkbox6.checked =true and checkbox7.checked =true and checkbox8.checked =true then

O problema é que além de ter de fazer como está em cima tenho de verificar entre elas. por exemplo:

if Checkbox1.checked =true and Checkbox2.checked =true and Checkbox3.checked =true and Checkbox4.checked =true and Checkbox5.checked =true and Checkbox6.checked =true and checkbox7.checked =false and checkbox8.checked =false then

e por ai fora, ou seja tive a fazer uma estimativa e são cerca de 200 ou mais condições, exite alguma forma mais rápida de o fazer? ou tenho de fazer tudo à "unha"??

PS: O problema não é fazer à unha, é mesmo o tempo, pois necessito de acabar isso o mais rapido possivel.

Desde já,

Obrigado pela vossa ajuda.

Paulo Marques


--Sometimes, we do what we want, but we don't want what we have done--

Share this post


Link to post
Share on other sites
Caça

E não podes fazer um a um? Tem de ser todos em conjunto?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PauloFMarques

Sim, tem de ser todos em conjunto pois o output depende de quais estão marcado ou não.


--Sometimes, we do what we want, but we don't want what we have done--

Share this post


Link to post
Share on other sites
FreiNando

Ou seja, Eu tenho 8 checkbox's, e tenho de comprar se estão ou não "checked". e tenho de fazer isso para todas elas.

... , ou seja tive a fazer uma estimativa e são cerca de 200 ou mais condições, exite alguma forma mais rápida de o fazer? ou tenho de fazer tudo à "unha"??

Podes 'transformar' o valor das 8 checkboxes num numero em que cada uma uma corresponde a um bit, e depois fazes um Select Case a esse valor.

Dá para obter 256 valores diferentes.

        Dim N As Integer = (CheckBox1.Checked) + 2 * (CheckBox2.Checked) _
                + 4 * (CheckBox3.Checked) + 8 * (CheckBox4.Checked) _
                + 16 * (CheckBox5.Checked) + 32 * (CheckBox6.Checked) _
                + 64 * (CheckBox7.Checked) + 128 * (CheckBox8.Checked)

        Select Case -N 'em Vb True=-1
            Case 0:'Instruções
            Case 1:'Instruções
                '....
            Case 255:'Instruções
        End Select


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
RuiMachado

deduzindo que as checkbox estao na form1.....


For Each obj As Object In Me.Controls

            If TypeOf obj Is CheckBox Then

                If obj.checked = True Then

                    MessageBox.Show(obj.text)

                End If

            End If

Next

Share this post


Link to post
Share on other sites
PauloFMarques

Podes 'transformar' o valor das 8 checkboxes num numero em que cada uma uma corresponde a um bit, e depois fazes um Select Case a esse valor.

Dá para obter 256 valores diferentes.

        Dim N As Integer = (CheckBox1.Checked) + 2 * (CheckBox2.Checked) _
                + 4 * (CheckBox3.Checked) + 8 * (CheckBox4.Checked) _
                + 16 * (CheckBox5.Checked) + 32 * (CheckBox6.Checked) _
                + 64 * (CheckBox7.Checked) + 128 * (CheckBox8.Checked)

        Select Case -N 'em Vb True=-1
            Case 0:'Instruções
            Case 1:'Instruções
                '....
            Case 255:'Instruções
        End Select

Não entendi bem como executar esta alternativa, o que é que isso vai fazer exactamente??

*************************************************************************************

deduzindo que as checkbox estao na form1.....


For Each obj As Object In Me.Controls

            If TypeOf obj Is CheckBox Then

                If obj.checked = True Then

                    MessageBox.Show(obj.text)

                End If

            End If

Next

Não estão no form1, e isso apenas me e mostra o conteúdo da checkbox, a ideia não é essa, o problema é ter de conjugar as 8 checkbox's entre elas, pois se a 1 estiver marcada ele realiza uma acção, se estiver a 2 e a 3 marcadas, ele realiza outra.

O objectivo é criar um relatório, mas estou a fazer o relatório manualmente, ou seja com printpreviewcontrol, printdocument's e "e.graphics.drastring"

Logo as checbox vão dar os dados a serem impressoras, por exemplo a 1 representa a tabela computadores, se ela estiver "checkada" ele vai buscar os dados dessa tabela, se estiver a 1(computadores) e a 2 (monitores) ele tem de mostrar os dados da 1ª tabela até acabar, quando encontrar o ultimo dado da 1ª tabela faz um separador e começa a mostrar os dados da segunda.

De momento ele já mostra os dados de cada uma se eu as seleccionar individualmente, mas a parte "pior" é os if's para juntar todas as condições, e o separador, são os únicos que ainda não sei como vou fazer.

Obrigado pela ajuda.


--Sometimes, we do what we want, but we don't want what we have done--

Share this post


Link to post
Share on other sites
ribeiro55

Pegando um pouco naquilo que o FreiNando te quis passar, dá uma vista de olhos no artigo http://wiki.portugal-a-programar.org/dev_net:vb.net:bitmasks

Se atribuíres um código a todas as condições e utilizares operações bitwise para o calcular, podes fazer depois o que pretendes apenas com um Select Case, como já te foi mostrado.

Entende código como uma combinação de estados de checkbox, por exemplo

Se CheckBox1 = 1, CheckBox2 = 2 e CheckBox3 = 4:

AMARELO = CheckBox1=True; CheckBox2=True; CheckBox3=False  (3)

VERMELHO = CheckBox1=True; CheckBox2=False; CheckBox3=False (1)

AZUL_BANANA = CheckBox1=False; CheckBox2=True; CheckBox3=False (2)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
FreiNando

Logo as checbox vão dar os dados a serem impressoras, por exemplo a 1 representa a tabela computadores, se ela estiver "checkada" ele vai buscar os dados dessa tabela, se estiver a 1(computadores) e a 2 (monitores) ele tem de mostrar os dados da 1ª tabela até acabar, quando encontrar o ultimo dado da 1ª tabela faz um separador e começa a mostrar os dados da segunda.

Então o teu problema é os separadores!?

E para que precisas de 200 condições?

Se cada checkbox corresponde a dados de uma tabela, basta colocares 8 ifs não encadeados e inserir um separador caso alguma tabela anterior a essa seja imprimida.

        Dim Sep As Boolean = False 'Separador

        If CheckBox1.Checked Then
            'imprimir tabela 1
            Sep = True
        End If

        If CheckBox2.Checked Then
            If Sep Then
                'imprimir separador
            End If
            'imprimir tabela 1
            Sep = True
        End If

        'repetir para os seguintes igual ao 2


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
PauloFMarques

ribeiro55,

Gostei da forma apresentada, mas penso que por enquanto ainda é um bocado demais para mim, tenho de estudar melhor a forma de aplicação de bitmasks antes de as poder utilizar, mas obrigado na mesma, já está na lista de coisas a estudar  O0

FreiNando,

Por acaso não tinha pensado nisso assim. 

Por vezes concentramos-nos tanto numa solução difícil que acabamos por nos esquecer da fácil.

Aquilo que eu pensava fazia exactamente isso, mas comparava umas com as outras. Vou utilizar essa ideia e ver se resulta. O0


--Sometimes, we do what we want, but we don't want what we have done--

Share this post


Link to post
Share on other sites
PauloFMarques

FreiNando, A resolução apresentada parecia simples, mas não é de possível realização.

Como deves ter lido numa das minhas respostas anteriores, estou a fazer os relatórios à mão, e estou a utilizar E.graphics.drawstring, e logo não posso utilizar esse código, pois tenho de dar as coordenadas, e o "y" da segunda tabela seria um numero se existe o primeiro, e outro se não existisse. dependia do ultimo registo.

De qualquer forma Obrigado.


--Sometimes, we do what we want, but we don't want what we have done--

Share this post


Link to post
Share on other sites
FreiNando

E porque não guardar o valor de Y?

Y apontava para a posição vertical do final  da impressão anterior e seria usado para calcular a posição da impressão seguinte.

Y teria de ser uma variavel externa aos procedimentos ou então passada como parametro por referencia, afim de ser actualizada.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
PauloFMarques

Foi essa mesma ideia que me ocorreu e que estou a por em prática agora mesmo..

Estou a escrever o final do código, e espero que resulte.

Obrigado na mesma.


--Sometimes, we do what we want, but we don't want what we have done--

Share this post


Link to post
Share on other sites
PauloFMarques

Resultou, muito obrigado mais uma vez


--Sometimes, we do what we want, but we don't want what we have done--

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

×
×
  • 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.