[resolvido] fncGetVisible so funciona em 1 grupo

Moderador: Avelino Sampaio

webruxim
Mensagens: 7
Registrado em: 22 Jul 2016, 20:25

[resolvido] fncGetVisible so funciona em 1 grupo

Mensagempor webruxim » 17 Mar 2017, 21:46

Boa tarde colegas e ADM.

Gostaria muito de uma ajuda. Estou com minha aplicação pronta e apenas fazendo alguns ajustes finais.

O código abaixo está funcionando perfeitamente, se eu bloqueio todos os formularios o grupo desapareçe da ribbon, perfeito, se eu desabilito so 1, ou 2 formulario eles tb somem.. perfeito.

Código:
Public Sub fncGetVisible(control As IRibbonControl, ByRef visible)
Dim j As Byte
On Error GoTo trataErro
If nlogoff = False Then Exit Sub

Select Case control.id
Case "grpseguranca"
'login.Id = 1 corresponde ao usuário admin
visible = IIf(login.id = 1, True, False)
Case "grpcategorias"
If fncBloquear(1, login.id) Then j = j + 1
If fncBloquear(2, login.id) Then j = j + 1
visible = IIf(j = 2, False, True)
j = 0
Case "guiaCadastro"
visible = True
Case Else
visible = Not Nz(fncBloquear(CLng(IIf(control.Tag = "", 0, control.Tag)), login.id), True)
End Select

sair:
Exit Sub
trataErro:
MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "Aviso", Err.Helpfile, Err.HelpContext
Resume sair:
End Sub


O problema aparece quando adiciono mais categorias ao controle como segue o codigo abaixo:

Código:
Public Sub fncGetVisible(control As IRibbonControl, ByRef visible)
Dim j As Byte
On Error GoTo trataErro
If nlogoff = False Then Exit Sub

Select Case control.id
Case "grpseguranca", "grpseguranca"
'login.Id = 1 corresponde ao usuário admin
visible = IIf(login.id = 1, True, False)
Case "grpseguranca"
visible = IIf(login.id > 1, True, False)
Case "grpcategorias", "grpcadprodser" 'Se tento dessa forma não altera nada continua o msm problema como descrevo abaixo
If fncBloquear(1, login.id) Then j = j + 1
If fncBloquear(2, login.id) Then j = j + 1
visible = IIf(j = 2, False, True)
j = 0
Case "grpcadprodser"
'Se tiro a categoria de cima e passa ela pra baixo como esta aqui continua o msm problema como descrevo abaixo
If fncBloquear(1, login.id) Then j = j + 1
If fncBloquear(2, login.id) Then j = j + 1
visible = IIf(j = 2, False, True)
j = 0

Case "guiaCadastro"
visible = True
Case Else
visible = Not Nz(fncBloquear(CLng(IIf(control.Tag = "", 0, control.Tag)), login.id), True)
End Select

sair:
Exit Sub
trataErro:
MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "Aviso", Err.Helpfile, Err.HelpContext
Resume sair:
End Sub


Bom o problema é o seguinte:

Suponha que todos os formularios dos 2 grupos ("grpcadprodser" e "grpcategorias") estejam bloqueados, o codigo funciona blz, os grupos somem.
Más se eu desbloqueio por exemplo 1 formulario em qualquer um dos grupos, o grupo que eu desbloqueei habilita normal, aparecendo somente o formulario desbloqueado, mas o outro grupo que esta com todos formularios bloqueados em vez dele ficar invisivel ele fica visivel e desabilitado, não era pra continuar invisivel? pois estou usando a função fncGetVisible em todos os grupos e botoes, mas ao fazer esse procedimento ele esta retornando a função fncGetEnabled

Peço a ajuda do Avelino para esclarecer essa minha duvida.
Se alguns dos colegas tb souberem me responder e solucionar o problema fico agradecido com o apoio.
Última edição por webruxim em 24 Mar 2017, 04:35, editado 1 vez no total.

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.


webruxim
Mensagens: 7
Registrado em: 22 Jul 2016, 20:25

Re: fncGetVisible so funciona em 1 grupo

