Jump to content
j.mendes24

Igualar variavel a objecto [RESOLVIDO]

Recommended Posts

j.mendes24

boas pessoal, tenho uma duvida, eu quero igualar uma variavel, vinda de uma base de dados sql, a um objecto.

eu tenho o seguinte código:


Dim VarMenu As New ToolStripMenuItem

Dim NomeMenu as String

VarMenu = NomeMenu
VarMenu.Visible = False

mas este codigo estame a dar erro em "VarMenu = NomeMenu".

ele nao me deixa igualar o NomeMenu ao VarMenu por este ser um objecto e o NomeMenu uma string.

Agradeço qualquer ajuda....

Cump´z

Share this post


Link to post
Share on other sites
ribeiro55

O que pretendes fazer?

Não podes tentar uma conversão de um objecto "STRING" para um objecto "TOOLSTRIPMENUITEM"

Se o que pretendes é adicionar um novo menu item com o texto que vem no NomeMenu terás de instanciar um novo objecto ToolStripMenuItem (como já fizeste) e passar o texto na propriedade Text:

Dim VarMenu As New ToolStripMenuItem

Dim NomeMenu as String

VarMenu.Text = NomeMenu
VarMenu.Visible = False


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
j.mendes24

eu nao me estou a espressar bem.

vou tentar expresarme melhor...

é o seguinte:

eu tenho o menu ja defenido, e tenho toda a sua estrutura numa tabela de uma base de dados. e tenho tambem uma tabela com as permissoes de acessos.

ou seja imaginemos que o user ("Funcionario1") nao tem acesso ao form ("ficheiros"). eu ja tenho um loop em que ele vai ver se o funcionario tem acesso ou nao.

mas depois ao iniciar o form geral(o form que contem o menu) eu quero que ele meta o botao do menu("ficheiro") enable caso este nao tenha permissao. mas quero fazer um codigo automatico para por enabled ou disabled todos os botoes do menu.

o codigo real que eu tenho é o seguinte:

Dim PodeEntrar As Integer
        Dim VarMenu As New ToolStripMenuItem

        OpenDao()

        Dim SQL3 As String = "SELECT TBEstrutura.ESTCod, TBEstrutura.ESTNome, TBEstrutura.ESTNomeVB, TBAutorizacoes.AUTEvand " & _
                             "FROM TBEstrutura LEFT JOIN TBAutorizacoes ON TBEstrutura.ESTCod = TBAutorizacoes.AUTEstrutura"
        RSTB1.Open(SQL3, ConnDao, CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)

        With RSTB1
            Do While Not .EOF
                If IsDBNull(.Fields("AUTEvand").Value) = True Then
                    VarMenu = .Fields("ESTNomeVB").Value
                    VarMenu.Visible = False
                Else
                    VarMenu = .Fields("ESTNomeVB").Value
                    PodeEntrar = Mid(.Fields("AUTEvand").Value, 1, 1)
                    If PodeEntrar = 1 Then
                        VarMenu.Visible = True
                    Else
                        VarMenu.Visible = False
                    End If
                End If
                .MoveNext()
            Loop
            .Close()
            CloseDao()
        End With

Share this post


Link to post
Share on other sites
jviana

Não percebi mas podes declarar um Objecto

Dim objecto As Object 'salvo erro, não sei se é assim que se escreve

Cumps. J.Viana


Learning

  • VB.Net
  • HTML
  • C/C++

Share this post


Link to post
Share on other sites
ribeiro55

Pois mas não pode ser.

Para bateres os textos dos menus, tens antes que apanhar a referência correcta do objecto que vais testar.

Vou te dar um workaround rápido que espero que entendas e quissá desenvolvas:

Poderia estar bem melhor, mas assim até deves entender melhor.

Para veres se é isto que precisas, substituí no teu código onde tens:

.Fields("ESTNomeVB").Value

por:

DevolveMenuItem(MenuStrip1, Nothing, ".Fields("ESTNomeVB").Value")

