Página 1 de 1

Não sair do sistema

Enviado: 07 Ago 2013 11:23
por joaosolution
Srs.

Bom dia

Alterei minha função errorsys para não sair do sistema e retornar ao Menu principal do sistema.

Mas após isso, meus SAY´s não aparecem e os GET´s aparecem todos na mesma linha.

Grato pela ajuda

Att
João Bosco

Não sair do sistema

Enviado: 07 Ago 2013 15:18
por Jairo Maia
Olá João,

Seja bem vindo ao Fórum.

João, creio que a única forma de podermos ajudá-lo, seria se você anexasse seu ERRORSYS.PRG alterado, e explicasse melhor em que situação você deseja que o sistema não aborte.

Está me parecendo que você está enviando um retorno antes mesmo que a rotina de erro possa tratar o erro.

Para anexar um arquivo no fórum veja este link: Como anexar arquivo nas mensagens

Não sair do sistema

Enviado: 07 Ago 2013 15:34
por joaosolution
Jairo

Obrigado pelo retorno!

Acredito que o problema não está na errosys, mas está em anexo.

Pois a sequencia está correta, abre a janela do erro e ao invés de executar um Quit eu executo um Break para voltar no Menu do sistema.

Só que após este retorno os SAYs e GETs não posicionam de forma correta.

Acredito que tenha que setar alguma coisa para os GETS posicionarem de forma correta novamente.
Att
João Bosco

Não sair do sistema

Enviado: 07 Ago 2013 17:07
por Jairo Maia
Olá João Bosco,

Veja que quem está chamando o comando Break é função DoBreak(), que é chamada dentro do BEGIN SEQUENCE / END SEQUENCE:

Código: Selecionar todos

BEGIN SEQUENCE
      oOldError = ErrorBlock( { || DoBreak() } )
      MemoWrit( "Error.log", cErrorLog )
END SEQUENCE
Da forma que você está fazendo, faz que o Break chamado, apenas quebra esse envelope, ou seja, ele segue após a linha END SEQUENCE

Existem formas de tratar erros pelo xHarbour, o fórum tem alguns exemplos usando o RECOVER, mas acho que você poderia ver se o exemplo abaixo ajuda você a entender o comando Break:

Código: Selecionar todos

Function Main()

 Inicio()

Return Nil

Function Inicio()

 Alert( "Inicio" )

 If LastKey() = 27 // K_ESC
  Quit
 EndIf

 Final()

Return Nil

Function Final()

 Alert( "Final" )

 If LastKey() = 27 // K_ESC
  Quit
 EndIf

Break( Inicio() )  // volta para função Inicio()

Não sair do sistema

Enviado: 07 Ago 2013 17:27
por joaosolution
Jair

Obrigado pela resposta! Mas o Break está funcionando perfeitamente.

O sistema dá o erro e volta certinho para o Menu que eu quero.
Até aí blz!

Só que após este retorno, nas telas os SAYs somem e os GETS ficam desposicionadas(todos na mesma linha)(ou na linha 23)

É como se o sistema perdesse alguma referência, pois os Menus e Browses funcionam perfeitamente.

Att
João Bosco

Não sair do sistema

Enviado: 07 Ago 2013 17:58
por Jairo Maia
João, olhei sua função e me parece que o problema deve ser outro, embora ainda não entendo como o Break está funcionando.

Vou fazer uma pergunta que acho que com certeza a resposta será sim, mas vamos lá: Você declarou a variavel GetSys := {} na sua função MenuPrincipal() como Local?

Não sair do sistema

Enviado: 07 Ago 2013 18:08
por joaosolution
Jairo

Sim normalmente declaro getlist:={} no início de todas a funções.

Att
João Bosco

Não sair do sistema

Enviado: 08 Ago 2013 07:37
por Jairo Maia
Ok.

Mas eu ainda acho que você poderia mudar este trecho do seu código:

Código: Selecionar todos

BEGIN SEQUENCE
      oOldError = ErrorBlock( { || DoBreak() } )
      MemoWrit( "Error.log", cErrorLog )
END SEQUENCE
Por este e testar:

Código: Selecionar todos

MemoWrit( "Error.log", cErrorLog )
Break( MenuPrincipal() )