home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BUG 4
/
BUGCD1997_05.BIN
/
aplic
/
clip4win
/
clip4win.exe
/
C4W30E.HUF
/
SOURCE
/
WBTDEMO.ZIP
/
WBDEMO.PRG
< prev
next >
Wrap
Text File
|
1995-06-07
|
86KB
|
2,356 lines
#define W_RIGHT 3
#define W_BOTTOM 4
#define WIN_WANT_ALL
#define WIN_WANT_SBS
#define WIN_WANT_EN
#define WIN_WANT_LBS
#define WIN_WANT_LB
#define WIN_WANT_CB
#define WIN_WANT_MF
#define WIN_WANT_IDM
#define WIN_WANT_HELP
#define WIN_WANT_DRAWTEXT
#define WIN_WANT_CLIPBOARD
#define WIN_WANT_RESOURCE
#define WIN_WANT_SYSTEM_METRICS
#define WIN_WANT_GETDEVCAPS
#define WIN_WANT_BITMAPS
#define BDOB 2001
#define BNAME 2002
#define BRACE 2003
#define BSEX 2004
#define BCCODE 2005
#include "windows.ch"
#include "inkey.ch"
#include "accel.ch"
#include "textmetr.ch"
#include "dialog.ch"
#include "font.ch"
#include "wbdemo.ch"
#include "paint.ch"
#include "topclass.ch"
#include "vo.ch"
STATIC cCopy := "Copyright 1994,1995 Logical Systems"
STATIC hMainWnd
STATIC hCTL3D
STATIC hBWCCLib
STATIC nTH
STATIC nMainWW
STATIC hDemoWnd
STATIC SCCODE,SLAST_NAME,SFIRST_NAME,SMI,SJR_SR_III,SNOTES,SRACE,SSEX
STATIC aTFont := {-12, 0, 0, 0, 0, .F., .F., .F., 1, 0, 0, 0, 0, "Arial"}
FUNCTION Main
LOCAL hInst, nEvent, cC3D, aCrect := {}
SET DELETED ON
SET SCOREBOARD OFF
REQUEST DBFCDX
REQUEST DBFNTX
hInst := _GetInstance()
hCTL3D := LoadLibrary("CTL3D.DLL")
hBWCCLib := LoadLibrary("BWCC.DLL")
Ctl3DRegister(hInst)
Ctl3dAutoSubClass(hInst)
SetHandleCount(30)
C4W_Autoclose(.F.)
hMainWnd := WinSetup("DEMO")
USE ATTEND NEW VIA "DBFNTX"
SET INDEX TO ATTEND
USE CHILD NEW VIA "DBFCDX"
SET INDEX TO CHILD
USE BUTTONS NEW VIA "DBFNTX"
USE CAL NEW VIA "DBFNTX"
SET INDEX TO CAL
DemoDlg()
DO WHILE .T.
nEvent := ChkEvent()
HandleEvent(nEvent)
ENDDO
RETURN(NIL)
STATIC FUNCTION WinSetup(cAppName, cTitle)
LOCAL hWnd, hInst, hPrevInst, nCmdShow, hBrush, hIcon
hInst := _GetInstance()
hPrevInst := _GetPrevInstance()
nCmdShow := _GetnCmdShow()
hIcon := LoadIcon(hInst,"DEMO"+CHR(0))
hBrush := GetStockObject( WHITE_BRUSH )
IF hPrevInst == 0
IF !RegisterClass(CS_HREDRAW + CS_VREDRAW + CS_SAVEBITS + CS_DBLCLKS,;
hInst, ;
hIcon, ;
LoadCursor(hInst,IDC_ARROW),;
hBrush,;
cAppName)
QUIT
ENDIF
IF !RegisterClass(CS_HREDRAW + CS_VREDRAW + CS_SAVEBITS + CS_DBLCLKS,;
hInst, ;
hIcon, ;
LoadCursor(,IDC_ARROW),;
GetStockObject(LTGRAY_BRUSH),;
'TB')
QUIT
ENDIF
// We want our icon on minimized browse windows so we get rid of
// the WBrowse() class and re-register it with our app icon
UnregisterClass("BLIST",hInst)
IF !RegisterClass(CS_HREDRAW + CS_VREDRAW + CS_SAVEBITS + CS_DBLCLKS,;
hInst, ;
hIcon, ;
LoadCursor(,IDC_ARROW),;
hBrush,;
"BLIST")
QUIT
ENDIF
ENDIF
hWnd := CreateWindow(cAppName, ;
"", ;
0, ;
0, ;
0, ;
640, ;
480, ;
0, ;
0, ;
hInst)
RETURN(hWnd)
FUNCTION PgmExit
Ctl3DUnRegister(_GetInstance())
FreeLibrary(hCTL3D)
FreeLibrary(hBWCCLib)
WinHelp(hMainWnd,"WINHELP.HLP",HELP_QUIT,0)
WinHelp(hMainWnd,"WBROWSES.HLP",HELP_QUIT,0)
DestroyWindow( hMainWnd )
QUIT
RETURN(NIL)
STATIC FUNCTION About
DialogBox(_GetInstance() , "about", hMainWnd, ;
{|hDlg, nMsg, nWparam, nLparam|;
MAbout(hDlg, nMsg, nWparam, nLparam)})
RETURN(NIL)
STATIC FUNCTION MAbout(hDlgWnd, nMsg, nWparam, nLparam)
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow(hDlgWnd)
RETURN(1)
CASE nMsg == WM_COMMAND
EndDialog(hDlgWnd,IDNO)
RETURN(1)
ENDCASE
RETURN(0)
STATIC FUNCTION FindKid( oB )
LOCAL nAnswer, cKid := "", nCrec
nAnswer := DialogBox(_GetInstance() , "find", oB:hWnd , ;
{|hDlg, nMsg, nWparam, nLparam|;
MFind(hDlg, nMsg, nWparam, nLparam,oB, @cKid)})
IF nAnswer == IDOK
IF !EMPTY(cKid)
SELECT CHILD
nCrec := RECNO()
SEEK cKid
IF !FOUND()
ErrorMsg(hMainWnd,"NOT FOUND!",'E')
GOTO nCrec
ELSE
oB:rowPos := 1
oB:nCrecNo := RECNO()
oB:nCurRec := NtxPos(INDEXORD(), RECNO())
oB:hitTop := BOF()
oB:hitBottom := EOF()
oB:showData()
ENDIF
ENDIF
ENDIF
RETURN(NIL)
STATIC FUNCTION MFind( hDlgWnd, nMsg, nWparam, nLparam,oB, cKid )
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow( hDlgWnd )
DoSubClEC( GetDlgItem( hDlgWnd, 101 ), hDlgWnd )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK
cKid := GetDlgItmText( hDlgWnd, 101 )
EndDialog( hDlgWnd, IDOK )
RETURN(1)
CASE nWparam == IDCANCEL
EndDialog( hDlgWnd, IDCANCEL )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION AddKid( oB, nMode )
LOCAL nCrec , nAnswer
SELECT CHILD
IF nMode == 1
nCrec := RECNO()
GO BOTTOM
SKIP
ENDIF
TmpVals()
nAnswer := DialogBox( _GetInstance() , "addkid", oB:hWnd , ;
{|hDlg, nMsg, nWparam, nLparam|;
MAddKid( hDlg, nMsg, nWparam, nLparam, oB, nMode )})
IF nAnswer == IDSAVE
IF nMode == 1
SELECT CHILD
APPEND BLANK
KidRepls()
oB:goTop()
ELSE
KidRepls()
oB:refreshAll()
ENDIF
ENDIF
RETURN(NIL)
STATIC FUNCTION MAddKid( hDlgWnd, nMsg, nWparam, nLparam, oB, nMode )
STATIC GetList
LOCAL nFoo
DO CASE
CASE nMsg == WM_INITDIALOG
GetList := KidGets( hDlgWnd )
IF nMode == 2
CheckDlgButton( hDlgWnd, 106, IIF( SSEX == 'M', 1, 0 ))
CheckDlgButton( hDlgWnd, 107, IIF( SSEX == 'F', 1, 0 ))
CheckDlgButton( hDlgWnd, 108, IIF( SRACE == 'W', 1, 0 ))
CheckDlgButton( hDlgWnd, 109, IIF( SRACE == 'B', 1, 0 ))
CheckDlgButton( hDlgWnd, 110, IIF( SRACE == 'O', 1, 0 ))
ENDIF
CenterWindow( hDlgWnd )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == 101
CASE nWparam == IDOK
IF GetFocus() < 500
PostMessage( hDlgWnd, WM_NEXTDLGCTL, 0, 0 )
ENDIF
RETURN( 1 )
CASE nWparam == IDSAVE
IF IsDialogOk( hDlgWnd, IDSAVE )
SNOTES := GetDlgItmText( hDlgWnd, 111 )
EndDialog( hDlgWnd, IDSAVE )
ENDIF
RETURN(1)
CASE nWparam == IDCANCEL
CANCEL DIALOG hDlgWnd
EndDialog( hDlgWnd, IDCANCEL )
RETURN(1)
CASE nWparam >= 106 .AND. nWparam <= 107
SSEX := IIF( nWparam == 106,'M','F' )
RETURN(1)
CASE nWparam >= 108 .AND. nWparam <= 110
SRACE := IIF( nWparam == 108, 'W',;
IIF( nWparam == 109, 'B', 'O'))
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION KidGets( hDlgWnd )
LOCAL GetList := {}
@ DIALOG hDlgWnd ID 101 GET SLAST_NAME
@ DIALOG hDlgWnd ID 102 GET SFIRST_NAME
@ DIALOG hDlgWnd ID 103 GET SMI
@ DIALOG hDlgWnd ID 104 GET SJR_SR_III
@ DIALOG hDlgWnd ID 105 GET SCCODE PICTURE "@!"
RETURN(GetList)
STATIC FUNCTION TmpVals
SCCODE := CHILD->CCODE
SLAST_NAME := CHILD->LAST_NAME
SFIRST_NAME := CHILD->FIRST_NAME
SMI := CHILD->MI
SJR_SR_III := CHILD->JR_SR_III
SRACE := CHILD->RACE
SSEX := CHILD->SEX
SNOTES := CHILD->NOTES
RETURN(NIL)
STATIC FUNCTION KidRepls
CHILD->CCODE := SCCODE
CHILD->LAST_NAME := SLAST_NAME
CHILD->FIRST_NAME := SFIRST_NAME
CHILD->MI := SMI
CHILD->JR_SR_III := SJR_SR_III
CHILD->RACE := SRACE
CHILD->SEX := SSEX
CHILD->NOTES := SNOTES
COMMIT
RETURN(NIL)
STATIC FUNCTION ViewNotes( oB )
DialogBox(_GetInstance() , "notes", oB:hWnd , ;
{|hDlg, nMsg, nWparam, nLparam|;
MNotes( hDlg, nMsg, nWparam, nLparam, oB )})
RETURN(NIL)
STATIC FUNCTION MNotes(hDlgWnd, nMsg, nWparam, nLparam, oB)
DO CASE
CASE nMsg == WM_INITDIALOG
SetDlgItemText( hDlgWnd, 101, LEFT(CHILD->NOTES,1400) )
CenterWindow( hDlgWnd )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK
CHILD->NOTES := LEFT( GetDlgItmText( hDlgWnd, 101), 1400)
EndDialog( hDlgWnd, IDOK )
RETURN(1)
CASE nWparam == IDCANCEL
EndDialog( hDlgWnd, IDCANCEL )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION MakeName
LOCAL cTmpname
cTmpname := TRIM(FIELD->LAST_NAME)+', '+;
TRIM(FIELD->FIRST_NAME)+' '+;
IIF(!EMPTY(FIELD->MI),FIELD->MI+'.','')+;
IIF(!EMPTY(FIELD->JR_SR_III),' ','')+FIELD->JR_SR_III
cTmpname := LEFT(cTmpname+SPACE(35),35)
IF ALLTRIM(cTmpname) == ','
cTmpname := SPACE(35)
ENDIF
RETURN(cTmpname)
STATIC FUNCTION MCalc( hDlgWnd, nMsg, nWparam, nLparam, aBArray, oB )
LOCAL aMoney
DO CASE
CASE nMsg == WM_INITDIALOG
aMoney := ReCalc( aBArray )
SetDlgItemText( hDlgWnd, 101, TRANSFORM(aMoney[1],"$99,999.99") )
SetDlgItemText( hDlgWnd, 102, TRANSFORM(aMoney[2],"$99,999.99") )
CenterWindow( hDlgWnd )
SetFocus( oB:hWnd )
RETURN(1)
CASE nMsg == WM_NCACTIVATE
IF nWparam < 1
nWparam := 1
ENDIF
SetFocus( oB:hWnd )
RETURN(0)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK
DestroyWindow( hDlgWnd )
oB:Destroy()
RETURN(1)
CASE nWparam == IDCALC
aMoney := ReCalc( aBArray )
SetDlgItemText( hDlgWnd, 101, TRANSFORM(aMoney[1],"$99,999.99") )
SetDlgItemText( hDlgWnd, 102, TRANSFORM(aMoney[2],"$99,999.99") )
SetFocus( oB:hWnd )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION ReCalc( aArray )
LOCAL nTuit := 0, nDisc := 0
LOCAL nCtr
FOR nCtr := 1 TO LEN(aArray)
nTuit += aArray[nCtr][2]
nDisc += IIF(aArray[nCtr][3] != 0,;
aArray[nCtr][2] * (aArray[nCtr][3]/100),0)
NEXT
RETURN({nTuit,nDisc})
PROCEDURE Ctl3dRegister( hInst )
LOCAL cDLL := GetProcAddress( hCTL3D, "Ctl3dRegister", "Pascal", ;
"void", "int" )
CallDLL( cDLL, hInst )
RETURN
PROCEDURE Ctl3dAutoSubclass( hInst )
LOCAL cDLL := GetProcAddress( hCTL3D, "Ctl3dAutoSubclass", "Pascal", ;
"void", "int" )
CallDLL( cDLL, hInst )
RETURN
PROCEDURE Ctl3dUnregister( hInst )
LOCAL cDLL := GetProcAddress( hCtl3d, "Ctl3dUnregister", "Pascal", ;
"void", "int" )
CallDLL( cDLL, hInst )
RETURN
STATIC PROCEDURE Ctl3dDlgEx( hWnd, nFlags )
LOCAL cDLL := GetProcAddress( hCtl3d, "Ctl3dSubclassDlgEx", "Pascal", ;
"BOOL", "HWND, DWORD" )
CallDLL( cDLL, hWnd, nFlags )
RETURN
************************** mover's
// Skipper() - This is the same skipblock function that WBrowse()
// uses internally. It is provided here so you can see what
// is required in those you write yourself. The difference
// between tbrowse() and WBrowse() is that the exported instance
// variable nCurRec must be set if the vertical scroll bar is
// to be updated correctly and we need to set our current
// record number (oB:nCrecNo).
STATIC FUNCTION Skipper( oB, nSkip )
DBSKIP( nSkip )
DO CASE
CASE BOF()
oB:nCurRec := 1
oB:nCrecNo := RECNO()
oB:hitTop := .T.
oB:hitBottom := EOF()
CASE EOF()
oB:nCurRec := RECNO()
oB:nCrecNo := RECNO()-1
oB:hitBottom := .T.
oB:hitTop := BOF()
OTHERWISE
oB:nCurRec += nSkip
oB:nCrecNo := RECNO()
oB:hitTop := .F.
oB:hitBottom := .F.
RETURN( nSkip )
ENDCASE
RETURN( 0 )
// Internal gotopblock and gobottomblock functions used by WBrowse()
//
STATIC FUNCTION BGoTop( oB )
DBGOTOP()
oB:hitTop := .T.
oB:hitBottom := EOF()
oB:rowPos := 1
oB:nCurRec := 1
oB:nCrecNo := recno()
oB:nMaxRec := LASTREC()
RETURN( NIL )
STATIC FUNCTION BGoBottom( oB )
DBGOBOTTOM()
oB:hitTop := BOF()
oB:hitBottom := .T.
oB:rowPos := oB:nMaxLines
oB:nCurRec := RECNO()
oB:nCrecNo := RECNO()
oB:nMaxRec := LASTREC()
RETURN( NIL )
// Array browse gotop routine
//
STATIC FUNCTION AGoTop( oB, aArray )
oB:nCurRec := 1
oB:rowPos := 1
oB:nCrecNo := NIL
oB:nMaxRec := LEN(aArray)
oB:hitTop := .T.
oB:hitBottom := .F.
RETURN(NIL)
// Array browse gobottom routine
//
STATIC FUNCTION AGoBottom( oB, aArray )
oB:nCurRec := LEN(aArray)
oB:nMaxRec := oB:nCurRec
oB:rowPos := oB:nMaxLines
oB:nCrecNo := NIL
oB:hitBottom := .T.
oB:hitTop := .F.
RETURN(NIL)
// Array browse skip routine
//
STATIC FUNCTION ASkipper( oB, nSkip, aArray )
LOCAL nMoved := 0
DO CASE
CASE nSkip > 0
IF ( oB:nCurRec + nSkip ) <= oB:nMaxRec
oB:nCurRec := oB:nCurRec + nSkip
nMoved := nSkip
oB:nCrecNo := oB:nCurRec
oB:hitTop := .F.
oB:hitBottom := .F.
ELSE
oB:nCurRec := oB:nMaxRec + 1 // IMPORTANT! Must be
oB:nCrecNo := NIL // = to LASTREC() + 1
oB:hitBottom := .T.
oB:hitTop := .F.
ENDIF
CASE nSkip < 0
IF ( oB:nCurRec - NegToPos(nSkip) ) >= 1
oB:nCurRec := oB:nCurRec - NegToPos(nSkip)
nMoved := nSkip
oB:nCrecNo := oB:nCurRec
oB:hitTop := .F.
oB:hitBottom := .F.
ELSE
oB:nCurRec := 1
oB:nCrecNo := NIL
oB:hitTop := .T.
oB:hitBottom := .F.
ENDIF
ENDCASE
RETURN(nMoved)
// First key search routine for an array
//
STATIC FUNCTION AFindKey( oB, cKey, aArray )
LOCAL nCtr
FOR nCtr := 1 TO LEN(aArray)
IF LEFT( UPPER(aArray[nCtr][1]) ,1 ) == cKey
EVAL( oB:gotopBlock, oB )
EVAL( oB:skipBlock, oB, nCtr-1 )
oB:rowPos := 1
oB:showData()
RETURN(.T.)
ENDIF
NEXT
RETURN(.F.)
STATIC FUNCTION DrawButtons( hWnd, aButtons, oB, lFind )
LOCAL nCtr, aCrect, nRight, hTB, hBWnd, hInst
aCrect := GetClientRect( hWnd )
hInst := _GetInstance()
hTB := CreateWindow("TB","",WS_CHILD+WS_VISIBLE+WS_BORDER,-2,-2,aCRect[W_RIGHT]+3,;
TextHeight( hWnd)+11,hWnd,0, hInst)
HideCaret(hTB)
DoSubClSB( hTB, hWnd )
aButtons := {}
AADD(aButtons, { hTB, NIL, NIL })
nRight := 2
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDTOPS, hInst),;
IDTOPS, {|oB|oB:GoTop(.F.)} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDBOTTOMS, hInst),;
IDBOTTOMS, {|oB|oB:GoBottom(.F.)} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDPGUPS, hInst),;
IDPGUPS, {|oB|oB:PageUp()} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDPGDNS, hInst),;
IDPGDNS, {|oB|oB:PageDown()} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDALTHOME, hInst),;
IDALTHOME, {|oB|oB:Home()} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDALTEND, hInst),;
IDALTEND, {|oB|oB:End()} } )
nRight += 52
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDADDS, hInst),;
IDADDS, {|oB|AddKid( oB, 1 )} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDDELETES, hInst),;
IDDELETES, {|oB|DelKid( oB )} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDEDITS, hInst),;
IDEDITS, {|oB|AddKid( oB, 2 )} } )
IF lFind
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDFINDS, hInst),;
IDFINDS, {|oB|FindKid( oB ), SetFocus( hWnd )} } )
ENDIF
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDPRINT, hInst),;
IDPRINT, {|oB|Print( hWnd, oB )} } )
nRight += 52
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDEXITS, hInst),;
IDEXITS, {|oB|PostMessage( hWnd, WM_SYSCOMMAND, SC_CLOSE, 0 )} } )
nRight += 26
AADD( aButtons, { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
nRight,1,25,22,hTB, IDBHELPS, hInst),;
IDBHELPS, {|oB|BHelp()} } )
RETURN( aButtons )
STATIC FUNCTION BDoSubCl( hWnd, oB )
LOCAL nProc
nProc := SubClassWindow(hWnd,;
{|hWnd, nMsg, nWparam, nLparam| ;
BWndProc(nProc, hWnd, nMsg, nWparam, nLparam, oB)},;
{WM_PAINT,;
WM_COMMAND,;
WM_SYSCOMMAND,;
WM_KEYDOWN,;
WM_CLOSE,;
WM_TIMER,;
WM_SIZE,;
WM_NCHITTEST,;
WM_SYSKEYDOWN})
RETURN(NIL)
STATIC FUNCTION BWndProc( nProc, hWnd, nMsg, nwParam, nlParam, oB )
LOCAL nCtr, hFont, aCRect, nTop, nBottom, hBrowWnd
hBrowWnd := oB:hWNd
DO CASE
CASE nMsg == WM_SYSCOMMAND
IF nWparam == SC_CLOSE
DestroyWindow( hWnd )
RETURN(NIL)
ENDIF
CASE nMsg == WM_SIZE
IF nWparam != SIZE_MINIMIZED
aCRect := GetClientRect( hWnd )
nTH := TextHeight( hWnd )
nTop := nTH+9
nBottom := aCRect[ 4 ] - nTop
MoveWindow( oB:hWnd,1,nTop,aCRect[3],nBottom,.T.)
MoveWindow( oB:cargo[1][1], -2, -2, aCRect[W_RIGHT]+3, nTH+11, .T. )
SendMessage( oB:hWnd, WM_PAINT, 0 , 0 )
ENDIF
CASE nMsg == WM_KEYDOWN .OR. nMsg == WM_SYSKEYDOWN
PostMessage( hBrowWnd, nMsg, nWparam, nLparam )
CASE nMsg == WM_COMMAND
FOR nCtr := 1 TO LEN( oB:cargo )
IF oB:cargo[ nCtr ][ 2 ] == nWparam
IF oB:cargo[ nCtr ][ 3 ] != NIL
EVAL( oB:cargo[ nCtr ][ 3 ], oB )
ENDIF
EXIT
ENDIF
NEXT
ENDCASE
IF IsWindow( hWnd )
SetFocus( hWnd )
ELSE
SetFocus( hMainWnd )
ENDIF
RETURN(CallWindowProc(nProc, hWnd, nMsg, nWparam, nLparam))
STATIC FUNCTION WndProcSB(nProc, hWnd, nMsg, nWparam, nLparam, hBWnd)
LOCAL hBrush, nButton
DO CASE
CASE nMsg == WM_CTLCOLOR
SetTextColor(nWparam, RGB(128,128,128))
SetBkColor(nWparam, RGB(128,128,128))
hBrush := GetStockObject(LTGRAY_BRUSH)
RETURN(hBrush)
CASE nMsg == WM_COMMAND
PostMessage(hBWnd,WM_COMMAND,nWparam,nLparam)
ENDCASE
RETURN(CallWindowProc(nProc, hWnd, nMsg, nWparam, nLparam))
STATIC FUNCTION DoSubClSB( hWnd , hBWnd)
LOCAL nProc
nProc := SubClassWindow(hWnd, ;
{|hWnd, nMsg, nWparam, nLparam| ;
WndProcSB(nProc, hWnd, nMsg, nWparam, nLparam, hBWnd)},;
{WM_CTLCOLOR,WM_COMMAND})
RETURN(NIL)
STATIC FUNCTION SetNubs( oB )
LOCAL hDC := GetDC( oB:hWnd )
LOCAL hOldFont, hBrowFont
hBrowFont := oB:colFont
IF hBrowFont != NIL
hOldFont := SelectObject( hDC, hBrowFont )
ENDIF
oB:setColWidth(0,C4W_LoWord(GetTextExtent(hDC,"WWW0000",7)))
IF hOldFont != NIL
SelectObject( hDC, hOldFont )
ENDIF
ReleaseDC( oB:hWnd, hDC )
RETURN( NIL )
STATIC FUNCTION Print( hWnd, oB )
LOCAL hPrintDC
LOCAL hFont1, hFont2
LOCAL nPtSize
LOCAL aFont := {-19, 0, 0, 0, 0, .F., .F., .F., 1, 0, 0, 0, 0, "Arial"}
// We let the user select the font and style
// but we will set the size later!
aFont := ChooseFont(aFont)
IF aFont == NIL
RETURN( NIL )
ENDIF
// Let the user select the printer and set it up if needed...
hPrintDC := GetPrintDC()
IF EMPTY(hPrintDC)
RETURN( NIL )
ENDIF
// Sometimes the printer setup dialog messes up our window
// so to make things nice we will re-draw it....
SendMessage( hWnd, WM_PAINT, 0, 0 )
// Now we set our font sizes
// 14 point for our heading
nPtSize := PosToNeg( ( 14 * GetDeviceCaps( hPrintDC, LOGPIXELSY ) ) / 72 )
aFont[1] := nPtSize
hFont1 := CreateFont( aFont )
// 10 point for the details...
nPtSize := PosToNeg( ( 10 * GetDeviceCaps( hPrintDC, LOGPIXELSY ) ) / 72 )
aFont[1] := nPtSize
hFont2 := CreateFont( aFont )
DialogBox( _GetInstance() , "statusbar", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MPrint( hDlg, nMsg, nWparam, nLparam, hPrintDC, oB, hFont1, hFont2 ) } )
// Clean up....
DeleteObject( hFont1 )
DeleteObject( hFont2 )
DeleteDC(hPrintDC)
RETURN( NIL )
STATIC FUNCTION MPrint( hDlgWnd, nMsg, nWparam, nLparam, hPrintDC, oB, hFont1, hFont2 )
STATIC hWnd, nRight, nBottom, hDC, hGBrush, lFirst, nCtr, lCancel
STATIC aCols[7], hBPen4, hBPen2
STATIC nWidth, nHeight, nPage, nTM, nTH, aTM, nBM
LOCAL aCrect, nEvent, nLM
DO CASE
CASE nMsg == WM_INITDIALOG
SendMessage( hDlgWnd, WM_SETTEXT, 0 , "Printing" )
SetDlgItemText( hDlgWnd, 105, "Records Printed:")
CenterWindow( hDlgWnd )
hWnd := GetDlgItem( hDlgWnd, 101 )
aCRect := GetClientRect( hWnd )
nRight := aCRect[ W_RIGHT ]
nBottom := aCRect[ W_BOTTOM ]
hDC := GetDC( hWnd )
hGBrush := CreateSolidBrush( RGB( 0, 255, 0 ) )
hBPen2 := CreatePen(PS_SOLID,2,RGB(0,0,0))
hBPen4 := CreatePen(PS_SOLID,4,RGB(0,0,0))
nWidth := GetDeviceCaps(hPrintDC, HORZRES)
nHeight := GetDeviceCaps(hPrintDC, VERTRES)
lFirst := .T.
lCancel := .F.
// Figure out how wide to make our columns
SelectObject( hPrintDC, hFont2 )
aCols[1] := 0
aCols[2] := aCols[1] + C4W_LoWord(GetTextExtent(hPrintDC,"BBB0000W",8))
aCols[3] := aCols[2] + C4W_LoWord(GetTextExtent(hPrintDC,"WWWWWWWWWWWWWW",14))
aCols[4] := aCols[3] + C4W_LoWord(GetTextExtent(hPrintDC,"WWWWWWWWWWWW",12))
aCols[5] := aCols[4] + C4W_LoWord(GetTextExtent(hPrintDC,"00/00/00W",9))
aCols[6] := aCols[5] + C4W_LoWord(GetTextExtent(hPrintDC,"FemaleW",7))
aCols[7] := aCols[6] + C4W_LoWord(GetTextExtent(hPrintDC,"BlackW",6))
// Center the report on the page
nLM := ( nWidth - aCols[7] ) / 2
FOR nCtr := 1 TO 7
aCols[nCtr] += nLM
NEXT
nCtr := 0
aTM := {}
GetTextMetrics(hPrintDC,@aTM)
nTH := aTM[ TM_Height ]
RETURN( 1 )
CASE nMsg == WM_PAINT
IF lFirst
lFirst := .F.
PostMessage( hDlgWnd, WM_USER+1, 0, 0 )
ENDIF
RETURN( 0 )
CASE nMsg == WM_COMMAND
IF nWparam == IDCANCEL
lCancel := .T.
ENDIF
RETURN( 0 )
CASE nMsg == WM_USER+1
SetFocus( GetDlgItem( hDlgWnd, 101) )
SetDlgItemText( hDlgWnd, 102, LTRIM( STR( CHILD->( LASTREC()) ) ) )
StatusBar( 0, CHILD->( LASTREC() ), hDlgWnd, nRight, nBottom, hDC, hGBrush, 0 )
nPage := 1
nTM := 200
nBM := nTM + ( nTH + ( nTH / 2 ) )
DO WHILE .T.
IF nBM + ( nTH + ( nTH /2 ) ) > nHeight - 200
EXIT
ENDIF
nBM += ( nTH + ( nTH /2 ) )
ENDDO
nBM := C4W_Int( nBM - ( nTH /2 ) ) + 4
CHILD->(DBGOTOP())
StartDoc(hPrintDC, "Child List")
StartPage(hPrintDC)
Header( hPrintDC, hBPen4, hFont1, hFont2, nTM, nTH, nBM, nWidth, nPage, aCols )
nTM += nTH + ( nTH / 2 )
DO WHILE !EOF() .AND. !lCancel
IF ( nEvent := ChkEvent() ) == EVENT_BUTTON
HandleEvent( nEvent )
ENDIF
PrintLine( hPrintDC, nTM, aCols )
nTM += nTH + ( nTH / 2 )
CHILD->(DBSKIP( 1 ))
StatusBar( ++nCtr,NIL, hDlgWnd, nRight, nBottom, hDC, hGBrush, nCtr )
IF nTM > nBM
EndPage(hPrintDC)
StartPage(hPrintDC)
nTM := 200
++nPage
Header( hPrintDC, hBPen4, hFont1, hFont2, nTM, nTH, nBM, nWidth, nPage, aCols )
nTM += nTH + ( nTH / 2 )
ELSE
SelectObject( hPrintDC, hBPen2 )
MoveTo( hPrintDC, aCols[1] - 10, nTM - ( ( nTH / 4 ) + 4 ) )
LineTo( hPrintDC, aCols[7], nTM - ( ( nTH /4 ) + 4 ) )
ENDIF
ENDDO
EndPage(hPrintDC)
EndDoc(hPrintDC)
StatusBar( CHILD->(LASTREC()), CHILD->(LASTREC()), hDlgWnd, nRight, nBottom, hDC, hGBrush, 0 )
DeleteObject( hGBrush )
DeleteObject( hBPen2 )
DeleteObject( hBPen4 )
ReleaseDC( hWnd, hDC )
EndDialog( hDlgWnd, 0 )
RETURN( 1 )
ENDCASE
RETURN( 0 )
STATIC FUNCTION Header( hPrintDC, hBPen, hFont1, hFont2, nTM, nTH, nBM, nWidth, nPage, aCols )
STATIC cPrinted
LOCAL nOldMode
LOCAL hBrush := GetStockObject( LTGRAY_BRUSH )
FillRect(hPrintDC, aCols[1] - 10, nTM - 12, aCols[7], nTM+nTH, hBrush)
IF nPage == 1
cPrinted := DTOC( DATE() ) + '-' + LEFT( TIME(), 5 )
ENDIF
SelectObject( hPrintDC, hFont1 )
nOldMode := SetBkMode(hPrintDC, TRANSPARENT)
DrawText( hPrintDC, "Child List",;
{ 0, 60, nWidth, 180 }, DT_CENTER+DT_SINGLELINE )
SelectObject( hPrintDC, hFont2 )
TextOut( hPrintDC, aCols[1] + 12, nTM, "ID#" )
TextOut( hPrintDC, aCols[2] + 12, nTM, "LAST NAME" )
TextOut( hPrintDC, aCols[3] + 12, nTM, "FIRST NAME" )
TextOut( hPrintDC, aCols[4] + 12, nTM, "DOB" )
TextOut( hPrintDC, aCols[5] + 12, nTM, "SEX" )
TextOut( hPrintDC, aCols[6] + 12, nTM, "RACE" )
SelectObject( hPrintDC, hBPen )
MoveTo( hPrintDC, aCols[1] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[7], nTM - 12 )
MoveTo( hPrintDC, aCols[1] - 10, nTM + nTH + 4 )
LineTo( hPrintDC, aCols[7], nTM + nTH + 4 )
MoveTo( hPrintDC, aCols[1] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[1] - 10, nBM )
MoveTo( hPrintDC, aCols[2] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[2] - 10, nBM )
MoveTo( hPrintDC, aCols[3] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[3] - 10, nBM )
MoveTo( hPrintDC, aCols[4] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[4] - 10, nBM )
MoveTo( hPrintDC, aCols[5] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[5] - 10, nBM )
MoveTo( hPrintDC, aCols[6] - 10, nTM - 12 )
LineTo( hPrintDC, aCols[6] - 10, nBM )
MoveTo( hPrintDC, aCols[7], nTM - 12 )
LineTo( hPrintDC, aCols[7], nBM )
MoveTo( hPrintDC, aCols[1] - 10, nBM )
LineTo( hPrintDC, aCols[7], nBM )
TextOut( hPrintDC, aCols[1] - 10, nBM + 10, "Page: "+LTRIM(STR(nPage)) )
TextOut( hPrintDC, aCols[7] - C4W_LoWord(GetTextExtent(hPrintDC,cPrinted,LEN( cPrinted ))),;
nBM + 10, cPrinted)
SetBkMode(hPrintDC, nOldMode)
RETURN( NIL )
STATIC FUNCTION PrintLine( hPrintDC, nTM, aCols )
TextOut( hPrintDC, aCols[1] + 12, nTM, FIELD->CCODE )
TextOut( hPrintDC, aCols[2] + 12, nTM, FIELD->LAST_NAME )
TextOut( hPrintDC, aCols[3] + 12, nTM, FIELD->FIRST_NAME )
TextOut( hPrintDC, aCols[4] + 12, nTM, DTOC( FIELD->BIRTHDAY ) )
TextOut( hPrintDC, aCols[5] + 12, nTM, IIF( FIELD->SEX == 'M', "Male", "Female" ) )
TextOut( hPrintDC, aCols[6] + 12, nTM, IIF( FIELD->RACE == 'W', "White",;
IIF( FIELD->RACE == 'B', "Black", "Other" ) ) )
RETURN( NIL )
STATIC FUNCTION StatusBar( nDone, nToDo, hWnd, nRight, nBottom, hDC, hBrush, nCopied )
STATIC nTotalSize
STATIC nPercent
LOCAL nReplicate
LOCAL cPercent
IF nToDo != NIL
nTotalSize := nToDo
SetBkMode( hDC, 1 )
nPercent := 0
ENDIF
IF nDone <= nTotalSize
nReplicate := C4W_Int( ( nRight-2 ) * ( nDone / nTotalSize ) )
IF nReplicate == nPercent
RETURN(NIL)
ENDIF
nPercent := nReplicate
IF nCopied != NIL
SetDlgItemText( hWnd, 103, LTRIM( STR( nCopied ) ) )
ENDIF
cPercent := LTRIM( STR( C4W_Int( ( nDone / nTotalSize ) * 100 ) ) ) + '%'
FillRect( hDC, MAX(nReplicate,1), 1, nRight-1, nBottom - 1, GetStockObject( LTGRAY_BRUSH ) )
FillRect( hDC, 1, 1, MAX(nReplicate,1), nBottom - 1, hBrush )
DrawText( hDC,cPercent,{ 0, 2, nRight, nBottom},DT_SINGLELINE+DT_CENTER)
ENDIF
RETURN( NIL )
STATIC FUNCTION IsSelected( oB )
LOCAL lSelected := BUTTONS->SELECTED
IF lSelected
lSelected := .F.
ELSE
lSelected := .T.
ENDIF
RLOCK()
BUTTONS->SELECTED := lSelected
DBRUNLOCK()
DBCOMMIT()
oB:refreshCurrent()
RETURN( NIL )
STATIC FUNCTION BHelp
DialogBox(_GetInstance() , "buttons", ,;
{|hDlg, nMsg, nWparam, nLparam|;
MHello(hDlg, nMsg, nWparam, nLparam)})
RETURN(NIL)
STATIC FUNCTION MHello(hDlgWnd, nMsg, nWparam, nLparam)
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow(hDlgWnd)
RETURN( 1 )
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK .OR. nWparam == IDCANCEL .OR.;
nWparam == IDABOUT
EndDialog( hDlgWnd, IDOK )
RETURN( 1 )
ENDCASE
ENDCASE
RETURN( 0 )
STATIC FUNCTION ShowInfo( aInfo )
DialogBox( _GetInstance() , "info", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MInfo(hDlg, nMsg, nWparam, nLparam, aInfo )})
RETURN( NIL )
STATIC FUNCTION MInfo(hDlgWnd, nMsg, nWparam, nLparam, aInfo )
LOCAL nCtr
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow(hDlgWnd)
FOR nCtr := 1 TO 10
IF aInfo[ nCtr ]
EnableWindow( GetDlgItem( hDlgWnd, nCtr + 100 ), .T. )
ELSE
EnableWindow( GetDlgItem( hDlgWnd, nCtr + 100 ), .F. )
ENDIF
CheckDlgButton( hDlgWnd, nCtr + 100, IIF( aInfo[ nCtr ], 1, 0 ) )
NEXT
SetDlgItemText( hDlgWnd, 201, aInfo[ 11 ] )
SendMessage( hDlgWnd, WM_SETTEXT, 0 , aInfo[ 12 ] )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK
EndDialog(hDlgWnd,IDNO)
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
///////////////////// Browses ///////////////////////////
STATIC FUNCTION Browse1
LOCAL oB, aFlds, nCtr
SELECT CHILD
SET ORDER TO 2
oB := WBrowse{hMainWnd,10,63,600,306,"Child List"}
oB:colorspec := {RGB(0,0,0),RGB(255,255,255),RGB(0,0,0),RGB(255,255,255)}
oB:autolite := .F.
aFlds := LDBrowFlds()
FOR nCtr := 1 TO LEN( aFlds )
aFlds[ nCtr] [ 1] := STRTRAN( aFlds[ nCtr ][ 1 ],'_','')
oB:addColumn( WBColumn{ aFlds[ nCtr ][ 1 ],&( aFlds[nCtr][2] ), aFlds[nCtr][3] } )
oB:SetColCargo( nCtr, nCtr )
NEXT
oB:keyBlock := {|oB, nMsg, nwParam, nlParam|CellEdit( oB, nMsg, nwParam, nlParam)}
oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
oB:doubleClick := oB:keyBlock
oB:showNumbers := .T.
oB:nubWidth := 30
oB:BoxCursor := .T.
oB:colFont := CreateFont( aTFont )
oB:setColWidth( 1, 40 )
oB:goTop()
DoSubClBWA( oB:hWnd )
RETURN(NIL)
STATIC FUNCTION Browse2
LOCAL aBArray := {}
LOCAL oB
LOCAL oCol
SELECT CHILD
SET ORDER TO 2
GO TOP
DO WHILE !EOF()
AADD(aBArray,{LEFT(MakeName(),20),;
CHILD->TUITION ,;
CHILD->DISCOUNT ,;
CHILD->CCODE+'.TXT',;
RECNO()})
SKIP
ENDDO
oB := WBrowse{ hMainWnd, 80, 60, 590, 304, "", WS_POPUP + WS_BORDER }
// --------- Column #1
//
oCol := WBColumn{}
oCol:heading := "NAME"
oCol:block := {||aBArray[oB:nCurRec][1]}
oB:addColumn( oCol )
// --------- Column #2
//
oCol := WBColumn{}
oCol:heading := {"TUITION","PER WEEK"}
oCol:block := {||aBArray[oB:nCurRec][2]}
oCol:picture := "999.99"
oB:addColumn( oCol )
// --------- Column #3
//
oCol := WBColumn{}
oCol:heading := "DISCOUNT"
oCol:block := {||aBArray[oB:nCurRec][3]}
oCol:picture := "99.99"
oB:addColumn( oCol )
// --------- Column #4
//
oCol := WBColumn{}
oCol:heading := "NOTES"
oCol:block := {||aBArray[oB:nCurRec][4]}
oB:addColumn( oCol )
oB:tbText := "CHILD LIST"
oB:tbAlign := DT_CENTER
oB:goTopBlock := {|oB|AGoTop(oB, aBArray)}
oB:goBottomBlock := {|oB|AGoBottom(oB, aBArray)}
oB:skipBlock := {|oB, nSkip|ASkipper(oB, nSkip, aBArray)}
oB:scanBlock := {|oB, cKey |AFindKey(oB, cKey, aBArray)}
oB:doubleClick := {|oB, nCrecNo, nMode|AEdit(oB,nCrecNo,nMode,aBArray)}
oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
oB:autoLite := .F.
oB:usermove := .F.
oB:sizeCursor := LoadCursor( _GetInstance(), "SIZER" )
oB:setHeadColor( 3, RGB(128,0,0) )
CenterWindow(oB:hWnd)
oB:goTop()
CreateDialog(_GetInstance() , "calc", oB:hWnd , ;
{|hDlg, nMsg, nWparam, nLparam|;
MCalc( hDlg, nMsg, nWparam, nLparam, aBArray, oB )})
SetFocus(oB:hWnd)
RETURN(NIL)
STATIC FUNCTION Browse3
LOCAL hWnd, hDC, aCrect, nCtr, oB, bFG, bBG, nTop, nBottom
bFG := {||IIF(MONTH(CHILD->BIRTHDAY) == MONTH(DATE()),RGB(255,255,255),RGB(0,0,0))}
bBG := {||IIF(MONTH(CHILD->BIRTHDAY) == MONTH(DATE()),RGB(128,0,0),RGB(255,255,255))}
SELECT CHILD
SET ORDER TO 2
hWnd := CreateWindow("BLIST", ; // window class
"Child List",;
WS_CAPTION + ;
WS_SYSMENU + ;
WS_THICKFRAME + ;
WS_MAXIMIZEBOX + ;
WS_MINIMIZEBOX, ;
CW_USEDEFAULT, ; // x co-ordinate
CW_USEDEFAULT, ; // y co-ordinate
498, ; // width
276, ; // height
hMainWnd, ;
0, ;
_GetInstance()) // our own app instance
HideCaret(hWnd)
ShowWindow( hWnd, SW_HIDE )
CenterWindow( hWnd )
ShowWindow( hWnd, SW_SHOW )
aCrect := GetClientRect( hWnd )
nTop := TextHeight( hWnd ) + 9
nBottom := aCrect[ W_BOTTOM ] - nTop
oB := WBrowse{hWnd,0,nTop,aCrect[ W_RIGHT ], nBottom,"",WS_CHILD+WS_BORDER}
oB:alias := "CHILD"
oB:autolite := .T.
oB:showNumbers := .T.
oB:userSize := .T.
oB:autoSize := .T.
oB:escape := .F.
oB:doubleClick := {|oB|AddKid( oB, 2 ) }
oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), PostMessage( hDemoWnd, WM_USER+1, 0, 0 ) }
oB:nubBlock := {|| FIELD->CCODE }
oB:nubHeading := "ID#"
oB:nubAlign := DT_CENTER
oB:nubColor := RGB(0,0,128)
oB:nubWidth := 80
oB:mimicButton := .T.
oB:addColumn(WBColumn{"LAST NAME" ,{||CHILD->LAST_NAME } } )
oB:addColumn(WBColumn{"FIRST NAME",{||CHILD->FIRST_NAME} } )
oB:addColumn(WBColumn{"DOB", {||DTOC(CHILD->BIRTHDAY)}} )
oB:addColumn(WBColumn{"SEX", {||CHILD->SEX} } )
oB:setColBitmap( 1, 901 , DT_RIGHT )
oB:setHeadBlock( 1, {|nCol| FindKid( oB ), SetFocus( hWnd ) } )
oB:setHeadColor( 0, RGB(0,0,128) )
oB:tbText := "CHILD LIST"
oB:cargo := DrawButtons( hWnd, ARRAY(14,3), oB, .F. )
BDoSubCl( hWnd , oB )
oB:goTop()
RETURN( NIL )
STATIC FUNCTION Browse4
LOCAL hWnd, hDC, aCrect, nCtr, oB, nTop, nBottom
SELECT CHILD
SET ORDER TO 2
hWnd := CreateWindow("BLIST", ;
"Child List", ;
WS_CAPTION + ;
WS_SYSMENU + ;
WS_THICKFRAME + ;
WS_MAXIMIZEBOX + ;
WS_MINIMIZEBOX, ;
CW_USEDEFAULT, ;
CW_USEDEFAULT, ;
516, ;
284, ;
hMainWnd, ;
0, ;
_GetInstance())
HideCaret(hWnd)
ShowWindow( hWnd, SW_HIDE )
CenterWindow( hWnd )
ShowWindow( hWnd, SW_SHOW )
aCrect := GetClientRect( hWnd )
nTop := TextHeight( hWnd ) + 9
nBottom := aCrect[ W_BOTTOM ] - nTop
oB := WBrowse{hWnd, 0, nTop, aCrect[ W_RIGHT ], nBottom,"",WS_CHILD+WS_BORDER }
oB:alias := "CHILD"
oB:autoLite := .F.
oB:showNumbers := .T.
oB:userSize := .F.
oB:autoSize := .T.
oB:escape := .F.
oB:doubleClick := {|oB|AddKid( oB, 2 ) }
oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), PostMessage( hDemoWnd, WM_USER+1, 0, 0 ) }
oB:nubBlock := {||FIELD->CCODE}
oB:nubHeading := NIL
oB:nubAlign := DT_CENTER
oB:nubColor := RGB(0,0,0)
oB:nubWidth := 80
oB:nubhBitmap := BCCODE
oB:nubHBitAlign := DT_CENTER
oB:addColumn(WBColumn{"" ,{||CHILD->LAST_NAME+CHR(13)+CHR(10)+;
TRIM(CHILD->FIRST_NAME )+" "+;
IIF(!EMPTY(CHILD->MI), CHILD->MI+". ","")+;
CHILD->JR_SR_III } } )
oB:addColumn(WBColumn{"", {||DTOC(CHILD->BIRTHDAY )}})
oB:addColumn(WBColumn{"", {||IIF(CHILD->SEX == 'M',"Male ","Female")}})
oB:setColBitMap( 0, BCCODE, DT_CENTER )
oB:setColBitMap( 1, BNAME, DT_CENTER )
oB:setColBitMap( 2, BDOB, DT_CENTER )
oB:setColBitMap( 3, BSEX, DT_CENTER )
oB:headHeight := 50
oB:goTop()
oB:cargo := DrawButtons( hWnd, ARRAY(14,3), oB, .T. )
BDoSubCl( hWnd , oB )
RETURN( NIL )
STATIC FUNCTION Browse5
LOCAL aFields := {{"",{||MakeName()},NIL,NIL,NIL,NIL,120}}
SELECT CHILD
GO TOP
DialogBox( _GetInstance(), "box1", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MFoo1( hDlg, nMsg, nWparam, nLparam, aFields )})
RETURN(NIL)
STATIC FUNCTION MFoo1( hDlgWnd, nMsg, nWparam, nLparam, aFields )
STATIC hBrowWnd
STATIC aBlks := {}
STATIC aRace := {'W','B','O'}
STATIC oB
STATIC hList
LOCAL nCtr
LOCAL aRect
LOCAL nTsize
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow(hDlgWnd)
aBlks := {}
AADD(aBlks,{||SetDlgItemText(hDlgWnd,101,CHILD->CCODE)})
AADD(aBlks,{||SetDlgItemText(hDlgWnd,102,DTOC(CHILD->BIRTHDAY))})
AADD(aBlks,{||SendMessage(hDlgWnd,WM_COMMAND,104+ASCAN(aRace,CHILD->RACE),0)})
AADD(aBlks,{||SendMessage(hDlgWnd,WM_COMMAND,IIF(CHILD->SEX == 'M' , 103, 104),0)})
hList := GetDlgItem( hDlgWnd, 999 )
oB := BListBox(hDlgWnd,;
hList,;
aFields ,;
NIL ,;
NIL ,;
NIL ,;
"CHILD" ,;
NIL ,;
aBlks, ;
.F. )
AADD(aBlks,{||SetDlgItemText(hDlgWnd,108,LTRIM(STR(oB:nCurRec)))})
oB:autosize := .F.
oB:rowGrids := .F.
oB:colGrids := .F.
oB:setColWidth( 0, 0 )
oB:tbHeight := 0
aRect := GetClientRect( hList )
nTsize := TextHeight( hList )
oB:SetColWidth( 1, ( aRect[ 3 ] - nTsize ) - 2 )
oB:SetRowHeight( nTsize - 2 )
oB:SetHeadHeight( 1, 0 )
oB:goTop()
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK .OR. nWparam == IDCANCEL
EndDialog( hDlgWnd, IDOK )
ShowWindow( hDemoWnd, SW_SHOW )
SetFocus( hDemoWnd )
RETURN(1)
CASE nWparam >= 105 .AND. nWparam <= 107
FOR nCtr := 105 TO 107
CheckDlgButton( hDlgWnd, nCtr, 0 )
NEXT
CheckDlgButton( hDlgWnd, nWparam, 1)
* SetFocus( hList )
RETURN(1)
CASE nWparam >= 103 .AND. nWparam <= 104
FOR nCtr := 103 TO 104
CheckDlgButton( hDlgWnd, nCtr, 0 )
NEXT
CheckDlgButton( hDlgWnd, nWparam, 1 )
*SetFocus( hList )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION Browse6
SELECT BUTTONS
GO TOP
DialogBox( _GetInstance(), "box2", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MFoo2( hDlg, nMsg, nWparam, nLparam )})
ShowWindow( hDemoWnd, SW_SHOW )
RETURN(NIL)
STATIC FUNCTION MFoo2( hDlgWnd, nMsg, nWparam, nLparam )
STATIC oB
LOCAL nCtr, aFields[2]
DO CASE
CASE nMsg == WM_INITDIALOG
aFields[1] := {" USE ",{||IIF(BUTTONS->SELECTED,OBM_CHECK,0)},,,,DT_CENTER}
aFields[2] := {{"DESCRIPTION","#define"},{||BUTTONS->DESCRIPT+CHR(13)+CHR(10)+;
TRIM(BUTTONS->TEXTID)+" ("+ALLTRIM(STR(BUTTONS->ID-1000))+')'}}
CenterWindow(hDlgWnd)
oB := BlistBox(hDlgWnd,;
GetDlgItem(hDlgWnd,999),;
aFields ,;
NIL ,;
NIL ,;
NIL ,;
"BUTTONS",;
NIL ,;
{} ,;
.F. )
oB:saveColSize := .T.
oB:setColWidth( 1, 60 )
oB:setColWidth( 2, 220 )
oB:autolite := .T.
oB:showNumbers := .T.
oB:userSize := .T.
oB:userMove := .F.
oB:autoSize := .T.
oB:escape := .F.
oB:nubBlock := {||FIELD->ID}
oB:nubHeading := NIL
oB:nubAlign := DT_CENTER
oB:nubColor := RGB(0,0,0)
oB:nubWidth := 60
oB:nubClickBlock:= {|oB|IsSelected( oB )}
oB:lineHeight := 60
oB:headHeight := 60
oB:mimicButton := .T.
oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
oB:GoTop()
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK .OR. nWparam == IDCANCEL
EndDialog( hDlgWnd, IDOK )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION Browse7
SELECT CAL
GO TOP
DialogBox( _GetInstance(), "cal", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MCal( hDlg, nMsg, nWparam, nLparam )})
ShowWindow( hDemoWnd, SW_SHOW )
RETURN(NIL)
STATIC FUNCTION MCal( hDlgWnd, nMsg, nWparam, nLparam )
STATIC oB, nYear, nMonth, aCal[6][7], aBlocks := {}
LOCAL dSdate, nCtr
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow( hDlgWnd )
nYear := YEAR( DATE() )
nMonth := MONTH( DATE() )
dSdate := CTOD( LTRIM( STR( nMonth ) )+'/01/'+STR( nYear, 4) )
SetDlgItemText( hDlgWnd, 101, CMONTH( dSdate )+', '+STR(nYear,4))
SetMonth( dSdate, aCal )
oB := BlistBox(hDlgWnd,;
GetDlgItem(hDlgWnd,999),;
{},;
{|oB|AGoTop(oB, aCal)},;
{|oB|AGoBottom(oB, aCal)},;
{|oB,nSkip|ASkipper(oB, nSkip, aCal)},;
NIL ,;
NIL ,;
NIL ,;
.F.)
oB:SaveColSize := .T.
oB:addColumn( WBColumn{" SUN ", {||aCal[oB:nCurRec][1]},,{||RGB(192,0,0)} })
oB:addColumn( WBColumn{" MON ", {||aCal[oB:nCurRec][2]},,{||RGB(0,0,0)} })
oB:addColumn( WBColumn{" TUE ", {||aCal[oB:nCurRec][3]},,{||RGB(0,0,0)} })
oB:addColumn( WBColumn{" WED ", {||aCal[oB:nCurRec][4]},,{||RGB(0,0,0)} })
oB:addColumn( WBColumn{" THU ", {||aCal[oB:nCurRec][5]},,{||RGB(0,0,0)} })
oB:addColumn( WBColumn{" FRI ", {||aCal[oB:nCurRec][6]},,{||RGB(0,0,0)} })
oB:addColumn( WBColumn{" SAT ", {||aCal[oB:nCurRec][7]},,{||RGB(192,0,0)} })
FOR nCtr := 1 TO 6
oB:SetColWidth( nCtr, 52 )
NEXT
oB:SetColWidth( 7, 51 )
oB:SetHeadColor( 1, RGB(160,0,0) )
oB:SetHeadColor( 7, RGB(180,0,0) )
SetScrollRange(oB:hWnd,SB_VERT,0,0)
oB:doubleClick := {|oB|DailyLog( oB, nMonth, nYear, 2, hDlgWnd )}
oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
oB:autoLite := .F.
oB:usermove := .F.
oB:userSize := .F.
oB:nubWidth := 0
oB:keyBlock := {| oB, nMsg, nwParam, nlParam|PgUpDn( hDlgWnd, nMsg, nwParam, nlParam )}
oB:goTop()
GetToday( oB, aCal )
oB:ShowData()
oB:hitTop := .T.
oB:hitBottom := .T.
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(0)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == 1
EVAL( oB:doubleClick, oB, nMonth, nYear )
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(1)
CASE nWparam == IDCANCEL
EndDialog( hDlgWnd, IDOK )
RETURN(1)
CASE nWparam == LARROW
IF nMonth > 1
--nMonth
ELSE
nMonth := 12
--nYear
ENDIF
dSdate := CTOD( LTRIM( STR( nMonth ) )+'/01/'+STR( nYear, 4) )
SetDlgItemText( hDlgWnd, 101, CMONTH( dSdate )+', '+STR(nYear,4))
SetMonth( dSdate, aCal )
oB:showData()
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(1)
CASE nWparam == RARROW
IF nMonth < 12
++nMonth
ELSE
nMonth := 1
++nYear
ENDIF
dSdate := CTOD( LTRIM( STR( nMonth ) )+'/01/'+STR( nYear, 4) )
SetDlgItemText( hDlgWnd, 101, CMONTH( dSdate )+', '+STR(nYear,4))
SetMonth( dSdate, aCal )
oB:showData()
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(1)
CASE nWparam == IDADD
DailyLog( oB, nMonth, nYear, 1 )
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(1)
CASE nWparam == IDEDIT
DailyLog( oB, nMonth, nYear, 2 )
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(1)
CASE nWparam == IDDEL
DailyLog( oB, nMonth, nYear, 3 )
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION GetToday( oB, aCal )
LOCAL nWeek, nDay, cToday
cToday := ALLTRIM( STR( DAY( DATE() ) ) ) + CHR(13) + CHR(10)
FOR nWeek := 1 TO 6
FOR nDay := 1 TO 7
IF ALLTRIM( aCal[ nWeek ][ nDay ] ) == cToday
oB:rowPos := nWeek
oB:colPos := nDay
EXIT
ENDIF
NEXT
NEXT
RETURN( NIL )
STATIC FUNCTION SetMonth( dSdate, aCal )
LOCAL nCtr, nCtr2
LOCAL nStart, nEnd, nDay1
nDay1 := DOW( dSdate )
DO CASE
CASE MONTH( dSdate ) == MONTH( dSdate + 30 )
nEnd := 31
CASE MONTH( dSdate ) == MONTH( dSdate + 29 )
nEnd := 30
CASE MONTH( dSdate ) == MONTH( dSdate + 28 )
nEnd := 29
OTHERWISE
nEnd := 28
ENDCASE
nStart := 1
FOR nCtr := 1 TO 7
IF nCtr < nDay1
aCal[1][nCtr] := ""
ELSE
aCal[1][nCtr] := LTRIM(STR(nStart++))+CHR(13)+CHR(10)
ENDIF
NEXT
FOR nCtr := 2 TO 6
FOR nCtr2 := 1 TO 7
IF nStart <= nEnd
aCal[nCtr][nCtr2] := LTRIM(STR(nStart++))+CHR(13)+CHR(10)
ELSE
aCal[nCtr][nCtr2] := ""
ENDIF
NEXT
NEXT
RETURN(NIL)
STATIC FUNCTION DailyLog( oB, nMonth, nYear, nMode, hDlgWnd )
LOCAL aData := oB:getCellData()
LOCAL cDate
LOCAL dTemp
IF EMPTY( aData[1] )
MessageBeep(MB_ICONEXCLAMATION)
RETURN(NIL)
ENDIF
aData[1] := ALLTRIM(STRTRAN( aData[1], CHR(13)+CHR(10)))
dTemp := CTOD( LTRIM( STR( nMonth ) ) +'/'+aData[1]+'/'+STR(nYear,4) )
cDate := DTOS( dTemp )
SEEK cDate
DO CASE
CASE nMode == 1 // Add
CASE nMode == 2 // Edit
IF !FOUND()
Errormsg(hMainWnd,"No notes for selected date...",'E')
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN( NIL )
ENDIF
CASE nMode == 3 // Delete
IF FOUND()
DELETE
ELSE
Errormsg(hMainWnd,"No notes for selected date...",'E')
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
ENDIF
RETURN( NIL )
ENDCASE
DialogBox(_GetInstance() , "notes", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MCNotes( hDlg, nMsg, nWparam, nLparam, dTemp, nMode )})
RETURN(NIL)
STATIC FUNCTION MCNotes(hDlgWnd, nMsg, nWparam, nLparam, dTemp, nMode )
DO CASE
CASE nMsg == WM_INITDIALOG
SendMessage( hDlgWnd, WM_SETTEXT, 0, "NOTES: "+DTOC( dTemp ) )
SetDlgItemText( hDlgWnd, 101, LEFT(CAL->NOTES,1400) )
CenterWindow( hDlgWnd )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK
IF nMode == 1
IF !FOUND()
APPEND BLANK
CAL->DATE := dTemp
ENDIF
ENDIF
CAL->NOTES := LEFT( GetDlgItmText( hDlgWnd, 101), 1400)
EndDialog( hDlgWnd, IDOK )
RETURN(1)
CASE nWparam == IDCANCEL
EndDialog( hDlgWnd, IDCANCEL )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION PgUpDn( hDlgWnd, nMsg, nwParam, nlParam )
IF nwParam == VK_PRIOR
PostMessage( hDlgWnd, WM_COMMAND, LARROW, 0 )
RETURN( .T. )
ENDIF
IF nwParam == VK_NEXT
PostMessage( hDlgWnd, WM_COMMAND, RARROW, 0 )
RETURN( .T. )
ENDIF
RETURN( .F. )
STATIC FUNCTION GetSysMenu( hWnd, lRevert )
LOCAL cGSM
LOCAL hMenu
LOCAL hLib
hLib := LoadLibrary( "USER.EXE" )
cGSM := GetProcAddress( hLib, "GetSystemMenu", ;
"Pascal", "int", "HWND, BOOL" )
lRevert := IIF( lRevert != NIL, lRevert, .F. )
hMenu := CallDLL(cGSM, hWnd, lRevert )
FreeLibrary( hLib )
RETURN( hMenu )
STATIC FUNCTION SetSysMenu( hMenu, nFlags, nIdNo, cText, nPosition )
LOCAL hLib
LOCAL cSSM
hLib := LoadLibrary( "USER.EXE" )
IF nPosition == NIL
cSSM := GetProcAddress( hLib, "AppendMenu", ;
"Pascal", "int", "int, int, int, string" )
CallDLL( cSSM, hMenu, nFlags, nIdNo, cText )
ELSE
cSSM := GetProcAddress( hLib, "InsertMenu", ;
"Pascal", "int", "int, int, int, int, string" )
CallDLL( cSSM, hMenu, nPosition, nFlags, nIdNo, cText )
ENDIF
RETURN( NIL )
STATIC FUNCTION DemoDlg
LOCAL nAnswer
nAnswer := CreateDialog(_GetInstance() , "demo",, ;
{|hDlg, nMsg, nWparam, nLparam|;
MBoo(hDlg, nMsg, nWparam, nLparam)})
RETURN(nAnswer)
STATIC FUNCTION MBoo(hDlgWnd, nMsg, nWparam, nLparam)
LOCAL cDemo, cTemp
DO CASE
CASE nMsg == WM_INITDIALOG
hDemoWnd := hDlgWnd
SendMessage( hDlgWnd, WM_SETTEXT, 0, "WBrowse(T) Version 3.00 Demo" )
SetSysMenu( GetSysMenu( hDlgWnd, .F. ), MF_SEPARATOR, -1, CHR(0) )
SetSysMenu( GetSysMenu( hDlgWnd, .F. ), MF_STRING, 999, "About"+CHR(0) )
SetDDList( GetDlgItem( hDlgWnd, 101 ) )
CenterWindow(hDlgWnd)
SetFocus( hDlgWnd )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDEXIT .OR. nWparam == IDCANCEL
DestroyWindow( hDlgWnd )
PgmExit()
RETURN(1)
CASE nWparam == IDHELPB
WinHelp(hMainWnd,"WBROWSES.HLP",HELP_INDEX,0)
CASE nWparam == IDRUN
cDemo := GetDlgItmText( hDlgWnd, 101 )
IF EMPTY( cDemo )
MessageBox( hDlgWnd, "NO DEMO SELECTED!", "OOPS!")
ELSE
cDemo := LEFT( cDemo, 1 )
ShowWindow( hDlgWnd, SW_HIDE )
DO CASE
CASE cDemo == '1'
Browse1()
CASE cDemo == '2'
Browse2()
CASE cDemo == '3'
Browse3()
CASE cDemo == '4'
Browse4()
CASE cDemo == '5'
Browse5()
CASE cDemo == '6'
Browse6()
CASE cDemo == '7'
Browse7()
CASE cDemo == '8'
Browse8()
CASE cDemo == '9'
Browse9()
ENDCASE
ENDIF
RETURN(1)
ENDCASE
CASE nMsg == WM_USER+1
SetFocus( hDlgWnd )
RETURN( 1 )
CASE nMsg == WM_SYSCOMMAND
IF nWparam == IDABOUT
ShowWindow( hDlgWnd, SW_HIDE)
About()
ShowWindow( hDlgWnd, SW_SHOW)
ENDIF
ENDCASE
RETURN(0)
STATIC FUNCTION SetDDList( hWnd )
LOCAL nCtr, nItem
LOCAL aDemos := { "1 - Spreadsheet Style",;
"2 - Array Browse",;
"3 - Browse With Toolbar",;
"4 - Browse With Bitmaps",;
"5 - BListBox()",;
"6 - BListBox() With Bitmaps",;
"7 - BListBox() - Calendar!",;
"8 - BListBox() - 3D",;
"9 - Parent/Child Browses"}
FOR nCtr := 1 TO 9
SendMessage(hWnd, CB_ADDSTRING, 0, aDemos[nCtr])
NEXT
SendMessage(hWnd, CB_SELECTSTRING, -1, "1")
RETURN(NIL)
STATIC FUNCTION AEdit( oB, nRecNo, nMode, aArray )
LOCAL xData, cPicture
LOCAL nResults := 0
DO CASE
CASE oB:colPos == 1
ErrorMsg( hMainWnd, "NAME CANNOT BE EDITED!", 'E' )
RETURN( .F. )
CASE oB:colPos == 2
xData := aArray[oB:nCurRec][2]
cPicture := "999.99"
nResults := DialogBox( _GetInstance() , "ratecode", oB:hWnd, ;
{|hDlg, nMsg, nWparam, nLparam|;
MAEdit( hDlg, nMsg, nWparam, nLparam, oB, @xData, cPicture ) })
CASE oB:colPos == 3
xData := aArray[oB:nCurRec][3]
cPicture := "999.99"
nResults := DialogBox( _GetInstance() , "discount", oB:hWnd, ;
{|hDlg, nMsg, nWparam, nLparam|;
MAEdit( hDlg, nMsg, nWparam, nLparam, oB, @xData, cPicture ) })
CASE oB:colPos == 4
MemoEdit2( oB, aArray )
ENDCASE
IF nResults == IDOK
SetFocus( oB:hWnd )
DO CASE
CASE oB:colPos == 2
aArray[oB:nCurRec][2] := xData
CASE oB:colPos == 3
aArray[oB:nCurRec][3] := xData
ENDCASE
ENDIF
IF oB:colPos != 4
oB:refreshCurrent()
SetFocus( oB:hWnd )
ENDIF
RETURN(NIL)
STATIC FUNCTION MemoEdit2( oB, aArray )
LOCAL nFp1, cBuffer
IF !FILE( aArray[oB:nCurRec][4] )
nFp1 := FCREATE( aArray[oB:nCurRec][4] )
cBuffer := "NOTES: "+aArray[oB:nCurRec ][1]
FWRITE( nFp1, cBuffer, LEN(cBuffer) )
FCLOSE( nFp1 )
ENDIF
SelectWindow( oB:hWnd )
WINEXEC( "NOTEPAD.EXE "+aArray[oB:nCurRec][4] )
RETURN(NIL)
STATIC FUNCTION MAEdit( hDlgWnd, nMsg, nWparam, nLparam, oB, xData, cPicture, nwParamb, nlParamb, xKeyVal, nField )
STATIC GetList := {}
DO CASE
CASE nMsg == WM_INITDIALOG
GetList := {}
@ DIALOG hDlgWnd ID 101 GET xData PICTURE cPicture
CenterWindow( hDlgWnd )
RETURN(1)
CASE nMsg == WM_COMMAND
DO CASE
CASE nWparam == IDOK
IsDialogOk( hDlgWnd, 101 )
xData:= GetList[1]:VarGet()
EndDialog( hDlgWnd, IDOK )
RETURN(1)
CASE nWparam == IDCANCEL
CANCEL DIALOG hDlgWnd
EndDialog( hDlgWnd, IDCANCEL )
RETURN(1)
ENDCASE
ENDCASE
RETURN(0)
STATIC FUNCTION DelKid( oB )
IF MessageBox( hMainWnd, "Delete Selected Record?",;
"Delete?", MB_YESNO+MB_ICONQUESTION ) == IDYES
DELETE
oB:refreshAll()
ENDIF
RETURN( NIL )
STATIC FUNCTION Browse8
SELECT CHILD
SET ORDER TO 2
GO TOP
DialogBox( _GetInstance(), "SET3D", , ;
{|hDlg, nMsg, nWparam, nLparam|;
M3D( hDlg, nMsg, nWparam, nLparam )})
ShowWindow( hDemoWnd, SW_SHOW )
RETURN(NIL)
STATIC FUNCTION M3D( hDlgWnd, nMsg, nWparam, nLparam )
STATIC oB
DO CASE
CASE nMsg == WM_INITDIALOG
CenterWindow( hDlgWnd )
oB := BlistBox(hDlgWnd,;
GetDlgItem(hDlgWnd,999),;
{},;
NIL,;
NIL,;
NIL,;
"CHILD",;
NIL ,;
NIL ,;
.F.)
oB:autolite := .T.
oB:showNumbers := .T.
oB:userMove := .T.
oB:doubleClick := {|oB|AddKid( oB, 2 ) }
oB:nubBlock := {|| FIELD->CCODE }
oB:nubHeading := "ID#"
oB:nubAlign := DT_CENTER
oB:nubColor := RGB(0,0,128)
oB:nubWidth := 80
oB:mimicButton := .T.
oB:addColumn(WBColumn{"LAST NAME" ,{||CHILD->LAST_NAME } } )
oB:addColumn(WBColumn{"FIRST NAME",{||CHILD->FIRST_NAME} } )
oB:addColumn(WBColumn{"DOB", {||DTOC(CHILD->BIRTHDAY)},NIL,NIL,NIL,DT_CENTER } )
oB:addColumn(WBColumn{"SEX", {||IIF(CHILD->SEX == 'M',"Male ","Female")} } )
oB:SetColWidth( 1, 120 )
oB:SetColWidth( 2, 120 )
oB:SetColWidth( 3, 80 )
oB:SetColWidth( 4, 80 )
oB:autosize := .F.
oB:SetColBitmap( 1, 901 , DT_RIGHT )
oB:SetHeadBlock( 1, {|nCol| FindKid( oB ), SetFocus( hDlgWnd ) } )
oB:make3D := .T.
oB:ColGrids := .F.
oB:RowGrids := .F.
oB:tbText := "CHILD LIST"
oB:goTop()
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
RETURN(0)
CASE nMsg == WM_COMMAND
SetFocus( GetDlgItem( hDlgWnd, 999 ) )
DO CASE
CASE nwParam == IDEXITS
EndDialog( hDlgWnd, 0 )
CASE nwParam == IDTOPS
oB:goTop()
CASE nwParam == IDBOTTOMS
oB:goBottom()
CASE nwParam == IDPGDNS
oB:pageDown()
CASE nwParam == IDPGUPS
oB:pageUp()
ENDCASE
RETURN( 1 )
ENDCASE
RETURN(0)
STATIC FUNCTION Browse9
SELECT CHILD
SET ORDER TO 2
GO TOP
DialogBox( _GetInstance(), "attend", , ;
{|hDlg, nMsg, nWparam, nLparam|;
MBrowse9( hDlg, nMsg, nWparam, nLparam )})
ShowWindow( hDemoWnd, SW_SHOW )
RETURN(NIL)
STATIC FUNCTION MBrowse9( hDlgWnd, nMsg, nWparam, nLparam )
STATIC oB1, oB2, bSBlock
LOCAL hFont
DO CASE
CASE nMsg == WM_INITDIALOG
hFont := SendMessage( hDlgWnd, WM_GETFONT, 0, 0 )
CenterWindow( hDlgWnd )
oB1 := BlistBox(hDlgWnd,;
GetDlgItem(hDlgWnd,101),;
{},;
NIL,;
NIL,;
NIL,;
"CHILD",;
NIL ,;
NIL ,;
.F.)
oB1:colFont := hFont
oB1:autolite := .F.
oB1:showNumbers := .T.
oB1:nubBlock := {|| RIGHT( FIELD->CCODE, 4 ) }
oB1:nubHeading := "ID#"
oB1:nubAlign := DT_CENTER
oB1:nubWidth := 50
oB1:showFocus := .T.
oB1:saveColSize := .T.
oB1:selectBlock := {||oB2:hitTop := .F., oB2:goTop()}
oB1:addColumn(WBColumn{"NAME" ,{||CHILD->( MakeName() )} } )
oB1:SetColWidth( 1, 137 )
oB2 := BlistBox(hDlgWnd,;
GetDlgItem(hDlgWnd,102),;
{},;
NIL,;
NIL,;
NIL,;
"ATTEND",;
NIL ,;
NIL ,;
.F.)
oB2:colFont := hFont
oB2:autolite := .T.
oB2:showNumbers := .T.
oB2:nubBlock := oB1:nubBlock
oB2:nubHeading := "ID#"
oB2:nubAlign := DT_CENTER
oB2:nubWidth := 50
oB2:showFocus := .T.
oB2:addColumn(WBColumn{"Date In",;
{||DTOC(ATTEND->DATE_IN)},,,,DT_CENTER } )
oB2:addColumn(WBColumn{"Time In" ,;
{||ATTEND->TIME_IN},,,,DT_CENTER } )
oB2:addColumn(WBColumn{"Date Out" ,;
{||DTOC(ATTEND->DATE_OUT)},,,,DT_CENTER } )
oB2:addColumn(WBColumn{"Time Out",;
{||ATTEND->TIME_OUT},,,,DT_CENTER } )
bSBlock := {||ATTEND->CCODE}
oB2:goTopBlock := {|oB|FindFirst( oB, CHILD->CCODE, "ATTEND" )}
oB2:goBottomBlock := {|oB|FindLast( oB,;
bSBlock,;
CHILD->CCODE, "ATTEND", .F. )}
oB2:skipBlock := {|oB,nSkip|SkipFor( oB,;
nSkip,;
bSBlock,;
CHILD->CCODE,;
"ATTEND",;
.F. ) }
oB1:goTop()
oB2:goTop()
CASE nMsg == WM_SYSCOMMAND
IF nWparam == SC_CLOSE
EndDialog( hDlgWnd, nWparam )
ENDIF
CASE nMsg == WM_COMMAND
IF nWparam == IDOK
EndDialog( hDlgWnd, nWparam )
ENDIF
ENDCASE
RETURN(0)
// Compile(cStr)
// Takes a string and returns a codeblock - runtime compiler
// Might as well make use of it since the Clipper compiler
// is always linked into your Clipper apps!
//
STATIC FUNCTION Compile(cStr)
RETURN(&("{||"+cStr+"}"))
// ErrorMsg(hWnd,cMarr,cType)
// General purpose error message handler
// Uses MessageBox() so if the user decides to move it the window
// underneath will NOT be automatically redrawn - You could always
// use a dialog box but the size would be fixed...
//
STATIC FUNCTION ErrorMsg(hWnd,cMarr,cType)
LOCAL nResponse
DO CASE
CASE cType = 'W'
MessageBeep(MB_ICONEXCLAMATION)
nResponse := MessageBox(hWnd,cMarr,"Caution!",;
MB_OKCANCEL+MB_ICONEXCLAMATION)
CASE cType = 'E'
MessageBeep(MB_ICONHAND)
nResponse := MessageBox(hWnd,cMarr,"Problem!",;
MB_OK+MB_ICONHAND)
OTHERWISE
MessageBeep(MB_OK)
nResponse := MessageBox(hWnd,cMarr,"Please!",;
MB_OKCANCEL+MB_ICONASTERISK)
ENDCASE
RETURN(nResponse)
// NegToPos(nValue)
// Converts a negative numeric value to a positive one
// Maybe not the most elegant way but it works!
//
STATIC FUNCTION NegToPos(nValue)
RETURN(VAL(STRTRAN(STR(nValue),'-')))
// PosToNeg(nValue)
// Converts a positive numeric value to a negative one
// Maybe not the best way to do it but it works!
//
STATIC FUNCTION PosToNeg(nValue)
RETURN(VAL('-'+LTRIM(STR(nValue))))
// CenterWindow() - Courtesy of Gerald Barber
// Centers a window in it's parent windows client area
// Written by Gerald Barber - thanks Gerald!
//
STATIC FUNCTION CenterWindow(hWnd)
LOCAL hWndParent
LOCAL aChild_[4]
LOCAL iCWidth
LOCAL iCHeight
LOCAL aParent_[4]
LOCAL aPoint_[2]
aChild_ := GetWindowRect(hWnd)
iCWidth := aChild_[3] - aChild_[1]
iCHeight := aChild_[4] - aChild_[2]
hWndParent := GetWindow(hWnd,GW_OWNER)
aParent_ := GetClientRect(hWndParent)
aPoint_ := {(aParent_[3]/2),(aParent_[4]/2)}
ClienttoScreen(hWndParent,aPoint_)
aPoint_[1] -= (iCWidth / 2)
aPoint_[2] -= (iCHeight / 2)
ScreentoClient(hWndParent,aPoint_)
aPoint_[1] := max(0, aPoint_[1])
aPoint_[2] := max(0, aPoint_[2])
ClienttoScreen(hWndParent,aPoint_)
MoveWindow(hWnd,aPoint_[1],aPoint_[2],iCWidth,iCHeight,.F.)
RETURN(NIL)
STATIC FUNCTION GetWindowRect(hWnd)
LOCAL cGWR
LOCAL cBuf := SPACE(8)
LOCAL hLib := LoadLibrary("USER.EXE")
cGWR := GetProcAddress(hLib, "GetWindowRect", ;
"Pascal", "void", "HWND, string")
CallDLL(cGWR, hWnd, @cBuf)
FreeLibrary(hLib)
RETURN( BIN2A(cBuf, "int[4]") )
STATIC FUNCTION TextHeight
LOCAL aTM := {}
LOCAL hDC := GetDC(hMainWnd)
GetTextMetrics(hDC,@aTM)
ReleaseDC(hMainWnd,hDC)
RETURN( aTM[ TM_Height ] )
// LdBrowFlds() - Returns an array for use by WBrowse() that contains
// ALL fields in a database
STATIC FUNCTION LdBrowFlds
LOCAL nCtr
LOCAL aFldList := {}
LOCAL aStruct := DBSTRUCT()
LOCAL cPict
FOR nCtr := 1 TO LEN( aStruct )
cPict := ""
DO CASE
CASE aStruct[nCtr][2] == 'C'
AADD( aFldList, {aStruct[nCtr][1],"{||"+ALIAS()+"->"+aStruct[nCtr][1]+'}',cPict} )
CASE aStruct[nCtr][2] == 'N'
cPict := REPLICATE( '9', aStruct[nCtr][3] )
IF aStruct[nCtr][4] > 0
cPict += '.'+REPLICATE( '9', aStruct[nCtr][4] )
ENDIF
AADD( aFldList, {aStruct[nCtr][1],"{||"+ALIAS()+"->"+aStruct[nCtr][1]+"}",cPict} )
CASE aStruct[nCtr][2] == 'L'
AADD( aFldList, {aStruct[nCtr][1],"{||IIF("+ALIAS()+"->"+aStruct[nCtr][1]+",'.T.','.F.')}",cPict} )
CASE aStruct[nCtr][2] == 'D'
AADD( aFldList, {aStruct[nCtr][1],"{||DTOC(FIELD->"+aStruct[nCtr][1]+")}",cPict} )
ENDCASE
NEXT
RETURN(aFldList)
STATIC FUNCTION BListBox(hDlg ,; // Dialog box handle
hWnd ,; // Handle to listbox control
aFlds ,; // fields/codeblocks for browse
bTop ,;
bBottom,;
bSkip ,;
cAlias ,; // name of database/alias
hBFont ,; // Optional font for listbox
aUpdate,; // Optional array of dialog controls
lShow)
LOCAL aRect, hInst, nCtr, oB, cOldAlias
aRect := GetClientRect(hWnd)
IF cAlias != NIL
cOldAlias := DBSELECTAREA( cAlias )
ENDIF
oB := WBrowse{ hWnd,0,0,aRect[3]-1, aRect[4]-1,;
"",;
WS_CHILD+WS_BORDER+WS_VISIBLE,hWnd}
oB:autoSize := .T.
FOR nCtr := 1 TO LEN(aFlds)
ASIZE(aFlds[nCtr],9)
IF aFlds[ nCtr ][ 7 ] != NIL
oB:autoSize := .F.
EXIT
ENDIF
NEXT
FOR nCtr := 1 TO LEN(aFlds)
oB:addColumn(WBColumn{aFlds[nCtr][1],;
aFlds[nCtr][2],;
aFlds[nCtr][3],;
aFlds[nCtr][4],;
aFlds[nCtr][5],;
aFlds[nCtr][6],;
aFlds[nCtr][7],;
aFlds[nCtr][8],;
aFlds[nCtr][9]})
NEXT
oB:userSize := .F.
oB:userMove := .F.
oB:goTopBlock := IIF( bTop == NIL, oB:goTopBlock, bTop)
oB:goBottomBlock := IIF( bBottom == NIL, oB:goBottomBlock, bBottom)
oB:skipBlock := IIF( bSkip == NIL, oB:skipBlock, bSkip)
oB:alias := IIF( cAlias == NIL, NIL, cAlias )
lShow := IIF( lShow == NIL, .T., lShow )
IF aUpdate != NIL
oB:selectBlock := {||UpdateDlg(hDlg,aUpdate)}
ENDIF
IF hBFont != NIL
oB:SetFont(hBFont)
ENDIF
oB:ShowFocus( .T. )
IF lShow
oB:goTop()
ENDIF
IF cAlias != NIL
DBSELECTAREA( cOldAlias )
ENDIF
DoSubCl(oB,hWnd)
RETURN(oB)
STATIC FUNCTION UpdateDlg(hDlg,aUpdate)
LOCAL nCtr
FOR nCtr := 1 TO LEN(aUpdate)
EVAL(aUpdate[nCtr])
NEXT
RETURN(NIL)
STATIC FUNCTION DoSubCl(oB,hWnd)
LOCAL nProc
nProc := SubClassWindow(hWnd,;
{|hWnd, nMsg, nWparam, nLparam|;
oB:__SubWndProc(nProc, hWnd, nMsg, nWparam, nLparam)},;
{WM_PAINT,;
WM_ERASEBKGND ,;
WM_MOUSEMOVE,;
WM_LBUTTONUP,;
WM_LBUTTONDOWN,;
WM_LBUTTONDBLCLK,;
WM_KEYDOWN,;
WM_SYSKEYDOWN,;
WM_COMMAND,;
WM_DESTROY,;
WM_HSCROLL,;
WM_SETFOCUS,;
WM_KILLFOCUS,;
WM_VSCROLL})
RETURN(NIL)
FUNCTION SkipFor( ; // Skipblock for handling sub-set browses
oB, ; // Browse Object
nSkip, ; // Number of Skips
bSearch, ; // Search Code Block
cKey, ; // Key that Code Block eval has match
cAlias, ; // DataBase Alias
lSoftSeek; // Logical SoftSeek mode for dBSeek()
) // Returns number of Skips
( cAlias )->( DBSKIP( nSkip ) )
lSoftSeek := IIF( lSoftSeek == NIL, .F., lSoftSeek )
DO CASE
CASE nSkip > 0 // Move Forward
IF EVAL( bSearch ) != cKey
oB:hitBottom := .T.
oB:hitTop := .F.
RETURN( -1 )
ENDIF
oB:nCurRec += nSkip
CASE nSkip < 0 // Move Back
IF EVAL( bSearch ) != cKey .OR. ( cAlias )->( BOF() )
IF !( cAlias )->( DBSEEK( cKey, lSoftSeek ) )
( cAlias )->( DBGOBOTTOM() )
( cAlias )->( DBSKIP() )
RETURN( nSkip )
ENDIF
oB:hitTop := .T.
oB:hitBottom := .F.
RETURN( 0 )
ENDIF
oB:nCurRec := oB:nCurRec - NegToPos(nSkip)
ENDCASE
oB:hitTop := .F.
oB:hitBottom := .F.
RETURN( nSkip )
FUNCTION FindFirst( ; // goTopBlock for browsing sub-sets
oB, ; // Browse Object
cKey, ; // Key for dBSeek()
cAlias, ; // DataBase Alias
lSoftSeek ; // Logical SoftSeek mode for dBSeek()
) // Return NIL
lSoftSeek := IIF( lSoftSeek == NIL, .F., .T. )
( cAlias )->( DBSEEK( cKey, lSoftSeek ) )
oB:nCurRec := 1
oB:hitTop := .T.
oB:hitBottom := ( cAlias )->( EOF() )
oB:rowPos := 1
RETURN( NIL )
FUNCTION FindLast( ; // goBottomBlock for browsing sub-sets
oB, ; // Browse Object
bSearch, ; // Search Code Block
cKey, ; // Key for dBSeek()
cAlias, ; // DataBase Alias
lSoftSeek ; // Logical SoftSeek mode for dBSeek()
) // Return NIL
LOCAL nCurRec := 0
lSoftSeek := IIF( lSoftSeek == NIL, .F., .T. )
IF ( cAlias)->( DBSEEK( cKey, lSoftSeek ) )
DO WHILE EVAL( bSearch ) == cKey .AND. !( cAlias )->( EOF() )
++nCurRec
( cAlias )->( DBSKIP() )
ENDDO
( cAlias )->( DBSKIP( -1 ) )
ELSE
nCurRec := 1
ENDIF
oB:nCurRec := MAX( nCurRec, 1 )
oB:hitBottom := .T.
oB:hitTop := .F.
oB:rowPos := oB:rowCount
oB:nMaxRec := nCurRec
RETURN( NIL )