Usuários/senhas/acessos/etc
Moderador: Moderadores
Usuários/senhas/acessos/etc
Tenho uma rotina montada, quase que neste molde mais usando DBF!, feito em GTWVW com xharbour 99.70..
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Um Treeview com opção de expandir cada opção do menu.
Realmente ficaria interessante.
Atualizei de leve, e acrescentei pra ver os grupos de um usuário.
Só a título de curiosidade ou talvez de exemplo.
Nessa imagem, tem o primeiro conjunto de opções com nome do usuário.
Depois tem mais três menus por cima.
Esses três vém daquele array do menu.
Reparem que a rotina é "feita a mão", usando FOR/NEXT pra montar o menu, e InKey(0) pro usuário teclar algo.
A rotina completa, sem limite de níveis, é esta, que só precisa do array com o menu:
Rotinas externas:
- wOpen() e wClose() - apenas pra montar o box (contorno) da opção e salvar/restaurar tela.
- Mensagem() e SetColorNormal() - o nome diz tudo
- MudaAcess() e SelecionaUsuarios() já fazem parte de configuração, e não deste menu
Toda navegação é essa rotina, incluindo uso de mouse.
E ao teclar numa opção com subopções:
Ela chama ela mesma, passando o "sub-array".
Conforme a configuração vai sendo feita, o próprio array armazena o resultado.
Acho que ficou visível o que precisei fazer pra acrescentar a parte de grupos.
Só acrescentei um elemento ao array.
Rotina sem classes, sem nada sofisticado, apenas comandos/funções simples.
O uso de recursividade é que fez a diferença.
Um ótimo exemplo pra mostrar a vantagem de variáveis LOCAL.
Se usasse variáveis PRIVATE ou PUBLIC, sem chance.
Realmente ficaria interessante.
Atualizei de leve, e acrescentei pra ver os grupos de um usuário.
Só a título de curiosidade ou talvez de exemplo.
Nessa imagem, tem o primeiro conjunto de opções com nome do usuário.
Depois tem mais três menus por cima.
Esses três vém daquele array do menu.
Reparem que a rotina é "feita a mão", usando FOR/NEXT pra montar o menu, e InKey(0) pro usuário teclar algo.
A rotina completa, sem limite de níveis, é esta, que só precisa do array com o menu:
Código: Selecionar todos
BoxAcesso( 4, 15, axMenu, 1, "ACESSOS DE " + cUsuario + " (PRÓPRIO/GRUPO)", .F. )
...
FUNCTION BoxAcesso( mLini, mColi, mMenuOpt, mOpc, mTitulo, mSaiSetas, lLiberado4, lLiberado5 )
LOCAL mCont, mLinf, mColf, mTecla
mLinf := mLini + Len( mMenuOpt ) + 2
mColf := mColi + 44
WOpen( mLini, mColi, mLinf, mColf, mTitulo )
Mensagem( "Selecione e tecle ENTER, <S> (Tem Acesso), <N> (Sem Acesso), <ESC> sai" )
DO WHILE .T.
FOR mCont = 1 TO Len( mMenuOpt )
@ mLini + 1 + mCont, mColi + 1 SAY " " + Pad( mMenuOpt[ mCont, 1 ], 31 ) + iif( Len( mMenuOpt[ mCont, 2 ] ) > 0, Chr(16), " " ) + " " + ;
iif( mMenuOpt[ mCont, 4 ], "SIM", "---" ) + " " + iif( mMenuOpt[ mCont, 5 ], "SIM", "---" ) + " " COLOR iif( mCont == mOpc, SetColorFocus(), SetColorBox() )
NEXT
SetColor( SetColorNormal() )
mTecla := Inkey(0)
DO CASE
CASE mTecla == K_ESC
EXIT
CASE mSaiSetas .AND. ( mTecla == K_RIGHT .OR. mTecla == Asc( "6" ) .OR. mTecla == K_LEFT .OR. mTecla == Asc( "4" ) ) // setas
EXIT
CASE mTecla == K_LBUTTONDOWN
IF MROW() > mLini + 1 .AND. MROW() < mLini + 2 + Len( mMenuOpt ) .AND. MCOL() > mColi .AND. MCOL() < mColi + 38
mOpc := MROW() - mLini - 1
Keyboard Chr( K_ENTER )
ENDIF
CASE mTecla == K_RBUTTONDOWN ; Keyboard Chr( K_ESC )
CASE mTecla == K_DOWN .OR. mTecla == Asc( "2" ) ; mOpc := iif( mOpc == Len( mMenuOpt ), 1, mOpc + 1 )
CASE mTecla == K_UP .OR. mTecla == Asc( "8" ) ; mOpc := iif( mOpc == 1, Len( mMenuOpt ), mOpc - 1 )
CASE mTecla == K_HOME .OR. mTecla == Asc( "7" ) ; mOpc := 1
CASE mTecla == K_END .OR. mTecla == Asc( "1" ) ; mOpc := Len( mMenuOpt )
CASE mTecla == Asc( "S" ) .OR. mTecla == Asc( "s" ) ; // MudaAcess( mMenuOpt, mOpc, .T. )
CASE mTecla == Asc( "N" ) .OR. mTecla == Asc( "n" ) ; // MudaAcess( mMenuOpt, mOpc, .F. )
CASE mTecla == K_ENTER
IF Len( mMenuOpt[ mOpc, 2 ] ) > 0
BoxAcesso( mLini + 2, mColi + 10, mMenuOpt[ mOpc, 2 ], 1, mMenuOpt[ mOpc, 1 ], @mMenuOpt[ mOpc, 4 ], @mMenuOpt[ mOpc, 5 ] )
ELSE
// SelecionaUsuarios( mColi + 20, mMenuOpt[ mOpc, 3 ] )
ENDIF
ENDCASE
ENDDO
WClose()
FOR mCont = 1 TO Len( mMenuOpt )
IF mMenuOpt[ mCont, 4 ]
lLiberado4 := .T.
ENDIF
IF mMenuOpt[ mCont, 5 ]
lLiberado5 := .T.
ENDIF
NEXT
RETURN NIL
- wOpen() e wClose() - apenas pra montar o box (contorno) da opção e salvar/restaurar tela.
- Mensagem() e SetColorNormal() - o nome diz tudo
- MudaAcess() e SelecionaUsuarios() já fazem parte de configuração, e não deste menu
Toda navegação é essa rotina, incluindo uso de mouse.
E ao teclar numa opção com subopções:
Código: Selecionar todos
CASE mTecla == K_ENTER
IF Len( mMenuOpt[ mOpc, 2 ] ) > 0
BoxAcesso( mLini + 2, mColi + 10, mMenuOpt[ mOpc, 2 ], 1, mMenuOpt[ mOpc, 1 ], @mMenuOpt[ mOpc, 4 ], @mMenuOpt[ mOpc, 5 ] )
ELSE
// SelecionaUsuarios( mColi + 20, mMenuOpt[ mOpc, 3 ] )
ENDIF
Conforme a configuração vai sendo feita, o próprio array armazena o resultado.
Acho que ficou visível o que precisei fazer pra acrescentar a parte de grupos.
Só acrescentei um elemento ao array.
Rotina sem classes, sem nada sofisticado, apenas comandos/funções simples.
O uso de recursividade é que fez a diferença.
Um ótimo exemplo pra mostrar a vantagem de variáveis LOCAL.
Se usasse variáveis PRIVATE ou PUBLIC, sem chance.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Frazato, deixei passar a sua mensagem.
Em DBF só é interessante se der a opção para o usuário organizar o menu do jeito que quiser.
No meu caso é fixo. só altera apenas o que pode ser visto.
Esse recurso de imagem de fundo é uma coisa que eu gostaria que tivesse na GTWVG.
Frazato:
Na mensagem da tela de configuração está HABILTAR.
Não sei se já corrigiu.
Em DBF só é interessante se der a opção para o usuário organizar o menu do jeito que quiser.
No meu caso é fixo. só altera apenas o que pode ser visto.
Esse recurso de imagem de fundo é uma coisa que eu gostaria que tivesse na GTWVG.
Frazato:
Na mensagem da tela de configuração está HABILTAR.
Não sei se já corrigiu.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
E não é que deu trabalho achar um erro nessa rotina.
Exatamente essa rotina que postei.
Quando não é o primeiro dos menus, tem a opção de sair pela seta: esse parâmetro mSaiSetas
Esqueci dele nessa chamada recursiva quando acrescentei grupos, e acabava mostrando errado na opção com subopções.
A sorte é que isso é usado só pro visual, então não comprometeu a configuração, que é pelo nome de módulos.
Também tive problema porque isolei a rotina de pegar grupos do usuário.
É que esqueci de retornar à área anterior (SELECT nAreaAnt) nessa rotina.
E como na minha senha pula tudo que é checagem... isso aconteceu no cliente.
Aqui também acontecem erros, não sou diferente de ninguém.
Exatamente essa rotina que postei.
Código: Selecionar todos
FUNCTION BoxAcesso( mLini, mColi, mMenuOpt, mOpc, mTitulo, mSaiSetas, lLiberado4, lLiberado5 )
BoxAcesso( mLini + 2, mColi + 10, mMenuOpt[ mOpc, 2 ], 1, mMenuOpt[ mOpc, 1 ], @mMenuOpt[ mOpc, 4 ], @mMenuOpt[ mOpc, 5 ] )
Esqueci dele nessa chamada recursiva quando acrescentei grupos, e acabava mostrando errado na opção com subopções.
A sorte é que isso é usado só pro visual, então não comprometeu a configuração, que é pelo nome de módulos.
Também tive problema porque isolei a rotina de pegar grupos do usuário.
É que esqueci de retornar à área anterior (SELECT nAreaAnt) nessa rotina.
E como na minha senha pula tudo que é checagem... isso aconteceu no cliente.
Aqui também acontecem erros, não sou diferente de ninguém.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Usuários/senhas/acessos/etc
Oi Jose!
Parabéns pelo trabalho ficou muito bom.
Como este fórum é para dar sugestões, segue a minha:
Acho interessante que a senha pudesse ser de pois fatores (por email já seria interessante e SMS seria um plus), onde o usuário poderia recuperar a sua senha e digitar um código. Desta forma evita suporte desnecessário.
Outro ponto é que depois que você introduzir o grupo, o acesso indivual em concomitância com o grupo se tornaria redundante. Lembrando que o usuário poderia ter vários grupos que acumulariam acessos. Mas o usuário especificamente poderia retirar ou adicionar acessos indivisuais (apos acesso do grupo).
Não sei se consegui explicar.
Uma duvida onde fica gracado estas opções do usuário? Como é o banco de dados?
Parabéns pelo trabalho ficou muito bom.
Como este fórum é para dar sugestões, segue a minha:
Acho interessante que a senha pudesse ser de pois fatores (por email já seria interessante e SMS seria um plus), onde o usuário poderia recuperar a sua senha e digitar um código. Desta forma evita suporte desnecessário.
Outro ponto é que depois que você introduzir o grupo, o acesso indivual em concomitância com o grupo se tornaria redundante. Lembrando que o usuário poderia ter vários grupos que acumulariam acessos. Mas o usuário especificamente poderia retirar ou adicionar acessos indivisuais (apos acesso do grupo).
Não sei se consegui explicar.
Uma duvida onde fica gracado estas opções do usuário? Como é o banco de dados?
Usuários/senhas/acessos/etc
Oi Jose! Pelo que eu entendi você tem os seus fontes disponibilizados em open source. É isso mesmo?
Eu estava pensando em criar um pequeno ERP (mini) em opensource. O que você acha?
Eu estava pensando em criar um pequeno ERP (mini) em opensource. O que você acha?
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Na prática, dividi os fontes do meu aplicativo em 3 partes:lwinter escreveu:Oi Jose! Pelo que eu entendi você tem os seus fontes disponibilizados em open source. É isso mesmo?
- sefazclass, é público no GitHub
- josequintas, é público no GitHub
- e a parte particular
Preciso dessas 3 partes pra gerar meu aplicativo que é distribuído aos clientes.
Pelo mesmo motivo, "josequintas" acaba tendo que manter compatibilidade com o aplicativo.
Talvez até divida em mais partes, só pra reduzir a parte "diferente".
Lá tem muitas rotinas prontas do meu ERP.Eu estava pensando em criar um pequeno ERP (mini) em opensource. O que você acha?
Mas cada um usa banco de dados diferente, tipo de acesso ao banco de dados, LIB visual diferente, acho que não vai ser fácil isso.
Aproveitando:
A parte de direitos de acesso que perguntou em outro post, e que mostrei aqui...
Tinha esquecido, mas é só compilar o teste que vai ver em funcionamento.
Editado pela última vez por JoséQuintas em 22 Jul 2019 18:33, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ quote ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r0
Razão: Mensagem editada para colocar a tag [ quote ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r0
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Usuários/senhas/acessos/etc
Não consegui encontrar o fonte do teste do menu em https://github.com/JoseQuintas/JoseQuintas
Seria outro repositório do GitHub?
rgds,
Seria outro repositório do GitHub?
rgds,
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Talvez precise dividir/organizar por "assunto", porque no momento tá tudo misturado.
Mesmo que o menu esteja num fonte, as chamadas estão por outro.
Menu
https://github.com/JoseQuintas/JoseQuin ... a_menu.prg
Configuração de acessos:
https://github.com/JoseQuintas/JoseQuin ... acesso.prg
Mesmo que o menu esteja num fonte, as chamadas estão por outro.
Menu
https://github.com/JoseQuintas/JoseQuin ... a_menu.prg
Configuração de acessos:
https://github.com/JoseQuintas/JoseQuin ... acesso.prg
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Usuários/senhas/acessos/etc
Não consegui entender como compiltar o test.prg que esta dentro de tests, pois ao compilar o test.hbp apresenta "cannot find -ljosequintas". Me parece ser a biblioteca. Como faco para compilar?
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Precisa indicar aonde estão os HBCs: da sefazclass e josequintas
Aqui simplifico colocando em \harbour\bin\hbmk.hbc
Assim posso usar em qualquer projeto diretamente.
libpaths=d:/cdrom/fontes/integra/sefazclass
libpaths=d:/cdrom/fontes/integra/josequintas
libpaths=d:/cdrom/fontes/integra/josequintas/bostaurus
se for indicar no hbp, coloque -LpathDoHBC
Isso indica aonde procurar o arquivo HBC, e o arquivo HBC já diz tudo que precisa pra linqueditar.
Importante: crie uma pasta para o EXE, e execute nessa pasta criada.
É porque vão ser criados os DBFs/CDXs, e assim fica centralizado numa pasta que poderá ser apagada depois.
Aqui simplifico colocando em \harbour\bin\hbmk.hbc
Assim posso usar em qualquer projeto diretamente.
libpaths=d:/cdrom/fontes/integra/sefazclass
libpaths=d:/cdrom/fontes/integra/josequintas
libpaths=d:/cdrom/fontes/integra/josequintas/bostaurus
se for indicar no hbp, coloque -LpathDoHBC
Isso indica aonde procurar o arquivo HBC, e o arquivo HBC já diz tudo que precisa pra linqueditar.
Importante: crie uma pasta para o EXE, e execute nessa pasta criada.
É porque vão ser criados os DBFs/CDXs, e assim fica centralizado numa pasta que poderá ser apagada depois.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Pera aí... compilou as LIBs antes de compilar o teste?lwinter escreveu:Não consegui entender como compiltar o test.prg que esta dentro de tests, pois ao compilar o test.hbp apresenta "cannot find -ljosequintas".
Me parece ser a biblioteca.
Como faco para compilar?
Vamos por partes:
crie o arquivo hbmk.hbc dentro da pasta harbour\bin.
Isso não vai mexer com seus projetos, apenas vai indicar aonde pode ser pesquisada alguma coisa.
Ajuste para o path de onde instalou as LIBs
---hbmk.hbc---
libpaths=path-de-sefazclass.hbc
libpaths=path-de-josequintas.hbc
vai na pasta de sefazclass:
hbmk2 sefazclass.hbp
vai na pasta de josequintas:
hbmk2 josequintas.hbp
vai na pasta do programa de teste:
hbmk2 test.hbp
Nota:
Pra quem usa HMG Extended ou fivewin ou XHarbour....
Essas LIBs poderiam ser assim também. Uma única linha e tudo pronto pra uso. PRA TODAS.
O XHarbour também... usando HBMK2.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Usuários/senhas/acessos/etc
Continua praticamente a mesma, mas agora usando SQL.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