Mensagempor webruxim » 22 Mar 2017, 03:35

prof. Avelino poderia ajudar ?

Damasceno Jr.
Mensagens: 233
Registrado em: 08 Jun 2015, 01:30
Localização: Medicilândia-Pará

Re: fncGetVisible so funciona em 1 grupo

Mensagempor Damasceno Jr. » 22 Mar 2017, 10:43

Tem como você anexar um exemplo com os objetos envolvidos?

Avatar do usuário
Avelino Sampaio
Mensagens: 1765
Registrado em: 04 Jun 2015, 18:27
Contato:

Re: fncGetVisible so funciona em 1 grupo

Mensagempor Avelino Sampaio » 22 Mar 2017, 12:37

webruxim,

observe na xml da ribbon que alguns botões possuem um atributo TAG, que identifica tal botão. Exemplo:

Código:
<button
id = "btClientes"
imageMso = "DistributionListSelectMembers"
label = "Clientes"
getVisible = "fncGetVisible"
onAction = "mcrRibbon.mClientes"
tag="1"
/>


Observer esse valor de tag sendo usada no código:

Código:
...
Case "grpcategorias", "grpcadprodser" 'Se tento dessa forma não altera nada continua o msm problema como descrevo abaixo
If fncBloquear(1, login.id) Then j = j + 1
If fncBloquear(2, login.id) Then j = j + 1
visible = IIf(j = 2, False, True)
j = 0
...


Os botões do seu grupo grpcadprodser devem receber um número de tag exclusiva e colocado na posição x:

