Clipper On Line • Ver Tópico - ErroLog - Captura de variáveis

ErroLog - Captura de variáveis

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

ErroLog - Captura de variáveis

Mensagempor Hasse » 21 Mar 2014 18:31

Boa tarde meus colegas.

Estou tentando montar uma função de ErrorLog, mas a coisa não é fácil, e há poucos exemplos. A maioria só trata de setar os dados necessários para que um errorlog funcione.

Para começar, em todos os prg's de error que encontrei, nenhum deles aborda um código que faça o que estou procurando, ou seja, listar as variáveis que estão em uso no instante do erro.

No ambiente MiniGui isto não é possível ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

ErroLog - Captura de variáveis

Mensagempor Toledo » 21 Mar 2014 20:46

Amigo, todo controle de erro run time é feito pelo Harbour, então você pode usar qualquer comando do harbour (ou mesmo clipper, já que é compatível) para pegar estas variáveis. Na fonte do xhb da Contrib do Harbour tem o arquivo xhberr.prg que pega todas as variáveis que estão na memória, veja abaixo parte do xhberr.prg que faz isto:

      SAVE ALL Like * TO errormem
      nMemHandle := FOpen( "errormem.mem", FO_READWRITE )
      nMemLength := FSeek( nMemHandle, 0, FS_END )
      FSeek( nMemHandle, 0 )
      nCount := 1
      WHILE FSeek( nMemHandle, 0, FS_RELATIVE ) + 1 < nMemLength
         nMemWidth := Space( 18 )
         FRead( nMemHandle, @nMemWidth, 18 )
         cVarName  := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
         cVarType  := SubStr( nMemWidth, 12, 1 )
         cVarRec   := Bin2W( Right( nMemWidth, 2 ) )
         nMemCount := iif( cVarType $ Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
         FSeek( nMemHandle, nMemCount, FS_RELATIVE )
         cTemp  := Left( cVarName + Space( 10 ), 10 )
         cTemp  += " TYPE " + Type( cVarName )
         cTemp  += " " + iif( Type( cVarName ) == "C", '"' + &cVarName + '"', strvalue( &cVarName ) )
         nBytes := 0
         SWITCH ValType( cVarName )
         CASE "C"
            nBytes += ( nLenTemp := Len( &cVarName ) )
            EXIT
         CASE "N"
            nBytes += ( nLenTemp := 9 )
            EXIT
         CASE "L"
            nBytes += ( nLenTemp := 2 )
            EXIT
         CASE "D"
            nBytes += ( nLenTemp := 9 )
            EXIT
         ENDSWITCH
         FWrite( nFhandle, "            " + Transform( nLenTemp, "999999" ) + "bytes -> " )
         FWriteLine( nHandle, "      " + cTemp )
      ENDDO
      FClose( nMemHandle )
      FErase( "errormem.mem" )

ATENÇÃO: o código acima é apenas uma parte do arquivo, então não é "compilável", servindo apenas para exemplo.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

ErroLog - Captura de variáveis

Mensagempor alxsts » 21 Mar 2014 21:10

Olá!

No trecho de código mostrado, somente as variáveis public e private dos tipos de dados Character, Date, Logic e Numeric serão salvas, já que o comando SAVE é usado. Variáveis local e static ficarão de fora, assim como arrays e code blocks public e private...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

ErroLog - Captura de variáveis

Mensagempor Hasse » 21 Mar 2014 22:23

Boa noite amigos.

Esta abertura foi muito boa. Encontrei alguns exemplos muito ricos, principalmente no tópico errorsys no Harbour.
Tenho um vasto material para estudar.

Obrigado.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

ErroLog - Captura de variáveis

Mensagempor Hasse » 23 Mar 2014 17:01

Boa tarde a todos.

Estou quase terminando e está ficando com a cara desejada. Bem o quase é que é o problema....

Quando da captura das variáveis acontece que consigo recuperar o nome das variáveis (ex: c_Var1), mas quando tento recuperar o conteúdo dela (ex: &c_var1) a coisa não funciona.

Abaixo o código do trecho em questão:
   SAVE ALL Like * TO errormem
   nMemHandle := FOpen( "errormem.mem", FO_READWRITE )
   nMemLength := FSeek( nMemHandle, 0, FS_END )
   FSeek( nMemHandle, 0 )
   n_Count := 1
   WHILE FSeek( nMemHandle, 0, 1 ) + 1 < nMemLength
      nMemWidth := Space( 18 )
      FRead( nMemHandle, @nMemWidth, 18 )
      cVarName  := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
      cVarType  := SubStr( nMemWidth, 12, 1 )
      cVarRec   := Bin2W( Right( nMemWidth, 2 ) )
      nMemCount := IIF( cVarType $ Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
      FSeek( nMemHandle, nMemCount, FS_RELATIVE )

      nBytes    := 0
      *
      c_Message += '1-' + cVarName + CRLF
      c_Message += '2-' + Type( "cVarName" ) + CRLF
      c_Message += '3-' + ValType( cVarName ) + CRLF

*      c_Temp := StrValue( &cVarName )     

*      c_Message     += StrValue( &cVarName )
*      c_Message     += " bytes   : "
*      c_Message     += Left( cVarName + Space( 10 ), 10 )
*      cTemp     += '   '
*      cTemp     += ValType( cVarName )
*      cTempo    += '  '
*      cTemp     += strvalue( &cVarName )

*      cTemp     += " ValType " + ValType( cVarName )
*      cTemp     += " " + IIF( Type( cVarName ) == "C", '"' + &cVarName + '"', strvalue( &cVarName ) )
*      c_Message += " VALTYPE " + ValType( cVarName )

*      IF ValType( cVarName ) == "C"
*        c_Message += '"' + ( cVarName ) + '"'
*      ELSE
*         c_Mesage += strvalue( &cVarName )
*      ENDIF

*      *
      c_Message += CRLF

*      SWITCH ValType( cVarName )
*         CASE "C"
*            nBytes += ( nLenTemp := Len( &cVarName ) )
*            EXIT
*         CASE "N"
*            nBytes += ( nLenTemp := 9 )
*            EXIT
*         CASE "L"
*            nBytes += ( nLenTemp := 2 )
*            EXIT
*         CASE "D"
*            nBytes += ( nLenTemp := 9 )
*            EXIT
*      END

   ENDDO
   FClose( nMemHandle )
   FErase( "errormem.mem" )

Observar que até onde inicia a parte comentada do código funciona corretamnente, mas basta descomentar a linha seguinte, c_Temp := StrValue( &cVarName ), que busca recuperar o conteúdo da variável, a rotina deixa de funcionar e o aplicativo parece congelar e preciso fechá-lo no Gerenciador de Tarefas do Windows.

O que deve ser feito ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

ErroLog - Captura de variáveis

Mensagempor Hasse » 25 Mar 2014 10:27

Bom dia colegas.

Nenhuma idéia do que fazer ?

Será que não pode-se usar a funçao MemoRead() que funciona ?

O problema é que não sei como tratar o arquivo, já que a forma de funcionamento do FSeek() é muito diferente do HB_AT().
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

ErroLog - Captura de variáveis

Mensagempor Hasse » 31 Mar 2014 00:12

UFA....Consegui

Após 2 dias de trabalho duro, "pura queimação de Tico-e-Teco" consegui resolver todos os problemas da Captura das Variáveis.
Segue o código:
   SAVE ALL Like * TO errormem                                 && Somente para variáveis PUBLIC e PRIVATE.
   *------------------------------------------------------------------------------------------------------
   *
   nMemHandle := FOpen( "errormem.mem", FO_READWRITE )
   nMemLength := FSeek( nMemHandle, 0, FS_END )
   FSeek( nMemHandle, 0 )
   n_Count := 0
   *
   c_Message += '      Tamanho      Variável      Tipo   Valor' + CRLF
   c_Message += '   --------------------------------------------' + CRLF
   *
   WHILE FSeek( nMemHandle, 0, 1 ) + 1 < nMemLength
      n_Count ++
      nMemWidth := Space( 18 )
      FRead( nMemHandle, @nMemWidth, 18 )
      cVarName  := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
      cVarType  := SubStr( nMemWidth, 12, 1 )
      cVarRec   := Bin2W( Right( nMemWidth, 2 ) )
      nMemCount := IIF( cVarType $ Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
      FSeek( nMemHandle, nMemCount, FS_RELATIVE )
      *
      c_Tipo  := Type( cVarName )
      nBytes  := 0
      IF c_Tipo = "C"
         nBytes  += Len( &cVarName )
      ELSEIF c_Tipo = "N"
         c_Byte  := AllTrim( ValToPrg( &cVarName ) )            && passa.
         nBytes  += Len( c_Byte )
      ELSEIF c_Tipo = "L"
         nBytes += ( 1 )
      ELSEIF c_Tipo = "D"
         c_Byte  := DtoC( &cVarName )            && passa.
         nBytes  += Len( c_Byte )
      ENDIF
      *
      c_Message += '   ' + Str( nBytes, 04, 00 ) + ' Bytes -> '
      c_Message += PADR( cVarName, 13 ) + 'Tipo  '
      c_Message += Type( cVarName ) + ' = '
      *
      IF Type( cVarName ) $ "C"
         c_Message += ValToPrg( &cVarName )
      ELSEIF Type( cVarName ) = "L"
         c_Message += ValToPrg( &cVarName )
      ELSEIF Type( cVarName ) = "D"
         c_Message += DtoC( &cVarName )
      ELSEIF Type( cVarName ) = "N"
         c_Message += AllTrim( Transform( &cVarName, '999999999' ) )
      ELSE
         c_Message += 'Indefinida'
      ENDIF
      c_Message += CRLF
      *
   ENDDO

Obrigado a todos que colaboraram.

RESOLVIDO...
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro