Clipper On Line • Ver Tópico - Visualizar XML

Visualizar XML

Discussão sobre ferramentas de apoio à programação (Clipper/[x]Harbour)

Moderador: Moderadores

 

Visualizar XML

Mensagempor JoséQuintas » 01 Out 2016 10:46

Alguém chegou a montar alguma coisa pra visualizar XML?
Tentei assim, mas é pouco ainda.


#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""

   FOR EACH cLetra IN cText
      IF cLetra == "<"
         nAbreFecha := iif( Substr( cText, cLetra:__EnumIndex + 1, 1 ) != "/", NODE_ABRE, NODE_FECHA )
         IF nAbreFecha == NODE_ABRE .OR. ( nAbreFecha == NODE_FECHA .AND. nAbreFechaAnterior == NODE_FECHA )
            AAdd( aTextList, cText2 )
            cText2 := ""
         ENDIF
         nAbreFechaAnterior := nAbreFecha
      ENDIF
      cText2 += cLetra
   NEXT
   IF ! Empty( cText2 )
      AAdd( aTextList, cText2 )
   ENDIF
   FOR EACH oElement IN aTextList
      nCol -= iif( Left( oElement, 2 ) == "</", 3, 0 )
      oElement := Pad( Space( nCol ) + oElement, 98 )
      nCol += iif( ! "</" $ oElement .AND. ! "/>" $ oElement, 3, 0 )
   NEXT

   CLS
   AChoice( 1, 1, 39, 99, aTextList )

   RETURN


testexml.png


Nota: seria pra visualizar sem existir arquivo XML em disco.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 01 Out 2016 11:47

Ainda não está bom, mas tá interessante, entrando e saindo dos blocos..
Com uso de recursividade:
A função chamando ela mesma. Nessas horas, variáveis locais é de extrema importância.


#include "inkey.ch"
#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""

   FOR EACH cLetra IN cText
      IF cLetra == "<"
         nAbreFecha := iif( Substr( cText, cLetra:__EnumIndex + 1, 1 ) != "/", NODE_ABRE, NODE_FECHA )
         IF nAbreFecha == NODE_ABRE .OR. ( nAbreFecha == NODE_FECHA .AND. nAbreFechaAnterior == NODE_FECHA )
            IF ! Empty( cText2 )
               AAdd( aTextList, cText2 )
            ENDIF
            cText2 := ""
         ENDIF
         nAbreFechaAnterior := nAbreFecha
      ENDIF
      cText2 += cLetra
   NEXT
   IF ! Empty( cText2 )
      AAdd( aTextList, cText2 )
   ENDIF
   FOR EACH oElement IN aTextList
      nCol     -= iif( Left( oElement, 2 ) == "</", 3, 0 )
      oElement := Pad( Space( nCol ) + oElement, 98 )
      nCol     += iif( ! "</" $ oElement .AND. ! "/>" $ oElement, 3, 0 )
   NEXT

   Inkey(0)
   CLS
   TBrowseXml( 1, aTextList, "XML" )

   RETURN

FUNCTION TBrowseXml( nRow, aTextList, cTitulo )

   LOCAL aSubText := {}, oElement, nCol, aItem := {}, nOpc, nBegin, aNewText := {}, cLetra, nCont, cTelaSalva

   IF Len( aTextList ) == 0
      RETURN NIL
   ENDIF
   nCol := 0
   FOR EACH cLetra IN aTextList[ 1 ]
      IF cLetra != " "
         EXIT
      ENDIF
      nCol += 1
   NEXT
   FOR EACH oElement IN aTextList
      IF ! Substr( oElement, nCol + 1, 1 ) == " " .OR. Len( oElement ) < nCol
         AAdd( aSubText, oElement )
         AAdd( aItem, oElement:__EnumIndex )
      ENDIF
   NEXT

   DO WHILE .T.
      @ nRow, nCol - 1 CLEAR TO Min( nRow + Len( aSubText ) + 2, 40 ), 100
      @ nRow, nCol - 1 TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
      @ nRow, nCol - 1 + 20 SAY cTitulo COLOR "N/W"
      nOpc := AChoice( nRow + 1, nCol, Min( nRow + Len( aSubText ) + 2, 39 ), 99, aSubText )

      IF LastKey() == K_ESC
         EXIT
      ENDIF
      nBegin := aItem[ nOpc ]
      FOR nCont = nBegin + 1 TO Len( aTextList )
         IF Substr( aTextList[ nCont ], nCol + 1, 1 ) != " "
            EXIT
         ENDIF
         AAdd( aNewText, aTextList[ nCont ] )
      NEXT
      SAVE SCREEN TO cTelaSalva
      TBrowseXml( nRow + 1, aNewText, aSubText[ nOpc ] )
      RESTORE SCREEN FROM cTelaSalva
   ENDDO

   RETURN NIL


