harbour + gtwvw + hwgui

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

Moderador: Moderadores

TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

harbour + gtwvw + hwgui

Mensagem por TerraSoftware »

Caros colegas.
Há vários dias venho acompanhando algumas postagens que me deixaram muito interesado em migrar pra harbour. Mas tenho algumas dúvida.
Hoje uso gtwvw junto com a hwgui, as duas convivem bem dentro do nosso sistema. Pergunto, no harbour:
1 - tem gtwvw ou equivalente?
2 - tem hwgui?
3 - as duas compilam juntas?
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: harbour + gtwvw + hwgui

Mensagem por Itamar M. Lins Jr. »

Ola!
Tem a WVW mas está parada.
Quanto a Hwgui, ela é nativa do Harbour. Alias não sei a necessidade de usar WVW com Hwgui, já que a Hwgui faz tudo mais fácil e melhor que a WVW, toda bugada e abandonada pelo seu criador.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
TerraSoftware
Usuário Nível 3
Usuário Nível 3
Mensagens: 353
Registrado em: 28 Jul 2004 13:14
Localização: Cianorte-PR
Contato:

Re: harbour + gtwvw + hwgui

Mensagem por TerraSoftware »

Caro colega Itamar.
Obrigado por sua tentativa em ajudar.
Com relacao a necessidade de usar a gtwvw, se nao fosse realmente necessário eu nao estaria perguntando.
Infelizmente nem todos tem tempo para converter um sistema inteiro para hwgui, mesmo sabendo que é a melhor opcao.
Nem sempre a melhor é a mais viavel.
Por estas e outras, eu preciso das duas juntas, pelo menos por enquanto, entao continuo na dúvida:
No harbour, a gtwvw e hwgui compilam juntas?
Obrigado!
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: harbour + gtwvw + hwgui

Mensagem por Itamar M. Lins Jr. »

Ola!
Infelizmente nem todos tem tempo para converter um sistema inteiro para hwgui, mesmo sabendo que é a melhor opcao.
Nem sempre a melhor é a mais viavel.
Observe que a Hwgui roda não só com a WVW mais também com a WVT/WVG que está muito mais estável do que a WVW, estou dizendo isso no Harbour.
Então o tempo que eu levaria para converter minha aplicação para WVW ou WVG simplesmente era maior do que converter para Hwgui até a curva de apredizando é maior. Porque já fui um usuário da WVW e assemelhados wvwtools.
Por estas e outras, eu preciso das duas juntas, pelo menos por enquanto, entao continuo na dúvida:
No harbour, a gtwvw e hwgui compilam juntas?
Respondendo novamente... Existe a WVW no contrib do Harbour, não sei se tem todas as funções usadas por vocês funcionando redondo, precisa ser testada por quem está precisando.
Eu tenho uma aplicação em WVT com algumas telas em HWGUI, mas ela não foi migrada nem será, porque eu conclui que na época era mais fácil abandonar o código e reescrever tudo em Hwgui, muito mais rápido do que reescrever para WVW ok?

Tem um post aqui antigo meu comparando a migração para a WVW e para a Hwgui.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: harbour + gtwvw + hwgui

Mensagem por Itamar M. Lins Jr. »

Ola!
Uma correção, a WVW está na pasta examples e não na contrib.
O exemplo abaixo compila no Harbour sem traumas, mas peguei uns erros quando executo e entro na parte do browse, talvez seja erro de programação e não da WVW em si.

Código: Selecionar todos

/*
 * $Id: wvwtest9.prg 15533 2010-09-26 15:30:18Z vszakats $
 */

//-------------------------------------------------------------------//
//
//                      Test/Demo Program for
//                       GTWVW GUI Interface
//                   with multiple window support
//                      a work in progress by
//               Budyanto Dj. <budyanto@centrin.net.id>
//                            based on:
//
//                           WVTGUI.PRG,
//                   GTWVT Console GUI Interface
//              by Pritpal Bedi <pritpal@vouchcac.com>
//
//                              GTWVT
//                by Peter Rees <peter@rees.co.nz>
//
//   parts of this program are copyrights of their respective owners
//
//-------------------------------------------------------------------//

/*
   Compile/Link info:
   This program requires WVWMOUSE.PRG.
   You may use 'hbmk2 wvwtest9.hbp' to build this program.

 */

#include "inkey.ch"
#include "common.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"

    #define MF_INSERT                     0
    #define MF_CHANGE                   128
    #define MF_APPEND                   256
    #define MF_DELETE                   512
    #define MF_REMOVE                  4096

    #define MF_BYCOMMAND                  0
    #define MF_BYPOSITION              1024

    #define MF_SEPARATOR               2048

    #define MF_ENABLED                    0
    #define MF_GRAYED                     1
    #define MF_DISABLED                   2

    #define MF_UNCHECKED                  0
    #define MF_CHECKED                    8
    #define MF_USECHECKBITMAPS          512

    #define MF_STRING                     0
    #define MF_BITMAP                     4
    #define MF_OWNERDRAW                256

    #define MF_POPUP                     16
    #define MF_MENUBARBREAK              32
    #define MF_MENUBREAK                 64

    #define MF_UNHILITE                   0
    #define MF_HILITE                   128

    #define MB_OK                                 0
    #define MB_OKCANCEL                           1
    #define MB_ABORTRETRYIGNORE                   2
    #define MB_YESNOCANCEL                        3
    #define MB_YESNO                              4
    #define MB_RETRYCANCEL                        5
    #define MB_CANCELTRYCONTINUE                  6


    #define MB_ICONHAND                          16
    #define MB_ICONQUESTION                      32
    #define MB_ICONEXCLAMATION                   48
    #define MB_ICONASTERISK                      64

    #define MB_USERICON                         128
    #define MB_ICONWARNING              MB_ICONEXCLAMATION
    #define MB_ICONERROR                MB_ICONHAND

    #define MB_ICONINFORMATION          MB_ICONASTERISK
    #define MB_ICONSTOP                 MB_ICONHAND

    #define MB_DEFBUTTON1                         0
    #define MB_DEFBUTTON2                       256
    #define MB_DEFBUTTON3                       512
    #define MB_DEFBUTTON4                       768

    #define MB_APPLMODAL                          0
    #define MB_SYSTEMMODAL                     4096
    #define MB_TASKMODAL                       8192
    #define MB_HELP                           16384 // Help Button

    #define MB_NOFOCUS                        32768
    #define MB_SETFOREGROUND                  65536
    #define MB_DEFAULT_DESKTOP_ONLY          131072

    #define MB_TOPMOST                       262144
    #define MB_RIGHT                         524288
    #define MB_RTLREADING                   1048576

  #define IDOK                1
  #define IDCANCEL            2
  #define IDABORT             3
  #define IDRETRY             4
  #define IDIGNORE            5
  #define IDYES               6
  #define IDNO                7
  #define IDCLOSE             8
  #define IDHELP              9

  #define IDTRYAGAIN          10

#DEFINE CRLF chr(13)+chr(10)

#DEFINE WVW_MAXWINDOWS    20             //! must match with HBGTWVW.H
#DEFINE WVW_DEFAULT_MENUKEYEVENT  1024   //! must match with HBGTWVW.H

//20040303: !!! copied from WVWMOUSE.PRG pls create an include file
* mouse object types //20040303
#DEFINE _MOBJECT_BUTTON  0      //mouse button
#DEFINE _MOBJECT_HSCROLL 1      //horiz scrollbar  //obsolete, not used
#DEFINE _MOBJECT_VSCROLL 2      //horiz scrollbar  //obsolete, not used

* for Button Types: //20040303
#DEFINE _BUTTON_NORMAL 0        //normal button
#DEFINE _BUTTON_FLAT   1        //'transparent', raised when mouseover
#DEFINE _BUTTON_NONE   2        //no sign even when mouseover or clicked
#DEFINE _BUTTON_HARD   3        //no recessed when pressed

