ERRO GERADO POR USUARIOS IMPACIENTES...

LUIS.HERRERA 13/08/2011 10:10:41
#381642
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.
MARCOSLING 13/08/2011 10:27:58
#381644
Resposta escolhida
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.
AJSO 13/08/2011 12:54:39
#381652
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.
LLAIA 13/08/2011 18:53:22
#381667
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.
EDERMIR 14/08/2011 20:19:46
#381716
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.
LUIS.HERRERA 15/08/2011 09:29:29
#381735
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.
Tópico encerrado , respostas não são mais permitidas