testexml.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 01 Out 2016 11:54

A título de curiosidade:

Neste bloco, verifico em que coluna começa o primeiro texto, que é a coluna que vai ser tratada no browse:
   nCol := 0
   FOR EACH cLetra IN aTextList[ 1 ]
      IF cLetra != " "
         EXIT
      ENDIF
      nCol += 1
   NEXT


Então, pego todos os títulos na mesma coluna, guardando o título e a posição na lista geral

   FOR EACH oElement IN aTextList
      IF ! Substr( oElement, nCol + 1, 1 ) == " " .OR. Len( oElement ) < nCol
         AAdd( aSubText, oElement )
         AAdd( aItem, oElement:__EnumIndex )
      ENDIF
   NEXT


Com a opção escolhida, vou lá no array, e pego tudo dentro dele, baseado em que tudo vai ter espaço em branco no início.

      nBegin := aItem[ nOpc ]
      FOR nCont = nBegin + 1 TO Len( aTextList )
         IF Substr( aTextList[ nCont ], nCol + 1, 1 ) != " "
            EXIT
         ENDIF
         AAdd( aNewText, aTextList[ nCont ] )
      NEXT


Uma vez com o array interno pronto, só chamar a própria rotina, e tudo vai se repetindo.

      TBrowseXml( nRow + 1, aNewText, aSubText[ nOpc ] )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 01 Out 2016 17:00

Melhorei um pouquinho pra tags <.../> e pra não cortar a linha, senão corta a tag final.
E um pouquinho o visual da navegacão.


#include "inkey.ch"
#include "hbgtinfo.ch"
#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""

   FOR EACH cLetra IN cText
      IF cLetra == "<"
         nAbreFecha := iif( Substr( cText, cLetra:__EnumIndex + 1, 1 ) != "/", NODE_ABRE, NODE_FECHA )
         IF nAbreFecha == NODE_ABRE .OR. ( nAbreFecha == NODE_FECHA .AND. nAbreFechaAnterior == NODE_FECHA )
            IF ! Empty( cText2 )
               AAdd( aTextList, cText2 )
            ENDIF
            cText2 := ""
         ENDIF
         nAbreFechaAnterior := nAbreFecha
      ENDIF
      cText2 += cLetra
      IF cLetra = ">" .AND. Substr( cText, cLetra:__EnumIndex - 1, 1 ) == "/"
         IF ! Empty( cText2 )
            AAdd( aTextList, cText2 )
            cText2 := ""
         ENDIF
      ENDIF
   NEXT
   IF ! Empty( cText2 )
      AAdd( aTextList, cText2 )
   ENDIF
   FOR EACH oElement IN aTextList
      nCol     -= iif( Left( oElement, 2 ) == "</", 3, 0 )
      oElement := Space( nCol ) + oElement
      nCol     += iif( ! "</" $ oElement .AND. ! "/>" $ oElement, 3, 0 )
      //? oElement
      //Inkey(1)
   NEXT

   TBrowseXml( 1, 1, aTextList, "XML" )

   RETURN