Código:
...
Case "grpcadprodser"
If fncBloquear(x, login.id) Then j = j + 1
If fncBloquear(x, login.id) Then j = j + 1
visible = IIf(j = 2, False, True
...


Aguardamos
==================================================
Clique no link abaixo e veja um ótimo kit de ensino que tenho para você.
http://www.usandoaccess.com.br
==================================================

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.


webruxim
Mensagens: 7
Registrado em: 22 Jul 2016, 20:25

Re: fncGetVisible so funciona em 1 grupo

Mensagempor webruxim » 23 Mar 2017, 03:35

Damasceno Jr. escreveu:Tem como você anexar um exemplo com os objetos envolvidos?

Estava preparando um exemplo pra postar, pois meu programa ja esta com muitos megas (28Mb)
Agradeço a atenção e disposição tambem e como o prof. Avelino respondeu logo abaixo

Avelino Sampaio escreveu:webruxim,
Código:
...
Case "grpcadprodser"
If fncBloquear(x, login.id) Then j = j + 1
If fncBloquear(x, login.id) Then j = j + 1
visible = IIf(j = 2, False, True
...



Vou mexer no codigo e volto com a resposta.
Obrigado a todos por enquanto...

webruxim
Mensagens: 7
Registrado em: 22 Jul 2016, 20:25

Re: fncGetVisible so funciona em 1 grupo

Mensagempor webruxim » 23 Mar 2017, 04:40

Damasceno Jr. escreveu:Tem como você anexar um exemplo com os objetos envolvidos?

Consegui fazer um exemplo. Segue em anexo.

Mestre Avelino pelo que entendi seria isso ?
Avelino Sampaio escreveu:webruxim,
Os botões do seu grupo grpcadprodser devem receber um número de tag exclusiva e colocado na posição x:
Código:
...
Case "grpcadprodser"
If fncBloquear(1, login.id) Then j = j + 1
If fncBloquear(2, login.id) Then j = j + 1
If fncBloquear(3, login.id) Then j = j + 1
If fncBloquear(4, login.id) Then j = j + 1
If fncBloquear(5, login.id) Then j = j + 1
If fncBloquear(6, login.id) Then j = j + 1
visible = IIf(j = 2, False, True
visible = IIf(j = 3, False, True
visible = IIf(j = 4, False, True
visible = IIf(j = 5, False, True
visible = IIf(j = 6, False, True
...


Segue um exemplo do que esta acontecendo em anexo.

exemplo.rar
(1.6 MiB) Baixado 8 vezes


Ao abrir o exemplo vai encontrar a uma categoria desabilitada (Categorias) ("grpcategorias") e outra habilitada (Cadastros/Produtos/Serviços) ("grpcadprodser").
esta categoria desabilitada na ribbon esta com a função fncGetVisible então ela não teria que estar invisivel ao inves de Desabilitada ?

Obs: Se eu bloqueio as 2 categorias as 2 somen da ribbon... mas se eu desbloquear qualquer botao em 1 das categorias a categoria que esta totalmente bloqueada deixa de ficar invisivel e fica desabilitada como se estivesse com a função fncGetEnabled

Fico no aguardo e mais uma vez obrigado por ajudarem.

Avatar do usuário
Avelino Sampaio
Mensagens: 1765
Registrado em: 04 Jun 2015, 18:27
Contato:

Re: fncGetVisible so funciona em 1 grupo

Mensagempor Avelino Sampaio » 23 Mar 2017, 13:13

Webruxim,

altere para:

Código:
Public Sub fncGetVisible(control As IRibbonControl, ByRef visible)
Dim j As Byte
On Error GoTo trataErro
If nlogoff = False Then Exit Sub
Stop
Select Case control.Id
Case "grpseguranca"
'login.Id = 1 corresponde ao usuário admin
visible = IIf(login.Id = 1, True, False)
Case "grpcategorias"
If fncBloquear(1, login.Id) Then j = j + 1
If fncBloquear(2, login.Id) Then j = j + 1
If fncBloquear(3, login.Id) Then j = j + 1
visible = Not j = 3
Case "grpcadprodser"
If fncBloquear(4, login.Id) Then j = j + 1
If fncBloquear(5, login.Id) Then j = j + 1
If fncBloquear(6, login.Id) Then j = j + 1
visible = Not j = 3
Case "guiaCadastro"
visible = True
Case Else
visible = Not Nz(fncBloquear(CLng(IIf(control.Tag = "", 0, control.Tag)), login.Id), True)
End Select

sair:
Exit Sub
trataErro:
MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "Aviso", Err.HelpFile, Err.HelpContext
Resume sair:
End Sub


Aguardamos
==================================================
Clique no link abaixo e veja um ótimo kit de ensino que tenho para você.
http://www.usandoaccess.com.br
==================================================

Damasceno Jr.
Mensagens: 233
Registrado em: 08 Jun 2015, 01:30
Localização: Medicilândia-Pará

Re: fncGetVisible so funciona em 1 grupo

Mensagempor Damasceno Jr. » 23 Mar 2017, 13:17

Vamos lá...

A função fncBloquear verifica se um determinado controle está bloqueado para determinado usuário, retornando "True" caso esteja bloqueado. Para isso, basta passar para a função a "tag" do controle e o "id" do usuário logado. Ex: fncBloquear(X, login.Id), onde "X" é a tag e login.Id é a variável que armazena o id do usuário logado.

Para saber se um controle de grupo de botões deve estar visível o código da função fncGetVisible avalia se os botões internos estarão visíveis.
Se o botão interno estiver bloqueado, uma unidade é adicionada a variável "j". Como você pode ver no código, essa parte é feita em "If fncBloquear(X, login.Id) Then j = j + 1". Depois então é só avaliar se a variável j tem o valor do total de botões internos.

Ex.: Se meu controle de grupo de botões tiver 5 botões internos e no final a variável j for igual a 5, então significa que meus 5 botões internos estão bloqueados e o controle de grupo de botões não precisa estar visível. Certo?

Confere aí como seu código deve ser...

Código:
Public Sub fncGetVisible(control As IRibbonControl, ByRef visible)
Dim j As Byte
On Error GoTo trataErro
If nlogoff = False Then Exit Sub

Select Case control.Id
Case "grpseguranca" 'caso o controle de grupo de botões seja "grpseguranca"
'login.Id = 1 corresponde ao usuário admin
visible = IIf(login.Id = 1, True, False) 'estará visível se o login.Id for 1, do contrário , não estará
Case "grpcategorias" 'caso o controle de grupo de botões seja "grpcategorias"
If fncBloquear(1, login.Id) Then j = j + 1 'se o botão interno que tem tag 1 estiver bloqueado então j = j +1
If fncBloquear(2, login.Id) Then j = j + 1 'se o botão interno que tem tag 2 estiver bloqueado então j = j +1
If fncBloquear(3, login.Id) Then j = j + 1 'se o botão interno que tem tag 3 estiver bloqueado então j = j +1
visible = IIf(j = 3, False, True) 'ao final, se j for igual a 3 então todos os meus botões internos
'estão bloqueados e o controle de grupo de botões não estará visível,
'do contrário, se j não for igual a 3 então algum botão interno não está bloqueado
'e o controle de grupo de botões deve ficar visível

j = 0 'que j volte a ser 0
Case "grpcadprodser" 'caso o controle de grupo de botões seja "grpcadprodser"
If fncBloquear(4, login.Id) Then j = j + 1 'se o botão interno que tem tag 4 estiver bloqueado então j = j +1
If fncBloquear(5, login.Id) Then j = j + 1 'se o botão interno que tem tag 5 estiver bloqueado então j = j +1
If fncBloquear(6, login.Id) Then j = j + 1 'se o botão interno que tem tag 6 estiver bloqueado então j = j +1
visible = IIf(j = 3, False, True) 'ao final, se j for igual a 3 então todos os meus botões internos
'estão bloqueados e o controle de grupo de botões não estará visível,
'do contrário, se j não for igual a 3 então algum botão interno não está bloqueado
'e o controle de grupo de botões deve ficar visível

j = 0 'que j volte a ser 0
Case "guiaCadastro"
visible = True
Case Else
visible = Not Nz(fncBloquear(CLng(IIf(control.Tag = "", 0, control.Tag)), login.Id), True)
End Select

sair:
Exit Sub
trataErro:
MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "Aviso", Err.HelpFile, Err.HelpContext
Resume sair:
End Sub

webruxim
Mensagens: 7
Registrado em: 22 Jul 2016, 20:25

Re: fncGetVisible so funciona em 1 grupo - RESOLVIDO

Mensagempor webruxim » 24 Mar 2017, 04:31

Avelino Sampaio escreveu:Webruxim,

altere para:

Código:
Public Sub fncGetVisible(control As IRibbonControl, ByRef visible)
Dim j As Byte
On Error GoTo trataErro
If nlogoff = False Then Exit Sub
Stop
Select Case control.Id
...


Aguardamos


Damasceno Jr. escreveu:Vamos lá...

A função fncBloquear verifica ...
...
Código:
Public Sub fncGetVisible(control As IRibbonControl, ByRef visible)
Dim j As Byte
On Error GoTo trataErro
If nlogoff = False Then Exit Sub
...


Obrigado Avelino e Damasceno Jr.

Nós, programadores, estamos sempre insatisfeitos. Acho que nunca vamos estar 100% felizes em um emprego, seja ele no Brasil ou no exterior, em uma startup ou em uma multinacional, como empregado ou empregador. Vai sempre existir política, você vai ter sempre que fazer coisas que não gosta de fazer. É como diria meu sogro, quem fala que ama o seu trabalho está mentindo.

Quando estou aqui nessa telinha sou mais feliz possível enquanto posso ficar fuçando. Aqui tenho espaço para utilizar minha criatividade. Tenho tempo para praticar e experimentar novos feitos em meus projetos. A não muito tempo conheci e me apaixonei pelo Access/VBA e aqui neste forum estou cercado de pessoas como eu. Pessoas que me inspiram, que me motivam e dizer obrigada, às vezes, não é suficiente para agradecer a tão amável e gentil pessoa que nos estende a mão amiga nos momentos de dificuldade e nos oferece amparo.

Estou agradecido a vocês e não sei neste instante como retribuir o carinho e dedicação que vocês tem conosco (programadores limitado de conhecimento). Estou à sua disposição para quando precisar, a qualquer momento e a qualquer hora. Também estendo-lhes minhas mãos, segure-as se precisar. E, obrigado por tudo! Tópico Resolvido.

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.



Voltar para “Ribbons”

Quem está online

Usuários neste fórum: Bing [Bot] e 1 visitante