* menu actions
#DEFINE IDM_DEMO_GET     101
#DEFINE IDM_DEMO_BROWSE  102
#DEFINE IDM_DEMO_CONSOLE 103
//#DEFINE IDM_DEMO_COLOR   104
#DEFINE IDM_DEMO_EXIT    199

#DEFINE IDM_TOOLBAR_RESET  501
#DEFINE IDM_TOOLBAR_DELETE 502
#DEFINE IDM_TOOLBAR_ENABLE  503
#DEFINE IDM_TOOLBAR_DISABLE  504

#DEFINE IDM_WINDOW_SPACING_INCREASE  201
#DEFINE IDM_WINDOW_SPACING_DECREASE  202
#DEFINE IDM_WINDOW_SPACING_DEFAULT   203

#DEFINE IDM_HELP_HELP    301
#DEFINE IDM_HELP_INFO    302

* menu action from toolbar only:
#DEFINE IDM_NETCONNECT    401
#DEFINE IDM_NETDISCONNECT 402
#DEFINE IDM_BACK          403
#DEFINE IDM_FORWARD       404
#DEFINE IDM_COPY          405
#DEFINE IDM_PASTE         406


static s_amiscobjlist := {}      //x misc object list (actually: list of codeblocks)
static s_afontinfo := {}         //x current font info

//-------------------------------------------------------------------//
PROCEDURE Main()
local nCurWindow
local hWnd, hMenu, hPopupmenu, hPopupmenu2
local cLabel := "This is the Main Window"
local nMaxRow, nMaxCol
local nCursor
local kF1, kF2, kF3
local kF9, kF10, kF11
local oMouse
local ch

   SET( _SET_EVENTMASK, INKEY_ALL )

   SET DATE BRITISH
   SET SCOREBOARD OFF
   //wvw_SetPaintRefresh(0)
   wvw_SetVertCaret(.t.)
   wvw_pbSetFont(, "Tahoma", 14)
   nCursor := setcursor(0)

   if !SetDefaultWindowSize()
      ldebug("Cannot setDefaultWindowSize()")
   else
      ldebug("Successfully setDefaultWindowSize()")
   endif
   nMaxRow := maxrow(); nMaxCol := maxcol()

   if wvw_SBcreate() > 0 .and.;
      wvw_SBaddPart(, "99:99:99") > 0
      wvw_SetTimer(, 1000)
   endif

   s_afontinfo := WVW_getfontinfo()

   hb_gtInfo( HB_GTI_INKEYFILTER, {|nkey| nAfterInkey(nkey) } )
   WVW_SETMOUSEMOVE(,.t.)                           //required by wvwmouse
   kF1 := SetKey( K_F1, {|| xHelp() } )
   kF2 := SetKey( K_F2, {|| xDebugInfo() } )
   kF3 := SetKey( K_F3, {|| Demo_Console() } )

   kF9 := SetKey( K_F9, {|| WVW_SetLineSpacing(NIL, WVW_SetLineSpacing()-2) } )
   kF10 := SetKey( K_F10, {|| WVW_SetLineSpacing(NIL, WVW_SetLineSpacing()+2) } )
   kF11 := SetKey( K_F11, {|| WVW_SetDefLineSpacing( WVW_SetLineSpacing() ) } )

   * start menu definitions *************************************

   hWnd := WVW_GETWINDOWHANDLE()
   hMenu = WVW_CreateMenu( )
      hPopupMenu = WVW_CreateMenu( )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_GET, "~GET demo"  )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_BROWSE, "~BROWSE demo" )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_CONSOLE, "~CONSOLE demo (F3)" )
      //WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_COLOR, "~COLOR demo" )
      WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_EXIT, "E~xit"  )
   WVW_AppendMenu( hMenu     , MF_ENABLED + MF_POPUP , hPopupMenu , "~Demos",  )

      hPopupMenu = WVW_CreateMenu( )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_ENABLE,  "~Enable Toolbar" )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_DISABLE, "~Disable Toolbar" )
      WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_RESET,  "~Reset Toolbar" )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_DELETE, "~Delete Toolbar" )
   WVW_AppendMenu( hMenu     , MF_ENABLED + MF_POPUP , hPopupMenu , "~Toolbar",  )

      hPopupMenu = WVW_CreateMenu( )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_WINDOW_SPACING_DECREASE, "~Decrease Line Spacing (F9)" )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_WINDOW_SPACING_INCREASE, "~Increase Line Spacing (F10)" )
      WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_WINDOW_SPACING_DEFAULT,  "~Set As Default Line Spacing (F11)" )
   WVW_AppendMenu( hMenu     , MF_ENABLED + MF_POPUP , hPopupMenu , "~Window",  )

      hPopupMenu = WVW_CreateMenu( )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_HELP_HELP, "~Help (F1)"  )
      WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
      WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_HELP_INFO, "~Info (F2)"  )
   WVW_AppendMenu( hMenu     , MF_ENABLED + MF_POPUP , hPopupMenu , "~Help",  )

   WVW_SetMenu(, hMenu )

   * end menu definitions *************************************

   nCurWindow := WVW_nNumWindows()-1 // == 0, Main Window

   CreateToolbar(nCurWindow)

   ResetMiscObjects( nCurWindow )
     AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawLabel( nWindow, 1,40, cLabel,6,, rgb(255,255,255), rgb(198,198,198), 'Arial', s_afontinfo[2], , , , , .t., .t. ) } )

   wvwm_ResetMouseObjects( nCurWindow )
     wvwm_AddMouseObjects( nCurWindow, WVWMouseButton():New("Info!",   maxrow()-2,67, , , {|| xDebugInfo() } ))

     oMouse := WVWMouseButton():New("Flat",   maxrow()-2,67-11, , , {|| lboxmessage("flat") }, 1, NIL )
     oMouse:cImage := "vouch1.gif"
     oMouse:cCaption := ""
     wvwm_AddMouseObjects( nCurWindow, oMouse )

     oMouse := WVWMouseButton():New("None",   maxrow()-2,67-11-11, , , {|| lboxmessage("none") }, 2, NIL )
     oMouse:Enable(.t.)
     wvwm_AddMouseObjects( nCurWindow, oMouse )

     wvwm_AddMouseObjects( nCurWindow, WVWMouseButton():New("Hard",   maxrow()-2,67-11-11-11, , , {|| lboxmessage("hard") }, 3, NIL ))
     oMouse := WVWMouseButton():New("Disabled",   maxrow()-2,67-11-11-11-11, , , {|| xDebugInfo() } )
     oMouse:Enable(.f.)
     wvwm_AddMouseObjects( nCurWindow, oMouse )

     oMouse := WVWMouseButton():New("Tight",   maxrow()-2,67-11-11-11-11-11, , , {|| lboxmessage("tight") } )
     oMouse:lTight := .t.
     wvwm_AddMouseObjects( nCurWindow, oMouse )

   * 20070525 the real pushbutton, easier and better looking. Nothing to do with wvwmouse.prg.
   WVW_PBcreate( nCurWindow, maxrow()-4,67-11-11-11-11-11, maxrow()-4, 67+9-11-11-11-11-11, "native", NIL, {||lboxmessage("native pushbutton")}, NIL)

   SetColor( 'N/W,N/GR*,,,N/W*' )
   CLS
   @ 0,0 say "This is line 0"
   @ 1,0 say "This is line 1"
   @ maxrow()-1,0 say "This is line " + alltrim(str(maxrow()-1))
   @ maxrow(),0 say "This is line " + alltrim(str(maxrow()))

   do while !((ch:=inkey(0))==K_ESC)
      /* experiment with different paintrefresh interval:
      do case
         case ch==asc("<")
            wvw_setPaintRefresh( INT(wvw_setPaintRefresh() / 2) )
            alert(wvw_setPaintRefresh())
         case ch==asc(">")
            wvw_setPaintRefresh( INT(wvw_setPaintRefresh() * 2) )
            alert(wvw_setPaintRefresh())
         case ch==asc("0")
            wvw_setPaintRefresh( 0 )
            alert(wvw_setPaintRefresh())
         otherwise
            * do nothing. inkey() has been handled by nAfterInket()
      endcase
      */
   enddo

   lboxmessage("Thanks for trying this program." + CRLF +;
               "Good bye!")

   * restore state
   wvwm_ResetMouseObjects( nCurWindow )
   ResetMiscObjects( nCurWindow )
   SetKey( K_F11, kF11 )
   SetKey( K_F10, kF10 )
   SetKey( K_F9, kF9 )

   //SetKey( K_F4, kF4 )
   SetKey( K_F3, kF3 )
   SetKey( K_F2, kF2 )
   SetKey( K_F1, kF1 )
   setcursor(nCursor)