FUNCTION TBrowseXml( nRow, nCol, aTextList, cTitulo )

   LOCAL aSubText := {}, oElement, nPos, aItem := {}, nOpc, nBegin, aNewText := {}, cLetra, nCont, cTelaSalva

   IF Len( aTextList ) == 0
      RETURN NIL
   ENDIF
   nPos := 0
   FOR EACH cLetra IN aTextList[ 1 ]
      IF cLetra != " "
         EXIT
      ENDIF
      nPos += 1
   NEXT
   FOR EACH oElement IN aTextList
      IF ! Substr( oElement, nPos + 1, 1 ) == " " .OR. Len( oElement ) < nPos
         AAdd( aSubText, oElement )
         AAdd( aItem, oElement:__EnumIndex )
      ENDIF
   NEXT

   DO WHILE .T.
      @ nRow, nCol - 1 CLEAR TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
      @ nRow, nCol - 1 TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
      @ nRow, nCol - 1 + 20 SAY cTitulo COLOR "W/GR+"
      nOpc := AChoice( nRow + 2, nCol, Min( nRow + Len( aSubText ) + 2, 39 ), 99, aSubText )

      IF LastKey() == K_ESC
         EXIT
      ENDIF
      nBegin := aItem[ nOpc ]
      FOR nCont = nBegin + 1 TO Len( aTextList )
         IF Substr( aTextList[ nCont ], nPos + 1, 1 ) != " "
            EXIT
         ENDIF
         AAdd( aNewText, Substr( aTextList[ nCont ], nPos + 2 ) )
      NEXT
      SAVE SCREEN TO cTelaSalva
      TBrowseXml( nRow + 2, nCol + 5, aNewText, aSubText[ nOpc ] )
      RESTORE SCREEN FROM cTelaSalva
   ENDDO

   RETURN NIL


A partir daí, só com biblioteca visual pra melhorar.

testexml.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 01 Out 2016 17:02

A propósito, errei na parte mais simples:

@ nRow, nCol - 1 CLEAR TO Min( nRow + Len( aSubText ) + 3, 40 ), 100
@ nRow, nCol - 1 TO Min( nRow + Len( aSubText ) + 3, 40 ), 100


Se é 40 linhas por 100 colunas, os maximos são 39 e 99..... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 01 Out 2016 17:07

Após correção, deu até pra ver um bug no Windows (acho)
Reparem a cor da janela, CLS não preencheu toda janela do prompt.

testexml.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor runner » 01 Out 2016 19:21

Olá, José Quintas.

Era justamente o que eu estava precisando, agradeço o seu apoio, agora não vou mais precisar gravar os meus xmls para geração da NFe, CTe e MDFe.
Harbour 3.2 + Minigui Extended 16 + xDev
runner
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 69
Data de registro: 03 Ago 2007 05:17
Cidade/Estado: GUARULHOS-SP
Curtiu: 0 vez
Mens.Curtidas: 3 vezes

Visualizar XML

Mensagempor gilbertosilverio » 03 Out 2016 09:01

Ola Jose,

Instalei a versão hb34 em uma maquina zerada, pra poder testa-lo, pois uso em produção uma versao do XHB 1.10 e HWGUI do BASSO que funcionava normalmente ate as ultimas atualizaçoes do W10, gostaria de poder usar uma verão mais nova do HB, pra não ficar parado, e ver se estes problemas que começaram a aparecer, seram resolvidos.

Este teu exemplo, para ler xml, compila normalmente, mais quando executo da a mensagem de erro:
error base/1070 arqgument error: ==

Como não cria nem log de erro, deduzi que o erro esta nesta linha, nCol -= iif( Left( oElement, 2 ) == "" $ oElement, 3, 0 )

To apanhando um bocado, pra usar o HBMK2, ja li varios tutoriais de como usa-lo, mais a maioria do prgs que compilo, da erro ou não executa.

Como devo compilar este prg, fiz assim: HBMK2 TESTE_ZE.PRG, alguma dica?

Grato.
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Visualizar XML

Mensagempor JoséQuintas » 03 Out 2016 09:45

Uma coisa é o Harbour sozinho, console.
Outra coisa é o Harbour sozinho ou com lib gráfica, ambiente gráfico.

No ambiente gráfico, se o EXE se fecha, a janela se fecha, o que fecha junto a janela de erros.

Eu uso uma errorsys que modifiquei pra abrir no bloco de notas.

Compilei normal, sem precisar adicionar nenhuma LIB. (com Harbour 3.4)

hbmk2 teste 


Convém lembrar que usei um determinado xml de teste.
Não sei se XMLs errados, ou XML contendo alguma coisa não prevista, possa causar erro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor gilbertosilverio » 03 Out 2016 09:57

Jose,

Tentei com diversos xmls de NFes validadas, autorizadas, etc, mais nenhuma abre...

Compilei igual ao que voce reportou, o HB34 que montei, segui o teu exemplo de como instalar o HB34 que voce postou aqui no forum em um maquina zerada, para não ter "sujeiras" de outras versões.

Vou tentar identificar o que acontece, e depois reporto aqui.

Grato.
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Visualizar XML

