Hwgui Turbo!

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8301
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 7 vezes
Curtiram: 2 vezes

Hwgui Turbo!

Mensagem por Itamar M. Lins Jr. »

Olá!
Ô! coisinha, tão bonitinha do pai!
HwguiTurbo1.PNG
HwguiTurbo1.PNG (38.13 KiB) Exibido 23 vezes

Código: Selecionar todos

#include "hwgui.ch"
#include "hbdyn.ch"

STATIC pLib     := NIL
STATIC hWebView := NIL

//=============================================================================
FUNCTION Main()
   LOCAL oForm

   hb_cdpSelect( "UTF8" )

   // Cria o DBF se ainda nao existir
   IF !File( "clientes.dbf" )
      DbCreate( "clientes.dbf", { ;
         { "NOME",  "C",  60, 0 }, ;
         { "EMAIL", "C",  80, 0 } } )
   ENDIF

   pLib := hb_LibLoad( "webview_wrapper.dll" )
   IF pLib == NIL
      hwg_MsgStop( "Falhou hb_LibLoad" )
      RETURN NIL
   ENDIF

   INIT WINDOW oForm TITLE "Hwgui + WebView2" SIZE 900, 700 ;
      ON INIT { || InicializaWebView( oForm ) } ;
      ON EXIT { || FinalizaWebView() }

   MENU OF oForm
      MENU TITLE "&Arquivo"
         MENUITEM "Sai&r" ACTION oForm:Close()
      ENDMENU
      MENU TITLE "A&juda"
         MENUITEM "&Sobre..." ACTION hwg_MsgInfo( "Hwgui + WebView2" )
      ENDMENU
   ENDMENU

   // Captura WM_USER+100 enviada pelo C via PostMessage
   oForm:bOther := { |o, msg, wp, lp| OnOtherMsg( o, msg, wp, lp ) }

   ACTIVATE WINDOW oForm CENTER

   IF pLib != NIL
      hb_LibFree( pLib )
   ENDIF
RETURN NIL

//=============================================================================
STATIC FUNCTION OnOtherMsg( o, nMsg, nWParam, nLParam )
   // WM_USER = 0x0400 = 1024 ; WM_USER+100 = 1124
   IF nMsg == 1124
      CheckMensagem()
      RETURN 0
   ENDIF
RETURN -1

//=============================================================================
STATIC FUNCTION InicializaWebView( oForm )
   LOCAL nBind

   hWebView := hb_DynCall( { "create_webview_embedded", pLib, ;
                             hb_bitOr( HB_DYN_CTYPE_VOID_PTR, HB_DYN_CALLCONV_CDECL ), ;
                             HB_DYN_CTYPE_CHAR_PTR, ;
                             HB_DYN_CTYPE_CHAR_PTR, ;
                             HB_DYN_CTYPE_INT, ;
                             HB_DYN_CTYPE_INT }, ;
                           "Hwgui + WebView2", "WebView2", 900, 660 )

   IF hWebView == NIL
      hwg_MsgStop( "Nao criou WebView" )
      RETURN NIL
   ENDIF

   // Registra as funcoes que o JavaScript podera chamar
   nBind := BindJS( "GravarCliente" )
   IF nBind != 0
      hwg_MsgStop( "bind GravarCliente falhou: " + hb_ValToStr( nBind ) )
   ENDIF

   BindJS( "ListarClientes" )
   BindJS( "ApagarCliente"  )
   BindJS( "BuscarCliente"  )

   hb_DynCall( { "navigate_webview", pLib, ;
                 hb_bitOr( HB_DYN_CTYPE_VOID, HB_DYN_CALLCONV_CDECL ), ;
                 HB_DYN_CTYPE_VOID_PTR, ;
                 HB_DYN_CTYPE_CHAR_PTR }, ;
               hWebView, "file:///C:/dev/hwgui/contrib/webview2/clientes.html" )
RETURN NIL

//=============================================================================
STATIC FUNCTION BindJS( cName )
RETURN hb_DynCall( { "bind_webview", pLib, ;
                     hb_bitOr( HB_DYN_CTYPE_INT, HB_DYN_CALLCONV_CDECL ), ;
                     HB_DYN_CTYPE_VOID_PTR, ;
                     HB_DYN_CTYPE_CHAR_PTR }, ;
                   hWebView, cName )

