MsgInfoEx

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

MsgInfoEx

Mensagem por Claudio Soto »

Hola a todos.
He desarrollado una función que convierte cualquier tipo de dato, ya sea valores de variables o contenido de matrices (inclusive sub-matrices) en una cadena de caracteres. Me es muy útil para depurar programas. Si bien la misma fue escrita para HMG se puede aplicar fácilmente a modo consola sustituyendo MsgInfo() por hb_Alert() (ver la directiva #command al inicio).
Espero que les sea útil.
Saludos,
Claudio Soto.

Código: Selecionar todos

*******************************************************************************
* ARCHIVO:  MsgInfoEx.prg
* FECHA:    Setiembre 2012
* AUTOR:    Dr. CLAUDIO SOTO
* PAIS:     URUGUAY
* E-MAIL:   srvet@adinet.com.uy
* BLOG:     http://srvet.blogspot.com
*******************************************************************************

#include "hbclass.ch"
#include <hmg.ch>
// #command MsgInfo(<arg1>,<arg2>) => hb_Alert(<arg1>)


//********************************************************************************************************
// MsgInfoEx (xMsg = [Array or xVar], [cSeparator], [cTitle], [bInfoDebug = .T.|.F.])
//********************************************************************************************************

FUNCTION MsgInfoEx (xMsg, cSeparator, cTitle, bInfoDebug) 
LOCAL cMsg
   cMsg := VarToStr (xMsg, cSeparator, bInfoDebug)
   MsgInfo (cMsg, cTitle)
RETURN cMsg



//********************************************************************************************************
// VarToStr (Data = [Array or xVar], [cSeparator], [bInfoDebug = .T.|.F.])
//********************************************************************************************************

FUNCTION VarToStr (Data, cSeparator, bInfoDebug)
LOCAL i, text:="", nLen := 0
   
   cSeparator := IF (ValType(cSeparator) == "U", " ", cSeparator)
   bInfoDebug := IF (ValType(bInfoDebug) <> "L", .F., bInfoDebug)
   
   IF ValType (Data) == "A"
      nLen := LEN (Data)
      text := text + IF (bInfoDebug, " { ", "")
      FOR i = 1 TO LEN (Data)
          text := text + VarToStr (Data [i], cSeparator, bInfoDebug) + IF (i < nLen, cSeparator,"")
      NEXT
      text := text + IF (bInfoDebug, " } ", "")
   ELSEIF ValType (Data) == "B"
          text := text + IF (bInfoDebug, " {|| ", "") 
          text := text + VarToStr (EVAL(Data), cSeparator, bInfoDebug) 
          text := text + IF (bInfoDebug, " } ", "")
   ELSE
      IF ValType (Data) == "C" .OR. ValType (Data) == "M"
         text := text + Data 
      ELSEIF ValType (Data) == "D"
         text := text + DTOC (Data)
      ELSEIF ValType (Data) == "L"
         text := text + IF (Data, ".T.",".F.")
      ELSEIF ValType (Data) == "N"
         text := text + ALLTRIM(STR(Data, 18, LENNUM(Data) - LENNUM(INT(Data)) -1))
      ELSEIF ValType (Data) == "U"
         text := text + "NIL"
      ELSEIF ValType (Data) == "O"
         text := text + "::Object::"
      ELSE
         text := text + "|Unknown Data|"
      ENDIF
   ENDIF
RETURN text



***************************************************************************************
* Example
***************************************************************************************

FUNCTION Main
   SET DATE TO BRITISH
   SET CENTURY ON
   
   aWHITE := {255,255,255}
   aBLACK := {  0,  0,  0}
   
   aMat := {{aWHITE, aBLACK},;
            { 10, 20, 30, 40, 50},;
            {{100, {"Hello", aWHITE, "HMG"}}, {200, 300, 400}},;
            {{},NIL}};
   
   MsgInfoEx ({"Desktop Width = ", GetDesktopWidth(), "Desktop Height = ", GetDesktopHeight()}, ,"Test1", .F.)
   MsgInfoEx (aMat, ", " ,"Test2", .T.)
   MsgInfoEx ({15, 20, date(), 23.5, "Hello", aBLACK, {10,12,aWHITE}, {||10*2+1}}, " , " ,"Test3", .T.)
   MsgInfoEx ({13.9999, {|| 10 < 12}, NIL, aWHITE}, NIL ,"Test4")
   MsgInfoEx (13.9999, NIL ,"Test5")

   oTest := ClassTest()
   oTest:GetSetValue (100)
   oTest:lFlag := .T.
   MsgInfoEx ({oTest, oTest:GetSetValue(), oTest:GetSetValue(200), oTest:lFlag, oTest:lFlag:=.F.}, "  -  ","Test6")

   cMsg := VarToStr({oTest, oTest:GetSetValue(), oTest:lFlag, "Hello World", aWHITE, 21.33}, " , ", .T.)
   MsgInfo (cMsg, "Test7")
   
RETURN


CLASS ClassTest 
   DATA   Value         INIT   0   PROTECTED
   DATA   lFlag         INIT  .F.
   METHOD GetSetValue   SETGET
ENDCLASS

METHOD GetSetValue (Arg) CLASS ClassTest
   IF PCOUNT() == 0
      RETURN ::Value
   ELSE
      ::Value := Arg
   ENDIF
RETURN 
Anexos
MsgInfoEx_Test.jpg
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

MsgInfoEx

Mensagem por Claudio Soto »

Hola a todos.
Esta función me la envió Marek Olszewski, hace lo mismo que la anterior pero es mucho mas sencilla al emplear la función hb_ValToExp () de Harbour.
Saludos,
Claudio.

Código: Selecionar todos

// by Marek Olszewski
function DebugMSG
   local i, aTemp := {}   
   for i := 1 to pcount()
      aadd( aTemp, hb_PValue(i))
   next i
   msgbox(hb_valtoexp(aTemp), "Debug Informations")
 return
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

MsgInfoEx

Mensagem por Jairo Maia »

Olá Claudio Soto,

Obrigado por seus compartilhamentos.

Apenas para registro, veja também a função do Harbour: Hb_ValToStr()

Código: Selecionar todos

Function Main()

 SET DATE BRITISH
 SET CENTURY ON

 Clear Screen

 dDate    := Date()
 lTrue    := .T.
 lFalse   := .F.
 nDecimal := ( 4.0 / 2 )
 nInteger := 10
 uNil     := Nil
 cString  := "Teste com a funcao Hb_ValToStr()"

 cMsg := Hb_ValToStr( dDate ) + Hb_Eol()
 cMsg += Hb_ValToStr( lTrue ) + Hb_Eol()
 cMsg += Hb_ValToStr( lFalse ) + Hb_Eol()
 cMsg += Hb_ValToStr( nDecimal ) + Hb_Eol()
 cMsg += Ltrim( Hb_ValToStr( nInteger ) ) + Hb_Eol()
 cMsg += Hb_ValToStr( uNil ) + Hb_Eol()
 cMsg += Hb_ValToStr( cString )

 ?
 ? cMsg
 ?

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

MsgInfoEx

Mensagem por Claudio Soto »

Hola Jairo.
Jairo Maia escreveu: veja também a função do Harbour: Hb_ValToStr()
Gracias por la información, realmente no conocía la existencia de las funciones Hb_ValToStr() y hb_ValToExp() de Harbour.
Saludos,
Claudio.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Responder