Após o desenvolvimento parcial do ErrorLog tratado no tópico ErrorLog - Captura de Variáveis, estou tentando adaptar ele a um aplicativo de leitura de Porta Serial, que já está funcionando em MiniGui com o ErrorLog padrão da MiniGui. Este ErrorLog foi baseado no código publicado pelo colega Adalberto del Rosario.
Digo parcial porque o MyErrorLog() em desenvolvimento está em fase bem adiantada, faltando somente terminar a rotina de captura das variáveis que ainda está com problemas e parada.
Enquanto não aparecerem novas idéias, estou tentando adaptar o MyErrorLog() ao aplicativo mencionado no primeiro parágrafo.
Mas o MyErroLog() não funciona, ou seja, a MiniGui continua a gravar o erro no ErrorLog padrão da MiniGui, e não grava no arquivo definido na linha 46 da Função MyErroFunc.prg.
Para análise dos colegas estou anexando o código abaixo.
Main()
*FrmWinHS.fmg
#include "hmg.ch"
#Include 'Inkey.Ch'
#include "MiniGUI.ch"
*
REQUEST HB_GT_WIN_DEFAULT // Janela DOS - Temporário para testes.
*
#includes diversos
*
*==================================================================================================
FUNCTION Main()
*
* procedimentos iniciais.....
*
n_Porta := PRM->PRMCOM
c_Porta := ALLTRIM( STR( PRM->PRMCOM ) )
n_Baud := PRM->PRMBRT
n_DtBit := PRM->PRMDTB
c_Prty := PRM->PRMPRT
n_StpBt := PRM->PRMSTB
n_X1 := PRM->PRMLIN // Endereços de tela.
n_Y1 := PRM->PRMCOL
n_Lrg := PRM->PRMLRG // Medidas da janela.
n_Alt := PRM->PRMALT
n_Size := 1024 // Tamalnho do Buffer.
n_Interv := 100 // Intervalo entre leituras da Porta Serial.
*
DEFINE WINDOW principal AT n_X1, n_Y1 WIDTH n_Lrg HEIGHT n_Alt ;
TITLE "HS611 - COM " + c_Porta MAIN ;
ON INIT Dados_Iniciais( c_Form ) ;
ON RELEASE COM_CLOSE( n_Porta )
*
@ 12, 15 LABEL label_1 WIDTH 160 HEIGHT 16 ;
VALUE 'COM ' + c_Porta + " => INATIVA" ;
FONT 'Times New Roman' SIZE 14
principal.label_1.fontcolor := RED
*
DEFINE TIMER Timer_1 INTERVAL n_Interv ACTION Ctrl_Read()
*
END WINDOW
*
ACTIVATE Window principal
*
RETURN( NIL )
*
*
*
*==================================================================================================
FUNCTION InitError( c_Form )
*
LOCAL oErrAntes, oErr // oErrorAntes = Para almacenar el ErrorBlock Anterior
LOCAL lMyError := .F. // lMyError = .t. - Si ocurrio realmente un error, .f. - para controlar los BREAK
*
oErrAntes := ERRORBLOCK( { | objErr | BREAK( objErr ) } )
*
BEGIN SEQUENCE
*
* NIL
*
RECOVER USING oErr
*
IF oErr <> NIL
lMyError := .T. // Especifica que realmente ocurreu um erro.
MyErrorFunc( oErr )
ENDIF
*
END
*
ERRORBLOCK( oErrAntes )
*
IF lMyError
MsgBox( "Ocorreu um erro e o sistema não pode completar a operação", "Error" )
ENDIF
*
RETURN( NIL )
*
*
*==================================================================================================
* Função de leitura da Porta Serial e gravação dos dados.
*--------------------------------------------------------------------------------------------------
FUNCTION Ctrl_Read( hwnd )
*
Liga_Timer( "PARAR" ) // Para a contagem de tempo.
*
*
* aqui rotina principal.
*
*
*
Liga_Timer( "INICIAR" ) // Re-inicia a contagem de tempo.
*
RETURN( NIL )
DEFINE WINDOW Principal AT n_X1, n_Y1 WIDTH n_Lrg HEIGHT n_Alt ;
TITLE "HS611 - COM " + c_Porta MAIN ;
ON INIT { || InitError() } ;
ON RELEASE { || COM_CLOSE( n_Porta ) }
*
@ 12, 15 LABEL label_1 WIDTH 160 HEIGHT 16 ;
VALUE 'COM ' + c_Porta + " => INATIVA" ;
FONT 'Times New Roman' SIZE 14
Principal.label_1.fontcolor := RED
*
DEFINE TIMER Timer_1 INTERVAL n_Interv ACTION Ctrl_Read()
*
END WINDOW
MyErrorFunc.prg
*****
* Manejo de Errores
* Extraido de ErrorSys.prg
* Adalberto del Rosario
*****
*
#include <minigui.ch>
#include "error.ch"
#include "FileIO.ch"
*
#define CRLF CHR(13) + CHR(10)
*
*--------------------------------------------------------------------------------------------------
FUNCTION MyErrorFunc( MyObjError )
*
LOCAL cErrorMsg, HtmArch, cText, i := 2
*
cErrorMsg := MyErrorMessage( MyObjError )
*
HtmArch := Html_ErrorLog()
Html_LineText( HtmArch, '<p class="updated">Date: ' + Dtoc(Date()) + " " + "Time: " + Time() )
Html_LineText( HtmArch, cErrorMsg + "</p>" )
*
cErrorMsg += CRLF + CRLF
*
WHILE ! Empty( ProcName( i ) )
cText := "Called from " + ProcName( i ) + "(" + AllTrim( Str( ProcLine( i++ ) ) ) + ")" + CRLF
cErrorMsg += cText
ENDDO
*
MsgStop( cErrorMsg, 'Program Error...Ivo' )
*
RETURN .T.
*
*
*--------------------------------------------------------------------------------------------------
STATIC FUNCTION MyErrorMessage( oError )
*
LOCAL c_Message, c_ScrnMsg, cVarName
LOCAL n_WorkArea := Select()
*
*------------------------------------ Gerar nome do LogFile ------------------------------------
I := 0
WHILE .T.
I ++
c_LogFile := "ERRORLOG_" + STRZERO( I, 03 ) + '.txt'
IF ! FILE( c_LogFile )
EXIT
EndIf
ENDDO
*-----------------------------------------------------------------------------------------------
* Aqui seguem as Informações:
* Tipo do erro, Número do erro, Descrição do Erro, Nome do Arquivo em uso aberto,
* Posição do registro do arquivo.
* Objeto do erro.
* Trace do erro.
* Variáveis ativas e seus conteúdos - FALTANDO.
* Disco, Diretório, Data, Hora, Memória Livre, Memória Disponível.
* SET's ativos.
* Informações de todos os arquivos DBF e CDX abertos, Índices ativos, Chaves dos índices, Relações ativas.
*
RETURN( NIL )
Onde está o erro ?