//=============================================================================
STATIC FUNCTION CheckMensagem()
   LOCAL cId, cJson, cFunc, cResult

   IF hWebView == NIL
      RETURN NIL
   ENDIF

   cId := hb_DynCall( { "get_message_id", pLib, ;
                        hb_bitOr( HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CALLCONV_CDECL ) } )
   IF ValType( cId ) == "A" .AND. Len( cId ) >= 1
      cId := cId[1]
   ENDIF
   IF cId == NIL .OR. Empty( cId )
      RETURN NIL
   ENDIF

   cFunc := hb_DynCall( { "get_message_func", pLib, ;
                          hb_bitOr( HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CALLCONV_CDECL ) } )
   IF ValType( cFunc ) == "A" .AND. Len( cFunc ) >= 1
      cFunc := cFunc[1]
   ENDIF

   cJson := hb_DynCall( { "get_message_data", pLib, ;
                          hb_bitOr( HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CALLCONV_CDECL ) } )
   IF ValType( cJson ) == "A" .AND. Len( cJson ) >= 1
      cJson := cJson[1]
   ENDIF

   cResult := Despachar( cFunc, cJson )

   hb_DynCall( { "reply_webview", pLib, ;
                 hb_bitOr( HB_DYN_CTYPE_INT, HB_DYN_CALLCONV_CDECL ), ;
                 HB_DYN_CTYPE_VOID_PTR, ;
                 HB_DYN_CTYPE_CHAR_PTR }, ;
               hWebView, cResult )
RETURN NIL

//=============================================================================
STATIC FUNCTION Despachar( cFunc, cJson )
   LOCAL hDados

   hDados := hb_jsonDecode( cJson )
   IF ValType( hDados ) == "A" .AND. Len( hDados ) >= 1
      hDados := hDados[1]
   ENDIF
   IF ValType( hDados ) != "H"
      hDados := {=>}
   ENDIF

   DO CASE
   CASE cFunc == "GravarCliente"
      RETURN GravarCliente( hDados )
   CASE cFunc == "ListarClientes"
      RETURN ListarClientes()
   CASE cFunc == "ApagarCliente"
      RETURN ApagarCliente( hDados )
   CASE cFunc == "BuscarCliente"
      RETURN BuscarCliente( hDados )
   ENDCASE

RETURN hb_jsonEncode( { "ok" => .F., "msg" => "Funcao desconhecida: " + hb_ValToStr( cFunc ) } )

//=============================================================================
STATIC FUNCTION GravarCliente( hDados )
   LOCAL cNome  := hb_HGetDef( hDados, "nome",  "" )
   LOCAL cEmail := hb_HGetDef( hDados, "email", "" )
   LOCAL nRecno

   IF Empty( cNome )
      RETURN hb_jsonEncode( { "ok" => .F., "msg" => "Nome obrigatorio" } )
   ENDIF

   AbreClientes()

   clientes->( DbAppend() )
   REPLACE clientes->NOME  WITH cNome
   REPLACE clientes->EMAIL WITH cEmail
   nRecno := clientes->( RecNo() )
   clientes->( DbCommit() )

RETURN hb_jsonEncode( { "ok" => .T., "recno" => nRecno } )

//=============================================================================
STATIC FUNCTION ListarClientes()
   LOCAL aLista := {}
   LOCAL nRecno

   AbreClientes()
   clientes->( DbGoTop() )
   DO WHILE !clientes->( Eof() )
      nRecno := clientes->( RecNo() )
      AAdd( aLista, { "recno" => nRecno, ;
                      "nome"  => AllTrim( clientes->NOME ), ;
                      "email" => AllTrim( clientes->EMAIL ) } )
      clientes->( DbSkip() )
   ENDDO

RETURN hb_jsonEncode( { "ok" => .T., "clientes" => aLista } )

