Ô! coisinha, tão bonitinha do pai!
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
