Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Função para retornar o obejto selecionado

ola, alguem sabe se é existe alguma função que retorne o objeto selecionado.
gostaria de fazer com que um filtro so apareça quando um determinado grafico seja selecionado.

estou com a versao 8.50

5 Replies
Not applicable
Author

Olá,

Não sei como verificar o objeto selecionado, mas podemos resolver seu problema através de duas macros e uma variável.

Crie essa macros no módulo (CTRL+M)

sub AtivaObjeto
set f = ActiveDocument.GetVariable("vMostraCampo")
f.SetContent "1", true
end sub

sub DesativaObjeto
set f = ActiveDocument.GetVariable("vMostraCampo")
f.SetContent "0", true
end sub

Crie a variável vMostraCampo.

Acesse as propriedades da pasta e vá na aba Macro
Selecione o objeto que ao ser selecionado deve exibir um determinado campo.
Ao Lado da caixa tem dois combos, no Ao Ativar escolha a macro AtivaObjeto e no Ao Desativar escolha a macro DesativaObjeto.

Agora acesse a propriedade do objeto que deverá ser ocultado e vá na aba Layout e na opção Mostrar Condicional e coloque a variável vMostraCampo.

Espero ter lhe ajudado.

Abraços.

Tonial



Not applicable
Author

Tonial.

Se ele fizer assim a principio funciona, mas quando a caixa com o filtro aparecer e ele for selecionar alguma coisa ela vai desaparecer, pois ele vai desativar o gráfico mudando o valor da variável.

Fiz algumas alterações na macro que você passou.

SUB AtivaObjeto
SET f = ActiveDocument.GetVariable("vMostraCampo")
SET C=ActiveDocument.GetSheetObject("CH84")
IF C.IsActive THEN
f.SetContent "1", TRUE
ELSE
IF C.IsMinimized THEN
f.SetContent "0", TRUE
END IF
END IF
END SUB

com essa macro acesse as propriedades da pasta e vá na aba Macro

Selecione o objeto que ao ser selecionado deve exibir um determinado campo.
Ao Lado da caixa tem dois combos, no Ao Ativar escolha a macro AtivaObjeto e no Ao Desativar escolha a macro AtivaObjeto.

Agora acesse a propriedade do objeto que deverá ser ocultado e vá na aba Layout e na opção Mostrar Condicional e coloque a variável vMostraCampo.

Eu fiz essa macro pensando em um gráfico que esta minimizado, assim quando você clicar apenas 1 vez no gráfico o objeto com os filtros aparecerá mas o gráfico continuará minimizado, clique 2 vezes para maximizar o gráfico.

Quando ele estiver maximizado você pode clicar em qualquer lugar que o objeto com os filtros não vai sumir.

Quando o gráfico for minimizado e você clicar em outro lugar o objeto com os filtros ficará oculto.

Se o gráfico for somente minimizado e você não clicar em nenhum lugar o objeto com os filtros ficará visível.

Assim como o Tonial espero ter ajudado.

Not applicable
Author

Bom dia, jovens.

Penso que o que se deseja é tão simplesmente abrir um gráfico acompanhado de um list box ou seleção múltipla para filtros, e fechar esse objeto de filtro quando o gráfico for minimizado.

O inconveniente é que você só pode tratar os eventos de ativação e desativação de um objeto. Em outras palavras, se o usuário clicar no objeto minimizado uma única vez, ele será ativado, disparando a macro, mas seu status continuará IsMinimized. Se após isso ele der um duplo-clique no objeto já ativo, não ocorrerá nem o evento de ativação, nem o de desativação, não disparando a macro.

Penso que o melhor seja colocar sobre o gráfico minimizado um botão transparente associado a macro que restaurará o gráfico e mostrará o objeto de seleção. Da mesma forma, coloque outro botão transparente sobre o ícone de minimização do gráfico, e associe este a macro de desativação dos objetos.

O efeito será o desejado, e a apresentação (visual) dará ao usuário a sensação de estar operando a aplicação da forma tradicional do QlikView.

Exemplo:

SUB AtivaObjetos
ActiveDocument.GetSheetObject("CH01").Restore
SET f=ActiveDocument.GetSheetObject("LB01")
set prop = f.GetProperties
prop.Layout.Frame.Show.Always = true
f.SetProperties prop
END SUB

SUB DesativaObjetos
ActiveDocument.GetSheetObject("CH01").Minimize
SET f=ActiveDocument.GetSheetObject("LB01")
set prop = f.GetProperties
prop.Layout.Frame.Show.Always = false
prop.Layout.Frame.Show.Expression.v = "1=0"
f.SetProperties prop
END SUB

Bom trabalho, e um grande abraço a todos.

Not applicable
Author

Bom dia Cláudio, tudo bem ?

A princípio eu havia pensado desta maneira (e já fiz em um cliente), mas e se existir outro gráfico minimizado e ele clicar diretamente no outro gráfico (Minimização Automática Ativada)?
O gráfico com o botão será minimizado mas o filtro continuará aparecendo e o botão ficará na mesma posição até que ele seja pressionado.

Eu testei as macros que você postou.

Por isso fiz da maneira acima, assim quando o outro gráfico for aberto ele minimizará o outro e executará a macro novamente ocultando o filtro.

O que fiz em um cliente foi criar um botão com a imagem do gráfico minimizado, quando ele clicava no botão exibia o gráfico com as variáveis para alteração de metas, quando o gráfico era exibido o botão continuava na tela mas agora aparecia escrito "Ocultar Gráfico de Metas" e quando ele clicava o gráfico e as variáveis ficavam ocultos.

Então tudo depende do ambiente, e nós não sabemos exatamente qual é este ambiente para passarmos a melhor solução.

Not applicable
Author

Guilherme, o problema é que o usuário não tem a obrigação de usar a aplicação da forma que ela está preparada para funcionar. Ou seja, se deixares o controle de forma automática (minimização automática) não podes querer controlar objetos assessórios, como os de seleção específica prum gráfico, no exemplo do Cabral. O usuário sempre poderá causar (e podes ter certeza que causará..) situações indesejadas como a que eu citei, e que escapa totalmente do controle dos disparadores de macros.

Sempre que precisares dar uma mecânica complexa, como objetos aparecendo/sumindo simultaneamente, ou coisas assim, utilize botões para controlá-los.

Em outras palavras, se houverem outros objetos mutuamente exclusivos ao gráfico em questão, faça o mesmo (botões transparentes sobre os ícones) e não utilize a propriedade de minimização automática em nenhum (nenhum mesmo...) objeto da pasta. Controle "manualmente" a mecânica de abrir/fechar objetos. Fica mais "na mão". Caso contrário sempre haverá uma ou outra situação indesejada na operação da aplicação.

Lembre-se, não há eventos (ao menos na 8.50) disparadores de macros para objeto sendo minimizado, ou restaurado, ou maximizado, apenas para ativado e desativado, e estes eventos (ativação/desativação) dizem respeito ao "foco" no objeto, inclusive você pode ter mais de um objeto ativo simultaneamente (pressionando shift+clique do mouse).

Minimização automática é sempre interessante quando num conjunto de objetos apenas um deve estar aberto. Se houver situações de simultaneidade, ou vários objetos trabalhando como um só, na 8.50 é melhor controlar por botões.

Até pode ser interessante fazer um tipo de menu hierárquico pra controlar essa mecânica, mas aí é melhor analisar caso-a-caso. Para cada problema, uma solução. Generalidades funcionam bem com situações padrão. Fugiu do padrão, solução caso-a-caso.

Abraços.