E acrescentas este sub algures na mesma classe:

    Private Function DevolveMenuItem(ByVal MenuBase As MenuStrip, ByVal transTSMI As ToolStripMenuItem, ByVal Texto As String, Optional ByRef Sai As Boolean = False) As ToolStripMenuItem

        Dim tempTSMI As New ToolStripMenuItem

        If transTSMI Is Nothing Then
            For Each TSMI As ToolStripMenuItem In MenuBase.Items
                If TSMI.DropDownItems.Count > 0 Then tempTSMI = DevolveMenuItem(MenuBase, TSMI, Texto, Sai)

                If TSMI.Text.ToLower = Texto.ToLower Then
                    Sai = True
                    Return TSMI
                End If

                If Sai = True Then Return tempTSMI
            Next
        Else
            For Each TSMI As ToolStripMenuItem In transTSMI.DropDownItems
                If TSMI.DropDownItems.Count > 0 Then tempTSMI = DevolveMenuItem(Nothing, TSMI, Texto, Sai)

                If TSMI.Text.ToLower = Texto.ToLower Then
                    Sai = True
                    Return TSMI
                End If

                If Sai = True Then Return tempTSMI
            Next
        End If

        Return New ToolStripMenuItem
    End Function

Trata-se de uma função recursiva à qual tens de fornecer a MenuStrip que queres.

Isso foi escrito aqui em cima do joelho, mas em princípio vasculha-te todos os itens do menu, batendo os textos, e quando encontrar devolve a instância do ToolStripMenuItem.

Bear in mind, com este código, se tiveres alguma coisa como Combos ou separadores nos menus, rebenta.

Mas deixo isso para te divertires. É fácil =)


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
ribeiro55

@imf0rmatic4

Tudo é um objecto.

O tipo de dados Object é uma indeterminação usada para "transportar" diferentes tipos de objectos.

Estou-me a lembrar das ListBox que mantêm listas de OBJECTS (e não strings, como são tratados geralmente), podendo tu desta forma manter listas de buttons, forms ou buttons e forms, ou o que quiseres. Até listas de listas de listas de listas de listas (....)


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
j.mendes24

eu os textos ja os tenho numa base de dados. eu quero e que ele ao fazer o while que va verificar se o utilizador tem acesso aquele botao se nao, entao se nao tiver o botao cujo o nome do botao é o que vem da base de dados, fica enabled, ou invisible.

Share this post


Link to post
Share on other sites
ribeiro55

Eu percebi, e já te dei uma solução.


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
j.mendes24

eu tenho separadores no menu...

como poderei resolver a situação?

ja andei paqui a testar com ifs mas nao csg

:S

Share this post


Link to post
Share on other sites
ribeiro55

Só precisas de um IF e de uma ligeira alteração num datatype.

Not even a clue? ;)


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
j.mendes24

indicio como assim?

nao faço mesmo a minima

e que j tou todo atroviado, ando ha dias ja a tentar fazer isto

Share this post


Link to post
Share on other sites
ribeiro55

Tudo bem.

Desde que aprendas, por mim está tudo bem.

Troca a função que te dei antes por a que está abaixo.

Chama-a da mesma forma.

    Private Function DevolveMenuItem(ByVal MenuBase As MenuStrip, ByVal transTSMI As ToolStripMenuItem, ByVal Texto As String, Optional ByRef Sai As Boolean = False) As ToolStripMenuItem

        Dim tempTSMI As New ToolStripMenuItem

        If transTSMI Is Nothing Then
            For Each TSMI As Object In MenuBase.Items
                If TypeOf TSMI Is ToolStripMenuItem Then
                    If TSMI.DropDownItems.Count > 0 Then tempTSMI = DevolveMenuItem(MenuBase, TSMI, Texto, Sai)

                    If TSMI.Text.ToLower = Texto.ToLower Then
                        Sai = True
                        Return TSMI
                    End If

                    If Sai = True Then Return tempTSMI
                End If
            Next
        Else
            For Each TSMI As Object In transTSMI.DropDownItems
                If TypeOf TSMI Is ToolStripMenuItem Then
                    If TSMI.DropDownItems.Count > 0 Then tempTSMI = DevolveMenuItem(Nothing, TSMI, Texto, Sai)

                    If TSMI.Text.ToLower = Texto.ToLower Then
                        Sai = True
                        Return TSMI
                    End If

                    If Sai = True Then Return tempTSMI
                End If
            Next
        End If

        Return New ToolStripMenuItem
    End Function