RETURN  //main()

//-------------------------------------------------------------------//

static procedure xDisableMenus(nWinNum, nNumItem)
* disables all Menu Items of window nWinNum
local i
local hMenu := WVW_GetMenu(nWinNum)
   for i := 0 to nNumItem-1
      WVW_EnableMenuItem(hMenu, i, MF_BYPOSITION + MF_GRAYED)
   next
return

static procedure xEnableMenus(nWinNum, nNumItem)
* enables all Menu Items of window nWinNum
local i
local hMenu := WVW_GetMenu(nWinNum)
   for i := 0 to nNumItem-1
      WVW_EnableMenuItem(hMenu, i, MF_BYPOSITION + MF_ENABLED)
   next
   WVW_DrawMenuBar(nWinNum)   //to force redraw of menu
return


//-------------------------------------------------------------------//
procedure Demo_Console(nTop, nLeft, nBottom, nRight)
local cWinName, nCurWindow
local nMaxrow, nMaxCol
local nCursor
local cColor
local ch
local lMouseMove
local lEchoing := .f.
   default nTop to 2
   default nLeft to 2
   default nBottom to nTop+10
   default nRight to nLeft+45

   cWinName := "Typewriter (Win#" + alltrim( str( WVW_nNumWindows() ) ) + "); CtrlW: New Window; ESC: Exit"

   //x init window
   nCurWindow := WVW_nOpenWindow(cWinName, nTop, nLeft, nBottom, nRight)
   if nCurWindow==0
      lboxmessage("Failed Opening new window!")
      return
   endif

   nCursor := setcursor(SC_NORMAL)
   cColor := setcolor("W+/N")
   lMouseMove := WVW_SETMOUSEMOVE(,.f.)
   nMaxrow := maxrow(); nMaxcol := maxcol()

   ResetMiscObjects( nCurWindow )
   wvwm_ResetMouseObjects( nCurWindow )

   ************ begin typewriter mode *************
   CLS
   ?? "Press Ctrl+E to toggle between echoing what you type to previous window"
   ?
   do while inkey()<>chr(0); enddo  //clear typeahead
   ch := inkey(0)
   do while !(ch == K_ESC)
      if ch==K_ENTER
         ?? chr(ch)+chr(10)
         if lEchoing
            * write the same thing to previous window
            WVW_nSetCurWindow( nCurWindow-1 )
            ?? chr(ch)+chr(10)
            WVW_nSetCurWindow( nCurWindow )
         endif
      elseif ch==K_CTRL_W
         * Recursively call (another) typewriter, bigger one
         Demo_Console(nTop+2, nLeft+2, nBottom+4, nRight+6)
      elseif ch==K_CTRL_E
         * toggle echoing output to prev window
         lEchoing := !lEchoing
      else
         * any other char goes here
         ?? chr(ch)
         if lEchoing
            * write the same thing to previous window
            WVW_nSetCurWindow( nCurWindow-1 )
            ?? chr(ch)
            WVW_nSetCurWindow( nCurWindow )
         endif
      endif
      ch := inkey(0)
   enddo

   ************ end typewriter mode ***************

   * epilogue
   WVW_lCloseWindow()

   * restore state
   wvwm_ResetMouseObjects( nCurWindow )
   ResetMiscObjects( nCurWindow )
   setcursor(nCursor)
   setcolor(cColor)
   WVW_SETMOUSEMOVE(,lMouseMove)
return //Demo_Console()