Mensagempor JoséQuintas » 03 Out 2016 10:02

Complemento:
Dá pra encontrar a errorsys que uso aqui:

https://github.com/JoseQuintas/AllInOne

Nesse caso, para compilar o teste com a errorsys:

hbmk2 teste errorsys
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 03 Out 2016 10:23

To apanhando um bocado, pra usar o HBMK2, ja li varios tutoriais de como usa-lo, mais a maioria do prgs que compilo, da erro ou não executa.


hbmk2 é pra ajudar a compilar, mas ele não faz mágica.
Tanto faz linha de comando, ou usando um HBP, os comandos são os mesmos, a diferença em HBP é separar um comando por linha.

Se forem exemplos criados usando a compilação -w3 -es2, então facilita se compilar igual, pra identificar se falta alguma coisa.
É que se não forem criados com isso, vai acusar muito mais erros, e complica... rs

basicamente é apenas colocar a lista de fontes.
Se os fontes usam arquivo .CH, ou biblioteca adicional, precisa indicar isso também no HBP. (ou linha de comando).
O hbmk2 só busca automático a parte básica

esse exemplo com console:

hbmk2 test


esse exempo com gtwvg:

hbmk2 test gtwvg.hbc


supondo que pegue um exemplo que use funções da gtwvg, ou funções da hbwin, etc.

hbmk2 test hbwin.hbc gtwvg.hbc


e se for usando arquivo hbp:
#arquivo.hbp
test
hbwin.hbc
gtwvg.hbc


hbmk2 arquivo.hbp


Lembre-se do Clipper.

um fonte do clipper:

clipper teste
rtlink fi teste


se no fonte usa diferente do padrão, por exemplo uma biblioteca que não é do Clipper:

clipper teste
rtlink fi teste lib outralib


se as libs do clipper não estão na pasta atual, ou indica SET LIB=c:\pasta ou:

clipper teste
rtlink fi teste lib c:\clipper\clipper, c:\clipper\dbfntx, c:\clipper\extend, c:\tools\outralib


Não é o hbmk2 que é complicado, é que acostumamos com tudo automático, e esquecemos do básico.
SET PATH, SET LIB, SET OBJ
Com Clipper é muito mais complicado do que com Harbour/hbmk2.

Mas tem um porém ai:
Também estão chamando de Harbour TUDO, e não é tudo.
hwgui, minigui, qt, etc. são bibliotecas adicionais, que necessitam configuracões adicionais.
hbide é um ambiente de compilação que também exige configurações especificas.

E dependendo de onde obter o Harbour, ele pode ou não vir com o compilador C junto.
Se o compilador C estiver no lugar adequado, e configurado no PATH, o hbmk2 pega automático.

Não queira testar tudo que é exemplo do jeito padrão, porque depende se o exemplo usa alguma lib adicional, pra indicar algo mais no HBP/linha de comando.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor JoséQuintas » 03 Out 2016 10:38

Dica pra usar o debug do Harbour, que é igual ao do Clipper:

coloquei um inkey(0) no início do fonte principal:

#define NODE_ABRE  1
#define NODE_FECHA 2

PROCEDURE Main

   LOCAL cText, cText2, cLetra, nAbreFecha, aTextList := {}, oElement, nCol := 0, nAbreFechaAnterior := 0

   SetMode( 40, 100 )
   SetColor( "W/B,N/W,,,W/B" )
   CLS
   cText  := MemoRead( "test.xml" )
   cText2 := ""
   Inkey(0)


compilei usando -b

hbmk2 test -b


Ao executar test, tecle Alt-D, e depois espaço (não sei porque precisa o espaco, mas tudo bem).

debug.png


Depois disso pode ir teclando F8, e acompanhar linha a linha.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Visualizar XML

Mensagempor gilbertosilverio » 03 Out 2016 13:11

Jose,

Muito obrigado pelas dicas, consegui fazer funcionar... vou agora tentar compilar a HWGUI 220 e ver como se comporta.
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Visualizar XML

Mensagempor alxsts » 03 Out 2016 19:14

Olá!
JoséQuintas escreveu:coloquei um inkey(0) no início do fonte principal:

Ao invés de Inkey(0), pode colocar direto uma ou várias chamadas à função AltD() nos pontos onde desejar parar o programa.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

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




Retornar para Ferramentas de Apoio

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 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