Página 1 de 1
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 04 Fev 2013 21:34
por jsnascimento
Prezados,
Boa Noite!
Tenho um aplicativo simples em Hmg.3.0.35, rodando em Windows Xp sp3, que possui duas Janelas: (1ª) “Principal” e (2ª) “Padrao”.
Através de um item da
“TOOLBAR” da primeira janela, a segunda janela é ativada, onde é dado sequência ao processamento específico.
Ao final do processamento, saio da janela (2ª) “Padrao” e vou para a janela (1ª) “Principal”. Neste ponto em diante identifico a ocorrência de um problema. Apesar do “Foco” ir para a Janela (1ª) “Principal” e mostrar os item da “TOOLBAR”, estes item de menu se tornam inertes, não executa mais nada - nem mesmo o item “Sair” está funcionando. Não consigo ir para lugar nenhum. Clico em qualquer item da “TOOLBAR” eles não realizam nada. É como se ação estivesse marcada com “Nil”.
A única forma de abandonar o aplicativo é clicando no
“X” da janela (1ª) “Principal”, não obstante esta janela possuir um botão específico para sair, mas mesmo este botão não funciona mais.
Outra constatação é que ao sair do aplicativo pela única alternativa citada acima, notei que o programa, apesar de encerrado, ainda fica ativo na memória do Windows como um processo invisível, notado apenas no “Gerenciador de Tarefas do Windows”.
O que será que está acontecendo? Alguém poderia me ajudar?
Segue código da Função
“Sair”:
Código: Selecionar todos
FUNCTION SAIR
IF MsgYesNo('Deseja realmente Sair ?','Confirmação',{'Sim','Não'})
RELEASE KEY F10 OF Padrao
DOMETHOD("Padrao","Hide")
DOMETHOD("Padrao","Release")
__Quit()
//*CLOSE DATABASE
//*THISWINDOW.RELEASE
ENDIF
Muito Obrigado!
Jamil S. Nascimento
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 05 Fev 2013 10:42
por Pablo César
Jamil, seria interessante que seja exibido o código por completo. Não interessam as funções de processamento específico, essas poderiam apenas eliminadas, mas interessaria ver as duas janelas (os dois forms) e as funções que chamam-se.
Não sabemos a razão da função SAIR ser escondida antes do release.
Liste o código completo. Assim não dá pra testar.
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 05 Fev 2013 14:37
por MSDN
No código que vc mostrou, é dado o comando para deixar a janela invisível, e logo em seguida para eliminar, não é necessário, e tbem, caso vc precise usar mais de uma janela para processar informações relacionadas, chamar a função que monta a janela, e depois fechar o form seria mais indicado, em raros casos deixar 2 janelas criadas e ocultando/mostrando uma delas é uma opção usual.
Vc poderia usar somente : Padrao.Release , isso já basta para fechar a janela, automaticamente o foco volta para onde estava anteriormente.
Abraços
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 05 Fev 2013 21:46
por jsnascimento
Prezados Colegas
Boa Noite!
MSDN postou:
No código que vc mostrou, é dado o comando para deixar a janela invisível, e logo em seguida para eliminar, não é necessário, e tbem, caso vc precise usar mais de uma janela para processar informações relacionadas, chamar a função que monta a janela, e depois fechar o form seria mais indicado, em raros casos deixar 2 janelas criadas e ocultando/mostrando uma delas é uma opção usual.
Vc poderia usar somente : Padrao.Release , isso já basta para fechar a janela, automaticamente o foco volta para onde estava anteriormente.
MSDN, você tem razão! Estava utilizando dois comandos para um objetivo só. Sou novato em Habour/MiniGui, por isso vou testando as possibilidades. Eu tentei utilizar "Padrao.Release", conforme sua orientação, mas está dando "pau" quando tento abortar o aplicativo na segunda Janela.
Estou enviando os fontes, mais três arquivo dbf's e um arquivo com a
imagem da mensagem de erro na hora do erro. ( BUG.BMP).
Vejam se podem me ajudar a entender este erro e como solucioná-lo.
Obrigado!
Jamil S. Nascimento
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 06 Fev 2013 09:08
por Pablo César
Olá Jamil, como eu tinha dito também sobre não entender o esconder antes do release na função SAIR e pedi para você disponibilizar o seu código. Tudo tem uma razão. Primeiramente, parabéns pela sua criatividade e permita-me fazer algumas observações, talvez sejam críticas pessoal minha, apenas:
1. Observei que tem muitos prgs, muito módulos que em certas situações apenas chamam outros módulos. Não teria nada de mal ter muitos PRGs, seria mais prático e mais entendível você desdobrar as funções de processamento e as funções de interface (telas ou forms) separadamente. Englobando num ou dois módulos apenas.
2. Os nomes da funções, estão muito longas. Não lembro até qual tamanho é aceito em Harbour. Mas seria conveniente ser mais sintético.
3. Pelo visto, você quer cancelar o processamento Padrao_processar_action(). Do qual executa uma série de restruturações de dbf na função main_Padronizar(). Ai eu pergunto: se você interromper no meio desse processamento, isso não poderá causar algum dano nos dbfs ? (
*1)
4. Se houver problemas de interromper o processamento na metade (digamos), você precisará também desabilitar todas as saídas do programa.
É importante que o seu código obedeça a lógica de funcionamento do seu aplicativo. Imagine um
fluxograma onde você colocará as opções do seu aplicativo e os seus comportamentos como também a suas isenções.
Eu vou tentar re-estruturar os seus módulos, mas precisarei que você responda a minha pergunta (*3) e faça um
Pseudocódigo, isto é, que relate com termos convencionais que indiquem todas as instruções (o que o programa tem que fazer). Esta é uma prática que auxilia ao programador a descrever todas as situações cabíveis para enfim elaborar um algoritmo adequado.
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 06 Fev 2013 09:25
por jsnascimento
Pablo César e demais colegas,
Bom dia!
Obrigado pela críticas construtivas. Em tempo oportuno tentarei customizar mais os meus "Prgs". Quantos aos nomes dos "prgs" acredito que não interfiram no funcionamento global, mas é viável reduzi-los. Quanto ao corrompimento dos "dbf" na interrupção abrupta do programa é previsível e aceitável. Eu preciso deste dispositivo de abortamento assim como está.
Isto posto, gostaria por favor da avaliação de vocês sobre o "bug" relatado e mostrada no arquivo "Bug.bmp" anexo ao tópico; pois o "bug" apresentado certamente não é devido a customização dos meus prgs.
O que será que está acontecendo? Alguém rodou o aplicativo e viu o erro acontecendo?
Obrigado!
Jamil S. Nascimento
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 06 Fev 2013 09:44
por Pablo César
jsnascimento escreveu:Isto posto, gostaria por favor da avaliação de vocês sobre o "bug" relatado e mostrada no arquivo "Bug.bmp" anexo ao tópico; pois o "bug" apresentado certamente não é devido a customização dos meus prgs.
O que será que está acontecendo? Alguém rodou o aplicativo e viu o erro acontecendo?
Ahh sim esqueci de mencionar. Não é BUG é erro de programação. Eu sei que você agora tem o interesse apenas de resolver o problema a todo custo, sem se preocupar sobre as consequências. Você ainda não me disse se a interrupção do processamento poderia ou não causar danos aos seus dbfs. De todas formas o que eu quero alertar é sobre o chamado de funções que você faz de forma não sistemática. Desculpe, parece tudo muito chato o que eu estou dizendo, mas é que tenho visto que você chama e retorna aos forms de forma não muito usual e que muita vezes estaria abrindo sessões em outras áreas.
Problemas ao SAIR de uma janela no aplicativo.
Enviado: 06 Fev 2013 10:07
por Pablo César
Jamil, veja um fato muito importante. Focando apenas o erro que está dando. Você está processando arquivos dbfs e está mudando a estrutura dos mesmos e fazendo a importação dos dados, certo ? Pois bem, você está fazendo isso num laço de repetição e no meio de tudo isso você quer abortar o processamento. Para isso você teria que dar um EXIT no seu laço de repetição (no seu FOR e nos Do While) que você tem. Mas em contrapartida você está chamando uma função para liberar a tela. É por isso que sugiro você restruturar os seus módulos. Programar em GUI é diferente do que estávamos acostumados.
Uma sugestão imediatista seria você colocar uma variável lógica na linha antes do final de cada laço e essa variável seria atribuída ao botão que estaria cancelando o processo.