//-------------------------------------------------------------------//
PROCEDURE Demo_Get()
local nCurWindow, getlist := {}
local cLabel := "This is the GET Demo Window"
LOCAL nTop    := 4
LOCAL nLeft    := 4
LOCAL nBottom    := 21
LOCAL nRight    := 75
LOCAL nColGet := 8
LOCAL get_1   := ctod( '' )
LOCAL get_2   := Pad( 'Pritpal Bedi', 35 )
LOCAL get_3   := Pad( '60, New Professor Colony', 35 )
LOCAL get_4   := Pad( 'Ludhiana, INDIA', 35 )
LOCAL get_5   := Pad( 'http://www.vouchcac.com', 35 )
LOCAL get_6   := 20000
local nCursor := setcursor(SC_NORMAL)
memvar x

   //x init window
   nCurWindow := WVW_nOpenWindow("GET Demo", nTop, nLeft, nBottom, nRight)
   if nCurWindow==0
      lboxmessage("Failed Opening new window!")
      return
   endif

   WVW_SetIcon(, 'vr_1.ico' )

   ResetMiscObjects( nCurWindow )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawLabel( nWindow, 1,nRight-nLeft, cLabel,2,, rgb(255,255,255), rgb(198,198,198), 'Arial', s_afontinfo[2], , , , , .t., .t. ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawBoxRecessed( nWindow, 7-nTop, 61-nLeft, 13-nTop, 70-nLeft ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawBoxGroup( nWindow, 15-nTop, 59-nLeft, 18-nTop, 72-nLeft ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawBoxGroup( nWindow, 5-nTop, 6-nLeft, 19-nTop, 44-nLeft ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawImage( nWindow, 8-nTop,62-nLeft,12-nTop,69-nLeft, 'vouch1.bmp' ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawBoxRecessed( nWindow, 7-nTop, 48-nLeft, 13-nTop, 55-nLeft ) } )
   AddMiscObjects( nCurWindow, {|nWindow| x:= nWindow, aEval( GetList, {|oGet| WVW_DrawBoxGet( x, oGet:Row, oGet:Col, Len( Transform( oGet:VarGet(), oGet:Picture ) ) ) } ) } )

   wvwm_ResetMouseObjects( nCurWindow )

   /* we now use native push button
   wvwm_AddMouseObjects( nCurWindow, WVWMouseButton():New("Info",   maxrow()-1,maxcol()-15, , , {|| xDebugInfo() } ))
   */
   WVW_PBcreate( nCurWindow, maxrow()-1,maxcol()-15, maxrow()-1, maxcol()-5, "Info", NIL, {||xDebugInfo()}, NIL)

   CLS

   @  6-nTop, nColGet-nLeft SAY '< Date >'
   @  9-nTop, nColGet-nLeft SAY '<' + PadC( 'Name', 33 ) + '>'
   @ 12-nTop, nColGet-nLeft SAY '<' + PadC( 'Address', 33 ) + '>'
   @ 16-nTop, 61-nLeft      SAY '< Salary >'

   @  7-nTop, nColGet-nLeft GET get_1
   @ 10-nTop, nColGet-nLeft GET get_2 //VALID ( VouChoice() < 7 )
   @ 13-nTop, nColGet-nLeft GET get_3
   @ 15-nTop, nColGet-nLeft GET get_4
   @ 17-nTop, nColGet-nLeft GET get_5
   @ 17-nTop, 61-nLeft      GET get_6 PICTURE '@Z 9999999.99'

   READ

   * epilogue
   //lboxmessage("Thanks for trying the GET Demo!")
   WVW_lCloseWindow()

   * restore state
   wvwm_ResetMouseObjects( nCurWindow )
   ResetMiscObjects( nCurWindow )
   setcursor(nCursor)

RETURN  //Demo_Get()


//-------------------------------------------------------------------//
FUNCTION DEMO_Browse()

   LOCAL nKey, bBlock, oBrowse , i
   LOCAL lEnd    := .f.
   LOCAL info_   := {}             //WVW_nOpenWindow() has not been performed, so...
   LOCAL nTop    :=  3             //pls notice that this is relative to PARENT window!
   LOCAL nLeft   :=  3             //pls notice that this is relative to PARENT window!
   LOCAL nBottom := maxrow() - 2   //pls notice that this is relative to PARENT window!
   LOCAL nRight  := maxcol() - 3   //pls notice that this is relative to PARENT window!
   LOCAL cColor
   local nMaxRow, nMaxCol

   local nStyle := 0
   local nCurWindow

   local oMouse, nHScrollBar, nVScrollBar

   //x init window
   nCurWindow := WVW_nOpenWindow("BROWSE Demo", nTop, nLeft, nBottom, nRight)
   if nCurWindow==0
      lboxmessage("Failed Opening new window!")
      return NIL
   endif
   nMaxRow := maxrow(); nMaxCol := maxcol()

   ResetMiscObjects( nCurWindow )
   wvwm_ResetMouseObjects( nCurWindow )

   cColor := SetColor( 'N/W' )
   CLS
   SetColor( 'N/W*,N/GR*,,,N/W* ' )

   USE '..\..\..\tests\TEST' NEW
   if NetErr()
      WVW_lCloseWindow()
      return nil
   endif

   index on FIELD->LAST to TEST1  //20040707

   info_:= DbStruct()

   oBrowse := TBrowseNew( 3, 2, maxrow()-3, maxcol()-3 )

   oBrowse:ColSep        = '  '
   oBrowse:HeadSep       = '__'
   oBrowse:GoTopBlock    = { || dbGoTop() }
   oBrowse:GoBottomBlock = { || dbGoBottom() }
   oBrowse:SkipBlock     = { | nSkip | dbSkipBlock( nSkip,oBrowse ) }

   for i := 1 to len( info_ )
      bBlock := VouBlockField( i )
      oBrowse:AddColumn( TBColumnNew( info_[ i,1 ], bBlock ) )
   next

   oBrowse:configure()

   WVW_SetPen( nStyle, 0, rgb( 210,1210,210 ) )
   WVW_SetIcon(, 'DIA_EXCL.ico' )

   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawBoxRecessed( nWindow, oBrowse:nTop, oBrowse:nLeft, oBrowse:nBottom, oBrowse:nRight ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawGridHorz( nWindow, oBrowse:nTop+3, oBrowse:nLeft, oBrowse:nRight, oBrowse:nBottom - oBrowse:nTop - 2 ) } )
   AddMiscObjects( nCurWindow, {|nWindow| WVW_DrawGridVert( nWindow, oBrowse:nTop, oBrowse:nBottom, oBrowse:aColumnsSep, len( oBrowse:aColumnsSep ) ) } )

   /* we now use native push button
   wvwm_AddMouseObjects( nCurWindow, WVWMouseButton():New("Info",   maxrow(),maxcol()-15, , , {|| xDebugInfo() } ))
   */
   WVW_PBcreate( nCurWindow, maxrow(),maxcol()-15, maxrow(), maxcol()-5, "Info", NIL, {||xDebugInfo()}, NIL)

   nHScrollBar := wvw_xbCreate( nCurWindow, 0, oBrowse:nBottom+1, oBrowse:nLeft, oBrowse:nRight-oBrowse:nLeft+1, /*aBlock*/ {|nWinNum, nXBid, nXBmsg, nXBpos| HXBscroller(oBrowse, nWinNum, nXBid, nXBmsg)}, /*aOffset*/ NIL)
   nVScrollBar := wvw_xbCreate( nCurWindow, 1, oBrowse:nTop, oBrowse:nRight+1, oBrowse:nBottom-oBrowse:nTop+1, /*aBlock*/ {|nWinNum, nXBid, nXBmsg, nXBpos| VXBscroller(oBrowse, nWinNum, nXBid, nXBmsg)}, /*aOffset*/ NIL)

   DispOutAt( nTop + 1-nTop, nleft-nleft, padc( hb_CurDrive()+':\'+CurDir()+'\'+'test.dbf', nRight - nLeft + 1 ), 'W+/W' )

   oBrowse:ForceStable()
   RefreshHXB(oBrowse, nCurWindow, nHScrollBar) //20040704
   RefreshVXB(oBrowse, nCurWindow, nVScrollBar) //20040704

   While !lEnd
      nKey = InKey( 0 )

      do case
      case nKey == K_ESC .or. nKey == K_ENTER
         lEnd = .t.
         loop

      case nKey == K_DOWN
         oBrowse:Down()

      case nKey == K_MWBACKWARD
         oBrowse:Down() //simple scroll down

      case nKey == K_UP
         oBrowse:Up()

      case nKey == K_MWFORWARD
         oBrowse:Up()   //simple scroll up

      case nKey == K_LEFT
         if oBrowse:colPos== 1; loop; endif
         oBrowse:Left()

      case nKey == K_RIGHT
         if oBrowse:colPos== oBrowse:colCount(); loop; endif
         oBrowse:Right()

      case nKey = K_PGDN
         oBrowse:pageDown()

      case nKey = K_PGUP
         oBrowse:pageUp()

      case nKey = K_CTRL_PGUP
         oBrowse:goTop()

      case nKey = K_CTRL_PGDN
         oBrowse:goBottom()

      case nKey = K_HOME
         oBrowse:home()

      case nKey = K_END
         oBrowse:end()

      case nKey = K_CTRL_LEFT
         oBrowse:panLeft()

      case nKey = K_CTRL_RIGHT
         oBrowse:panRight()

      case nKey = K_CTRL_HOME
         oBrowse:panHome()

      case nKey = K_CTRL_END
         oBrowse:panEnd()

      otherwise
         * other keys, including mouse events do not need ForceStable
         loop

      endcase

      oBrowse:ForceStable()

      //refresh the scrollbars due to keyboard navigation
      RefreshHXB(oBrowse, nCurWindow, nHScrollBar) //20040704
      RefreshVXB(oBrowse, nCurWindow, nVScrollBar) //20040704

   enddo

   DBCloseArea()

   * epilogue
   //lboxmessage("Thanks for trying the BROWSE Demo!")
   WVW_lCloseWindow()

   * restore state
   wvwm_ResetMouseObjects( nCurWindow )
   ResetMiscObjects( nCurWindow )

   WVW_SetPen( 0 )

   SetColor( cColor )
   //SetCursor( nCursor )

RETURN nil //DEMO_Browse()

/* generic Vertical Scrollbar handler for tbrowse */
function VXBscroller(oBrowse, nWinNum, XBid, XBmsg)
local nOldWin
local lNeedStabilize

//if we can't handle non topmost window we must return right away
//if nWinNum <> wvw_nNumWindows()-1 ; return ; endif

   nOldWin := wvw_nSetCurWindow(nWinNum)

   lNeedStabilize := .f.
   do while .t.  //dummy loop
      do case
         case XBmsg == 0 //SB_LINEUP
            if ordKeyNo() == 1; exit; endif
            oBrowse:up()
         case XBmsg == 1 //SB_LINEDOWN
            if ordKeyNo() == ordKeyCount(); exit; endif
            oBrowse:down()
         case XBmsg == 2 //SB_PAGEUP
            if ordKeyNo() == 1; exit; endif
            oBrowse:pageup()
         case XBmsg == 3 //SB_PAGEDOWN
            if ordKeyNo() == ordKeyCount(); exit; endif
            oBrowse:pagedown()
         otherwise
            * ignore
            lNeedStabilize := .f.
            exit
      endcase
      lNeedStabilize := .t.
      exit
   enddo //dummy loop

   if lNeedStabilize
      oBrowse:ForceStable()
      RefreshVXB(oBrowse, nWinNum, XBid)
   endif

   wvw_nSetCurWindow(nOldWin)

return NIL

/* generic Horizontal Scrollbar handler for tbrowse */
function HXBscroller(oBrowse, nWinNum, XBid, XBmsg)
local nOldWin
local lNeedStabilize

//if we can't handle non topmost window we must return right away
//if nWinNum <> wvw_nNumWindows()-1 ; return ; endif

   nOldWin := wvw_nSetCurWindow(nWinNum)

   lNeedStabilize := .f.
   do while .t.  //dummy loop
      do case
         case XBmsg == 0 //SB_LINELEFT
            if oBrowse:colPos== 1; exit; endif
            oBrowse:left()
         case XBmsg == 1 //SB_LINERIGHT
            if oBrowse:colpos == oBrowse:colCount(); exit; endif
            oBrowse:right()
         case XBmsg == 2 //SB_PAGELEFT
            if oBrowse:colPos== 1; exit; endif
            oBrowse:panleft()
         case XBmsg == 3 //SB_PAGERIGHT
            if oBrowse:colpos == oBrowse:colCount(); exit; endif
            oBrowse:panright()
         otherwise
            * ignore
            lNeedStabilize := .f.
            exit
      endcase
      lNeedStabilize := .t.
      exit
   enddo //dummy loop
   if lNeedStabilize
      oBrowse:ForceStable()
      RefreshHXB(oBrowse, nWinNum, XBid)
   endif

   wvw_nSetCurWindow(nOldWin)

return NIL

/**
20040704 notes:

0 <= nPage <= (nMax - nMin + 1)
nPage :: pagesize

nMin <= nPos <= (nMax - max(nPage-1, 0))
**/

static function RefreshVXB(oBrowse, nWinNum, XBid)
local nMin, nMax, nPage, nPos
local nRatio
   //recalc the pos
   if ordKeyCount() < 30000
      nRatio := 1
      nMin := 1
      nMax := ordKeyCount()
      nPage := oBrowse:RowCount()       // ordKeyCount()
      nPos := ordKeyNo()-oBrowse:RowPos+1  // ordKeyCount()
   else
      nRatio := ordKeyCount() / 10
      do while nRatio > 30000
         nRatio := nRatio / 10
      enddo

      nMin := 1
      nMax := round( ordKeyCount() / nRatio, 0)
      nPage := round(oBrowse:RowCount() / nRatio, 0)       // ordKeyCount()
      nPos := round( (ordKeyNo()-oBrowse:RowPos+1) / nRatio, 0 )// ordKeyCount()
   endif

   WVW_XBupdate(nWinNum, XBid, nPos, nPage, nMin, nMax)

return NIL

static function RefreshHXB(oBrowse, nWinNum, XBid)
local nMin, nMax, nPage, nPos
local nRatio
   //recalc the pos
   nMin := 1
   nMax := oBrowse:ColCount
   nPage := oBrowse:RightVisible - oBrowse:LeftVisible + 1
   nPos := iif(oBrowse:RightVisible==oBrowse:ColCount, nMax, oBrowse:LeftVisible)

   WVW_XBupdate(nWinNum, XBid, nPos, nPage, nMin, nMax)

return NIL



//-------------------------------------------------------------------//
STATIC FUNCTION DbSkipBlock( n, oTbr )

   LOCAL nSkipped := 0

   if n = 0
      DBSkip( 0 )

   elseif n > 0
      do while nSkipped != n .and. TBNext( oTbr )
         nSkipped++
      enddo
   else
      do while nSkipped != n .and. TBPrev( oTbr )
         nSkipped--
      enddo
   endif

RETURN  nSkipped

//-------------------------------------------------------------------//
STATIC FUNCTION TBNext( oTbr )

   LOCAL nSaveRecNum := recno()
   LOCAL lMoved := .T.

   if Eof()
      lMoved := .F.
   else
      DBSkip( 1 )
      if Eof()
         lMoved := .F.
         DBGoTo( nSaveRecNum )
      endif
   endif

RETURN lMoved
//-------------------------------------------------------------------//
STATIC FUNCTION TBPrev( oTbr )
   LOCAL nSaveRecNum := Recno()
   LOCAL lMoved := .T.

   DBSkip( -1 )

   if Bof()
      DBGoTo( nSaveRecNum )
      lMoved := .F.
   endif

RETURN lMoved
//-------------------------------------------------------------------//
STATIC FUNCTION VouBlockField( i )

RETURN  { || fieldget( i ) }

//-------------------------------------------------------------------//
//      WVW_Paint() must be a FUNCTION in your application
//      as it is called when Window gets WM_PAINT message.
//-------------------------------------------------------------------//
//20040330,was: FUNCTION WVW_Paint( hWnd, msg, wParam, lParam, nWinNum )
//20040408,was: FUNCTION WVW_Paint( nWinNum, nrow1, ncol1, nrow2, ncol2 )
FUNCTION WVW_Paint( nWinNum )
   //ldebug("WVW_Paint:" + CRLF +;
   //       "hWnd = " + alltrim(str(hWnd)) + CRLF +;
   //       "nWinNum = " + alltrim(str(nWinNum)))
   if len(s_amiscobjlist) >= nWinNum+1
      aeval( s_amiscobjlist[nWinNum+1], {|e| eval( e, nWinNum )} )
   endif

   wvwm_paint( nWinNum )
RETURN 0

//-------------------------------------------------------------------//
//      WVW_SetFocus() must be a FUNCTION in your application
//      needs to process messages sent through WM_SETFOCUS message
//      received by the window.
//-------------------------------------------------------------------//
/*
FUNCTION WVW_SetFocus( hWnd, nWinNum )
static nGotFocus := 0
   if nWinNum==0
      return NIL
   endif
   nGotFocus++
   @ 0,0 say nGotFocus
   if nGotFocus % 3 == 0
      alert("Got focus " + tran(nGotFocus,"9999") + "th times")
   endif

RETURN nil
*/

//-------------------------------------------------------------------//
//      WVW_KillFocus() must be a FUNCTION in your application
//      needs to process messages sent through WM_KILLFOCUS message
//      received by the window.
//-------------------------------------------------------------------//
//FUNCTION WVW_KillFocus( hWnd )
//RETURN nil

function WVW_TIMER(nWinNum, hWnd, message, wParam, lParam)
* this function is called every certain interval, by GTWVW gtwndproc
   WVW_SBsetText(0, 1, time())
return NIL

function CreateToolbar(nWinNum)
//for toolbar:
local nSysBitmap := 1     //0:none 1:small 2:large
local lDisplayText := .f. //text will be displayed as tooltip instead
local hWndTB
local ldefault

   wvw_tbdestroy(nWinNum)

   ldefault := lYesNo("would you like to use default toolbar setting?")

   if !ldefault
      nSysBitmap := alert("Select toolbar button size", {"Small", "Big"})
      nSysBitmap := iif(nSysBitmap==0, 1, nSysBitmap)
      lDisplayText:= alert("Display text in toolbar?", {"Yes", "No"})==1
   endif

   hWndTB := wvw_tbcreate(nWinNum, lDisplayText, NIL, nSysBitmap)

   if hWndTB==0
      lboxmessage("FAILED create toolbar")
      return NIL
   endif

   /* system bitmaps use constants in commctrl.h */

   /* using system view bitmaps */
   wvw_tbAddButton(nWinNum, IDM_NETCONNECT,    9  /*VIEW_NETCONNECT*/, "Connect",2)
   wvw_tbAddButton(nWinNum, IDM_NETDISCONNECT, 10 /*VIEW_NETDISCONNECT*/, "Dis",2)
   wvw_tbAddButton(nWinNum)  //separator

   /* using system history bitmaps */
   wvw_tbAddButton(nWinNum, IDM_BACK,          0 /*HIST_BACK*/,   "Back",3)
   wvw_tbAddButton(nWinNum, IDM_FORWARD,       1 /*HIST_FORWARD*/,"Forward",3)
   wvw_tbAddButton(nWinNum)  //separator

   /* using custom bitmaps */
   wvw_tbAddButton(nWinNum, IDM_DEMO_BROWSE, "def2.bmp","Browse",0)
   wvw_tbAddButton(nWinNum, IDM_DEMO_GET,    "vouch1.bmp",  "Get",0)
   wvw_tbAddButton(nWinNum)  //separator

   /* using system standard bitmaps */
   wvw_tbAddButton(nWinNum, IDM_COPY,    1 /*STD_COPY*/, "Copy", 1)
   wvw_tbAddButton(nWinNum, IDM_PASTE,   2 /*STD_PASTE*/,"Paste",  1)
   wvw_tbAddButton(nWinNum)  //separator

   wvw_tbAddButton(nWinNum, IDM_HELP_INFO, 10 /*STD_PROPERTIES*/,"Info",1)
   wvw_tbAddButton(nWinNum, IDM_HELP_HELP, 11 /*STD_HELP*/,"Help",1)
return NIL

function xDisableToolbar(nWinNum)
local i
  for i := 0 to wvw_tbButtonCount(nWinNum)-1
     WVW_TBEnableButton(nWinNum, i, .f.)
  next
return NIL

function xEnableToolbar(nWinNum)
local i
  for i := 0 to wvw_tbButtonCount(nWinNum)-1
     WVW_TBEnableButton(nWinNum, i, .t.)
  next
return NIL

//-------------------------------------------------------------------//

function ResetMiscObjects( nWinNum )
   do while len(s_amiscobjlist) < nWinNum+1
      aadd( s_amiscobjlist, {} )
   enddo
   s_amiscobjlist[ nWinNum+1 ] := {}
return .t.

function AddMiscObjects( nWinNum, bAction )
   aadd( s_amiscobjlist[ nWinNum+1 ], bAction )
return .t.


// inkey() handler **************************************

/* this is for use with SETINKEYAFTERBLOCK() */
function nAfterInkey(nkey)
* check if nkey is:
* (1) menu command, or
* (2) mouse button action
local bAction
  if nkey==WVW_DEFAULT_MENUKEYEVENT
     * MenuKeyEvent
     return nMenuChecker(WVW_GETLASTMENUEVENT())
  //was: elseif ASCAN({K_LBUTTONDOWN, K_LBUTTONUP, K_MOUSEMOVE}, nKey) > 0
  elseif ASCAN({K_LBUTTONDOWN, K_LBUTTONUP, K_MOUSEMOVE, K_MMLEFTDOWN,;
                K_LDBLCLK}, nKey) > 0
     * MouseEvent
     return wvwm_nMouseChecker(nkey)
  elseif (bAction := SETKEY(nKey)) != NIL
     eval(bAction, PROCNAME(), PROCLINE(), READVAR())
     return 0
  endif
return nkey //nAfterInkey(nkey)


// MENU handler **************************************

function nMenuChecker(nMenuEvent)
local nkey := 0
   xDisableMenus(0, 4)
   //xDisableToolbar(0)

   do case
      case nMenuEvent==IDM_DEMO_GET
         * lboxmessage("Demo GET")
         Demo_Get()
      case nMenuEvent==IDM_DEMO_BROWSE
         * lboxmessage("Demo BROWSE")
         Demo_Browse()
      case nMenuEvent==IDM_DEMO_CONSOLE
         * lboxmessage("Demo CONSOLE")
         Demo_Console()
      //case nMenuEvent==IDM_DEMO_COLOR
      //   * lboxmessage("Demo COLOR")
      //   Demo_Color()
      case nMenuEvent==IDM_DEMO_EXIT
         * lboxmessage("should EXIT!")
         nkey := K_ESC

      case nMenuEvent==IDM_WINDOW_SPACING_INCREASE
         WVW_SetLineSpacing(NIL, WVW_SetLineSpacing()+2)
      case nMenuEvent==IDM_WINDOW_SPACING_DECREASE
         WVW_SetLineSpacing(NIL, WVW_SetLineSpacing()-2)
      case nMenuEvent==IDM_WINDOW_SPACING_DEFAULT
         WVW_SetDefLineSpacing( WVW_SetLineSpacing() )

      case nMenuEvent==IDM_TOOLBAR_ENABLE
         xEnableToolbar(0)
      case nMenuEvent==IDM_TOOLBAR_DISABLE
         xDisableToolbar(0)
      case nMenuEvent==IDM_TOOLBAR_RESET
         CreateToolbar(0)
      case nMenuEvent==IDM_TOOLBAR_DELETE
         WVW_TBdestroy(0)

      case nMenuEvent==IDM_HELP_HELP
         xHelp()
      case nMenuEvent==IDM_HELP_INFO
         xDebugInfo()
      otherwise
         lboxmessage("Sorry, unknown menu option")
   endcase

   //xEnableToolbar(0)
   xEnableMenus(0, 4)
return nkey //nMenuChecker()

// MISCELLANEOUS *******************************************************

function lBoxMessage(cMsg, cTitle)
   default cTitle to "Info"
   win_messagebox(WVW_GETWINDOWHANDLE(), cMsg, cTitle, MB_OK + MB_ICONINFORMATION + MB_SYSTEMMODAL)
return .t.

function lYesNo(cMsg, cTitle)
   default cTitle to "Konfirmasi"

return (win_messagebox(WVW_GETWINDOWHANDLE(), cMsg, cTitle, MB_YESNO + MB_ICONQUESTION + MB_SYSTEMMODAL) == IDYES)

function lDebug(cMsg)
return lBoxMessage(cMsg, "Debug")

function xDebugInfo()
static s_nfh := 0
   MSETPOS(maxrow(), maxcol())

   //SETMOUSE(.t., maxrow(), maxcol())

   //WVW_SETMOUSEPOS(WVW_nNumWindows()-1, maxrow(), maxcol())

   lboxmessage("GTWVW test/demo" + CRLF +;
          "Budyanto Dj. <budyanto@centrin.net.id>" + CRLF+;
          CRLF +;
          "Topmost Window is Window #" + alltrim(str(wvw_nNumWindows()-1)) + CRLF +;
          "Current Window is Window #" + alltrim(str(wvw_nSetCurWindow())) + CRLF +;
          "MaxRow() = " + alltrim(str(maxrow())) + ", MaxCol() = " + alltrim(str(maxcol())) + CRLF +;
          "Row() = " + alltrim(str(row())) + ", Col() = " + alltrim(str(col())) + CRLF +;
          "WVW_RowOfs() = " + alltrim(str(wvw_nrowofs())) + ", WVW_ColOfs() = " + alltrim(str(wvw_ncolofs())) + CRLF +;
          "Line Spacing = " + alltrim(str(WVW_SetLineSpacing()))  + CRLF +;
          "Default Line Spacing = " + alltrim(str(WVW_SetDefLineSpacing()))  + CRLF +;
          CRLF +;
          "Font Face = '" + s_aFontInfo[1] + "'" + CRLF +;
          "Font Height = " + alltrim(str(s_aFontInfo[2])) + CRLF +;
          "Font Width = " + alltrim(str(s_aFontInfo[3])) + CRLF +;
          CRLF+;
          "BTW, mouse pointer now sits on maxrow(),maxcol(), doesn't it?")
return NIL

function xHelp()
   lboxmessage("GTWVW test/demo" + CRLF +;
          "Budyanto Dj. <budyanto@centrin.net.id>" + CRLF+;
          CRLF +;
          "Hotkeys (available in any window):" + CRLF+;
          "F1 : Help" + CRLF+;
          "F2 : Info on current window" + CRLF+;
          "F3 : Open a new window of a pseudo-console typewriter" + CRLF+;
          "F9 : Decrease Line Spacing" + CRLF+;
          "F10: Increase Line Spacing" + CRLF+;
          "F11: Set as Default Line Spacing" + CRLF+;
          CRLF+;
          "Test/demo available:" + CRLF+;
          "GET: a simple GET/READ session"+CRLF+;
          "BROWSE: a simple TBROWSE session"+CRLF+;
          CRLF+;
          "CONSOLE: a simple CONSOLE session" + CRLF+;
          "You are interacting in a typewriter mode." + CRLF+;
          "Press Ctrl+W to open a new, bigger window." + CRLF+;
          "Press ESC to exit)"+CRLF+;
          CRLF+;
          "Maximum number of windows opened: " + alltrim(str(WVW_MAXWINDOWS)) + CRLF+;
          CRLF+;
          "Other info:"+CRLF+;
          "Window repainting is checked at 100msec interval")
return NIL

function nCeiling(nNumber, nRoundDec)
* WARNING!!! tidak bekerja untuk nRoundDec > 0
* nRoundDec: 0=satuan, -1=puluhan, -2=ratusan, -3=ribuan
local i
local nTemp
   default nRoundDec to 0   //SATUAN
   if nRoundDec > 0
      nRoundDec := 0
   endif

   * geser kanan
   for i := nRoundDec to (0-1)   //artinya kalau SATUAN gak usah
      nNumber := nNumber / 10
   next

   nTemp := nNumber - INT(nNumber)  //right of dec point
   if nTemp>0
      nNumber := INT(nNumber) + 1
   else
      nNumber := INT(nNumber)
   endif

   * geser kiri
   for i := nRoundDec to (0-1)   //artinya kalau SATUAN gak usah
      nNumber := nNumber * 10
   next
return nNumber

/* Modified from SetDefaultWindowSize() sample from Peter Rees */
/* Note: width < 0 appears better, but mouse caption will look bad */
FUNCTION SetDefaultWindowSize()
  //x was: LOCAL Result:= SetMode(32,98), ScreenWidth
  LOCAL Result:= .t., ScreenWidth
  SetMode(25,80)
  IF Result
     screenWidth := Wvw_GetScreenWidth()
     DO CASE
        CASE screenWidth >= 1024
          Result:= Wvw_SetFont(,'Terminal',20,10)
        CASE screenWidth >= 800
          IF HB_OSISWINNT()
             Result:= Wvw_SetFont(,'Lucida Console',16,-8)
          ELSE
             Result:= Wvw_SetFont(,'System',16,-8)
          ENDIF
        OTHERWISE
           Result:= Wvw_SetFont(,'Terminal',12,6)
     ENDCASE
     IF Result
        Wvw_SetCodePage(,255)  // #define OEM_CHARSET 255 - from wingdi.h
        CLS
     ENDIF
  ENDIF
RETURN(Result)

//static function isWinNT()
//return lYesNo("I am preparing the 'best' font for you..." + CRLF+;
//              "Sorry, is it Windows NT?")


//ERROR handler *******************************************************

procedure ErrorSys()
ErrorBlock( { |e| MyError( e ) } )
return


static procedure MyError( e )
local cTrace := "", i := 1 , cErr

cErr := "Runtime error" + CRLF + ;
        CRLF + ;
        "Gencode: " + LTrim( Str( e:GenCode ) ) + CRLF + ;
        "Desc: " + e:Description +  + CRLF + ;
        "Sub-system: " + LTrim( Str( e:SubCode ) ) + CRLF + ;
        CRLF + ;
        "Call trace:" + CRLF + ;
        CRLF


do while ! Empty( ProcName( ++i ) )
    cErr += Trim( ProcName( i ) ) + "(" + Ltrim( Str( ProcLine( i ) ) ) + ")" + CRLF
enddo

//? cErr  // Calls quit
ldebug(cErr)
hb_gtInfo( HB_GTI_INKEYFILTER, NIL )
quit

return

proc debugging(cMsg, nRow, nCol, nWinNum)
  ? cmsg + alltrim(str(nrow)) + ", " + alltrim(str(ncol))
return

proc pause
  tone(660,2)
  inkey(0)
return
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

harbour + gtwvw + hwgui

Mensagem por leandrolinauer »

Bom dia Itamar.
Estou procurando respostas para como fazer harbour + gtwvw+ hwgui, estou lutando para executar o sistema com as duas juntas mas nao esta dando certo.

Já consegui compilar e gera o executavel perfeitamente sem erros, mas na hora de executar o programa ele não executa, vai para as estrelas e sai sem mostrar nada, nem tela.

Estou fazendo em HARBOUR 3.2 + GTwvw + HWgui 2.18, são as ultimas versões que baixei.

Detalhe, o executavel compilado com como esta acima só funciona se eu não chamar nenhum fonte em HWGUI, se chamar ele não executa.
DETALHES:
/////Meu HBMK.HBM
hwgui.hbc
gtwvw.hbc
-inc -lhbcomm -lhbwin -lhbct -lhbtip -lsqlite3 -lhbsqlit3

////Meu projeto.HBP
@hbmk.hbm
-oKAZA
-prgflag=/m /l /n
-compr=yes
TELAHWGUI.PRG
meusfontes.prg
KAZA.RC

////Gtwvw.hbc
{!allwin|!x86}skip=yes

incpaths=.
libpaths=lib/${hb_plat}/${hb_comp}

gt=${hb_name}
gui=yes

libs=${_HB_DYNPREF}${hb_name}${_HB_DYNSUFF}

////Hwgui.hbc
incpaths=include
libpaths=lib

{win}gt=gtgui

libs=hwgui procmisc hbxml
{win&!allmingw}libs=hbactivex

Necessito de ajuda porque preciso migrar o sistema todo para HWGUI, mas terei que fazer isto aos poucos devido ser muito extenso e o mesmo sofre muitas alterações diárias para melhorias de execução.

Grato pela colaboração.
:{
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

harbour + gtwvw + hwgui

Mensagem por Itamar M. Lins Jr. »

A Hwgui 2.18 está com muitos problemas.
Baixe a versão 2.17 no yahoo hwguibr que o Marcos Gambeta colocou lá.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

harbour + gtwvw + hwgui

Mensagem por leandrolinauer »

Boa tarde.
Não consegui compilar a versao 2.17 com harbour 3.2, da erros de falta de arquivos etc..

Voltando ao assunto HWGui 2.18, eu consigo fazer funcionar se for somente HWGui com HARBOUR 3.2 rodando belezinha os exemplos dela, só não consegui rodar com GTWVW.

Um dos erros pode ser que não funcione com GTWVW?
Ou será que o programa deve ser a tela principal em HWGUI e o resto em GTWVW?, este teste nao fiz ainda, mas vou.

Grato por enquanto
:{
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

harbour + gtwvw + hwgui

Mensagem por Itamar M. Lins Jr. »

Olha, a GTWVW é uma lib sem suporte está abandonada.
Se for questão de rapidez no desenvolvimento melhor fazer tudo em HWGUI.

Não é essa a resposta que vc esperava provavelmente, mas não vale a pena perder tempo com a GTWVW.

A versão 2.18 está em beta com muita coisa por fazer... o Alexander voltou a contribuir e desfez muita coisa da versão 2.17 porém parou 2 meses e hoje dia 26/09/2013 fez algumas correções solicitadas por nós, já detectamos mais problemas e esperamos que ele corrija.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

harbour + gtwvw + hwgui

Mensagem por leandrolinauer »

Boa noite.
Voltei para Harbour 3.1 porque me deparei com um erro que não identifique nos erros modelo DOS, tela vermelha sem as escritas de identificação de erro.
Bom não tentei hwgui no harbour 3.1 ainda, vou tentar mais tarde se consigo compilar e fazer quem sabe funcionar HARBOUR + GTWVW + HWGUI.
Não tenho como abandonar a GTWVW de imediato em virtude de todo o sistema ja esta escrito com esta lib, será que com outra lib que molde a gtwvw para substituição funcione com a hwgui, o problema é que a hwgui é escrita totalmente diferente da gtwvw.
:xau :{
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

harbour + gtwvw + hwgui

Mensagem por JoséQuintas »

Discordo do que foi apresentado, mas com ressalvas.

Ponto principal: o que usa da GTWVW?
Dependendo do que usa, pode passar direto pra GTWVT ou GTWVG.

O Harbour 3.2 está bem estável, e vai ser o mais compatível com LIBs, além de conter GTWVT/GTWVG mais atualizadas.
De repente pode brigar com um bug de compatibilidade no Harbour 3.0 que já foi resolvido no 3.2.

A curva de aprendizado.....
Tem que avaliar não só onde quer chegar, mas por onde pode passar.

Se for analisar friamente, a curva de aprendizado vai ser muito melhor em outra linguagem de programação.
Mas tudo depende de cada um.

Aproveitar fontes é bom, quando não dá pra passar um grande ERP pra outra linguagem de uma vez.
E se precisar adquirir conhecimentos de visual gráfico, o melhor é aproveitar fontes, e poder ir alterando conforme vai adquirindo conhecimento.
Não é o caso de algumas LIBs gráficas, que exigem que tudo seja alterado de uma vez.

Se seu ERP puder parar por meses, e ir fazendo versão em paralelo, aí a curva de aprendizado pode ser maior, mas só vai ver resultado no final, seja positivo ou negativo.
Se puder fazer aos poucos, pelo menos perde menos tempo com isso, e a decepção é menor.

Nesta semana liberei pra poder abrir várias janelas independentes do sistema.
Por incrível que pareça, preferiram sem isso.
Demorei meses pra deixar redondo, mas fui fazendo só de vez em quando, a passos longos, nada de tempo integral.

Já o menu estilo WIndows, eu mesmo não gostei e não liberei.

Ainda bem que está tudo como opcional, podendo ser ativado ou não.

Tem até recurso para Windows 8.1... onde o sistema vai falar em bom e claro português.

Mas é assim que funciona: tem coisas que interessam para o usuário final, e tem coisas que não.
O próprio Windows 8.1 é um exemplo, aonde a maioria não gostou do novo estilo metro, nem eu.

Poder liberar pequenas partes para clientes é bom pra avaliar a recepção do resultado, e poder mudar de rumo no meio do caminho.

Enquanto isso, todos os relatórios viraram Harupdf como principal elemento, com todos os recursos disponíveis, mas sem abandonar a opção de matricial.
Esta parte obrigatoriamente teria que ser feita, não depende de lib gráfica, então o sistema continuou indo em frente, sempre.

É isso que acho.

Obs.
Uma vez em muiltithread/multijanelas, como está agora, dá pra brincar com qualquer lib gráfica.
Falta paciência pra mexer nesses troços esquisitos que existem no Harbour.
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/
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

harbour + gtwvw + hwgui

Mensagem por leandrolinauer »

Boa tarde.
Obrigado pelos muitos esclarecimentos, mas quando me refiro em muitas alterações, são alterações gerenciais, são melhorias gerencias e não de telas, estas que estão me consumindo muito tempo, tais como:
Relatórios novos, bloqueios novos, alteração de algum cadastro ou até complementação de movimento, e tbem a parte fiscal que tem muito a ser feito.

Aí como estou trabalhando com isto, todo dia o dia todo, fica dificil parar o sistema para poder escrever em outra linguagem, por isto eu procuro algo que eu possa mesclar podendo deixar o sistema rodando e fazendo de tempo em tempo um bloco novo, exemplo:

Sistema (GTWVW)
CADASTRO DE CLIENTES (GTWVW)
........VARIOS OUTROS (GTWVW)
CADASTRO DE CIDADES (GTWVW) (agora vou trabalhar neste na folga) fazendo abaixo:

SISTEMA(GTWVW)
CADASTRO DE CLIENTES(GTWVW)
.....VARIOS OUTROS (GTWVW)
CADASTRO DE CIDADES (HWGUI)

e assim até terminar, mas rodando nos clientes sem que de falhas ou erros, apenas vão ver que em HWGUI com tela diferente, até alterar tudo ficando.

SISTEMA(HWGUI)
CADASTRO DE CLIENTES(HWGUI)
......VARIOS OUTROS (HWGUI)
CADASTRO DE CIDADES (HWGUI)

Por isto solicite se tem outra LIB que é igual ao GTWVW, exemplo a GTWVG e que combine com HWGUI para rodar no mesmo fonte compilado.

Grato pela ajuda.
:D
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

harbour + gtwvw + hwgui

Mensagem por JoséQuintas »

Um exemplo parecido com o exemplo apresentado pela fwvw, sem nada complicado no fonte:

Código: Selecionar todos

PROCEDURE Main
   LOCAL dDate     := Date()
   LOCAL cName     := PadR( "Pritpal Bedi", 35 )
   LOCAL cAdd1     := PadR( "60, New Professor Colony", 35 )
   LOCAL cAdd2     := PadR( "Ludhiana, INDIA", 35 )
   LOCAL cAdd3     := PadR( "http://hbide.vouch.info", 35 )
   LOCAL nSlry     := 20000
   LOCAL nColGet   := 8
   LOCAL GetList := {}
   SetColor( "N/W" )
   CLS
   SetColor( "N/W,N/GR*,,,N/W*" )
   @  6, nColGet SAY "< Date >"
   @  9, nColGet SAY "<" + PadC( "Name", 33 ) + ">"
   @ 12, nColGet SAY "<" + PadC( "Address", 33 ) + ">"
   @ 16, 61      SAY "< Salary >"
   @  7, nColGet GET dDate VALID DataOk( dDate )
   @ 10, nColGet GET cName
   @ 13, nColGet GET cAdd1 
   @ 15, nColGet GET cAdd2 
   @ 17, nColGet GET cAdd3 
   @ 17, 61      GET nSlry PICTURE "@Z 9999999.99" 
   READ
   RETURN

FUNCTION DataOk( dDate )
   IF Year( dDate ) != 2013
       wapi_MessageBox( wapi_GetActiveWindow(), "Data invalida", "Atencao" )
       RETURN .f.
   ENDIF
   RETURN .t.
arquivo hbp

Código: Selecionar todos

test.prg
gtwvg.hbc
hbwin.hbc
Tudo bem, a mudança é simples, mas nada que complique fontes.
É um visual simples, mas totalmente compatível com outras LIBs gráficas.

Comentário:
A mensagem estilo windows usa a própria api do windows, através da hbwin do Harbour
E as cores, são somente mudança de cor.
Anexos
telawvg.png
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/
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

harbour + gtwvw + hwgui

Mensagem por Toledo »

Amigos, segue em anexo um pequeno exemplo de GtWvg + HwGui.

Leandro, qualquer dúvida posta aqui no fórum que tentamos lhe ajudar.

Abraços,
Anexos
harbour_gtwvg_hwgui.zip
(1.07 MiB) Baixado 589 vezes
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

harbour + gtwvw + hwgui

Mensagem por JoséQuintas »

Tava repassando o post. Já é usada WVW e HWGUI, a dúvida é só sobre ter isso no Harbour ou algo compatível.
wvw tem sim, mas wvw fica em extras, o que significa sem continuidade ou com ajustes de compatibilidade limitados. Se tiver problemas, acho que gtwvg é a mais próxima.
E hwgui é baixar a parte e compilar.

Obs. Isso falando de harbour 3.2, que é a versão base atual pra praticamente tudo.
Obs2. Lembro de ter lido sobre a parte gráfica do Harbour+Windows que serviu de base pra muita coisa, ter começado por alguém que morreu. Só não lembro qual das LIBs foi.
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/
Responder