ERRO GERADO POR USUARIOS IMPACIENTES...
Bom dia!
Estou tendo um erro relatado em outro tópico já ENCERRADO, pois parecia ser uma coisa e na realidade é outra, pois isso abro este outro tópico especÃfico.
Pergunta:
Como vocês fazem para evitar que um usuário clique em outros controles antes de uma rotina solicitada ser plenamente executada, ou seja, todos os dados necessários terem sido carregados e exibidos, após uma solicitação de consulta, seleção de registro, etc..?
Problema:
Alguns usuários, em clientes diferentes, não tem muita paciencia de esperar de 2 a 10 segundos para o preenchimento completo de uma tela de dados, então começam a clicar nos outros controles da tela, como [Ô]Forma de Ganhar Tempo[Ô], exibindo uma parte especÃfica (Abas do SSTAB) com os dados que precisarão. A lentidão as vezes é da rede, do hardware, da forma de acesso wirelless, terminal server, etc.., com isso está fazendo com que o VB6 se perca e gere o erro:
nº 91 - Descrição : Object variable or With block variable not set
O erro ocorre dentro de uma SUB e está relacionado a um recordset usado para preencher um flexgrid. Essa função é executada mais de uma vez, pois em alguns casos tenho 3 ou 5 flexgrids diferentes para preencher.
Quando o usuário clica em outros controles, antes do programa terminar de carregar todos os dados do banco e preencher os controles, parece que as rotinas começam a ser executadas em ordem indevida, em função dos comandos [Ô]Cliques do usuário[Ô] que disparam outros eventos destes controles, sem que hajam dados disponÃveis ainda, e a mesma rotina que estava sendo executada, é executada outras vezes indevidamente (gerando um loop de 3 a 5 erros consecutivos em relação ao número de grids que tenho de preencher).
Notas:
1- Uso o DoEvents durante o preenchimento dos grids, para exibir em tempo real tanto uma barra de progresso do preenchimento na tela principal, permitindo que o usuário saiba que o proregrama não travou, bem como atualizar as labels com o número de registros carregados.
2- eu desativo a montagem do grid durante seu preenchimento, só habilitando ao final, isso permite agilizar bem o tempo de montagem.
3- Tentei usar o Enabled no form, mas isso gera erro em rotinas que precisam usar controles durante sua executção.
Estou tendo um erro relatado em outro tópico já ENCERRADO, pois parecia ser uma coisa e na realidade é outra, pois isso abro este outro tópico especÃfico.
Pergunta:
Como vocês fazem para evitar que um usuário clique em outros controles antes de uma rotina solicitada ser plenamente executada, ou seja, todos os dados necessários terem sido carregados e exibidos, após uma solicitação de consulta, seleção de registro, etc..?
Problema:
Alguns usuários, em clientes diferentes, não tem muita paciencia de esperar de 2 a 10 segundos para o preenchimento completo de uma tela de dados, então começam a clicar nos outros controles da tela, como [Ô]Forma de Ganhar Tempo[Ô], exibindo uma parte especÃfica (Abas do SSTAB) com os dados que precisarão. A lentidão as vezes é da rede, do hardware, da forma de acesso wirelless, terminal server, etc.., com isso está fazendo com que o VB6 se perca e gere o erro:
nº 91 - Descrição : Object variable or With block variable not set
O erro ocorre dentro de uma SUB e está relacionado a um recordset usado para preencher um flexgrid. Essa função é executada mais de uma vez, pois em alguns casos tenho 3 ou 5 flexgrids diferentes para preencher.
Quando o usuário clica em outros controles, antes do programa terminar de carregar todos os dados do banco e preencher os controles, parece que as rotinas começam a ser executadas em ordem indevida, em função dos comandos [Ô]Cliques do usuário[Ô] que disparam outros eventos destes controles, sem que hajam dados disponÃveis ainda, e a mesma rotina que estava sendo executada, é executada outras vezes indevidamente (gerando um loop de 3 a 5 erros consecutivos em relação ao número de grids que tenho de preencher).
Notas:
1- Uso o DoEvents durante o preenchimento dos grids, para exibir em tempo real tanto uma barra de progresso do preenchimento na tela principal, permitindo que o usuário saiba que o proregrama não travou, bem como atualizar as labels com o número de registros carregados.
2- eu desativo a montagem do grid durante seu preenchimento, só habilitando ao final, isso permite agilizar bem o tempo de montagem.
3- Tentei usar o Enabled no form, mas isso gera erro em rotinas que precisam usar controles durante sua executção.
Eu evito usar contadores de registros carregados, uso no máximo uma barra de progresso, mas prefiro exibir um status de [Ô]processando...[Ô] ou algo do tipo, pois notei que esses [Ô]enfeites[Ô] deixam o processamento mais lento.
Para evitar que o usuário fique clicando onde não deve, eu apenas uso o Enabled dos controles.
Ou, uso um form modal e faço o processamento dentro de form, assim você mantém o usuário [Ô]preso[Ô].
Eu já usei o Enabled do form, mas nunca tive problemas, mas prefiro desabilitar os controles individualmente, pois esteticamente acho que fica melhor.
Para evitar que o usuário fique clicando onde não deve, eu apenas uso o Enabled dos controles.
Ou, uso um form modal e faço o processamento dentro de form, assim você mantém o usuário [Ô]preso[Ô].
Eu já usei o Enabled do form, mas nunca tive problemas, mas prefiro desabilitar os controles individualmente, pois esteticamente acho que fica melhor.
Olá Luiz utilize seus processos dentro de tratamento de erros
Exemplo:
dentro de sua SUB OU QQ OUTRO PROCESSO.
On error GoTo Trata_Erro_divisao
Err.Raise Number:=11 [ô]Gera um erro de divisão por zero exit sub
Trata_Erro_divisao:
Select Case Err.Number case 11
if MsgBox([Ô]Não Existe divisão por Zero. !!! [Ô], vbYesNo) = vbYes Then
c=inputbox([Ô]Informe o valor do denominador ! [Ô])
resume
else
exit sub [ô]<= ISSO PORQUE é UMA SUB SE FOR FUNCTION exit function
endif
End Select
lembre-se é um exemplo que trata o erro e deixa o usuário interagir com a sub refazendo o processo, mas pode ser adaptada para suas rotinas apenas para tratar
o erro e não fechar sua aplicação:
Isso enibe qq ação do usuário pois só deixa ele uitilizar o prooximo processo apos o termino do anterior.
Exemplo:
dentro de sua SUB OU QQ OUTRO PROCESSO.
On error GoTo Trata_Erro_divisao
Err.Raise Number:=11 [ô]Gera um erro de divisão por zero exit sub
Trata_Erro_divisao:
Select Case Err.Number case 11
if MsgBox([Ô]Não Existe divisão por Zero. !!! [Ô], vbYesNo) = vbYes Then
c=inputbox([Ô]Informe o valor do denominador ! [Ô])
resume
else
exit sub [ô]<= ISSO PORQUE é UMA SUB SE FOR FUNCTION exit function
endif
End Select
lembre-se é um exemplo que trata o erro e deixa o usuário interagir com a sub refazendo o processo, mas pode ser adaptada para suas rotinas apenas para tratar
o erro e não fechar sua aplicação:
Isso enibe qq ação do usuário pois só deixa ele uitilizar o prooximo processo apos o termino do anterior.
Como vc usa o DoEvents, o jeio esmo é liberar (Enable = True) esses controles gradualmente ao passo que cada procedimento termina, ou libera só no final.
Coloque ENABLED = FALSE no FORM.
Eu faço assim nas minhas aplicações para evitar o problema que você relatou e para evitar que o usuário clique em outra tela durante uma tela de controle.
Eu faço assim nas minhas aplicações para evitar o problema que você relatou e para evitar que o usuário clique em outra tela durante uma tela de controle.
Abrir outros forms não é problema, pois só deixo abrir um por vez.
Vou implmentar o bloqueio de todos os controles mesmo, acho que é a única forma mais prática de resolver.
Obrigado.
Vou implmentar o bloqueio de todos os controles mesmo, acho que é a única forma mais prática de resolver.
Obrigado.
Tópico encerrado , respostas não são mais permitidas