Pra quem ficou curioso:
Fonte relativamente simples
Código: Selecionar todos
#include "hbgtinfo.ch"
#include "hwgui.ch"
FUNCTION Main()
LOCAL oDlg, nCont := 1
INIT DIALOG oDlg TITLE "ADO Example" ;
AT 200,0 SIZE 400,150
MENU OF oDlg
MENUITEM "&Exit" ACTION hwg_EndDialog()
MENUITEM "&Browse DBF" ACTION hb_ThreadStart( { || DoMt( nCont++ ) } )
ENDMENU
ACTIVATE DIALOG oDlg
hb_ThreadWaitForAll()
RETURN Nil
FUNCTION DoMt( nCont )
hb_gtReload( hb_gtInfo( HB_GTI_VERSION ) )
hwg_initProc() // init hwgui on thread
DlgBrwDbf( nCont )
RETURN Nil
Algo extraordinário no fonte acima ? não
O outro fonte, dlgbrwdbf.prg, é um browse dbf simples em hwgui.
Pode até ser compilado sozinho, poderia ser qualquer fonte hwgui.
Peguei do exemplo ADO, que o Itamar complementou com DBF na época.
Código: Selecionar todos
/*
* dlgbrwdbf.prg
* dbf browse
*/
#include "hwgui.ch"
FUNCTION DlgBrwDbf( nCont )
LOCAL oDlg, oBrowse, aList, aItem
SET EXCLUSIVE OFF
hb_Default( @nCont, 1 )
CreateDBF( "test" )
USE test
aList := { ;
{ "Name", { || field->Name } }, ;
{ "Adress", { || field->Address } } }
INIT DIALOG oDlg TITLE "DBF BROWSE " + Ltrim( Str( nCont ) ) AT 0,0 SIZE 1024,600
@ 20,10 BROWSE oBrowse DATABASE SIZE 780, 500 STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL
FOR EACH aItem IN aList
ADD COLUMN aItem[ 2 ] TO oBrowse HEADER aItem[ 1 ] LENGTH 30
NEXT
@ 500,540 BUTTON "Close" SIZE 180,36 ;
ON CLICK { || hwg_EndDialog() } // will close all
ACTIVATE DIALOG oDlg
CLOSE DATABASES
RETURN Nil
FUNCTION CreateDbf( cFileName )
LOCAL aList
IF hb_vfExists( cFileName + ".dbf" )
RETURN NIL
ENDIF
aList := { ;
{ "NAME", "C", 30, 0 }, ;
{ "ADDRESS", "C", 30, 0 } }
dbCreate( cFileName , aList )
USE ( cFileName )
APPEND BLANK
REPLACE field->name WITH "DBF_AAAA", field->address WITH "DBF_AAAA"
APPEND BLANK
REPLACE field->name WITH "DBF_BBBB", field->address WITH "DBF_BBBB"
APPEND BLANK
REPLACE field->name WITH "DBF_CCCC", field->address WITH "DBF_CCCC"
USE
RETURN NIL