//=============================================================================
STATIC FUNCTION ApagarCliente( hDados )
   LOCAL nRecno := hb_HGetDef( hDados, "recno", 0 )

   IF nRecno <= 0
      RETURN hb_jsonEncode( { "ok" => .F., "msg" => "RECNO invalido" } )
   ENDIF

   AbreClientes()
   clientes->( DbGoTo( nRecno ) )
   IF !clientes->( Eof() )
      clientes->( DbDelete() )
      clientes->( DbCommit() )
      RETURN hb_jsonEncode( { "ok" => .T. } )
   ENDIF

RETURN hb_jsonEncode( { "ok" => .F., "msg" => "Registro nao encontrado" } )

//=============================================================================
STATIC FUNCTION BuscarCliente( hDados )
   LOCAL cNome  := hb_HGetDef( hDados, "nome", "" )
   LOCAL aLista := {}

   AbreClientes()
   clientes->( DbGoTop() )
   DO WHILE !clientes->( Eof() )
      IF Upper( cNome ) $ Upper( AllTrim( clientes->NOME ) )
         AAdd( aLista, { "recno" => clientes->( RecNo() ), ;
                         "nome"  => AllTrim( clientes->NOME ), ;
                         "email" => AllTrim( clientes->EMAIL ) } )
      ENDIF
      clientes->( DbSkip() )
   ENDDO

RETURN hb_jsonEncode( { "ok" => .T., "clientes" => aLista } )

//=============================================================================
STATIC FUNCTION AbreClientes()
   IF !Used()
      IF !File( "clientes.dbf" )
         DbCreate( "clientes.dbf", { ;
            { "NOME",  "C",  60, 0 }, ;
            { "EMAIL", "C",  80, 0 } } )
      ENDIF
      USE clientes.dbf ALIAS clientes NEW
   ENDIF
RETURN NIL

//=============================================================================
STATIC FUNCTION FinalizaWebView()
   IF hWebView != NIL
      hb_DynCall( { "destroy_webview", pLib, ;
                    hb_bitOr( HB_DYN_CTYPE_VOID, HB_DYN_CALLCONV_CDECL ), ;
                    HB_DYN_CTYPE_VOID_PTR }, ;
                  hWebView )
      hWebView := NIL
   ENDIF
RETURN NIL
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8301
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 7 vezes
Curtiram: 2 vezes

Re: Hwgui Turbo!

Mensagem por Itamar M. Lins Jr. »

Olá!
Gosta de telas em html com CSS ? Quer rodar misturado ? É caixa, URL, gravar, DBF, SQL ?
Quer misturar com Telas Windows ? Tá ai a solução.
Anexos
HwguiTurbo2.PNG
HwguiTurbo2.PNG (34.55 KiB) Exibido 12 vezes
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8301
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 7 vezes
Curtiram: 2 vezes

Re: Hwgui Turbo!

Mensagem por Itamar M. Lins Jr. »

Olá!
Tela dos testes.
HwguiTurbo0.PNG
HwguiTurbo0.PNG (36.9 KiB) Exibido 11 vezes
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8301
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 7 vezes
Curtiram: 2 vezes

Re: Hwgui Turbo!

Mensagem por Itamar M. Lins Jr. »

Olá!
Anexos
HwguiTurbo3.PNG
HwguiTurbo3.PNG (40.5 KiB) Exibido 10 vezes
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 8301
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 7 vezes
Curtiram: 2 vezes

Re: Hwgui Turbo!

Mensagem por Itamar M. Lins Jr. »

Olá!
Brinquem ai.
É a IA que faz as telas em HTML. Desenhar tela cansa muito. :lol:
Basta vc definir o DBF, gerar as telas usando IA.
Com ABAS que vc pode mudar de posição... Enfim é coisa que qualquer navegador faz.
Visual é o mesmo.
WebView4.PNG
WebView4.PNG (33.94 KiB) Exibido 7 vezes
webview2.rar
Arquivo com demonstração, baixe o webview2 da MS.
(833.29 KiB) Baixado 2 vezes
https://developer.microsoft.com/en-us/m ... 3#download
Captura_de_tela_20260916_011129.png
Captura_de_tela_20260916_011129.png (137.44 KiB) Exibido 7 vezes
Saudações,
Itamar M. Lins Jr.
Responder