Trocando o tipo de dados dos itens do ForEach para Object, passas a poder fazer referência qualquer objecto através da mesma variável.

Posto isto, testamos o tipo da variável e só executamos a lógica de comparação caso seja um ToolStripMenuItem.


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
j.mendes24

ja percebi, eu ja tava todo atroviado, eu tava a tentar testar na mesma linha, o meu raciciocinio de resolução tava boa, a maneira de resolver e que nao XD

isto ate está a funcionar a qestão e que o botao que supostamente devia ficar invisivel continua visivel.

:s

depois de chamar a função ja tentei de varias maneiras por o botao invisivel mas sem suceesso.

Share this post


Link to post
Share on other sites
ribeiro55

Isso pode já ser problema na tua lógica.

Esse método só faz uma coisa: localiza uma instância do objecto ToolStripMenuItem dentro de uma MenuStrip e devolve-te a referência.

Para tirares a dúvida, onde tens enabled mete visible e valida se desaparece.


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
j.mendes24

ja resolvi...

obrigadão pla ajuda, agarrei na na função que me dizeste e modifiquei-a um pouco de maneira a ser-me completamente útil.

mais uma vez obrigado.

;)

Share this post


Link to post
Share on other sites
ribeiro55

Apresenta as alterações que efectuaste.

Pode sempre dar jeito a alguém.


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
j.mendes24

de seguida deixo como ficou.... pode ser que seja util par alguem... cumpz! ;)

Dim PodeEntrar As Integer

        OpenDao()

        Dim SQL3 As String = "SELECT CODEST, NOMEEST, NomeVBEST, EvandAUT, UserAUT " & _
                             "FROM ESTTB LEFT JOIN AUTTB ON CODEST = ESTAUT " & _
                             "WHERE USERAUT = " & User
        RSTB1.Open(SQL3, ConnDao, CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)

        With RSTB1
            Do While Not .EOF
                If IsDBNull(.Fields("EvandAUT").Value) = True Then
                    ColocaDisable(MS1, Nothing, .Fields("NomeVBAUT").Value, False)
                Else
                    PodeEntrar = Mid(.Fields("EvandAUT").Value, 1, 1)
                    If PodeEntrar = 1 Then
                        ColocaDisable(MS1, Nothing, .Fields("NomeVBEST").Value, True)
                    Else
                        ColocaDisable(MS1, Nothing, .Fields("NomeVBEST").Value, False)
                    End If
                End If
                .MoveNext()
            Loop
            .Close()
            CloseDao()
        End With

    Private Function ColocaDisable(ByVal MenuBase As MenuStrip, ByVal transTSMI As ToolStripMenuItem, ByVal Texto As String, Optional ByRef Valor As Boolean = False) As ToolStripMenuItem

        Dim VVV As String
        Dim tempTSMI As New ToolStripMenuItem
        If transTSMI Is Nothing Then
            For Each TSMI As Object In MS1.Items
                If TypeOf TSMI Is ToolStripMenuItem Then
                    If TSMI.DropDownItems.Count > 0 Then tempTSMI = ColocaDisable(MenuBase, TSMI, Texto, Valor)
                    VVV = TSMI.name
                    If VVV = Texto Then
                        TSMI.Enabled = Valor
                    End If
                End If
            Next
        Else
            For Each TSMI As Object In transTSMI.DropDownItems
                If TypeOf TSMI Is ToolStripMenuItem Then
                    If TSMI.DropDownItems.Count > 0 Then tempTSMI = ColocaDisable(Nothing, TSMI, Texto, Valor)
                    VVV = TSMI.name
                    If VVV = Texto Then
                        TSMI.Enabled = Valor
                    End If
                End If
            Next
        End If
        Return New ToolStripMenuItem
    End Function

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.