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 >
Text File  |  1995-06-07  |  86KB  |  2,356 lines

  1.  
  2. #define W_RIGHT  3
  3. #define W_BOTTOM 4
  4. #define WIN_WANT_ALL
  5. #define WIN_WANT_SBS
  6. #define WIN_WANT_EN
  7. #define WIN_WANT_LBS
  8. #define WIN_WANT_LB
  9. #define WIN_WANT_CB
  10. #define WIN_WANT_MF
  11. #define WIN_WANT_IDM
  12. #define WIN_WANT_HELP
  13. #define WIN_WANT_DRAWTEXT
  14. #define WIN_WANT_CLIPBOARD
  15. #define WIN_WANT_RESOURCE
  16. #define WIN_WANT_SYSTEM_METRICS
  17. #define WIN_WANT_GETDEVCAPS
  18. #define WIN_WANT_BITMAPS
  19.  
  20.  
  21. #define BDOB   2001
  22. #define BNAME  2002
  23. #define BRACE  2003
  24. #define BSEX   2004
  25. #define BCCODE 2005
  26.  
  27.  
  28. #include "windows.ch"
  29. #include "inkey.ch"
  30. #include "accel.ch"
  31. #include "textmetr.ch"
  32. #include "dialog.ch"
  33. #include "font.ch"
  34. #include "wbdemo.ch"
  35. #include "paint.ch"
  36. #include "topclass.ch"
  37. #include "vo.ch"
  38.  
  39. STATIC cCopy    := "Copyright 1994,1995 Logical Systems"
  40. STATIC hMainWnd
  41. STATIC hCTL3D
  42. STATIC hBWCCLib
  43. STATIC nTH
  44. STATIC nMainWW
  45. STATIC hDemoWnd
  46.  
  47. STATIC SCCODE,SLAST_NAME,SFIRST_NAME,SMI,SJR_SR_III,SNOTES,SRACE,SSEX
  48. STATIC aTFont := {-12, 0, 0, 0, 0, .F., .F., .F., 1, 0, 0, 0, 0, "Arial"}
  49.  
  50. FUNCTION Main
  51.        LOCAL hInst, nEvent, cC3D, aCrect := {}
  52.  
  53.  
  54.        SET DELETED ON
  55.        SET SCOREBOARD OFF
  56.        REQUEST DBFCDX
  57.        REQUEST DBFNTX
  58.  
  59.        hInst    := _GetInstance()
  60.        hCTL3D   := LoadLibrary("CTL3D.DLL")
  61.        hBWCCLib := LoadLibrary("BWCC.DLL")
  62.        Ctl3DRegister(hInst)
  63.        Ctl3dAutoSubClass(hInst)
  64.        SetHandleCount(30)
  65.        C4W_Autoclose(.F.)
  66.        hMainWnd := WinSetup("DEMO")
  67.  
  68.        USE ATTEND NEW VIA "DBFNTX"
  69.        SET INDEX TO ATTEND
  70.        USE CHILD NEW VIA "DBFCDX"
  71.        SET INDEX TO CHILD
  72.        USE BUTTONS NEW VIA "DBFNTX"
  73.        USE CAL NEW VIA "DBFNTX"
  74.        SET INDEX TO CAL
  75.        DemoDlg()
  76.        DO WHILE .T.
  77.           nEvent := ChkEvent()
  78.           HandleEvent(nEvent)
  79.        ENDDO
  80. RETURN(NIL)
  81.  
  82. STATIC FUNCTION WinSetup(cAppName, cTitle)
  83.        LOCAL  hWnd, hInst, hPrevInst, nCmdShow, hBrush, hIcon
  84.  
  85.        hInst     := _GetInstance()
  86.        hPrevInst := _GetPrevInstance()
  87.        nCmdShow  := _GetnCmdShow()
  88.        hIcon     := LoadIcon(hInst,"DEMO"+CHR(0))
  89.        hBrush    := GetStockObject( WHITE_BRUSH )
  90.        IF hPrevInst == 0
  91.           IF !RegisterClass(CS_HREDRAW + CS_VREDRAW + CS_SAVEBITS + CS_DBLCLKS,;
  92.                             hInst, ;
  93.                             hIcon, ;
  94.                             LoadCursor(hInst,IDC_ARROW),;
  95.                             hBrush,;
  96.                             cAppName)
  97.  
  98.              QUIT
  99.          ENDIF
  100.          IF !RegisterClass(CS_HREDRAW + CS_VREDRAW + CS_SAVEBITS + CS_DBLCLKS,;
  101.                            hInst, ;
  102.                            hIcon, ;
  103.                            LoadCursor(,IDC_ARROW),;
  104.                            GetStockObject(LTGRAY_BRUSH),;
  105.                            'TB')
  106.  
  107.              QUIT
  108.          ENDIF
  109.  
  110.          // We want our icon on minimized browse windows so we get rid of
  111.          // the WBrowse() class and re-register it with our app icon
  112.  
  113.          UnregisterClass("BLIST",hInst)
  114.          IF !RegisterClass(CS_HREDRAW + CS_VREDRAW + CS_SAVEBITS + CS_DBLCLKS,;
  115.                            hInst, ;
  116.                            hIcon, ;
  117.                            LoadCursor(,IDC_ARROW),;
  118.                            hBrush,;
  119.                            "BLIST")
  120.  
  121.             QUIT
  122.          ENDIF
  123.       ENDIF
  124.       hWnd := CreateWindow(cAppName,    ;
  125.                            "",          ;
  126.                            0,           ;
  127.                            0,           ;
  128.                            0,           ;
  129.                            640,         ;
  130.                            480,         ;
  131.                            0,           ;
  132.                            0,           ;
  133.                            hInst)
  134. RETURN(hWnd)
  135.  
  136. FUNCTION PgmExit
  137.  
  138.        Ctl3DUnRegister(_GetInstance())
  139.        FreeLibrary(hCTL3D)
  140.        FreeLibrary(hBWCCLib)
  141.        WinHelp(hMainWnd,"WINHELP.HLP",HELP_QUIT,0)
  142.        WinHelp(hMainWnd,"WBROWSES.HLP",HELP_QUIT,0)
  143.        DestroyWindow( hMainWnd )
  144.        QUIT
  145. RETURN(NIL)
  146.  
  147. STATIC FUNCTION About
  148.  
  149.        DialogBox(_GetInstance() , "about", hMainWnd, ;
  150.                  {|hDlg, nMsg, nWparam, nLparam|;
  151.                  MAbout(hDlg, nMsg, nWparam, nLparam)})
  152. RETURN(NIL)
  153.  
  154. STATIC FUNCTION MAbout(hDlgWnd, nMsg, nWparam, nLparam)
  155.  
  156.        DO CASE
  157.           CASE nMsg == WM_INITDIALOG
  158.                CenterWindow(hDlgWnd)
  159.                RETURN(1)
  160.  
  161.           CASE nMsg == WM_COMMAND
  162.                EndDialog(hDlgWnd,IDNO)
  163.                RETURN(1)
  164.        ENDCASE
  165. RETURN(0)
  166.  
  167. STATIC FUNCTION FindKid( oB )
  168.        LOCAL nAnswer, cKid := "", nCrec
  169.  
  170.        nAnswer := DialogBox(_GetInstance() , "find", oB:hWnd , ;
  171.                             {|hDlg, nMsg, nWparam, nLparam|;
  172.                             MFind(hDlg, nMsg, nWparam, nLparam,oB, @cKid)})
  173.        IF nAnswer == IDOK
  174.           IF !EMPTY(cKid)
  175.              SELECT CHILD
  176.              nCrec := RECNO()
  177.              SEEK cKid
  178.              IF !FOUND()
  179.                 ErrorMsg(hMainWnd,"NOT FOUND!",'E')
  180.                 GOTO nCrec
  181.              ELSE
  182.                 oB:rowPos    := 1
  183.                 oB:nCrecNo   := RECNO()
  184.                 oB:nCurRec   := NtxPos(INDEXORD(), RECNO())
  185.                 oB:hitTop    := BOF()
  186.                 oB:hitBottom := EOF()
  187.                 oB:showData()
  188.              ENDIF
  189.           ENDIF
  190.        ENDIF
  191. RETURN(NIL)
  192.  
  193. STATIC FUNCTION MFind( hDlgWnd, nMsg, nWparam, nLparam,oB, cKid )
  194.  
  195.        DO CASE
  196.           CASE nMsg == WM_INITDIALOG
  197.                CenterWindow( hDlgWnd )
  198.                DoSubClEC( GetDlgItem( hDlgWnd, 101 ), hDlgWnd )
  199.                RETURN(1)
  200.  
  201.           CASE nMsg == WM_COMMAND
  202.                DO CASE
  203.                   CASE nWparam == IDOK
  204.                        cKid := GetDlgItmText( hDlgWnd, 101 )
  205.                        EndDialog( hDlgWnd, IDOK )
  206.                        RETURN(1)
  207.  
  208.                   CASE nWparam == IDCANCEL
  209.                        EndDialog( hDlgWnd, IDCANCEL )
  210.                        RETURN(1)
  211.                ENDCASE
  212.        ENDCASE
  213. RETURN(0)
  214.  
  215. STATIC FUNCTION AddKid( oB, nMode )
  216.        LOCAL nCrec , nAnswer
  217.  
  218.        SELECT CHILD
  219.        IF nMode == 1
  220.           nCrec := RECNO()
  221.           GO BOTTOM
  222.           SKIP
  223.        ENDIF
  224.        TmpVals()
  225.        nAnswer := DialogBox( _GetInstance() , "addkid", oB:hWnd , ;
  226.                             {|hDlg, nMsg, nWparam, nLparam|;
  227.                             MAddKid( hDlg, nMsg, nWparam, nLparam, oB, nMode )})
  228.  
  229.        IF nAnswer == IDSAVE
  230.           IF nMode == 1
  231.              SELECT CHILD
  232.              APPEND BLANK
  233.              KidRepls()
  234.              oB:goTop()
  235.           ELSE
  236.              KidRepls()
  237.              oB:refreshAll()
  238.           ENDIF
  239.        ENDIF
  240. RETURN(NIL)
  241.  
  242. STATIC FUNCTION MAddKid( hDlgWnd, nMsg, nWparam, nLparam, oB, nMode )
  243.        STATIC GetList
  244.        LOCAL nFoo
  245.  
  246.        DO CASE
  247.           CASE nMsg == WM_INITDIALOG
  248.                GetList := KidGets( hDlgWnd )
  249.                IF nMode == 2
  250.                   CheckDlgButton( hDlgWnd, 106, IIF( SSEX  == 'M', 1, 0 ))
  251.                   CheckDlgButton( hDlgWnd, 107, IIF( SSEX  == 'F', 1, 0 ))
  252.                   CheckDlgButton( hDlgWnd, 108, IIF( SRACE == 'W', 1, 0 ))
  253.                   CheckDlgButton( hDlgWnd, 109, IIF( SRACE == 'B', 1, 0 ))
  254.                   CheckDlgButton( hDlgWnd, 110, IIF( SRACE == 'O', 1, 0 ))
  255.                ENDIF
  256.                CenterWindow( hDlgWnd )
  257.                RETURN(1)
  258.  
  259.           CASE nMsg == WM_COMMAND
  260.                DO CASE
  261.                   CASE nWparam == 101
  262.                   CASE nWparam == IDOK
  263.                        IF GetFocus() < 500
  264.                           PostMessage( hDlgWnd, WM_NEXTDLGCTL, 0, 0 )
  265.                        ENDIF
  266.                        RETURN( 1 )
  267.                   CASE nWparam == IDSAVE
  268.                        IF IsDialogOk( hDlgWnd, IDSAVE )
  269.                           SNOTES := GetDlgItmText( hDlgWnd, 111 )
  270.                           EndDialog( hDlgWnd, IDSAVE )
  271.                        ENDIF
  272.                        RETURN(1)
  273.  
  274.                   CASE nWparam == IDCANCEL
  275.                        CANCEL DIALOG hDlgWnd
  276.                        EndDialog( hDlgWnd, IDCANCEL )
  277.                        RETURN(1)
  278.  
  279.                   CASE nWparam >= 106 .AND. nWparam <= 107
  280.                        SSEX := IIF( nWparam == 106,'M','F' )
  281.                        RETURN(1)
  282.  
  283.                   CASE nWparam >= 108 .AND. nWparam <= 110
  284.                        SRACE := IIF( nWparam == 108, 'W',;
  285.                                     IIF( nWparam == 109, 'B', 'O'))
  286.                        RETURN(1)
  287.                ENDCASE
  288.        ENDCASE
  289. RETURN(0)
  290.  
  291. STATIC FUNCTION KidGets( hDlgWnd )
  292.        LOCAL GetList := {}
  293.  
  294.        @ DIALOG hDlgWnd ID 101 GET SLAST_NAME
  295.        @ DIALOG hDlgWnd ID 102 GET SFIRST_NAME
  296.        @ DIALOG hDlgWnd ID 103 GET SMI
  297.        @ DIALOG hDlgWnd ID 104 GET SJR_SR_III
  298.        @ DIALOG hDlgWnd ID 105 GET SCCODE PICTURE "@!"
  299. RETURN(GetList)
  300.  
  301. STATIC FUNCTION TmpVals
  302.  
  303.        SCCODE      := CHILD->CCODE
  304.        SLAST_NAME  := CHILD->LAST_NAME
  305.        SFIRST_NAME := CHILD->FIRST_NAME
  306.        SMI         := CHILD->MI
  307.        SJR_SR_III  := CHILD->JR_SR_III
  308.        SRACE       := CHILD->RACE
  309.        SSEX        := CHILD->SEX
  310.        SNOTES      := CHILD->NOTES
  311. RETURN(NIL)
  312.  
  313. STATIC FUNCTION KidRepls
  314.  
  315.        CHILD->CCODE      := SCCODE
  316.        CHILD->LAST_NAME  := SLAST_NAME
  317.        CHILD->FIRST_NAME := SFIRST_NAME
  318.        CHILD->MI         := SMI
  319.        CHILD->JR_SR_III  := SJR_SR_III
  320.        CHILD->RACE       := SRACE
  321.        CHILD->SEX        := SSEX
  322.        CHILD->NOTES      := SNOTES
  323.        COMMIT
  324. RETURN(NIL)
  325.  
  326. STATIC FUNCTION ViewNotes( oB )
  327.  
  328.        DialogBox(_GetInstance() , "notes", oB:hWnd , ;
  329.                  {|hDlg, nMsg, nWparam, nLparam|;
  330.                   MNotes( hDlg, nMsg, nWparam, nLparam, oB )})
  331. RETURN(NIL)
  332.  
  333. STATIC FUNCTION MNotes(hDlgWnd, nMsg, nWparam, nLparam, oB)
  334.  
  335.        DO CASE
  336.           CASE nMsg == WM_INITDIALOG
  337.                SetDlgItemText( hDlgWnd, 101, LEFT(CHILD->NOTES,1400) )
  338.                CenterWindow( hDlgWnd )
  339.                RETURN(1)
  340.  
  341.           CASE nMsg == WM_COMMAND
  342.                DO CASE
  343.                   CASE nWparam == IDOK
  344.                        CHILD->NOTES := LEFT( GetDlgItmText( hDlgWnd, 101), 1400)
  345.                        EndDialog( hDlgWnd, IDOK )
  346.                        RETURN(1)
  347.  
  348.                   CASE nWparam == IDCANCEL
  349.                        EndDialog( hDlgWnd, IDCANCEL )
  350.                        RETURN(1)
  351.                ENDCASE
  352.        ENDCASE
  353. RETURN(0)
  354.  
  355. STATIC FUNCTION MakeName
  356.        LOCAL cTmpname
  357.  
  358.        cTmpname := TRIM(FIELD->LAST_NAME)+', '+;
  359.                    TRIM(FIELD->FIRST_NAME)+' '+;
  360.                    IIF(!EMPTY(FIELD->MI),FIELD->MI+'.','')+;
  361.                    IIF(!EMPTY(FIELD->JR_SR_III),' ','')+FIELD->JR_SR_III
  362.        cTmpname := LEFT(cTmpname+SPACE(35),35)
  363.        IF ALLTRIM(cTmpname) == ','
  364.           cTmpname := SPACE(35)
  365.        ENDIF
  366. RETURN(cTmpname)
  367.  
  368. STATIC FUNCTION MCalc( hDlgWnd, nMsg, nWparam, nLparam, aBArray, oB )
  369.        LOCAL aMoney
  370.  
  371.        DO CASE
  372.           CASE nMsg == WM_INITDIALOG
  373.                aMoney := ReCalc( aBArray )
  374.                SetDlgItemText( hDlgWnd, 101, TRANSFORM(aMoney[1],"$99,999.99") )
  375.                SetDlgItemText( hDlgWnd, 102, TRANSFORM(aMoney[2],"$99,999.99") )
  376.                CenterWindow( hDlgWnd )
  377.                SetFocus( oB:hWnd )
  378.                RETURN(1)
  379.  
  380.           CASE nMsg == WM_NCACTIVATE
  381.                IF nWparam < 1
  382.                   nWparam := 1
  383.                ENDIF
  384.                SetFocus( oB:hWnd )
  385.                RETURN(0)
  386.  
  387.           CASE nMsg == WM_COMMAND
  388.                DO CASE
  389.                   CASE nWparam == IDOK
  390.                        DestroyWindow( hDlgWnd )
  391.                        oB:Destroy()
  392.                        RETURN(1)
  393.  
  394.                   CASE nWparam == IDCALC
  395.                        aMoney := ReCalc( aBArray )
  396.                        SetDlgItemText( hDlgWnd, 101, TRANSFORM(aMoney[1],"$99,999.99") )
  397.                        SetDlgItemText( hDlgWnd, 102, TRANSFORM(aMoney[2],"$99,999.99") )
  398.                        SetFocus( oB:hWnd )
  399.                        RETURN(1)
  400.                ENDCASE
  401.        ENDCASE
  402. RETURN(0)
  403.  
  404. STATIC FUNCTION ReCalc( aArray )
  405.        LOCAL nTuit := 0, nDisc := 0
  406.        LOCAL nCtr
  407.  
  408.        FOR nCtr := 1 TO LEN(aArray)
  409.            nTuit += aArray[nCtr][2]
  410.            nDisc += IIF(aArray[nCtr][3] != 0,;
  411.                         aArray[nCtr][2] * (aArray[nCtr][3]/100),0)
  412.        NEXT
  413. RETURN({nTuit,nDisc})
  414.  
  415. PROCEDURE Ctl3dRegister( hInst )
  416.        LOCAL   cDLL := GetProcAddress( hCTL3D, "Ctl3dRegister", "Pascal",   ;
  417.                                        "void", "int" )
  418.        CallDLL( cDLL, hInst )
  419. RETURN
  420.  
  421. PROCEDURE Ctl3dAutoSubclass( hInst )
  422.        LOCAL   cDLL := GetProcAddress( hCTL3D, "Ctl3dAutoSubclass", "Pascal",   ;
  423.                                        "void", "int" )
  424.        CallDLL( cDLL, hInst )
  425. RETURN
  426.  
  427. PROCEDURE Ctl3dUnregister( hInst )
  428.        LOCAL   cDLL := GetProcAddress( hCtl3d, "Ctl3dUnregister", "Pascal",   ;
  429.                                        "void", "int" )
  430.        CallDLL( cDLL, hInst )
  431. RETURN
  432.  
  433. STATIC PROCEDURE Ctl3dDlgEx( hWnd, nFlags )
  434.        LOCAL   cDLL := GetProcAddress( hCtl3d, "Ctl3dSubclassDlgEx", "Pascal",   ;
  435.                                        "BOOL", "HWND, DWORD" )
  436.        CallDLL( cDLL, hWnd, nFlags )
  437. RETURN
  438.  
  439. **************************  mover's
  440.  
  441. // Skipper() - This is the same skipblock function that WBrowse()
  442. // uses internally.  It is provided here so you can see what
  443. // is required in those you write yourself.  The difference
  444. // between tbrowse() and WBrowse() is that the exported instance
  445. // variable nCurRec must be set if the vertical scroll bar is
  446. // to be updated correctly and we need to set our current
  447. // record number (oB:nCrecNo).
  448.  
  449. STATIC FUNCTION Skipper( oB, nSkip )
  450.  
  451.         DBSKIP( nSkip )
  452.         DO CASE
  453.            CASE BOF()
  454.                 oB:nCurRec   := 1
  455.                 oB:nCrecNo   := RECNO()
  456.                 oB:hitTop    := .T.
  457.                 oB:hitBottom := EOF()
  458.            CASE EOF()
  459.                 oB:nCurRec   := RECNO()
  460.                 oB:nCrecNo   := RECNO()-1
  461.                 oB:hitBottom := .T.
  462.                 oB:hitTop    := BOF()
  463.            OTHERWISE
  464.                 oB:nCurRec   += nSkip
  465.                 oB:nCrecNo   := RECNO()
  466.                 oB:hitTop    := .F.
  467.                 oB:hitBottom := .F.
  468.                 RETURN( nSkip )
  469.         ENDCASE
  470. RETURN( 0 )
  471.  
  472. // Internal gotopblock and gobottomblock functions used by WBrowse()
  473. //
  474. STATIC FUNCTION BGoTop( oB )
  475.  
  476.         DBGOTOP()
  477.         oB:hitTop    := .T.
  478.         oB:hitBottom := EOF()
  479.         oB:rowPos    := 1
  480.         oB:nCurRec   := 1
  481.         oB:nCrecNo   := recno()
  482.         oB:nMaxRec   := LASTREC()
  483. RETURN( NIL )
  484.  
  485. STATIC FUNCTION BGoBottom( oB )
  486.  
  487.        DBGOBOTTOM()
  488.        oB:hitTop     := BOF()
  489.        oB:hitBottom  := .T.
  490.        oB:rowPos     := oB:nMaxLines
  491.        oB:nCurRec    := RECNO()
  492.        oB:nCrecNo    := RECNO()
  493.        oB:nMaxRec    := LASTREC()
  494. RETURN( NIL )
  495.  
  496. // Array browse gotop routine
  497. //
  498. STATIC FUNCTION AGoTop( oB, aArray )
  499.  
  500.        oB:nCurRec   := 1
  501.        oB:rowPos    := 1
  502.        oB:nCrecNo   := NIL
  503.        oB:nMaxRec   := LEN(aArray)
  504.        oB:hitTop    := .T.
  505.        oB:hitBottom := .F.
  506. RETURN(NIL)
  507.  
  508. // Array browse gobottom routine
  509. //
  510. STATIC FUNCTION AGoBottom( oB, aArray )
  511.  
  512.        oB:nCurRec   := LEN(aArray)
  513.        oB:nMaxRec   := oB:nCurRec
  514.        oB:rowPos    := oB:nMaxLines
  515.        oB:nCrecNo   := NIL
  516.        oB:hitBottom := .T.
  517.        oB:hitTop    := .F.
  518. RETURN(NIL)
  519.  
  520. // Array browse skip routine
  521. //
  522. STATIC FUNCTION ASkipper( oB, nSkip, aArray )
  523.        LOCAL nMoved := 0
  524.  
  525.        DO CASE
  526.           CASE nSkip > 0
  527.                IF ( oB:nCurRec + nSkip ) <= oB:nMaxRec
  528.                   oB:nCurRec   := oB:nCurRec + nSkip
  529.                   nMoved       := nSkip
  530.                   oB:nCrecNo   := oB:nCurRec
  531.                   oB:hitTop    := .F.
  532.                   oB:hitBottom := .F.
  533.                ELSE
  534.                   oB:nCurRec   := oB:nMaxRec + 1 // IMPORTANT!  Must be
  535.                   oB:nCrecNo   := NIL            // = to LASTREC() + 1
  536.                   oB:hitBottom := .T.
  537.                   oB:hitTop    := .F.
  538.                ENDIF
  539.  
  540.           CASE nSkip < 0
  541.                IF ( oB:nCurRec - NegToPos(nSkip) ) >= 1
  542.                   oB:nCurRec := oB:nCurRec - NegToPos(nSkip)
  543.                   nMoved     := nSkip
  544.                   oB:nCrecNo := oB:nCurRec
  545.                   oB:hitTop  := .F.
  546.                   oB:hitBottom := .F.
  547.                ELSE
  548.                   oB:nCurRec := 1
  549.                   oB:nCrecNo := NIL
  550.                   oB:hitTop  := .T.
  551.                   oB:hitBottom := .F.
  552.                ENDIF
  553.        ENDCASE
  554. RETURN(nMoved)
  555.  
  556. // First key search routine for an array
  557. //
  558. STATIC FUNCTION AFindKey( oB, cKey, aArray )
  559.        LOCAL nCtr
  560.  
  561.        FOR nCtr := 1 TO LEN(aArray)
  562.            IF LEFT( UPPER(aArray[nCtr][1]) ,1 ) == cKey
  563.               EVAL( oB:gotopBlock, oB )
  564.               EVAL( oB:skipBlock, oB, nCtr-1 )
  565.               oB:rowPos    := 1
  566.               oB:showData()
  567.               RETURN(.T.)
  568.            ENDIF
  569.        NEXT
  570. RETURN(.F.)
  571.  
  572. STATIC FUNCTION DrawButtons( hWnd, aButtons, oB, lFind )
  573.        LOCAL nCtr, aCrect, nRight, hTB, hBWnd, hInst
  574.  
  575.        aCrect   := GetClientRect( hWnd )
  576.        hInst    := _GetInstance()
  577.        hTB      := CreateWindow("TB","",WS_CHILD+WS_VISIBLE+WS_BORDER,-2,-2,aCRect[W_RIGHT]+3,;
  578.                                  TextHeight( hWnd)+11,hWnd,0, hInst)
  579.        HideCaret(hTB)
  580.        DoSubClSB( hTB, hWnd )
  581.        aButtons := {}
  582.        AADD(aButtons, { hTB, NIL, NIL })
  583.        nRight := 2
  584.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  585.                           nRight,1,25,22,hTB, IDTOPS, hInst),;
  586.                           IDTOPS, {|oB|oB:GoTop(.F.)} } )
  587.  
  588.        nRight += 26
  589.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  590.                           nRight,1,25,22,hTB, IDBOTTOMS, hInst),;
  591.                           IDBOTTOMS, {|oB|oB:GoBottom(.F.)} } )
  592.        nRight += 26
  593.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  594.                           nRight,1,25,22,hTB, IDPGUPS, hInst),;
  595.                           IDPGUPS, {|oB|oB:PageUp()} } )
  596.        nRight += 26
  597.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  598.                           nRight,1,25,22,hTB, IDPGDNS, hInst),;
  599.                           IDPGDNS, {|oB|oB:PageDown()} } )
  600.        nRight += 26
  601.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  602.                           nRight,1,25,22,hTB, IDALTHOME, hInst),;
  603.                           IDALTHOME, {|oB|oB:Home()} } )
  604.        nRight += 26
  605.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  606.                           nRight,1,25,22,hTB, IDALTEND, hInst),;
  607.                           IDALTEND, {|oB|oB:End()} } )
  608.        nRight += 52
  609.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  610.                           nRight,1,25,22,hTB, IDADDS, hInst),;
  611.                           IDADDS, {|oB|AddKid( oB, 1 )} } )
  612.        nRight += 26
  613.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  614.                           nRight,1,25,22,hTB, IDDELETES, hInst),;
  615.                           IDDELETES, {|oB|DelKid( oB )} } )
  616.        nRight += 26
  617.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  618.                           nRight,1,25,22,hTB, IDEDITS, hInst),;
  619.                           IDEDITS, {|oB|AddKid( oB, 2 )} } )
  620.        IF lFind
  621.           nRight += 26
  622.           AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  623.                              nRight,1,25,22,hTB, IDFINDS, hInst),;
  624.                              IDFINDS, {|oB|FindKid( oB ), SetFocus( hWnd )} } )
  625.        ENDIF
  626.        nRight += 26
  627.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  628.                           nRight,1,25,22,hTB, IDPRINT, hInst),;
  629.                           IDPRINT, {|oB|Print( hWnd, oB )} } )
  630.        nRight += 52
  631.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  632.                           nRight,1,25,22,hTB, IDEXITS, hInst),;
  633.                           IDEXITS, {|oB|PostMessage( hWnd, WM_SYSCOMMAND, SC_CLOSE, 0 )} } )
  634.        nRight += 26
  635.        AADD( aButtons,  { CreateWindow("borbtn","",WS_CHILD+WS_VISIBLE,;
  636.                           nRight,1,25,22,hTB, IDBHELPS, hInst),;
  637.                           IDBHELPS, {|oB|BHelp()} } )
  638. RETURN( aButtons )
  639.  
  640. STATIC FUNCTION BDoSubCl( hWnd, oB )
  641.        LOCAL nProc
  642.  
  643.        nProc := SubClassWindow(hWnd,;
  644.                    {|hWnd, nMsg, nWparam, nLparam| ;
  645.                    BWndProc(nProc, hWnd, nMsg, nWparam, nLparam, oB)},;
  646.                    {WM_PAINT,;
  647.                     WM_COMMAND,;
  648.                     WM_SYSCOMMAND,;
  649.                     WM_KEYDOWN,;
  650.                     WM_CLOSE,;
  651.                     WM_TIMER,;
  652.                     WM_SIZE,;
  653.                     WM_NCHITTEST,;
  654.                     WM_SYSKEYDOWN})
  655. RETURN(NIL)
  656.  
  657. STATIC FUNCTION BWndProc( nProc, hWnd, nMsg, nwParam, nlParam, oB )
  658.        LOCAL nCtr, hFont, aCRect, nTop, nBottom, hBrowWnd
  659.  
  660.        hBrowWnd := oB:hWNd
  661.        DO CASE
  662.           CASE nMsg == WM_SYSCOMMAND
  663.                IF nWparam == SC_CLOSE
  664.                   DestroyWindow( hWnd )
  665.                   RETURN(NIL)
  666.                ENDIF
  667.  
  668.           CASE nMsg == WM_SIZE
  669.                IF nWparam != SIZE_MINIMIZED
  670.                   aCRect  := GetClientRect( hWnd )
  671.                   nTH     := TextHeight( hWnd )
  672.                   nTop    := nTH+9
  673.                   nBottom := aCRect[ 4 ] -  nTop
  674.                   MoveWindow( oB:hWnd,1,nTop,aCRect[3],nBottom,.T.)
  675.                   MoveWindow( oB:cargo[1][1], -2, -2, aCRect[W_RIGHT]+3, nTH+11, .T. )
  676.                   SendMessage( oB:hWnd, WM_PAINT, 0 , 0 )
  677.                ENDIF
  678.  
  679.           CASE nMsg == WM_KEYDOWN .OR. nMsg == WM_SYSKEYDOWN
  680.                PostMessage( hBrowWnd, nMsg, nWparam, nLparam )
  681.  
  682.           CASE nMsg == WM_COMMAND
  683.                FOR nCtr := 1 TO LEN( oB:cargo )
  684.                    IF oB:cargo[ nCtr ][ 2 ] == nWparam
  685.                       IF oB:cargo[ nCtr ][ 3 ] != NIL
  686.                          EVAL( oB:cargo[ nCtr ][ 3 ], oB )
  687.                       ENDIF
  688.                       EXIT
  689.                    ENDIF
  690.                NEXT
  691.        ENDCASE
  692.        IF IsWindow( hWnd )
  693.           SetFocus( hWnd )
  694.        ELSE
  695.           SetFocus( hMainWnd )
  696.        ENDIF
  697. RETURN(CallWindowProc(nProc, hWnd, nMsg, nWparam, nLparam))
  698.  
  699. STATIC FUNCTION WndProcSB(nProc, hWnd, nMsg, nWparam, nLparam, hBWnd)
  700.        LOCAL hBrush, nButton
  701.  
  702.        DO CASE
  703.           CASE nMsg == WM_CTLCOLOR
  704.                SetTextColor(nWparam, RGB(128,128,128))
  705.                SetBkColor(nWparam, RGB(128,128,128))
  706.                hBrush := GetStockObject(LTGRAY_BRUSH)
  707.                RETURN(hBrush)
  708.  
  709.           CASE nMsg == WM_COMMAND
  710.                PostMessage(hBWnd,WM_COMMAND,nWparam,nLparam)
  711.        ENDCASE
  712. RETURN(CallWindowProc(nProc, hWnd, nMsg, nWparam, nLparam))
  713.  
  714. STATIC FUNCTION DoSubClSB( hWnd , hBWnd)
  715.        LOCAL nProc
  716.  
  717.        nProc := SubClassWindow(hWnd,                               ;
  718.                    {|hWnd, nMsg, nWparam, nLparam|                 ;
  719.                    WndProcSB(nProc, hWnd, nMsg, nWparam, nLparam, hBWnd)},;
  720.                    {WM_CTLCOLOR,WM_COMMAND})
  721. RETURN(NIL)
  722.  
  723. STATIC FUNCTION SetNubs( oB )
  724.        LOCAL hDC := GetDC( oB:hWnd )
  725.        LOCAL hOldFont, hBrowFont
  726.  
  727.        hBrowFont := oB:colFont
  728.        IF hBrowFont != NIL
  729.           hOldFont := SelectObject( hDC, hBrowFont )
  730.        ENDIF
  731.        oB:setColWidth(0,C4W_LoWord(GetTextExtent(hDC,"WWW0000",7)))
  732.        IF hOldFont != NIL
  733.           SelectObject( hDC, hOldFont )
  734.        ENDIF
  735.        ReleaseDC( oB:hWnd, hDC )
  736. RETURN( NIL )
  737.  
  738. STATIC FUNCTION Print( hWnd, oB )
  739.        LOCAL hPrintDC
  740.        LOCAL hFont1, hFont2
  741.        LOCAL nPtSize
  742.        LOCAL aFont := {-19, 0, 0, 0, 0, .F., .F., .F., 1, 0, 0, 0, 0, "Arial"}
  743.  
  744.        // We let the user select the font and style
  745.        // but we will set the size later!
  746.  
  747.        aFont    := ChooseFont(aFont)
  748.        IF aFont == NIL
  749.           RETURN( NIL )
  750.        ENDIF
  751.  
  752.        // Let the user select the printer and set it up if needed...
  753.  
  754.        hPrintDC := GetPrintDC()
  755.        IF EMPTY(hPrintDC)
  756.           RETURN( NIL )
  757.        ENDIF
  758.  
  759.        // Sometimes the printer setup dialog messes up our window
  760.        // so to make things nice we will re-draw it....
  761.  
  762.        SendMessage( hWnd, WM_PAINT, 0, 0 )
  763.  
  764.        // Now we set our font sizes
  765.  
  766.        // 14 point for our heading
  767.  
  768.        nPtSize  := PosToNeg( ( 14 * GetDeviceCaps( hPrintDC, LOGPIXELSY ) ) / 72 )
  769.        aFont[1] := nPtSize
  770.        hFont1   := CreateFont( aFont )
  771.  
  772.        // 10 point for the details...
  773.  
  774.        nPtSize  := PosToNeg( ( 10 * GetDeviceCaps( hPrintDC, LOGPIXELSY ) ) / 72 )
  775.        aFont[1] := nPtSize
  776.        hFont2   := CreateFont( aFont )
  777.  
  778.        DialogBox( _GetInstance() , "statusbar", , ;
  779.                   {|hDlg, nMsg, nWparam, nLparam|;
  780.                   MPrint( hDlg, nMsg, nWparam, nLparam, hPrintDC, oB, hFont1, hFont2 ) } )
  781.  
  782.        // Clean up....
  783.  
  784.        DeleteObject( hFont1 )
  785.        DeleteObject( hFont2 )
  786.        DeleteDC(hPrintDC)
  787. RETURN( NIL )
  788.  
  789. STATIC FUNCTION MPrint( hDlgWnd, nMsg, nWparam, nLparam, hPrintDC, oB, hFont1, hFont2 )
  790.        STATIC hWnd, nRight, nBottom, hDC, hGBrush, lFirst, nCtr, lCancel
  791.        STATIC aCols[7], hBPen4, hBPen2
  792.        STATIC nWidth, nHeight, nPage, nTM, nTH, aTM, nBM
  793.        LOCAL aCrect, nEvent, nLM
  794.  
  795.        DO CASE
  796.           CASE nMsg == WM_INITDIALOG
  797.                SendMessage( hDlgWnd, WM_SETTEXT, 0 , "Printing" )
  798.                SetDlgItemText( hDlgWnd, 105, "Records Printed:")
  799.                CenterWindow( hDlgWnd )
  800.                hWnd     := GetDlgItem( hDlgWnd, 101 )
  801.                aCRect   := GetClientRect( hWnd )
  802.                nRight   := aCRect[ W_RIGHT ]
  803.                nBottom  := aCRect[ W_BOTTOM ]
  804.                hDC      := GetDC( hWnd )
  805.                hGBrush  := CreateSolidBrush( RGB( 0, 255, 0 ) )
  806.                hBPen2   := CreatePen(PS_SOLID,2,RGB(0,0,0))
  807.                hBPen4   := CreatePen(PS_SOLID,4,RGB(0,0,0))
  808.                nWidth   := GetDeviceCaps(hPrintDC, HORZRES)
  809.                nHeight  := GetDeviceCaps(hPrintDC, VERTRES)
  810.                lFirst   := .T.
  811.                lCancel  := .F.
  812.  
  813.                // Figure out how wide to make our columns
  814.  
  815.                SelectObject( hPrintDC, hFont2 )
  816.                aCols[1] := 0
  817.                aCols[2] := aCols[1] + C4W_LoWord(GetTextExtent(hPrintDC,"BBB0000W",8))
  818.                aCols[3] := aCols[2] + C4W_LoWord(GetTextExtent(hPrintDC,"WWWWWWWWWWWWWW",14))
  819.                aCols[4] := aCols[3] + C4W_LoWord(GetTextExtent(hPrintDC,"WWWWWWWWWWWW",12))
  820.                aCols[5] := aCols[4] + C4W_LoWord(GetTextExtent(hPrintDC,"00/00/00W",9))
  821.                aCols[6] := aCols[5] + C4W_LoWord(GetTextExtent(hPrintDC,"FemaleW",7))
  822.                aCols[7] := aCols[6] + C4W_LoWord(GetTextExtent(hPrintDC,"BlackW",6))
  823.  
  824.                // Center the report on the page
  825.  
  826.                nLM      := ( nWidth - aCols[7] ) / 2
  827.                FOR nCtr := 1 TO 7
  828.                    aCols[nCtr] += nLM
  829.                NEXT
  830.                nCtr     := 0
  831.                aTM      := {}
  832.                GetTextMetrics(hPrintDC,@aTM)
  833.                nTH     := aTM[ TM_Height ]
  834.                RETURN( 1 )
  835.  
  836.           CASE nMsg == WM_PAINT
  837.                IF lFirst
  838.                   lFirst := .F.
  839.                   PostMessage( hDlgWnd, WM_USER+1, 0, 0 )
  840.                ENDIF
  841.                RETURN( 0 )
  842.  
  843.           CASE nMsg == WM_COMMAND
  844.                IF nWparam == IDCANCEL
  845.                   lCancel := .T.
  846.                ENDIF
  847.                RETURN( 0 )
  848.  
  849.           CASE nMsg == WM_USER+1
  850.                SetFocus( GetDlgItem( hDlgWnd, 101) )
  851.                SetDlgItemText( hDlgWnd, 102, LTRIM( STR( CHILD->( LASTREC())  ) ) )
  852.                StatusBar( 0, CHILD->( LASTREC() ), hDlgWnd, nRight, nBottom, hDC, hGBrush, 0 )
  853.                nPage      := 1
  854.                nTM        := 200
  855.                nBM        := nTM + ( nTH + ( nTH / 2 ) )
  856.                DO WHILE .T.
  857.                   IF nBM + ( nTH + ( nTH /2 ) ) > nHeight - 200
  858.                      EXIT
  859.                   ENDIF
  860.                   nBM  += ( nTH + ( nTH /2 ) )
  861.                ENDDO
  862.                nBM  := C4W_Int( nBM - ( nTH /2 ) ) + 4
  863.                CHILD->(DBGOTOP())
  864.                StartDoc(hPrintDC, "Child List")
  865.                StartPage(hPrintDC)
  866.                Header( hPrintDC, hBPen4, hFont1, hFont2, nTM, nTH, nBM, nWidth, nPage, aCols )
  867.                nTM += nTH + ( nTH / 2 )
  868.                DO WHILE !EOF() .AND. !lCancel
  869.                   IF ( nEvent := ChkEvent() ) == EVENT_BUTTON
  870.                      HandleEvent( nEvent )
  871.                   ENDIF
  872.                   PrintLine( hPrintDC, nTM, aCols )
  873.                   nTM += nTH + ( nTH / 2 )
  874.                   CHILD->(DBSKIP( 1 ))
  875.                   StatusBar( ++nCtr,NIL, hDlgWnd, nRight, nBottom, hDC, hGBrush, nCtr )
  876.                   IF nTM > nBM
  877.                      EndPage(hPrintDC)
  878.                      StartPage(hPrintDC)
  879.                      nTM := 200
  880.                      ++nPage
  881.                      Header( hPrintDC, hBPen4, hFont1, hFont2, nTM, nTH, nBM, nWidth, nPage, aCols )
  882.                      nTM += nTH + ( nTH / 2 )
  883.                   ELSE
  884.                      SelectObject( hPrintDC, hBPen2 )
  885.                      MoveTo( hPrintDC, aCols[1] - 10, nTM - ( ( nTH / 4 ) + 4 ) )
  886.                      LineTo( hPrintDC, aCols[7], nTM - ( ( nTH /4 ) + 4 ) )
  887.                   ENDIF
  888.                ENDDO
  889.                EndPage(hPrintDC)
  890.                EndDoc(hPrintDC)
  891.                StatusBar( CHILD->(LASTREC()), CHILD->(LASTREC()), hDlgWnd, nRight, nBottom, hDC, hGBrush, 0 )
  892.                DeleteObject( hGBrush )
  893.                DeleteObject( hBPen2 )
  894.                DeleteObject( hBPen4 )
  895.                ReleaseDC( hWnd, hDC )
  896.                EndDialog( hDlgWnd, 0 )
  897.                RETURN( 1 )
  898.        ENDCASE
  899. RETURN( 0 )
  900.  
  901. STATIC FUNCTION Header( hPrintDC, hBPen, hFont1, hFont2, nTM, nTH, nBM, nWidth, nPage, aCols )
  902.        STATIC cPrinted
  903.        LOCAL nOldMode
  904.        LOCAL hBrush :=  GetStockObject( LTGRAY_BRUSH )
  905.  
  906.        FillRect(hPrintDC, aCols[1] - 10, nTM - 12, aCols[7], nTM+nTH, hBrush)
  907.  
  908.        IF nPage == 1
  909.           cPrinted := DTOC( DATE() ) + '-' + LEFT( TIME(), 5 )
  910.        ENDIF
  911.  
  912.        SelectObject( hPrintDC, hFont1 )
  913.        nOldMode := SetBkMode(hPrintDC, TRANSPARENT)
  914.        DrawText( hPrintDC, "Child List",;
  915.                 { 0, 60, nWidth, 180 }, DT_CENTER+DT_SINGLELINE )
  916.        SelectObject( hPrintDC, hFont2 )
  917.        TextOut( hPrintDC, aCols[1] + 12, nTM, "ID#" )
  918.        TextOut( hPrintDC, aCols[2] + 12, nTM, "LAST NAME" )
  919.        TextOut( hPrintDC, aCols[3] + 12, nTM, "FIRST NAME" )
  920.        TextOut( hPrintDC, aCols[4] + 12, nTM, "DOB" )
  921.        TextOut( hPrintDC, aCols[5] + 12, nTM, "SEX" )
  922.        TextOut( hPrintDC, aCols[6] + 12, nTM, "RACE" )
  923.        SelectObject( hPrintDC, hBPen )
  924.  
  925.        MoveTo( hPrintDC, aCols[1] - 10, nTM - 12 )
  926.        LineTo( hPrintDC, aCols[7], nTM - 12    )
  927.  
  928.        MoveTo( hPrintDC, aCols[1] - 10, nTM + nTH + 4 )
  929.        LineTo( hPrintDC, aCols[7], nTM + nTH + 4 )
  930.  
  931.        MoveTo( hPrintDC, aCols[1] - 10, nTM - 12 )
  932.        LineTo( hPrintDC, aCols[1] - 10, nBM )
  933.  
  934.        MoveTo( hPrintDC, aCols[2] - 10, nTM - 12 )
  935.        LineTo( hPrintDC, aCols[2] - 10, nBM )
  936.  
  937.        MoveTo( hPrintDC, aCols[3] - 10, nTM - 12 )
  938.        LineTo( hPrintDC, aCols[3] - 10, nBM )
  939.  
  940.        MoveTo( hPrintDC, aCols[4] - 10, nTM - 12 )
  941.        LineTo( hPrintDC, aCols[4] - 10, nBM )
  942.  
  943.        MoveTo( hPrintDC, aCols[5] - 10, nTM - 12 )
  944.        LineTo( hPrintDC, aCols[5] - 10, nBM )
  945.  
  946.        MoveTo( hPrintDC, aCols[6] - 10, nTM - 12 )
  947.        LineTo( hPrintDC, aCols[6] - 10, nBM )
  948.  
  949.        MoveTo( hPrintDC, aCols[7], nTM - 12 )
  950.        LineTo( hPrintDC, aCols[7], nBM )
  951.  
  952.        MoveTo( hPrintDC, aCols[1] - 10, nBM )
  953.        LineTo( hPrintDC, aCols[7], nBM )
  954.  
  955.        TextOut( hPrintDC, aCols[1] - 10, nBM + 10, "Page:  "+LTRIM(STR(nPage)) )
  956.        TextOut( hPrintDC, aCols[7] - C4W_LoWord(GetTextExtent(hPrintDC,cPrinted,LEN( cPrinted ))),;
  957.                 nBM + 10, cPrinted)
  958.  
  959.        SetBkMode(hPrintDC, nOldMode)
  960. RETURN( NIL )
  961.  
  962. STATIC FUNCTION PrintLine( hPrintDC, nTM, aCols )
  963.  
  964.        TextOut( hPrintDC, aCols[1] + 12, nTM, FIELD->CCODE )
  965.        TextOut( hPrintDC, aCols[2] + 12, nTM, FIELD->LAST_NAME )
  966.        TextOut( hPrintDC, aCols[3] + 12, nTM, FIELD->FIRST_NAME )
  967.        TextOut( hPrintDC, aCols[4] + 12, nTM, DTOC( FIELD->BIRTHDAY ) )
  968.        TextOut( hPrintDC, aCols[5] + 12, nTM, IIF( FIELD->SEX == 'M', "Male", "Female" ) )
  969.        TextOut( hPrintDC, aCols[6] + 12, nTM, IIF( FIELD->RACE == 'W', "White",;
  970.                                               IIF( FIELD->RACE == 'B', "Black", "Other" ) ) )
  971. RETURN( NIL )
  972.  
  973. STATIC FUNCTION StatusBar( nDone, nToDo, hWnd, nRight, nBottom, hDC, hBrush, nCopied )
  974.        STATIC nTotalSize
  975.        STATIC nPercent
  976.        LOCAL  nReplicate
  977.        LOCAL  cPercent
  978.  
  979.        IF nToDo != NIL
  980.           nTotalSize :=  nToDo
  981.           SetBkMode( hDC, 1 )
  982.           nPercent := 0
  983.        ENDIF
  984.        IF nDone <= nTotalSize
  985.           nReplicate := C4W_Int( ( nRight-2 ) * ( nDone / nTotalSize ) )
  986.           IF nReplicate == nPercent
  987.              RETURN(NIL)
  988.           ENDIF
  989.           nPercent := nReplicate
  990.           IF nCopied != NIL
  991.              SetDlgItemText( hWnd, 103, LTRIM( STR( nCopied ) ) )
  992.           ENDIF
  993.           cPercent := LTRIM( STR( C4W_Int( ( nDone / nTotalSize ) * 100 ) ) ) + '%'
  994.           FillRect( hDC, MAX(nReplicate,1), 1, nRight-1, nBottom - 1, GetStockObject( LTGRAY_BRUSH ) )
  995.           FillRect( hDC, 1, 1, MAX(nReplicate,1), nBottom - 1, hBrush )
  996.           DrawText( hDC,cPercent,{ 0, 2, nRight, nBottom},DT_SINGLELINE+DT_CENTER)
  997.        ENDIF
  998. RETURN( NIL )
  999.  
  1000. STATIC FUNCTION IsSelected( oB )
  1001.        LOCAL lSelected := BUTTONS->SELECTED
  1002.  
  1003.        IF lSelected
  1004.           lSelected := .F.
  1005.        ELSE
  1006.           lSelected := .T.
  1007.        ENDIF
  1008.        RLOCK()
  1009.        BUTTONS->SELECTED := lSelected
  1010.        DBRUNLOCK()
  1011.        DBCOMMIT()
  1012.        oB:refreshCurrent()
  1013. RETURN( NIL )
  1014.  
  1015. STATIC FUNCTION BHelp
  1016.  
  1017.        DialogBox(_GetInstance() , "buttons", ,;
  1018.                    {|hDlg, nMsg, nWparam, nLparam|;
  1019.                    MHello(hDlg, nMsg, nWparam, nLparam)})
  1020. RETURN(NIL)
  1021.  
  1022. STATIC FUNCTION MHello(hDlgWnd, nMsg, nWparam, nLparam)
  1023.  
  1024.        DO CASE
  1025.           CASE nMsg == WM_INITDIALOG
  1026.                CenterWindow(hDlgWnd)
  1027.                RETURN( 1 )
  1028.  
  1029.           CASE nMsg == WM_COMMAND
  1030.                DO CASE
  1031.                   CASE nWparam == IDOK .OR. nWparam == IDCANCEL .OR.;
  1032.                        nWparam == IDABOUT
  1033.                        EndDialog( hDlgWnd, IDOK )
  1034.                        RETURN( 1 )
  1035.                ENDCASE
  1036.       ENDCASE
  1037. RETURN( 0 )
  1038.  
  1039. STATIC FUNCTION ShowInfo( aInfo )
  1040.  
  1041.        DialogBox( _GetInstance() , "info", ,  ;
  1042.                  {|hDlg, nMsg, nWparam, nLparam|;
  1043.                  MInfo(hDlg, nMsg, nWparam, nLparam, aInfo )})
  1044. RETURN( NIL )
  1045.  
  1046. STATIC FUNCTION MInfo(hDlgWnd, nMsg, nWparam, nLparam, aInfo )
  1047.        LOCAL nCtr
  1048.  
  1049.        DO CASE
  1050.           CASE nMsg == WM_INITDIALOG
  1051.                CenterWindow(hDlgWnd)
  1052.                FOR nCtr := 1 TO 10
  1053.                    IF aInfo[ nCtr ]
  1054.                       EnableWindow( GetDlgItem( hDlgWnd, nCtr + 100 ), .T. )
  1055.                    ELSE
  1056.                       EnableWindow( GetDlgItem( hDlgWnd, nCtr + 100 ), .F. )
  1057.                    ENDIF
  1058.                    CheckDlgButton( hDlgWnd, nCtr + 100, IIF( aInfo[ nCtr ], 1, 0 ) )
  1059.                NEXT
  1060.                SetDlgItemText( hDlgWnd, 201, aInfo[ 11 ] )
  1061.                SendMessage( hDlgWnd, WM_SETTEXT, 0 , aInfo[ 12 ] )
  1062.                RETURN(1)
  1063.  
  1064.           CASE nMsg == WM_COMMAND
  1065.                DO CASE
  1066.                   CASE nWparam == IDOK
  1067.                        EndDialog(hDlgWnd,IDNO)
  1068.                        RETURN(1)
  1069.                ENDCASE
  1070.        ENDCASE
  1071. RETURN(0)
  1072.  
  1073. ///////////////////// Browses ///////////////////////////
  1074.  
  1075. STATIC FUNCTION Browse1
  1076.        LOCAL oB, aFlds, nCtr
  1077.  
  1078.        SELECT CHILD
  1079.        SET ORDER TO 2
  1080.        oB := WBrowse{hMainWnd,10,63,600,306,"Child List"}
  1081.        oB:colorspec    := {RGB(0,0,0),RGB(255,255,255),RGB(0,0,0),RGB(255,255,255)}
  1082.        oB:autolite     := .F.
  1083.        aFlds := LDBrowFlds()
  1084.        FOR nCtr := 1 TO LEN( aFlds )
  1085.            aFlds[ nCtr] [ 1] := STRTRAN( aFlds[ nCtr ][ 1 ],'_','')
  1086.            oB:addColumn( WBColumn{ aFlds[ nCtr ][ 1 ],&( aFlds[nCtr][2] ), aFlds[nCtr][3] } )
  1087.            oB:SetColCargo( nCtr, nCtr )
  1088.        NEXT
  1089.        oB:keyBlock     := {|oB, nMsg, nwParam, nlParam|CellEdit( oB, nMsg, nwParam, nlParam)}
  1090.        oB:destroyBlock := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
  1091.        oB:doubleClick  := oB:keyBlock
  1092.        oB:showNumbers  := .T.
  1093.        oB:nubWidth     := 30
  1094.        oB:BoxCursor    := .T.
  1095.        oB:colFont      :=  CreateFont(  aTFont )
  1096. oB:setColWidth( 1, 40 )
  1097.        oB:goTop()
  1098.        DoSubClBWA( oB:hWnd )
  1099. RETURN(NIL)
  1100.  
  1101. STATIC FUNCTION Browse2
  1102.        LOCAL aBArray := {}
  1103.        LOCAL oB
  1104.        LOCAL oCol
  1105.  
  1106.        SELECT CHILD
  1107.        SET ORDER TO 2
  1108.        GO TOP
  1109.        DO WHILE !EOF()
  1110.           AADD(aBArray,{LEFT(MakeName(),20),;
  1111.                         CHILD->TUITION     ,;
  1112.                         CHILD->DISCOUNT    ,;
  1113.                         CHILD->CCODE+'.TXT',;
  1114.                         RECNO()})
  1115.           SKIP
  1116.        ENDDO
  1117.        oB := WBrowse{ hMainWnd, 80, 60, 590, 304, "",  WS_POPUP + WS_BORDER }
  1118.  
  1119.        // --------- Column #1
  1120.        //
  1121.        oCol         := WBColumn{}
  1122.        oCol:heading := "NAME"
  1123.        oCol:block   := {||aBArray[oB:nCurRec][1]}
  1124.        oB:addColumn( oCol )
  1125.  
  1126.        // --------- Column #2
  1127.        //
  1128.        oCol         := WBColumn{}
  1129.        oCol:heading := {"TUITION","PER WEEK"}
  1130.        oCol:block   := {||aBArray[oB:nCurRec][2]}
  1131.        oCol:picture := "999.99"
  1132.        oB:addColumn( oCol )
  1133.  
  1134.        // --------- Column #3
  1135.        //
  1136.        oCol         := WBColumn{}
  1137.        oCol:heading := "DISCOUNT"
  1138.        oCol:block   := {||aBArray[oB:nCurRec][3]}
  1139.        oCol:picture := "99.99"
  1140.        oB:addColumn( oCol )
  1141.  
  1142.        // --------- Column #4
  1143.        //
  1144.        oCol         := WBColumn{}
  1145.        oCol:heading := "NOTES"
  1146.        oCol:block   := {||aBArray[oB:nCurRec][4]}
  1147.        oB:addColumn( oCol )
  1148.  
  1149.        oB:tbText        := "CHILD LIST"
  1150.        oB:tbAlign       :=  DT_CENTER
  1151.        oB:goTopBlock    := {|oB|AGoTop(oB, aBArray)}
  1152.        oB:goBottomBlock := {|oB|AGoBottom(oB, aBArray)}
  1153.        oB:skipBlock     := {|oB, nSkip|ASkipper(oB, nSkip, aBArray)}
  1154.        oB:scanBlock     := {|oB, cKey |AFindKey(oB, cKey, aBArray)}
  1155.        oB:doubleClick   := {|oB, nCrecNo, nMode|AEdit(oB,nCrecNo,nMode,aBArray)}
  1156.        oB:destroyBlock  := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
  1157.        oB:autoLite      := .F.
  1158.        oB:usermove      := .F.
  1159.        oB:sizeCursor    :=  LoadCursor( _GetInstance(), "SIZER" )
  1160.        oB:setHeadColor( 3, RGB(128,0,0) )
  1161.        CenterWindow(oB:hWnd)
  1162.        oB:goTop()
  1163.        CreateDialog(_GetInstance() , "calc", oB:hWnd ,  ;
  1164.                     {|hDlg, nMsg, nWparam, nLparam|;
  1165.                     MCalc( hDlg, nMsg, nWparam, nLparam, aBArray, oB )})
  1166.        SetFocus(oB:hWnd)
  1167. RETURN(NIL)
  1168.  
  1169. STATIC FUNCTION Browse3
  1170.        LOCAL  hWnd, hDC, aCrect, nCtr, oB, bFG, bBG, nTop, nBottom
  1171.  
  1172.        bFG := {||IIF(MONTH(CHILD->BIRTHDAY) == MONTH(DATE()),RGB(255,255,255),RGB(0,0,0))}
  1173.        bBG := {||IIF(MONTH(CHILD->BIRTHDAY) == MONTH(DATE()),RGB(128,0,0),RGB(255,255,255))}
  1174.  
  1175.        SELECT CHILD
  1176.        SET ORDER TO 2
  1177.        hWnd := CreateWindow("BLIST",       ; // window class
  1178.                             "Child List",;
  1179.                              WS_CAPTION +     ;
  1180.                              WS_SYSMENU +     ;
  1181.                              WS_THICKFRAME +  ;
  1182.                              WS_MAXIMIZEBOX + ;
  1183.                              WS_MINIMIZEBOX,  ;
  1184.                              CW_USEDEFAULT,   ; // x co-ordinate
  1185.                              CW_USEDEFAULT,   ; // y co-ordinate
  1186.                              498,             ; // width
  1187.                              276,             ; // height
  1188.                              hMainWnd,        ;
  1189.                              0,               ;
  1190.                              _GetInstance())             // our own app instance
  1191.         HideCaret(hWnd)
  1192.         ShowWindow( hWnd, SW_HIDE )
  1193.         CenterWindow( hWnd )
  1194.         ShowWindow( hWnd, SW_SHOW )
  1195.         aCrect           := GetClientRect( hWnd )
  1196.         nTop             := TextHeight( hWnd ) + 9
  1197.         nBottom          := aCrect[ W_BOTTOM ] - nTop
  1198.         oB               := WBrowse{hWnd,0,nTop,aCrect[ W_RIGHT ], nBottom,"",WS_CHILD+WS_BORDER}
  1199.         oB:alias         := "CHILD"
  1200.         oB:autolite      := .T.
  1201.         oB:showNumbers   := .T.
  1202.         oB:userSize      := .T.
  1203.         oB:autoSize      := .T.
  1204.         oB:escape        := .F.
  1205.         oB:doubleClick   := {|oB|AddKid( oB, 2 ) }
  1206.         oB:destroyBlock  := {||ShowWindow( hDemoWnd, SW_SHOW ), PostMessage( hDemoWnd, WM_USER+1, 0, 0 ) }
  1207.         oB:nubBlock      := {|| FIELD->CCODE }
  1208.         oB:nubHeading    := "ID#"
  1209.         oB:nubAlign      := DT_CENTER
  1210.         oB:nubColor      := RGB(0,0,128)
  1211.         oB:nubWidth      := 80
  1212.         oB:mimicButton   := .T.
  1213.         oB:addColumn(WBColumn{"LAST NAME" ,{||CHILD->LAST_NAME } } )
  1214.         oB:addColumn(WBColumn{"FIRST NAME",{||CHILD->FIRST_NAME} } )
  1215.         oB:addColumn(WBColumn{"DOB",      {||DTOC(CHILD->BIRTHDAY)}} )
  1216.         oB:addColumn(WBColumn{"SEX",       {||CHILD->SEX} } )
  1217.         oB:setColBitmap( 1, 901 , DT_RIGHT )
  1218.         oB:setHeadBlock( 1, {|nCol| FindKid( oB ), SetFocus( hWnd ) } )
  1219.         oB:setHeadColor( 0, RGB(0,0,128) )
  1220.         oB:tbText        := "CHILD LIST"
  1221.         oB:cargo         := DrawButtons( hWnd, ARRAY(14,3), oB, .F. )
  1222.         BDoSubCl( hWnd , oB )
  1223.         oB:goTop()
  1224. RETURN( NIL )
  1225.  
  1226. STATIC FUNCTION Browse4
  1227.        LOCAL  hWnd, hDC, aCrect, nCtr, oB, nTop, nBottom
  1228.  
  1229.        SELECT CHILD
  1230.        SET ORDER TO 2
  1231.        hWnd := CreateWindow("BLIST",          ;
  1232.                             "Child List",     ;
  1233.                              WS_CAPTION +     ;
  1234.                              WS_SYSMENU +     ;
  1235.                              WS_THICKFRAME +  ;
  1236.                              WS_MAXIMIZEBOX + ;
  1237.                              WS_MINIMIZEBOX,  ;
  1238.                              CW_USEDEFAULT,   ;
  1239.                              CW_USEDEFAULT,   ;
  1240.                              516,             ;
  1241.                              284,             ;
  1242.                              hMainWnd,        ;
  1243.                              0,               ;
  1244.                              _GetInstance())
  1245.         HideCaret(hWnd)
  1246.         ShowWindow( hWnd, SW_HIDE )
  1247.         CenterWindow( hWnd )
  1248.         ShowWindow( hWnd, SW_SHOW )
  1249.         aCrect           := GetClientRect( hWnd )
  1250.         nTop             := TextHeight( hWnd ) + 9
  1251.         nBottom          := aCrect[ W_BOTTOM ] - nTop
  1252.         oB               := WBrowse{hWnd, 0, nTop, aCrect[ W_RIGHT ], nBottom,"",WS_CHILD+WS_BORDER }
  1253.         oB:alias         := "CHILD"
  1254.         oB:autoLite      := .F.
  1255.         oB:showNumbers   := .T.
  1256.         oB:userSize      := .F.
  1257.         oB:autoSize      := .T.
  1258.         oB:escape        := .F.
  1259.         oB:doubleClick   := {|oB|AddKid( oB, 2 ) }
  1260.         oB:destroyBlock  := {||ShowWindow( hDemoWnd, SW_SHOW ), PostMessage( hDemoWnd, WM_USER+1, 0, 0 ) }
  1261.         oB:nubBlock      := {||FIELD->CCODE}
  1262.         oB:nubHeading    := NIL
  1263.         oB:nubAlign      := DT_CENTER
  1264.         oB:nubColor      := RGB(0,0,0)
  1265.         oB:nubWidth      := 80
  1266.         oB:nubhBitmap    := BCCODE
  1267.         oB:nubHBitAlign  := DT_CENTER
  1268.         oB:addColumn(WBColumn{"" ,{||CHILD->LAST_NAME+CHR(13)+CHR(10)+;
  1269.                                         TRIM(CHILD->FIRST_NAME )+" "+;
  1270.                                         IIF(!EMPTY(CHILD->MI), CHILD->MI+". ","")+;
  1271.                                         CHILD->JR_SR_III } } )
  1272.         oB:addColumn(WBColumn{"", {||DTOC(CHILD->BIRTHDAY )}})
  1273.         oB:addColumn(WBColumn{"", {||IIF(CHILD->SEX == 'M',"Male   ","Female")}})
  1274.         oB:setColBitMap( 0, BCCODE, DT_CENTER )
  1275.         oB:setColBitMap( 1, BNAME,  DT_CENTER )
  1276.         oB:setColBitMap( 2, BDOB,   DT_CENTER )
  1277.         oB:setColBitMap( 3, BSEX,   DT_CENTER )
  1278.         oB:headHeight := 50
  1279.         oB:goTop()
  1280.         oB:cargo      := DrawButtons( hWnd, ARRAY(14,3), oB, .T. )
  1281.         BDoSubCl( hWnd , oB )
  1282. RETURN( NIL )
  1283.  
  1284. STATIC FUNCTION Browse5
  1285.        LOCAL aFields := {{"",{||MakeName()},NIL,NIL,NIL,NIL,120}}
  1286.  
  1287.        SELECT CHILD
  1288.        GO TOP
  1289.        DialogBox( _GetInstance(), "box1", ,  ;
  1290.                  {|hDlg, nMsg, nWparam, nLparam|;
  1291.                   MFoo1( hDlg, nMsg, nWparam, nLparam, aFields )})
  1292. RETURN(NIL)
  1293.  
  1294. STATIC FUNCTION MFoo1( hDlgWnd, nMsg, nWparam, nLparam, aFields )
  1295.        STATIC hBrowWnd
  1296.        STATIC aBlks := {}
  1297.        STATIC aRace := {'W','B','O'}
  1298.        STATIC oB
  1299.        STATIC hList
  1300.        LOCAL nCtr
  1301.        LOCAL aRect
  1302.        LOCAL nTsize
  1303.  
  1304.        DO CASE
  1305.           CASE nMsg == WM_INITDIALOG
  1306.                CenterWindow(hDlgWnd)
  1307.                aBlks := {}
  1308.                AADD(aBlks,{||SetDlgItemText(hDlgWnd,101,CHILD->CCODE)})
  1309.                AADD(aBlks,{||SetDlgItemText(hDlgWnd,102,DTOC(CHILD->BIRTHDAY))})
  1310.                AADD(aBlks,{||SendMessage(hDlgWnd,WM_COMMAND,104+ASCAN(aRace,CHILD->RACE),0)})
  1311.                AADD(aBlks,{||SendMessage(hDlgWnd,WM_COMMAND,IIF(CHILD->SEX == 'M' , 103, 104),0)})
  1312.                hList := GetDlgItem( hDlgWnd, 999 )
  1313.                oB    := BListBox(hDlgWnd,;
  1314.                                hList,;
  1315.                                aFields  ,;
  1316.                                NIL      ,;
  1317.                                NIL      ,;
  1318.                                NIL      ,;
  1319.                                "CHILD"  ,;
  1320.                                NIL      ,;
  1321.                                aBlks, ;
  1322.                                .F. )
  1323.                AADD(aBlks,{||SetDlgItemText(hDlgWnd,108,LTRIM(STR(oB:nCurRec)))})
  1324.                oB:autosize := .F.
  1325.                oB:rowGrids := .F.
  1326.                oB:colGrids := .F.
  1327.                oB:setColWidth( 0, 0 )
  1328.                oB:tbHeight := 0
  1329.                aRect  := GetClientRect( hList )
  1330.                nTsize := TextHeight( hList )
  1331.                oB:SetColWidth( 1, ( aRect[ 3 ] - nTsize ) - 2  )
  1332.                oB:SetRowHeight( nTsize - 2 )
  1333.                oB:SetHeadHeight( 1, 0 )
  1334.                oB:goTop()
  1335.                RETURN(1)
  1336.  
  1337.           CASE nMsg == WM_COMMAND
  1338.                DO CASE
  1339.                   CASE nWparam == IDOK .OR. nWparam == IDCANCEL
  1340.                        EndDialog( hDlgWnd, IDOK )
  1341.                        ShowWindow( hDemoWnd, SW_SHOW )
  1342.                        SetFocus( hDemoWnd )
  1343.                        RETURN(1)
  1344.  
  1345.                   CASE nWparam >= 105 .AND. nWparam <= 107
  1346.                        FOR nCtr := 105 TO 107
  1347.                            CheckDlgButton( hDlgWnd, nCtr, 0 )
  1348.                        NEXT
  1349.                        CheckDlgButton( hDlgWnd, nWparam, 1)
  1350.                      * SetFocus( hList )
  1351.                        RETURN(1)
  1352.  
  1353.                   CASE nWparam >= 103 .AND. nWparam <= 104
  1354.                        FOR nCtr := 103 TO 104
  1355.                            CheckDlgButton( hDlgWnd, nCtr, 0 )
  1356.                        NEXT
  1357.                        CheckDlgButton( hDlgWnd, nWparam, 1 )
  1358.                       *SetFocus( hList )
  1359.                        RETURN(1)
  1360.                ENDCASE
  1361.        ENDCASE
  1362. RETURN(0)
  1363.  
  1364. STATIC FUNCTION Browse6
  1365.  
  1366.        SELECT BUTTONS
  1367.        GO TOP
  1368.        DialogBox( _GetInstance(), "box2", ,  ;
  1369.                  {|hDlg, nMsg, nWparam, nLparam|;
  1370.                   MFoo2( hDlg, nMsg, nWparam, nLparam )})
  1371.        ShowWindow( hDemoWnd, SW_SHOW )
  1372. RETURN(NIL)
  1373.  
  1374. STATIC FUNCTION MFoo2( hDlgWnd, nMsg, nWparam, nLparam )
  1375.        STATIC oB
  1376.        LOCAL nCtr, aFields[2]
  1377.  
  1378.        DO CASE
  1379.           CASE nMsg == WM_INITDIALOG
  1380.                aFields[1] := {"    USE    ",{||IIF(BUTTONS->SELECTED,OBM_CHECK,0)},,,,DT_CENTER}
  1381.                aFields[2] := {{"DESCRIPTION","#define"},{||BUTTONS->DESCRIPT+CHR(13)+CHR(10)+;
  1382.                              TRIM(BUTTONS->TEXTID)+" ("+ALLTRIM(STR(BUTTONS->ID-1000))+')'}}
  1383.                CenterWindow(hDlgWnd)
  1384.                oB := BlistBox(hDlgWnd,;
  1385.                               GetDlgItem(hDlgWnd,999),;
  1386.                               aFields  ,;
  1387.                               NIL      ,;
  1388.                               NIL      ,;
  1389.                               NIL      ,;
  1390.                               "BUTTONS",;
  1391.                               NIL      ,;
  1392.                               {}       ,;
  1393.                               .F.       )
  1394.                oB:saveColSize  := .T.
  1395.                oB:setColWidth( 1, 60 )
  1396.                oB:setColWidth( 2, 220 )
  1397.                oB:autolite     := .T.
  1398.                oB:showNumbers  := .T.
  1399.                oB:userSize     := .T.
  1400.                oB:userMove     := .F.
  1401.                oB:autoSize     := .T.
  1402.                oB:escape       := .F.
  1403.                oB:nubBlock     := {||FIELD->ID}
  1404.                oB:nubHeading   := NIL
  1405.                oB:nubAlign     := DT_CENTER
  1406.                oB:nubColor     := RGB(0,0,0)
  1407.                oB:nubWidth     := 60
  1408.                oB:nubClickBlock:= {|oB|IsSelected( oB )}
  1409.                oB:lineHeight   := 60
  1410.                oB:headHeight   := 60
  1411.                oB:mimicButton  := .T.
  1412.                oB:destroyBlock  := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
  1413.                oB:GoTop()
  1414.                RETURN(1)
  1415.  
  1416.           CASE nMsg == WM_COMMAND
  1417.                DO CASE
  1418.                   CASE nWparam == IDOK .OR. nWparam == IDCANCEL
  1419.                        EndDialog( hDlgWnd, IDOK )
  1420.                        RETURN(1)
  1421.  
  1422.                ENDCASE
  1423.        ENDCASE
  1424. RETURN(0)
  1425.  
  1426. STATIC FUNCTION Browse7
  1427.  
  1428.        SELECT CAL
  1429.        GO TOP
  1430.        DialogBox( _GetInstance(), "cal", ,  ;
  1431.                  {|hDlg, nMsg, nWparam, nLparam|;
  1432.                   MCal( hDlg, nMsg, nWparam, nLparam )})
  1433.        ShowWindow( hDemoWnd, SW_SHOW )
  1434. RETURN(NIL)
  1435.  
  1436. STATIC FUNCTION MCal( hDlgWnd, nMsg, nWparam, nLparam )
  1437.        STATIC oB, nYear, nMonth, aCal[6][7], aBlocks := {}
  1438.        LOCAL  dSdate, nCtr
  1439.  
  1440.        DO CASE
  1441.           CASE nMsg == WM_INITDIALOG
  1442.                CenterWindow( hDlgWnd )
  1443.                nYear  := YEAR( DATE() )
  1444.                nMonth := MONTH( DATE() )
  1445.                dSdate := CTOD( LTRIM( STR( nMonth ) )+'/01/'+STR( nYear, 4) )
  1446.                SetDlgItemText( hDlgWnd, 101, CMONTH( dSdate )+', '+STR(nYear,4))
  1447.                SetMonth( dSdate, aCal )
  1448.                oB := BlistBox(hDlgWnd,;
  1449.                               GetDlgItem(hDlgWnd,999),;
  1450.                               {},;
  1451.                               {|oB|AGoTop(oB, aCal)},;
  1452.                               {|oB|AGoBottom(oB, aCal)},;
  1453.                               {|oB,nSkip|ASkipper(oB, nSkip, aCal)},;
  1454.                               NIL      ,;
  1455.                               NIL      ,;
  1456.                               NIL      ,;
  1457.                               .F.)
  1458.  
  1459.                oB:SaveColSize := .T.
  1460.                oB:addColumn( WBColumn{"   SUN   ", {||aCal[oB:nCurRec][1]},,{||RGB(192,0,0)}  })
  1461.                oB:addColumn( WBColumn{"   MON   ", {||aCal[oB:nCurRec][2]},,{||RGB(0,0,0)}    })
  1462.                oB:addColumn( WBColumn{"   TUE   ", {||aCal[oB:nCurRec][3]},,{||RGB(0,0,0)}    })
  1463.                oB:addColumn( WBColumn{"   WED   ", {||aCal[oB:nCurRec][4]},,{||RGB(0,0,0)}    })
  1464.                oB:addColumn( WBColumn{"   THU   ", {||aCal[oB:nCurRec][5]},,{||RGB(0,0,0)}    })
  1465.                oB:addColumn( WBColumn{"   FRI   ", {||aCal[oB:nCurRec][6]},,{||RGB(0,0,0)}    })
  1466.                oB:addColumn( WBColumn{"   SAT   ", {||aCal[oB:nCurRec][7]},,{||RGB(192,0,0)}  })
  1467.                FOR nCtr := 1 TO 6
  1468.                   oB:SetColWidth( nCtr, 52 )
  1469.                NEXT
  1470.                oB:SetColWidth( 7, 51 )
  1471.                oB:SetHeadColor( 1, RGB(160,0,0) )
  1472.                oB:SetHeadColor( 7, RGB(180,0,0) )
  1473.                SetScrollRange(oB:hWnd,SB_VERT,0,0)
  1474.                oB:doubleClick   := {|oB|DailyLog( oB, nMonth, nYear, 2, hDlgWnd )}
  1475.                oB:destroyBlock  := {||ShowWindow( hDemoWnd, SW_SHOW ), SetFocus( hDemoWnd ) }
  1476.                oB:autoLite      := .F.
  1477.                oB:usermove      := .F.
  1478.                oB:userSize      := .F.
  1479.                oB:nubWidth      := 0
  1480.                oB:keyBlock      := {| oB, nMsg, nwParam, nlParam|PgUpDn( hDlgWnd, nMsg, nwParam, nlParam )}
  1481.                oB:goTop()
  1482.                GetToday( oB, aCal )
  1483.                oB:ShowData()
  1484.                oB:hitTop        := .T.
  1485.                oB:hitBottom     := .T.
  1486.                SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1487.                RETURN(0)
  1488.  
  1489.           CASE nMsg == WM_COMMAND
  1490.                DO CASE
  1491.                   CASE nWparam == 1
  1492.                        EVAL( oB:doubleClick, oB, nMonth, nYear )
  1493.                        SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1494.                        RETURN(1)
  1495.  
  1496.                   CASE nWparam == IDCANCEL
  1497.                        EndDialog( hDlgWnd, IDOK )
  1498.                        RETURN(1)
  1499.  
  1500.                   CASE nWparam == LARROW
  1501.                        IF nMonth > 1
  1502.                           --nMonth
  1503.                        ELSE
  1504.                           nMonth := 12
  1505.                           --nYear
  1506.                        ENDIF
  1507.                        dSdate := CTOD( LTRIM( STR( nMonth ) )+'/01/'+STR( nYear, 4) )
  1508.                        SetDlgItemText( hDlgWnd, 101, CMONTH( dSdate )+', '+STR(nYear,4))
  1509.                        SetMonth( dSdate, aCal )
  1510.                        oB:showData()
  1511.                        SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1512.                        RETURN(1)
  1513.  
  1514.                   CASE nWparam == RARROW
  1515.                        IF nMonth < 12
  1516.                           ++nMonth
  1517.                        ELSE
  1518.                           nMonth := 1
  1519.                           ++nYear
  1520.                        ENDIF
  1521.                        dSdate := CTOD( LTRIM( STR( nMonth ) )+'/01/'+STR( nYear, 4) )
  1522.                        SetDlgItemText( hDlgWnd, 101, CMONTH( dSdate )+', '+STR(nYear,4))
  1523.                        SetMonth( dSdate, aCal )
  1524.                        oB:showData()
  1525.                        SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1526.                        RETURN(1)
  1527.  
  1528.                   CASE nWparam == IDADD
  1529.                        DailyLog( oB, nMonth, nYear, 1 )
  1530.                        SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1531.                        RETURN(1)
  1532.  
  1533.                   CASE nWparam == IDEDIT
  1534.                        DailyLog( oB, nMonth, nYear, 2 )
  1535.                        SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1536.                        RETURN(1)
  1537.  
  1538.                   CASE nWparam == IDDEL
  1539.                        DailyLog( oB, nMonth, nYear, 3 )
  1540.                        SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1541.                        RETURN(1)
  1542.  
  1543.                ENDCASE
  1544.        ENDCASE
  1545. RETURN(0)
  1546.  
  1547. STATIC FUNCTION GetToday( oB, aCal )
  1548.        LOCAL nWeek, nDay, cToday
  1549.  
  1550.        cToday := ALLTRIM( STR( DAY( DATE() ) ) ) + CHR(13) + CHR(10)
  1551.        FOR nWeek := 1 TO 6
  1552.            FOR nDay := 1 TO 7
  1553.                IF ALLTRIM( aCal[ nWeek ][ nDay ] ) == cToday
  1554.                   oB:rowPos := nWeek
  1555.                   oB:colPos := nDay
  1556.                   EXIT
  1557.                ENDIF
  1558.            NEXT
  1559.        NEXT
  1560. RETURN( NIL )
  1561.  
  1562. STATIC FUNCTION SetMonth( dSdate, aCal )
  1563.        LOCAL nCtr, nCtr2
  1564.        LOCAL nStart, nEnd, nDay1
  1565.  
  1566.        nDay1 := DOW( dSdate )
  1567.  
  1568.        DO CASE
  1569.           CASE MONTH( dSdate ) == MONTH( dSdate + 30 )
  1570.                nEnd := 31
  1571.           CASE MONTH( dSdate ) == MONTH( dSdate + 29 )
  1572.                nEnd := 30
  1573.           CASE MONTH( dSdate ) == MONTH( dSdate + 28 )
  1574.                nEnd := 29
  1575.           OTHERWISE
  1576.                nEnd := 28
  1577.        ENDCASE
  1578.        nStart := 1
  1579.        FOR nCtr := 1 TO 7
  1580.            IF nCtr < nDay1
  1581.               aCal[1][nCtr] := ""
  1582.            ELSE
  1583.               aCal[1][nCtr] := LTRIM(STR(nStart++))+CHR(13)+CHR(10)
  1584.            ENDIF
  1585.        NEXT
  1586.        FOR nCtr := 2 TO 6
  1587.            FOR nCtr2 := 1 TO 7
  1588.                IF nStart <= nEnd
  1589.                   aCal[nCtr][nCtr2] := LTRIM(STR(nStart++))+CHR(13)+CHR(10)
  1590.                ELSE
  1591.                   aCal[nCtr][nCtr2] := ""
  1592.                ENDIF
  1593.            NEXT
  1594.        NEXT
  1595. RETURN(NIL)
  1596.  
  1597. STATIC FUNCTION DailyLog( oB, nMonth, nYear, nMode, hDlgWnd )
  1598.        LOCAL aData := oB:getCellData()
  1599.        LOCAL cDate
  1600.        LOCAL dTemp
  1601.  
  1602.        IF EMPTY( aData[1] )
  1603.           MessageBeep(MB_ICONEXCLAMATION)
  1604.           RETURN(NIL)
  1605.        ENDIF
  1606.        aData[1] := ALLTRIM(STRTRAN( aData[1], CHR(13)+CHR(10)))
  1607.        dTemp    := CTOD( LTRIM( STR( nMonth ) ) +'/'+aData[1]+'/'+STR(nYear,4) )
  1608.        cDate    := DTOS( dTemp )
  1609.  
  1610.        SEEK cDate
  1611.        DO CASE
  1612.           CASE nMode == 1  // Add
  1613.  
  1614.           CASE nMode == 2  // Edit
  1615.                IF !FOUND()
  1616.                   Errormsg(hMainWnd,"No notes for selected date...",'E')
  1617.                   SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1618.                   RETURN( NIL )
  1619.                ENDIF
  1620.  
  1621.           CASE nMode == 3  // Delete
  1622.               IF FOUND()
  1623.                  DELETE
  1624.               ELSE
  1625.                  Errormsg(hMainWnd,"No notes for selected date...",'E')
  1626.                  SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1627.               ENDIF
  1628.               RETURN( NIL )
  1629.        ENDCASE
  1630.  
  1631.        DialogBox(_GetInstance() , "notes", , ;
  1632.                  {|hDlg, nMsg, nWparam, nLparam|;
  1633.                   MCNotes( hDlg, nMsg, nWparam, nLparam, dTemp, nMode )})
  1634. RETURN(NIL)
  1635.  
  1636. STATIC FUNCTION MCNotes(hDlgWnd, nMsg, nWparam, nLparam, dTemp, nMode )
  1637.  
  1638.        DO CASE
  1639.           CASE nMsg == WM_INITDIALOG
  1640.                SendMessage( hDlgWnd, WM_SETTEXT, 0, "NOTES:  "+DTOC( dTemp ) )
  1641.                SetDlgItemText( hDlgWnd, 101, LEFT(CAL->NOTES,1400) )
  1642.                CenterWindow( hDlgWnd )
  1643.                RETURN(1)
  1644.  
  1645.           CASE nMsg == WM_COMMAND
  1646.                DO CASE
  1647.                   CASE nWparam == IDOK
  1648.                        IF nMode == 1
  1649.                           IF !FOUND()
  1650.                              APPEND BLANK
  1651.                              CAL->DATE  := dTemp
  1652.                           ENDIF
  1653.                        ENDIF
  1654.                        CAL->NOTES := LEFT( GetDlgItmText( hDlgWnd, 101), 1400)
  1655.                        EndDialog( hDlgWnd, IDOK )
  1656.                        RETURN(1)
  1657.  
  1658.                   CASE nWparam == IDCANCEL
  1659.                        EndDialog( hDlgWnd, IDCANCEL )
  1660.                        RETURN(1)
  1661.                ENDCASE
  1662.        ENDCASE
  1663. RETURN(0)
  1664.  
  1665. STATIC FUNCTION PgUpDn( hDlgWnd, nMsg, nwParam, nlParam )
  1666.  
  1667.        IF nwParam == VK_PRIOR
  1668.           PostMessage( hDlgWnd, WM_COMMAND, LARROW, 0 )
  1669.           RETURN( .T. )
  1670.        ENDIF
  1671.        IF nwParam == VK_NEXT
  1672.           PostMessage( hDlgWnd, WM_COMMAND, RARROW, 0 )
  1673.           RETURN( .T. )
  1674.        ENDIF
  1675. RETURN( .F. )
  1676.  
  1677. STATIC FUNCTION GetSysMenu( hWnd, lRevert )
  1678.        LOCAL cGSM
  1679.        LOCAL hMenu
  1680.        LOCAL hLib
  1681.  
  1682.        hLib := LoadLibrary( "USER.EXE" )
  1683.        cGSM := GetProcAddress( hLib, "GetSystemMenu", ;
  1684.                                "Pascal", "int", "HWND, BOOL" )
  1685.        lRevert := IIF( lRevert != NIL, lRevert, .F. )
  1686.        hMenu := CallDLL(cGSM, hWnd, lRevert )
  1687.        FreeLibrary( hLib )
  1688. RETURN( hMenu )
  1689.  
  1690. STATIC FUNCTION SetSysMenu( hMenu, nFlags, nIdNo, cText, nPosition )
  1691.        LOCAL hLib
  1692.        LOCAL cSSM
  1693.  
  1694.        hLib  := LoadLibrary( "USER.EXE" )
  1695.        IF nPosition == NIL
  1696.           cSSM  := GetProcAddress( hLib, "AppendMenu", ;
  1697.                                    "Pascal", "int", "int, int, int, string" )
  1698.           CallDLL( cSSM, hMenu, nFlags, nIdNo, cText )
  1699.        ELSE
  1700.           cSSM  := GetProcAddress( hLib, "InsertMenu", ;
  1701.                                    "Pascal", "int", "int, int, int, int, string" )
  1702.           CallDLL( cSSM, hMenu, nPosition, nFlags, nIdNo, cText )
  1703.        ENDIF
  1704. RETURN( NIL )
  1705.  
  1706. STATIC FUNCTION DemoDlg
  1707.        LOCAL nAnswer
  1708.  
  1709.        nAnswer := CreateDialog(_GetInstance() , "demo",,  ;
  1710.                             {|hDlg, nMsg, nWparam, nLparam|;
  1711.                             MBoo(hDlg, nMsg, nWparam, nLparam)})
  1712. RETURN(nAnswer)
  1713.  
  1714. STATIC FUNCTION MBoo(hDlgWnd, nMsg, nWparam, nLparam)
  1715.        LOCAL cDemo, cTemp
  1716.  
  1717.        DO CASE
  1718.           CASE nMsg == WM_INITDIALOG
  1719.                hDemoWnd := hDlgWnd
  1720.                SendMessage( hDlgWnd, WM_SETTEXT, 0, "WBrowse(T) Version 3.00 Demo" )
  1721.                SetSysMenu( GetSysMenu( hDlgWnd, .F. ), MF_SEPARATOR, -1, CHR(0) )
  1722.                SetSysMenu( GetSysMenu( hDlgWnd, .F. ), MF_STRING, 999, "About"+CHR(0) )
  1723.                SetDDList( GetDlgItem( hDlgWnd, 101 ) )
  1724.                CenterWindow(hDlgWnd)
  1725.                SetFocus( hDlgWnd )
  1726.                RETURN(1)
  1727.  
  1728.           CASE nMsg == WM_COMMAND
  1729.                DO CASE
  1730.                   CASE nWparam == IDEXIT .OR. nWparam == IDCANCEL
  1731.                        DestroyWindow( hDlgWnd )
  1732.                        PgmExit()
  1733.                        RETURN(1)
  1734.  
  1735.                   CASE nWparam == IDHELPB
  1736.                        WinHelp(hMainWnd,"WBROWSES.HLP",HELP_INDEX,0)
  1737.  
  1738.                   CASE nWparam == IDRUN
  1739.                        cDemo := GetDlgItmText(  hDlgWnd, 101  )
  1740.                        IF EMPTY( cDemo )
  1741.                           MessageBox( hDlgWnd, "NO DEMO SELECTED!", "OOPS!")
  1742.                        ELSE
  1743.                           cDemo := LEFT( cDemo, 1 )
  1744.                           ShowWindow( hDlgWnd, SW_HIDE )
  1745.                           DO CASE
  1746.                              CASE  cDemo == '1'
  1747.                                    Browse1()
  1748.                              CASE  cDemo == '2'
  1749.                                    Browse2()
  1750.                              CASE  cDemo == '3'
  1751.                                    Browse3()
  1752.                              CASE  cDemo == '4'
  1753.                                    Browse4()
  1754.                              CASE  cDemo == '5'
  1755.                                    Browse5()
  1756.                              CASE  cDemo == '6'
  1757.                                    Browse6()
  1758.                              CASE  cDemo == '7'
  1759.                                    Browse7()
  1760.                              CASE  cDemo == '8'
  1761.                                    Browse8()
  1762.                              CASE  cDemo == '9'
  1763.                                    Browse9()
  1764.                           ENDCASE
  1765.                         ENDIF
  1766.                        RETURN(1)
  1767.                ENDCASE
  1768.  
  1769.        CASE nMsg == WM_USER+1
  1770.             SetFocus( hDlgWnd )
  1771.             RETURN( 1 )
  1772.        CASE nMsg == WM_SYSCOMMAND
  1773.             IF nWparam == IDABOUT
  1774.                ShowWindow( hDlgWnd, SW_HIDE)
  1775.                About()
  1776.                ShowWindow( hDlgWnd, SW_SHOW)
  1777.             ENDIF
  1778.        ENDCASE
  1779. RETURN(0)
  1780.  
  1781. STATIC FUNCTION SetDDList( hWnd )
  1782.        LOCAL nCtr, nItem
  1783.        LOCAL aDemos := { "1 - Spreadsheet Style",;
  1784.                          "2 - Array Browse",;
  1785.                          "3 - Browse With Toolbar",;
  1786.                          "4 - Browse With Bitmaps",;
  1787.                          "5 - BListBox()",;
  1788.                          "6 - BListBox() With Bitmaps",;
  1789.                          "7 - BListBox() - Calendar!",;
  1790.                          "8 - BListBox() - 3D",;
  1791.                          "9 - Parent/Child Browses"}
  1792.  
  1793.  
  1794.        FOR nCtr := 1 TO 9
  1795.            SendMessage(hWnd, CB_ADDSTRING, 0, aDemos[nCtr])
  1796.        NEXT
  1797.        SendMessage(hWnd, CB_SELECTSTRING, -1, "1")
  1798. RETURN(NIL)
  1799.  
  1800. STATIC FUNCTION AEdit( oB, nRecNo, nMode, aArray )
  1801.        LOCAL xData, cPicture
  1802.        LOCAL nResults := 0
  1803.  
  1804.        DO CASE
  1805.           CASE oB:colPos == 1
  1806.                ErrorMsg( hMainWnd, "NAME CANNOT BE EDITED!", 'E' )
  1807.                RETURN( .F. )
  1808.  
  1809.           CASE oB:colPos == 2
  1810.                   xData    := aArray[oB:nCurRec][2]
  1811.                   cPicture := "999.99"
  1812.                   nResults := DialogBox( _GetInstance() , "ratecode", oB:hWnd, ;
  1813.                                  {|hDlg, nMsg, nWparam, nLparam|;
  1814.                                  MAEdit( hDlg, nMsg, nWparam, nLparam, oB, @xData, cPicture ) })
  1815.           CASE oB:colPos == 3
  1816.                   xData    := aArray[oB:nCurRec][3]
  1817.                   cPicture := "999.99"
  1818.                   nResults := DialogBox( _GetInstance() , "discount", oB:hWnd, ;
  1819.                                  {|hDlg, nMsg, nWparam, nLparam|;
  1820.                                  MAEdit( hDlg, nMsg, nWparam, nLparam, oB, @xData, cPicture ) })
  1821.           CASE oB:colPos == 4
  1822.                MemoEdit2( oB, aArray )
  1823.        ENDCASE
  1824.  
  1825.        IF nResults == IDOK
  1826.           SetFocus( oB:hWnd )
  1827.           DO CASE
  1828.              CASE oB:colPos == 2
  1829.                   aArray[oB:nCurRec][2] := xData
  1830.              CASE oB:colPos == 3
  1831.                   aArray[oB:nCurRec][3] := xData
  1832.           ENDCASE
  1833.        ENDIF
  1834.        IF oB:colPos != 4
  1835.           oB:refreshCurrent()
  1836.           SetFocus( oB:hWnd )
  1837.        ENDIF
  1838. RETURN(NIL)
  1839.  
  1840. STATIC FUNCTION MemoEdit2( oB, aArray )
  1841.        LOCAL nFp1, cBuffer
  1842.  
  1843.        IF !FILE( aArray[oB:nCurRec][4] )
  1844.           nFp1    := FCREATE( aArray[oB:nCurRec][4] )
  1845.           cBuffer := "NOTES:  "+aArray[oB:nCurRec ][1]
  1846.           FWRITE( nFp1, cBuffer, LEN(cBuffer) )
  1847.           FCLOSE( nFp1 )
  1848.        ENDIF
  1849.        SelectWindow( oB:hWnd )
  1850.        WINEXEC( "NOTEPAD.EXE "+aArray[oB:nCurRec][4] )
  1851. RETURN(NIL)
  1852.  
  1853. STATIC FUNCTION MAEdit( hDlgWnd, nMsg, nWparam, nLparam, oB, xData, cPicture, nwParamb, nlParamb, xKeyVal, nField )
  1854.        STATIC GetList := {}
  1855.        DO CASE
  1856.           CASE nMsg == WM_INITDIALOG
  1857.                GetList := {}
  1858.                @ DIALOG hDlgWnd ID 101 GET xData PICTURE cPicture
  1859.                CenterWindow( hDlgWnd )
  1860.                RETURN(1)
  1861.  
  1862.           CASE nMsg == WM_COMMAND
  1863.                DO CASE
  1864.                   CASE nWparam == IDOK
  1865.                        IsDialogOk( hDlgWnd, 101 )
  1866.                        xData:= GetList[1]:VarGet()
  1867.                        EndDialog( hDlgWnd, IDOK )
  1868.                        RETURN(1)
  1869.  
  1870.                   CASE nWparam == IDCANCEL
  1871.                        CANCEL DIALOG hDlgWnd
  1872.                        EndDialog( hDlgWnd, IDCANCEL )
  1873.                        RETURN(1)
  1874.               ENDCASE
  1875.         ENDCASE
  1876. RETURN(0)
  1877.  
  1878. STATIC FUNCTION DelKid( oB )
  1879.  
  1880.        IF MessageBox( hMainWnd, "Delete Selected Record?",;
  1881.                       "Delete?", MB_YESNO+MB_ICONQUESTION ) == IDYES
  1882.           DELETE
  1883.           oB:refreshAll()
  1884.        ENDIF
  1885. RETURN( NIL )
  1886.  
  1887. STATIC FUNCTION Browse8
  1888.  
  1889.        SELECT CHILD
  1890.        SET ORDER TO 2
  1891.        GO TOP
  1892.        DialogBox( _GetInstance(), "SET3D", ,  ;
  1893.                  {|hDlg, nMsg, nWparam, nLparam|;
  1894.                   M3D( hDlg, nMsg, nWparam, nLparam )})
  1895.        ShowWindow( hDemoWnd, SW_SHOW )
  1896. RETURN(NIL)
  1897.  
  1898. STATIC FUNCTION M3D( hDlgWnd, nMsg, nWparam, nLparam )
  1899.        STATIC oB
  1900.  
  1901.        DO CASE
  1902.           CASE nMsg == WM_INITDIALOG
  1903.                CenterWindow( hDlgWnd )
  1904.                oB := BlistBox(hDlgWnd,;
  1905.                               GetDlgItem(hDlgWnd,999),;
  1906.                               {},;
  1907.                               NIL,;
  1908.                               NIL,;
  1909.                               NIL,;
  1910.                               "CHILD",;
  1911.                               NIL ,;
  1912.                               NIL ,;
  1913.                               .F.)
  1914.  
  1915.               oB:autolite      := .T.
  1916.               oB:showNumbers   := .T.
  1917.               oB:userMove      := .T.
  1918.               oB:doubleClick   := {|oB|AddKid( oB, 2 ) }
  1919.               oB:nubBlock      := {|| FIELD->CCODE }
  1920.               oB:nubHeading    := "ID#"
  1921.               oB:nubAlign      := DT_CENTER
  1922.               oB:nubColor      := RGB(0,0,128)
  1923.               oB:nubWidth      := 80
  1924.               oB:mimicButton   := .T.
  1925.               oB:addColumn(WBColumn{"LAST NAME" ,{||CHILD->LAST_NAME } } )
  1926.               oB:addColumn(WBColumn{"FIRST NAME",{||CHILD->FIRST_NAME} } )
  1927.               oB:addColumn(WBColumn{"DOB",       {||DTOC(CHILD->BIRTHDAY)},NIL,NIL,NIL,DT_CENTER } )
  1928.               oB:addColumn(WBColumn{"SEX",       {||IIF(CHILD->SEX == 'M',"Male  ","Female")} } )
  1929.               oB:SetColWidth( 1, 120 )
  1930.               oB:SetColWidth( 2, 120 )
  1931.               oB:SetColWidth( 3, 80 )
  1932.               oB:SetColWidth( 4, 80 )
  1933.               oB:autosize := .F.
  1934.               oB:SetColBitmap( 1, 901 , DT_RIGHT )
  1935.               oB:SetHeadBlock( 1, {|nCol| FindKid( oB ), SetFocus( hDlgWnd ) } )
  1936.               oB:make3D := .T.
  1937.               oB:ColGrids := .F.
  1938.               oB:RowGrids := .F.
  1939.               oB:tbText :=  "CHILD LIST"
  1940.               oB:goTop()
  1941.               SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1942.               RETURN(0)
  1943.  
  1944.           CASE nMsg == WM_COMMAND
  1945.                SetFocus( GetDlgItem( hDlgWnd, 999 ) )
  1946.                DO CASE
  1947.                   CASE nwParam == IDEXITS
  1948.                        EndDialog( hDlgWnd, 0 )
  1949.                   CASE nwParam == IDTOPS
  1950.                        oB:goTop()
  1951.                   CASE nwParam == IDBOTTOMS
  1952.                        oB:goBottom()
  1953.                   CASE nwParam == IDPGDNS
  1954.                        oB:pageDown()
  1955.                   CASE nwParam == IDPGUPS
  1956.                        oB:pageUp()
  1957.               ENDCASE
  1958.               RETURN( 1 )
  1959.        ENDCASE
  1960. RETURN(0)
  1961.  
  1962. STATIC FUNCTION Browse9
  1963.  
  1964.        SELECT CHILD
  1965.        SET ORDER TO 2
  1966.        GO TOP
  1967.        DialogBox( _GetInstance(), "attend", ,  ;
  1968.                  {|hDlg, nMsg, nWparam, nLparam|;
  1969.                   MBrowse9( hDlg, nMsg, nWparam, nLparam )})
  1970.        ShowWindow( hDemoWnd, SW_SHOW )
  1971. RETURN(NIL)
  1972.  
  1973. STATIC FUNCTION MBrowse9( hDlgWnd, nMsg, nWparam, nLparam )
  1974.        STATIC oB1, oB2, bSBlock
  1975.        LOCAL hFont
  1976.  
  1977.        DO CASE
  1978.           CASE nMsg == WM_INITDIALOG
  1979.                hFont := SendMessage( hDlgWnd, WM_GETFONT, 0, 0 )
  1980.                CenterWindow( hDlgWnd )
  1981.                oB1 := BlistBox(hDlgWnd,;
  1982.                               GetDlgItem(hDlgWnd,101),;
  1983.                               {},;
  1984.                               NIL,;
  1985.                               NIL,;
  1986.                               NIL,;
  1987.                               "CHILD",;
  1988.                               NIL ,;
  1989.                               NIL ,;
  1990.                               .F.)
  1991.  
  1992.                oB1:colFont       := hFont
  1993.                oB1:autolite      := .F.
  1994.                oB1:showNumbers   := .T.
  1995.                oB1:nubBlock      := {|| RIGHT( FIELD->CCODE, 4 ) }
  1996.                oB1:nubHeading    := "ID#"
  1997.                oB1:nubAlign      := DT_CENTER
  1998.                oB1:nubWidth      := 50
  1999.                oB1:showFocus     := .T.
  2000.                oB1:saveColSize   := .T.
  2001.                oB1:selectBlock   := {||oB2:hitTop := .F., oB2:goTop()}
  2002.                oB1:addColumn(WBColumn{"NAME" ,{||CHILD->( MakeName() )} } )
  2003.                oB1:SetColWidth( 1, 137 )
  2004.                oB2 := BlistBox(hDlgWnd,;
  2005.                               GetDlgItem(hDlgWnd,102),;
  2006.                               {},;
  2007.                               NIL,;
  2008.                               NIL,;
  2009.                               NIL,;
  2010.                               "ATTEND",;
  2011.                               NIL ,;
  2012.                               NIL ,;
  2013.                               .F.)
  2014.  
  2015.                oB2:colFont       := hFont
  2016.                oB2:autolite      := .T.
  2017.                oB2:showNumbers   := .T.
  2018.                oB2:nubBlock      := oB1:nubBlock
  2019.                oB2:nubHeading    := "ID#"
  2020.                oB2:nubAlign      := DT_CENTER
  2021.                oB2:nubWidth      := 50
  2022.                oB2:showFocus     := .T.
  2023.                oB2:addColumn(WBColumn{"Date In",;
  2024.                                       {||DTOC(ATTEND->DATE_IN)},,,,DT_CENTER } )
  2025.                oB2:addColumn(WBColumn{"Time In" ,;
  2026.                                       {||ATTEND->TIME_IN},,,,DT_CENTER } )
  2027.                oB2:addColumn(WBColumn{"Date Out" ,;
  2028.                                       {||DTOC(ATTEND->DATE_OUT)},,,,DT_CENTER } )
  2029.                oB2:addColumn(WBColumn{"Time Out",;
  2030.                                       {||ATTEND->TIME_OUT},,,,DT_CENTER } )
  2031.  
  2032.                bSBlock           := {||ATTEND->CCODE}
  2033.                oB2:goTopBlock    := {|oB|FindFirst( oB, CHILD->CCODE, "ATTEND" )}
  2034.                oB2:goBottomBlock := {|oB|FindLast( oB,;
  2035.                                                    bSBlock,;
  2036.                                                    CHILD->CCODE, "ATTEND", .F. )}
  2037.                oB2:skipBlock     := {|oB,nSkip|SkipFor( oB,;
  2038.                                                         nSkip,;
  2039.                                                         bSBlock,;
  2040.                                                         CHILD->CCODE,;
  2041.                                                         "ATTEND",;
  2042.                                                         .F. ) }
  2043.  
  2044.  
  2045.  
  2046.                oB1:goTop()
  2047.                oB2:goTop()
  2048.  
  2049.           CASE nMsg == WM_SYSCOMMAND
  2050.                IF nWparam == SC_CLOSE
  2051.                   EndDialog( hDlgWnd, nWparam )
  2052.                ENDIF
  2053.           CASE nMsg == WM_COMMAND
  2054.                IF nWparam == IDOK
  2055.                   EndDialog( hDlgWnd, nWparam )
  2056.                ENDIF
  2057.        ENDCASE
  2058. RETURN(0)
  2059.  
  2060. // Compile(cStr)
  2061. // Takes a string and returns a codeblock - runtime compiler
  2062. // Might as well make use of it since the Clipper compiler
  2063. // is always linked into your Clipper apps!
  2064. //
  2065. STATIC FUNCTION Compile(cStr)
  2066. RETURN(&("{||"+cStr+"}"))
  2067.  
  2068. // ErrorMsg(hWnd,cMarr,cType)
  2069. // General purpose error message handler
  2070. // Uses MessageBox() so if the user decides to move it the window
  2071. // underneath will NOT be automatically redrawn - You could always
  2072. // use a dialog box but the size would be fixed...
  2073. //
  2074. STATIC FUNCTION ErrorMsg(hWnd,cMarr,cType)
  2075.        LOCAL nResponse
  2076.  
  2077.        DO CASE
  2078.           CASE cType = 'W'
  2079.                MessageBeep(MB_ICONEXCLAMATION)
  2080.                nResponse := MessageBox(hWnd,cMarr,"Caution!",;
  2081.                             MB_OKCANCEL+MB_ICONEXCLAMATION)
  2082.           CASE cType = 'E'
  2083.                MessageBeep(MB_ICONHAND)
  2084.                nResponse := MessageBox(hWnd,cMarr,"Problem!",;
  2085.                             MB_OK+MB_ICONHAND)
  2086.           OTHERWISE
  2087.                MessageBeep(MB_OK)
  2088.                nResponse := MessageBox(hWnd,cMarr,"Please!",;
  2089.                             MB_OKCANCEL+MB_ICONASTERISK)
  2090.        ENDCASE
  2091. RETURN(nResponse)
  2092.  
  2093. // NegToPos(nValue)
  2094. // Converts a negative numeric value to a positive one
  2095. // Maybe not the most elegant way but it works!
  2096. //
  2097. STATIC FUNCTION NegToPos(nValue)
  2098. RETURN(VAL(STRTRAN(STR(nValue),'-')))
  2099.  
  2100. // PosToNeg(nValue)
  2101. // Converts a positive numeric value to a negative one
  2102. // Maybe not the best way to do it but it works!
  2103. //
  2104. STATIC FUNCTION PosToNeg(nValue)
  2105. RETURN(VAL('-'+LTRIM(STR(nValue))))
  2106.  
  2107. // CenterWindow() - Courtesy of Gerald Barber
  2108. // Centers a window in it's parent windows client area
  2109. // Written by Gerald Barber - thanks Gerald!
  2110. //
  2111. STATIC FUNCTION CenterWindow(hWnd)
  2112.        LOCAL hWndParent
  2113.        LOCAL aChild_[4]
  2114.        LOCAL iCWidth
  2115.        LOCAL iCHeight
  2116.        LOCAL aParent_[4]
  2117.        LOCAL aPoint_[2]
  2118.  
  2119.        aChild_    := GetWindowRect(hWnd)
  2120.        iCWidth    := aChild_[3] - aChild_[1]
  2121.        iCHeight   := aChild_[4] - aChild_[2]
  2122.        hWndParent := GetWindow(hWnd,GW_OWNER)
  2123.        aParent_   := GetClientRect(hWndParent)
  2124.        aPoint_    := {(aParent_[3]/2),(aParent_[4]/2)}
  2125.        ClienttoScreen(hWndParent,aPoint_)
  2126.        aPoint_[1] -= (iCWidth  / 2)
  2127.        aPoint_[2] -= (iCHeight / 2)
  2128.        ScreentoClient(hWndParent,aPoint_)
  2129.        aPoint_[1] := max(0, aPoint_[1])
  2130.        aPoint_[2] := max(0, aPoint_[2])
  2131.        ClienttoScreen(hWndParent,aPoint_)
  2132.        MoveWindow(hWnd,aPoint_[1],aPoint_[2],iCWidth,iCHeight,.F.)
  2133. RETURN(NIL)
  2134.  
  2135. STATIC FUNCTION GetWindowRect(hWnd)
  2136.        LOCAL cGWR
  2137.        LOCAL cBuf := SPACE(8)
  2138.        LOCAL hLib := LoadLibrary("USER.EXE")
  2139.  
  2140.        cGWR := GetProcAddress(hLib, "GetWindowRect", ;
  2141.                               "Pascal", "void", "HWND, string")
  2142.        CallDLL(cGWR, hWnd, @cBuf)
  2143.        FreeLibrary(hLib)
  2144. RETURN( BIN2A(cBuf, "int[4]") )
  2145.  
  2146. STATIC FUNCTION TextHeight
  2147.        LOCAL aTM := {}
  2148.        LOCAL hDC := GetDC(hMainWnd)
  2149.  
  2150.        GetTextMetrics(hDC,@aTM)
  2151.        ReleaseDC(hMainWnd,hDC)
  2152. RETURN( aTM[ TM_Height ] )
  2153.  
  2154. // LdBrowFlds() - Returns an array for use by WBrowse() that contains
  2155. //                 ALL fields in a database
  2156. STATIC FUNCTION LdBrowFlds
  2157.        LOCAL nCtr
  2158.        LOCAL aFldList := {}
  2159.        LOCAL aStruct  := DBSTRUCT()
  2160.        LOCAL cPict
  2161.  
  2162.        FOR nCtr := 1 TO LEN( aStruct )
  2163.            cPict := ""
  2164.            DO CASE
  2165.               CASE aStruct[nCtr][2] == 'C'
  2166.                    AADD( aFldList, {aStruct[nCtr][1],"{||"+ALIAS()+"->"+aStruct[nCtr][1]+'}',cPict} )
  2167.               CASE aStruct[nCtr][2] == 'N'
  2168.                    cPict := REPLICATE( '9', aStruct[nCtr][3] )
  2169.                    IF aStruct[nCtr][4] > 0
  2170.                       cPict += '.'+REPLICATE( '9', aStruct[nCtr][4] )
  2171.                    ENDIF
  2172.                    AADD( aFldList, {aStruct[nCtr][1],"{||"+ALIAS()+"->"+aStruct[nCtr][1]+"}",cPict} )
  2173.               CASE aStruct[nCtr][2] == 'L'
  2174.                    AADD( aFldList, {aStruct[nCtr][1],"{||IIF("+ALIAS()+"->"+aStruct[nCtr][1]+",'.T.','.F.')}",cPict} )
  2175.               CASE aStruct[nCtr][2] == 'D'
  2176.                    AADD( aFldList, {aStruct[nCtr][1],"{||DTOC(FIELD->"+aStruct[nCtr][1]+")}",cPict} )
  2177.            ENDCASE
  2178.          NEXT
  2179. RETURN(aFldList)
  2180.  
  2181. STATIC FUNCTION BListBox(hDlg   ,;  // Dialog box handle
  2182.                          hWnd   ,;  // Handle to listbox control
  2183.                          aFlds  ,;  // fields/codeblocks for browse
  2184.                          bTop   ,;
  2185.                          bBottom,;
  2186.                          bSkip  ,;
  2187.                          cAlias ,;  // name of database/alias
  2188.                          hBFont ,;  // Optional font for listbox
  2189.                          aUpdate,;  // Optional array of dialog controls
  2190.                          lShow)
  2191.  
  2192.         LOCAL aRect, hInst, nCtr, oB, cOldAlias
  2193.  
  2194.         aRect     := GetClientRect(hWnd)
  2195.  
  2196.         IF cAlias != NIL
  2197.            cOldAlias := DBSELECTAREA( cAlias )
  2198.         ENDIF
  2199.  
  2200.         oB :=  WBrowse{ hWnd,0,0,aRect[3]-1, aRect[4]-1,;
  2201.                         "",;
  2202.                         WS_CHILD+WS_BORDER+WS_VISIBLE,hWnd}
  2203.  
  2204.         oB:autoSize := .T.
  2205.         FOR nCtr := 1 TO LEN(aFlds)
  2206.             ASIZE(aFlds[nCtr],9)
  2207.             IF aFlds[ nCtr ][ 7 ] != NIL
  2208.                oB:autoSize := .F.
  2209.                EXIT
  2210.             ENDIF
  2211.         NEXT
  2212.  
  2213.         FOR nCtr := 1 TO LEN(aFlds)
  2214.             oB:addColumn(WBColumn{aFlds[nCtr][1],;
  2215.                                      aFlds[nCtr][2],;
  2216.                                      aFlds[nCtr][3],;
  2217.                                      aFlds[nCtr][4],;
  2218.                                      aFlds[nCtr][5],;
  2219.                                      aFlds[nCtr][6],;
  2220.                                      aFlds[nCtr][7],;
  2221.                                      aFlds[nCtr][8],;
  2222.                                      aFlds[nCtr][9]})
  2223.         NEXT
  2224.         oB:userSize      := .F.
  2225.         oB:userMove      := .F.
  2226.         oB:goTopBlock    := IIF( bTop    == NIL, oB:goTopBlock, bTop)
  2227.         oB:goBottomBlock := IIF( bBottom == NIL, oB:goBottomBlock, bBottom)
  2228.         oB:skipBlock     := IIF( bSkip   == NIL, oB:skipBlock, bSkip)
  2229.         oB:alias         := IIF( cAlias  == NIL, NIL, cAlias )
  2230.         lShow            := IIF( lShow   == NIL, .T., lShow )
  2231.         IF aUpdate != NIL
  2232.            oB:selectBlock := {||UpdateDlg(hDlg,aUpdate)}
  2233.         ENDIF
  2234.         IF hBFont != NIL
  2235.            oB:SetFont(hBFont)
  2236.         ENDIF
  2237.         oB:ShowFocus( .T. )
  2238.         IF lShow
  2239.            oB:goTop()
  2240.         ENDIF
  2241.         IF cAlias != NIL
  2242.            DBSELECTAREA( cOldAlias )
  2243.         ENDIF
  2244.         DoSubCl(oB,hWnd)
  2245. RETURN(oB)
  2246.  
  2247. STATIC FUNCTION UpdateDlg(hDlg,aUpdate)
  2248.        LOCAL nCtr
  2249.  
  2250.        FOR nCtr := 1 TO LEN(aUpdate)
  2251.            EVAL(aUpdate[nCtr])
  2252.        NEXT
  2253. RETURN(NIL)
  2254.  
  2255. STATIC FUNCTION DoSubCl(oB,hWnd)
  2256.        LOCAL nProc
  2257.  
  2258.        nProc := SubClassWindow(hWnd,;
  2259.                 {|hWnd, nMsg, nWparam, nLparam|;
  2260.                 oB:__SubWndProc(nProc, hWnd, nMsg, nWparam, nLparam)},;
  2261.                 {WM_PAINT,;
  2262.                  WM_ERASEBKGND ,;
  2263.                  WM_MOUSEMOVE,;
  2264.                  WM_LBUTTONUP,;
  2265.                  WM_LBUTTONDOWN,;
  2266.                  WM_LBUTTONDBLCLK,;
  2267.                  WM_KEYDOWN,;
  2268.                  WM_SYSKEYDOWN,;
  2269.                  WM_COMMAND,;
  2270.                  WM_DESTROY,;
  2271.                  WM_HSCROLL,;
  2272.                  WM_SETFOCUS,;
  2273.                  WM_KILLFOCUS,;
  2274.                  WM_VSCROLL})
  2275. RETURN(NIL)
  2276.  
  2277. FUNCTION SkipFor(        ; // Skipblock for handling sub-set browses
  2278.                 oB,      ; // Browse Object
  2279.                 nSkip,   ; // Number of Skips
  2280.                 bSearch, ; // Search Code Block
  2281.                 cKey,    ; // Key that Code Block eval has match
  2282.                 cAlias,  ; // DataBase Alias
  2283.                 lSoftSeek; // Logical SoftSeek mode for dBSeek()
  2284.                 )          // Returns number of Skips
  2285.  
  2286.        ( cAlias )->( DBSKIP( nSkip ) )
  2287.        lSoftSeek := IIF( lSoftSeek == NIL, .F., lSoftSeek )
  2288.        DO CASE
  2289.           CASE nSkip > 0 // Move Forward
  2290.                IF EVAL( bSearch ) != cKey
  2291.                    oB:hitBottom := .T.
  2292.                    oB:hitTop    := .F.
  2293.                    RETURN( -1 )
  2294.                ENDIF
  2295.                oB:nCurRec += nSkip
  2296.  
  2297.           CASE nSkip < 0 // Move Back
  2298.                IF EVAL( bSearch ) != cKey .OR. ( cAlias )->( BOF() )
  2299.                   IF !( cAlias )->( DBSEEK( cKey, lSoftSeek ) )
  2300.                      ( cAlias )->( DBGOBOTTOM() )
  2301.                      ( cAlias )->( DBSKIP() )
  2302.                      RETURN( nSkip )
  2303.                   ENDIF
  2304.                   oB:hitTop    := .T.
  2305.                   oB:hitBottom := .F.
  2306.                   RETURN( 0 )
  2307.                ENDIF
  2308.                oB:nCurRec := oB:nCurRec - NegToPos(nSkip)
  2309.        ENDCASE
  2310.        oB:hitTop    := .F.
  2311.        oB:hitBottom := .F.
  2312. RETURN( nSkip )
  2313.  
  2314. FUNCTION FindFirst(         ; // goTopBlock for browsing sub-sets
  2315.                   oB,       ; // Browse Object
  2316.                   cKey,     ; // Key for dBSeek()
  2317.                   cAlias,   ; // DataBase Alias
  2318.                   lSoftSeek ; // Logical SoftSeek mode for dBSeek()
  2319.                   )           // Return NIL
  2320.  
  2321.        lSoftSeek := IIF( lSoftSeek == NIL, .F., .T. )
  2322.        ( cAlias )->( DBSEEK( cKey, lSoftSeek ) )
  2323.  
  2324.        oB:nCurRec   := 1
  2325.        oB:hitTop    := .T.
  2326.        oB:hitBottom := ( cAlias )->( EOF() )
  2327.        oB:rowPos    := 1
  2328. RETURN( NIL )
  2329.  
  2330. FUNCTION FindLast(         ; // goBottomBlock for browsing sub-sets
  2331.                  oB,       ; // Browse Object
  2332.                  bSearch,  ; // Search Code Block
  2333.                  cKey,     ; // Key for dBSeek()
  2334.                  cAlias,   ; // DataBase Alias
  2335.                  lSoftSeek ; // Logical SoftSeek mode for dBSeek()
  2336.                  )           // Return NIL
  2337.  
  2338.        LOCAL nCurRec := 0
  2339.  
  2340.        lSoftSeek := IIF( lSoftSeek == NIL, .F., .T. )
  2341.        IF ( cAlias)->( DBSEEK( cKey, lSoftSeek ) )
  2342.           DO WHILE EVAL( bSearch ) == cKey  .AND. !( cAlias )->( EOF() )
  2343.              ++nCurRec
  2344.              ( cAlias )->( DBSKIP() )
  2345.           ENDDO
  2346.           ( cAlias )->( DBSKIP( -1 ) )
  2347.        ELSE
  2348.           nCurRec := 1
  2349.        ENDIF
  2350.        oB:nCurRec   := MAX( nCurRec, 1 )
  2351.        oB:hitBottom := .T.
  2352.        oB:hitTop    := .F.
  2353.        oB:rowPos    := oB:rowCount
  2354.        oB:nMaxRec   := nCurRec
  2355. RETURN( NIL )
  2356.