home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 June / PCWorld_2002-06_cd.bin / Software / Komercni / xbase / express / exd17208.r04 / exp17 / Samples / Xsample2.prg < prev    next >
Text File  |  2002-01-30  |  64KB  |  2,515 lines

  1. *-- PROGRAM FILE -------------------------------------------------------------
  2. * Application: eXPress++ Library
  3. *  Description: eXPress++ sample programs
  4. *    File Name: xsample2.prg
  5. *       Author: Roger Donnay          Tester:
  6. * Date created: 11/04/98              Date updated: 11/07/2001
  7. *    Copyright: (c) 2001 by DONNAY Software Designs
  8. *-----------------------------------------------------------------------------
  9.  
  10. #include "DCDIALOG.CH"
  11. #include "SET.CH"
  12. #include "XBP.CH"
  13. #include "APPEVENT.CH"
  14. #include "dcpick.ch"
  15. #include "dcapp.ch"
  16. #include "dcbitmap.ch"
  17. #include "dcicon.ch"
  18. #include "dccursor.ch"
  19. #include "dcxtoc.ch"
  20. #include "class.ch"
  21. #include "font.ch"
  22. #INCLUDE "dcprint.CH"
  23.  
  24. FUNCTION X_Samples_2( oDialog )
  25.  
  26. LOCAL GetList := {}, nTest := 0, cMemo := '', oMemo, i, j, oDlg, ;
  27.       lDebugCreate := .f., lDebugEvent := .f., GetOptions, aApp[1], ;
  28.       cTitle, oDlgWindow, aCoords, oSourceFile, cSource
  29.  
  30. SET DEFA TO
  31. SET PATH TO ..\DATA
  32.  
  33. cTitle := 'eXPress++ Sample Programs (Set 2)'
  34. nTest := 0
  35. cMemo := ''
  36. lDebugEvent := .f.
  37. lDebugCreate := .f.
  38.  
  39. FOR i := 1 TO  5
  40.   FOR j := 1 TO 6
  41.     nTest++
  42.     @ j-1,1 + (i-1)*14 DCRADIO nTest               ;
  43.       VALUE nTest ;
  44.       PROMPT XSample_Header(nTest)               ;
  45.       ACTION {||XSample_Memo(nTest,oMemo,oSourceFile,@cSource)}
  46.   NEXT j
  47. NEXT i
  48. nTest := 1
  49.  
  50. @ 2,73 DCPUSHBUTTON CAPTION 'Run Sample'  ;
  51.       SIZE 12, 1                               ;
  52.       ACTION {||XSample_Run(nTest,oDialog,lDebugCreate,lDebugEvent)}
  53.  
  54. @ 3,73 DCPUSHBUTTON CAPTION 'Print Source'  ;
  55.       SIZE 12, 1                               ;
  56.       ACTION {||XSample_Print(cSource)}
  57.  
  58. @ 4,73 DCPUSHBUTTON CAPTION 'Exit' ;
  59.       SIZE 12, 1  ;
  60.       ACTION {||PostAppEvent(xbeP_Close,,,oDlg)}
  61.  
  62. @ 5,73 DCCHECKBOX lDebugEvent PROMPT 'Debug Events'
  63.  
  64. @ 6.3,5 DCSAY '' SAYSIZE 60 COLOR GRA_CLR_DARKBLUE ;
  65.       OBJECT oSourceFile FONT '8.Courier Bold'
  66.  
  67. @ 7,1 DCMULTILINE cMemo ;
  68.      OBJECT oMemo ;
  69.      SIZE 85,12 ;
  70.      FONT '8.Alaska Crt'
  71.  
  72. DCGETOPTIONS ;
  73.       ICON ICON_EXPRESS ;
  74.       CASCADE
  75.  
  76. DCREAD GUI ;
  77.       OPTIONS GetOptions ;
  78.       EVAL {||XSample_Memo(nTest,oMemo,oSourceFile,@cSource)} ;
  79.       APPWINDOW oDialog ;
  80.       PARENT @oDlg ;
  81.       TITLE cTitle ;
  82.       FIT
  83.  
  84. CLOSE DATABASES
  85.  
  86. RETURN nil
  87.  
  88. * -------------------------
  89.  
  90. STATIC FUNCTION XSample_Memo( nTest, oMemo, oSourceFile, cSource )
  91.  
  92. LOCAL cFunction, nFound, cSourceFile
  93.  
  94. cSource := ''
  95. nTest += 42
  96. cFunction := 'XSample_' + Alltrim(Str(nTest))
  97.  
  98. cSourceFile := 'XSAMPLE2.PRG'
  99. cSource := MemoRead(cSourceFile)
  100. IF Empty(cSource)
  101.   cSourceFile := '..\PRG\XSAMPLE2.PRG'
  102.   cSource := MemoRead(cSourceFile)
  103. ENDIF
  104. IF Empty(cSource)
  105.   cSource := 'XSAMPLE2.PRG cannot be found'
  106. ENDIF
  107.  
  108. nFound := AT('FUNCTION ' + cFunction,cSource)
  109. cSource := Substr(cSource,nFound)
  110. nFound := AT('*** END OF EXAMPLE ***',cSource)
  111. cSource := Substr(cSource,1,nFound+21)
  112.  
  113. IF !Empty(cSource)
  114.   oMemo:setData(cSource)
  115.   oSourceFile:setCaption(cSourceFile)
  116. ENDIF
  117. RETURN nil
  118.  
  119. * -------------------
  120.  
  121. STATIC FUNCTION XSample_Print( cSource )
  122.  
  123. LOCAL oPrinter, nLineCount := MLCount(cSource), i, cMemoLine, nRow
  124.  
  125. DCPRINT ON TO oPrinter PREVIEW FONT '10.Courier' NONSTOP HIDE
  126. IF Valtype(oPrinter) # 'O' .OR. !oPrinter:lActive
  127.   RETURN nil
  128. ENDIF
  129. nRow := 1
  130. FOR i := 1 TO nLineCount - 1
  131.   cMemoLine := MemoLine( cSource, nil, i )
  132.   @ nRow++,2 DCPRINT SAY cMemoLine PRINTER oPrinter
  133.   IF nRow > 60
  134.     DCPRINT EJECT
  135.     nRow := 1
  136.   ENDIF
  137. NEXT
  138. DCPRINT OFF
  139.  
  140. RETURN nil
  141.  
  142. * ---------------------
  143.  
  144. STATIC FUNCTION XSample_Run( nTest, oDialog, lDebugCreate, lDebugEvent )
  145.  
  146. LOCAL nDebug := 0
  147.  
  148. DC_Gui(.t.)
  149.  
  150. nTest += 42
  151. IF lDebugCreate
  152.    nDebug += DCGUI_DEBUG_CREATE
  153. ENDIF
  154. IF lDebugEvent
  155.    nDebug += DCGUI_DEBUG_EVENTS
  156. ENDIF
  157. DC_ReadGuiDebug(nDebug)
  158. CLOSE ALL
  159. SET DEFA TO
  160.  
  161. IF nTest = 43
  162.    XSample_43()
  163. ELSEIF nTest = 44
  164.    XSample_44()
  165. ELSEIF nTest = 45
  166.    XSample_45()
  167. ELSEIF nTest = 46
  168.    XSample_46()
  169. ELSEIF nTest = 47
  170.    XSample_47()
  171. ELSEIF nTest = 48
  172.    XSample_48()
  173. ELSEIF nTest = 49
  174.    XSample_49()
  175. ELSEIF nTest = 50
  176.    XSample_50()
  177. ELSEIF nTest = 51
  178.    XSample_51()
  179. ELSEIF nTest = 52
  180.    XSample_52()
  181. ELSEIF nTest = 53
  182.    XSample_53()
  183. ELSEIF nTest = 54
  184.    XSample_54()
  185. ELSEIF nTest = 55
  186.    XSample_55()
  187. ELSEIF nTest = 56
  188.    XSample_56()
  189. ELSEIF nTest = 57
  190.    XSample_57()
  191. ELSEIF nTest = 58
  192.    XSample_58()
  193. ELSEIF nTest = 59
  194.    XSample_59()
  195. ELSEIF nTest = 60
  196.    XSample_60()
  197. ELSEIF nTest = 61
  198.    XSample_61()
  199. ELSEIF nTest = 62
  200.    XSample_62()
  201. ELSEIF nTest = 63
  202.    XSample_63()
  203. ELSEIF nTest = 64
  204.    XSample_64()
  205. ELSEIF nTest = 65
  206.    XSample_65()
  207. ELSEIF nTest = 66
  208.    XSample_66()
  209. ELSEIF nTest = 67
  210.    XSample_67()
  211. ELSEIF nTest = 68
  212.    XSample_68()
  213. ELSEIF nTest = 69
  214.    XSample_69()
  215. ELSEIF nTest = 70
  216.    XSample_70()
  217. ELSEIF nTest = 71
  218.    XSample_71()
  219. ELSEIF nTest = 72
  220.    XSample_72()
  221. ELSEIF nTest = 73
  222. ELSEIF nTest = 74
  223. ELSEIF nTest = 75
  224. ELSEIF nTest = 76
  225. ELSEIF nTest = 77
  226. ELSEIF nTest = 78
  227. ELSEIF nTest = 79
  228. ELSEIF nTest = 80
  229. ELSEIF nTest = 81
  230. ELSEIF nTest = 82
  231. ELSEIF nTest = 83
  232. ELSEIF nTest = 84
  233. ENDIF
  234.  
  235. DC_ClearEvents()
  236.  
  237. RETURN nil
  238.  
  239. /* ---------------------------- */
  240.  
  241. STATIC FUNCTION XSample_Header( nTest, oDlg )
  242.  
  243. nTest += 42
  244.  
  245. IF nTest = 43
  246.   RETURN "AutoSeek 1"
  247. ELSEIF nTest = 44
  248.   RETURN "AutoSeek 2"
  249. ELSEIF nTest = 45
  250.   RETURN "Drag/Drop"
  251. ELSEIF nTest = 46
  252.   RETURN "Cut/Paste"
  253. ELSEIF nTest = 47
  254.   RETURN 'ParaCombo'
  255. ELSEIF nTest = 48
  256.   RETURN 'BrowNoBars'
  257. ELSEIF nTest = 49
  258.   RETURN 'ArrayEdit'
  259. ELSEIF nTest = 50
  260.   RETURN 'ColumnSort'
  261. ELSEIF nTest = 51
  262.   RETURN 'Origin'
  263. ELSEIF nTest = 52
  264.   RETURN 'GET Options'
  265. ELSEIF nTest = 53
  266.   RETURN 'DialogSize 1'
  267. ELSEIF nTest = 54
  268.   RETURN 'DialogSize 2'
  269. ELSEIF nTest = 55
  270.   RETURN 'Combo/Data'
  271. ELSEIF nTest = 56
  272.   RETURN 'Processing'
  273. ELSEIF nTest = 57
  274.   RETURN 'ListBox'
  275. ELSEIF nTest = 58
  276.   RETURN 'ProgValid'
  277. ELSEIF nTest = 59
  278.   RETURN 'PickList'
  279. ELSEIF nTest = 60
  280.   RETURN 'XtoClipper'
  281. ELSEIF nTest = 61
  282.   RETURN 'IndexSlow'
  283. ELSEIF nTest = 62
  284.   RETURN 'IndexFast'
  285. ELSEIF nTest = 63
  286.   RETURN 'ExitQuery'
  287. ELSEIF nTest = 64
  288.   RETURN 'Accelerators'
  289. ELSEIF nTest = 65
  290.   RETURN 'FancyButt'
  291. ELSEIF nTest = 66
  292.   RETURN 'Totalling'
  293. ELSEIF nTest = 67
  294.   RETURN 'BitMapBrow'
  295. ELSEIF nTest = 68
  296.   RETURN 'PrintLabels'
  297. ELSEIF nTest = 69
  298.   RETURN 'Get/Combo'
  299. ELSEIF nTest = 70
  300.   RETURN 'HiliteGets'
  301. ELSEIF nTest = 71
  302.   RETURN 'Combo/Add'
  303. ELSEIF nTest = 72
  304.   RETURN 'Clock'
  305. ENDIF
  306.  
  307. RETURN ''
  308.  
  309.  
  310. //* ---------------------------- */
  311.  
  312. STATIC FUNCTION XSample_43
  313.  
  314. /*
  315. Browse with AUTOSEEK (DataBase)
  316.  
  317. This sample demonstrates a single @ DCSAY..GET and a Browse.  The
  318. GET is used to enter a string to seek.
  319. */
  320.  
  321. LOCAL GetList := {}, cSeek := Space(20), oBrowse
  322.  
  323. IF !File('..\XDOC\EXPRESS.DBF')
  324.   DC_MsgBox({'Sorry.  The database required to show this feature',;
  325.              'is not included in the demonstration version', ;
  326.              'or the ..\XDOC\EXPRESS.DBF file does not exist'})
  327.   RETURN nil
  328. ENDIF
  329.  
  330. SET DEFA TO ..\XDOC
  331. USE EXPRESS VIA FOXCDX EXCLUSIVE ALIAS 'XDOC'
  332. SET INDEX TO EXPRESS.CDX
  333. OrdSetFocus('COMMAND')
  334. SET DEFA TO
  335.  
  336. @ 1,1 DCSAY 'Seek' GET cSeek SAYRIGHT PICT '@!' ;
  337.       KEYBLOCK {|a,b,o|_XSample_43(a,b,o,oBrowse,@cSeek)}
  338.  
  339. @ 3,1 DCBROWSE oBrowse ALIAS 'XDOC' SIZE 77,11.8
  340.  
  341. DCBROWSECOL FIELD XDOC->command HEADER "Command" PARENT oBrowse ;
  342.   WIDTH 7
  343.  
  344. DCBROWSECOL FIELD XDOC->type  HEADER "Type" PARENT oBrowse ;
  345.   WIDTH 6
  346.  
  347. DCBROWSECOL FIELD XDOC->category HEADER "Category" PARENT oBrowse ;
  348.   WIDTH 6
  349.  
  350. DCBROWSECOL FIELD XDOC->short HEADER "Short Description" PARENT oBrowse
  351.  
  352. DCBROWSECOL FIELD XDOC->module HEADER "Module" PARENT oBrowse ;
  353.  
  354. DCBROWSECOL FIELD XDOC->see_also HEADER "See Also" PARENT oBrowse
  355.  
  356. DCBROWSECOL DATA {||XDOC->(recno())} HEADER "Record" PARENT oBrowse ;
  357.   WIDTH 4
  358.  
  359. DCREAD GUI ;
  360.     TITLE 'AUTOSEEK Demo' ;
  361.     FIT ;
  362.     ADDBUTTONS ;
  363.     MODAL
  364.  
  365. RETURN nil
  366.  
  367. /* ---------------------- */
  368.  
  369. STATIC FUNCTION _XSample_43( a, b, o, oBrowse, cSeek )
  370.  
  371. LOCAL lClearBuffer := .t., lSoftSeek := Set(_SET_SOFTSEEK,.t.)
  372.  
  373. IF a = xbeK_UP
  374.    oBrowse:up()
  375. ELSEIF a = xbeK_DOWN
  376.    oBrowse:down()
  377. ELSEIF a = xbeK_PGUP
  378.    oBrowse:pageup()
  379. ELSEIF a = xbeK_PGDN
  380.    oBrowse:pagedown()
  381. ELSEIF a = xbeK_END
  382.    oBrowse:gobottom()
  383. ELSEIF a = xbeK_HOME
  384.    oBrowse:gotop()
  385. ELSE
  386.    SEEK AllTrim(o:EditBuffer())
  387.    lClearBuffer := .f.
  388. ENDIF
  389. oBrowse:refreshall()
  390. IF lClearBuffer
  391.   cSeek := Space(20)
  392.   o:Get:home()
  393.   o:setData()
  394. ENDIF
  395. Set(_SET_SOFTSEEK,lSoftSeek)
  396.  
  397. RETURN nil
  398. *** END OF EXAMPLE ***
  399.  
  400.  
  401. //* ---------------------------- */
  402.  
  403. STATIC FUNCTION XSample_44
  404.  
  405. /*
  406. Browse with AUTOSEEK (Array)
  407.  
  408. This sample demonstrates a single @ DCSAY..GET and a Browse.  The
  409. GET is used to enter a string to seek.
  410. */
  411.  
  412. LOCAL GetList := {}, cSeek := Space(20), oBrowse, aDirectory, i
  413.  
  414. @ 1,1 DCSAY 'Seek' GET cSeek SAYRIGHT PICT '@!' ;
  415.       GETEVAL {|oXbp|oXbp:keyboard := {|a,b,o|_XSample_44(a,b,o,oBrowse)} }
  416.  
  417. aDirectory := Directory()
  418. FOR i := 1 TO Len(aDirectory)
  419.   aDirectory[i,1] := Upper(aDirectory[i,1])
  420. NEXT
  421. ASort(aDirectory,,,{|x,y|x[1]<y[1]})
  422.  
  423. @ 3,1 DCBROWSE oBrowse DATA aDirectory ;
  424.       SIZE 55,12 FONT '10.Helv Bold' ;
  425.       FIT ;
  426.       PRESENTATION DC_BrowPres()
  427.  
  428. DCBROWSECOL ELEMENT 1 WIDTH 10 HEADER "Name" PARENT oBrowse
  429.  
  430. DCBROWSECOL ELEMENT 2 WIDTH 7 HEADER "Size" PARENT oBrowse
  431.  
  432. DCBROWSECOL ELEMENT 3 WIDTH 8 HEADER "Date" PARENT oBrowse
  433.  
  434. DCBROWSECOL ELEMENT 4 WIDTH 6 HEADER "Time" PARENT oBrowse
  435.  
  436. DCREAD GUI ;
  437.    FIT ;
  438.    MODAL ;
  439.    BUTTONS DCGUI_BUTTON_OK + DCGUI_BUTTON_CANCEL ;
  440.    TITLE 'Array Browse of Directory'
  441.  
  442. RETURN nil
  443.  
  444. /* ---------------------- */
  445.  
  446. STATIC FUNCTION _XSample_44( a, b, o, oBrowse )
  447.  
  448. LOCAL aArray := oBrowse:cargo[5], nElement
  449.  
  450. nElement := AScan(aArray,{|x|Upper(x[1])=Upper(Alltrim(o:editBuffer()))})
  451. IF nElement > 0
  452.   IF IsMemberVar(oBrowse,'arrayElement') // eXPress++ 1.7 or later
  453.     oBrowse:arrayElement := nElement
  454.   ENDIF
  455.   oBrowse:cargo[4] := nElement
  456.   oBrowse:refreshAll()
  457. ENDIF
  458.  
  459. RETURN nil
  460. *** END OF EXAMPLE ***
  461.  
  462. /* ---------------------------- */
  463.  
  464. STATIC FUNCTION XSample_45
  465.  
  466. /*
  467. Drag and Drop
  468.  
  469. This sample demonstrates dragging a value from a row/column in
  470. an array browse to another row/column.  The value in the cell
  471. that is grabbed is swapped with the value in the cell dropped.
  472. */
  473.  
  474. LOCAL GetList := {}, oBrowse, aDirectory, i
  475.  
  476. aDirectory := Directory()
  477. FOR i := 1 TO Len(aDirectory)
  478.   aDirectory[i,1] := Upper(aDirectory[i,1])
  479. NEXT
  480. ASort(aDirectory,,,{|x,y|x[1]<y[1]})
  481.  
  482. @ 3,1 DCBROWSE oBrowse DATA aDirectory ;
  483.       SIZE 43,12 FONT '10.Helv Bold' ;
  484.       PRESENTATION DC_BrowPres()
  485.  
  486. DCBROWSECOL ELEMENT 1 WIDTH 30 HEADER "File Name" PARENT oBrowse
  487.  
  488. DCREAD GUI ;
  489.    FIT ;
  490.    MODAL ;
  491.    BUTTONS DCGUI_BUTTON_EXIT ;
  492.    TITLE 'Drag a Value from one Row to another' ;
  493.    HANDLER _XSample_45 REFERENCE @oBrowse
  494.  
  495. RETURN nil
  496.  
  497. /* ------------------- */
  498.  
  499. STATIC FUNCTION ;
  500.   _XSample_45 ( nEvent, mp1, mp2, oXbp, oDlg, GetList, oBrowse )
  501.  
  502. STATIC lButtonDown := .f., nTopRow, nGrabRow, cFileName, oCellGroup
  503.  
  504. LOCAL oColumn, nRowPos, nElement, lHitBottom := .f.
  505.  
  506. IF Valtype(oXbp) = 'O'
  507.  
  508.   /* -- Left button pressed in a cell -- */
  509.   IF nEvent = xbeM_LbDown .AND. oXbp:ClassName() = 'XbpCellGroup'
  510.  
  511.     nRowPos := Int((oXbp:currentSize()[2]-mp1[2]) / (oXbp:CellRect(1)[4]-oXbp:CellRect(1)[2]))
  512.     oBrowse:forcestable()
  513.     nElement := oBrowse:cargo[4]  // Get current array pointer
  514.     nTopRow := nElement - nRowPos
  515.     nGrabRow := nElement
  516.     oBrowse:setPointer( nil, POINTER_MOVE_1, 1)
  517.     lButtonDown := .t.
  518.     oCellGroup := oXbp
  519.  
  520.     /* -- Left button released in new cell -- */
  521.   ELSEIF nEvent = xbeM_LbUp .AND. oXbp:ClassName() = 'XbpCellGroup' .AND. ;
  522.          oXbp == oCellGroup
  523.  
  524.     nRowPos := Int((oXbp:currentSize()[2]-mp1[2]) / (oXbp:CellRect(1)[4]-oXbp:CellRect(1)[2]))
  525.     nElement := nTopRow + nRowPos
  526.     cFileName := oBrowse:cargo[5,nElement,1]
  527.     oBrowse:cargo[5,nElement,1] := oBrowse:cargo[5,nGrabRow,1]
  528.     oBrowse:cargo[5,nGrabRow,1] := cFileName
  529.     oBrowse:refreshAll()
  530.     oBrowse:setPointer( nil, 1, 1 )
  531.     lButtonDown := .f.
  532.  
  533.   ELSEIF lButtonDown
  534.  
  535.     oBrowse:setPointer( nil, POINTER_MOVE_1, 1)
  536.  
  537.     /* -- Mouse moved in Bottom ScrollBar area -- */
  538.     IF nEvent = xbeM_Motion .AND. oXbp:ClassName() = 'XbpScrollbar' .AND. ;
  539.        oXbp:type = XBPSCROLL_HORIZONTAL
  540.       DO WHILE oBrowse:cargo[4] < Len(oBrowse:cargo[5])
  541.         IF oBrowse:RowPos+1 = oBrowse:RowCount
  542.            nTopRow++
  543.         ENDIF
  544.         oBrowse:down()
  545.         oBrowse:refreshAll()
  546.         nEvent := AppEvent( @mp1, @mp2, @oXbp, .1 )
  547.         IF nEvent = xbeM_LbUp
  548.            EXIT
  549.         ELSEIF nEvent = xbeP_None .OR. Valtype(oXbp) # 'O' .OR. oXbp:ClassName() = 'XbpScrollbar'
  550.            Sleep(7)
  551.            LOOP
  552.         ENDIF
  553.         EXIT
  554.       ENDDO
  555.     /* -- Mouse moved in Header area -- */
  556.     ELSEIF nEvent = xbeM_Motion .AND. oXbp:ClassName() = 'XbpCellGroup' .AND. ;
  557.            !(oXbp==oCellGroup) .AND. oXbp:setParent()==oCellGroup:setParent()
  558.       DO WHILE oBrowse:cargo[4] > 1
  559.         IF oBrowse:RowPos = 1
  560.            nTopRow--
  561.         ENDIF
  562.         oBrowse:up()
  563.         oBrowse:refreshAll()
  564.         nEvent := AppEvent( @mp1, @mp2, @oXbp, .1 )
  565.         IF nEvent = xbeM_LbUp
  566.            EXIT
  567.         ELSEIF nEvent = xbeP_None .OR. Valtype(oXbp) # 'O' .OR. ;
  568.            (oXbp:ClassName() = 'XbpCellGroup' .AND. ;
  569.             !(oXbp==oCellGroup) .AND. oXbp:setParent()==oCellGroup:setParent())
  570.            Sleep(7)
  571.            LOOP
  572.         ENDIF
  573.         EXIT
  574.       ENDDO
  575.     ENDIF
  576.  
  577.   ENDIF
  578.  
  579. ENDIF
  580. IF nEvent = xbeM_LbUp
  581.    lButtonDown := .f.
  582. ENDIF
  583.  
  584. RETURN DCGUI_NONE
  585. *** END OF EXAMPLE ***
  586.  
  587. /* ---------------------------- */
  588.  
  589. STATIC FUNCTION XSample_46
  590.  
  591. /*
  592. Cut and Paste
  593.  
  594. This sample demonstrates cutting a value from a row/column in
  595. an array browse and pasting it to another row/column.  The value
  596. in the cell that is cut is swapped with the value in the cell
  597. pasted.  Use the right mouse button.
  598. */
  599.  
  600. LOCAL GetList := {}, oBrowse, aSchedule, i, j, oMenuBrow
  601.  
  602. aSchedule := Array(24)
  603. FOR i := 1 TO 24
  604.   aSchedule[i] := Array(8)
  605.   aSchedule[i,1] := Str(i,2) + ':00'
  606.   FOR j := 2 TO 8
  607.      aSchedule[i,j] := Space(25)
  608.   NEXT
  609. NEXT
  610.  
  611. aSchedule[6,2] := Pad('John Smith',25)
  612. aSchedule[8,3] := Pad('Laurie Jones',25)
  613. aSchedule[9,4] := Pad('Tom Walker',25)
  614. aSchedule[7,5] := Pad('Nancy Buffet',25)
  615.  
  616. @ 3,1 DCBROWSE oBrowse DATA aSchedule ;
  617.       SIZE 80,14.5 FREEZELEFT {1} ;
  618.       EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;
  619.       DELETE xbeK_DEL ;
  620.       INSERT xbeK_INS ;
  621.       RBSELECT
  622.  
  623. DCBROWSECOL ELEMENT 1 WIDTH 4 HEADER "Time" PARENT oBrowse
  624. DCBROWSECOL ELEMENT 2 WIDTH 9 HEADER "Sunday" PARENT oBrowse
  625. DCBROWSECOL ELEMENT 3 WIDTH 9 HEADER "Monday" PARENT oBrowse
  626. DCBROWSECOL ELEMENT 4 WIDTH 9 HEADER "Tuesday" PARENT oBrowse
  627. DCBROWSECOL ELEMENT 5 WIDTH 9 HEADER "Wednesday" PARENT oBrowse
  628. DCBROWSECOL ELEMENT 6 WIDTH 9 HEADER "Thursday" PARENT oBrowse
  629. DCBROWSECOL ELEMENT 7 WIDTH 9 HEADER "Friday" PARENT oBrowse
  630. DCBROWSECOL ELEMENT 8 WIDTH 9 HEADER "Saturday" PARENT oBrowse
  631.  
  632. DCSUBMENU oMenuBrow PROMPT "&Browse" PARENT oBrowse
  633.  
  634. DCMENUITEM "~Cut" PARENT oMenuBrow ACTION {||_XSample_46(oBrowse,2)}
  635. DCMENUITEM "C~opy" PARENT oMenuBrow ACTION {||_XSample_46(oBrowse,3)}
  636. DCMENUITEM "~Paste" PARENT oMenuBrow ACTION {||_XSample_46(oBrowse,4)}
  637.  
  638. DCREAD GUI ;
  639.    FIT ;
  640.    MODAL ;
  641.    BUTTONS DCGUI_BUTTON_EXIT ;
  642.    TITLE 'Double Click to EDIT, Right Click to Cut/Paste' ;
  643.    EVAL {||_XSample_46(@oBrowse,1,@oMenuBrow,1)}
  644.  
  645. RETURN nil
  646.  
  647. /* -------------------------- */
  648.  
  649. STATIC FUNCTION _XSample_46 ( oBrowse, nMode, oMenuBrow )
  650.  
  651. STATIC cClipData
  652.  
  653. LOCAL i, aChildList, oXbp, nRow, nCol, oCellGroup
  654.  
  655. IF nMode = 1
  656.    aChildList := oBrowse:ChildList()
  657.    FOR i := 2 TO 8
  658.       oXbp := oBrowse:getColumn(i)
  659.       oCellGroup := oXbp:dataArea
  660.  
  661.       /* -- Attach menu to each cellgroup -- */
  662.       oCellGroup:RbDown  := DC_MergeBlocks(oCellGroup:RbDown,;
  663.               { |x,y,z| oMenuBrow:PopUp ( nil, x, 1 , ;
  664.                 XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN  ) })
  665.    NEXT
  666. ELSEIF nMode = 2  // Cut
  667.   nRow := oBrowse:cargo[4]
  668.   nCol := oBrowse:colPos
  669.   cClipData := oBrowse:cargo[5,nRow,nCol]
  670.   oBrowse:cargo[5,nRow,nCol] := Space(25)
  671.   oBrowse:refreshCurrent()
  672. ELSEIF nMode = 3  // Copy
  673.   nRow := oBrowse:cargo[4]
  674.   nCol := oBrowse:colPos
  675.   cClipData := oBrowse:cargo[5,nRow,nCol]
  676. ELSEIF nMode = 4  // Paste
  677.   nRow := oBrowse:cargo[4]
  678.   nCol := oBrowse:colPos
  679.   oBrowse:cargo[5,nRow,nCol] := cClipData
  680.   oBrowse:refreshCurrent()
  681. ENDIF
  682.  
  683. RETURN nil
  684. *** END OF EXAMPLE ***
  685.  
  686. /* ------------------------ */
  687.  
  688. STATIC FUNCTION XSample_47()
  689.  
  690. /* This example shows how to create two combo boxes which link
  691.    to each other thus allowing the operator to choose a pay
  692.    method from either combo box */
  693.  
  694. LOCAL aPayType, aTextList, aCodeList, cCodeName, cTextName, ;
  695.       GetList := {}, oCode, oText
  696.  
  697. aPayType:=  {{PADR("Visa  ",30)     ,"V    "},;
  698.              {PADR("MasterCard",30) ,"M    "},;
  699.              {PADR("Cash",30)       ,"C    "},;
  700.              {PADR("Account",30)    ,"A    "},;
  701.              {PADR("Discover",30)   ,"D    "},;
  702.              {PADR("Net-30",30)     ,"N    "},;
  703.              {PADR("ChecK",30)      ,"K    "},;
  704.              {PADR("Other",30)      ,"O    "},;
  705.              {SPACE(30)             ,SPACE(5)} }
  706.  
  707. aTextList:= DC_AConvert(aPayType)[1]
  708. aCodeList:= DC_AConvert(aPayType)[2]
  709. cCodeName:= aCodeList[1]
  710. cTextName:= aTextList[1]
  711.  
  712. @  1,2 DCCOMBOBOX cCodeName LIST aCodeList SIZE 7,5 OBJECT oCode ;
  713.    DATALINK {||oText:XbpSLE:setData(cTextName := ;
  714.                 aTextList[ASCAN(aCodeList,cCodeName)] ) }
  715.  
  716. @  1,9 DCCOMBOBOX cTextName LIST aTextList SIZE 20,5 OBJECT oText  ;
  717.    DATALINK {||oCode:XbpSLE:setData(cCodeName := ;
  718.                 aCodeList[ASCAN(aTextList,cTextName)] ) }
  719.  
  720. DCREAD GUI FIT MODAL ADDBUTTONS
  721.  
  722. DC_MsgBox({'You Chose:', cCodeName, cTextName})
  723.  
  724. RETURN cCodeName
  725. *** END OF EXAMPLE ***
  726.  
  727. /* ------------------------ */
  728.  
  729. STATIC FUNCTION XSample_48()
  730.  
  731. /*
  732. This example shows how to create a browse without scroll bars.
  733. The :configure() method is necessary because the EVAL code
  734. block is evaluated after :create()
  735. */
  736.  
  737. LOCAL aPayType, GetList := {}, oBrowse, oBrowBox
  738.  
  739. aPayType:=  {{PADR("Visa  ",30)     ,"V    "},;
  740.              {PADR("MasterCard",30) ,"M    "},;
  741.              {PADR("Cash",30)       ,"C    "},;
  742.              {PADR("Account",30)    ,"A    "},;
  743.              {PADR("Discover",30)   ,"D    "},;
  744.              {PADR("Net-30",30)     ,"N    "},;
  745.              {PADR("ChecK",30)      ,"K    "},;
  746.              {PADR("Other",30)      ,"O    "}}
  747.  
  748. @ 1,2 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX OBJECT oBrowBox ;
  749.    SIZE 30, 10
  750.  
  751. @  .1,.2 DCBROWSE oBrowse DATA aPayType SIZE 29.4,9.7 ;
  752.    PARENT oBrowBox ;
  753.    EVAL {|o|o:hScroll:=.f., ;
  754.             o:vScroll:=.f., ;
  755.             o:sizeCols:=.f., ;
  756.             o:configure()}
  757.  
  758. DCBROWSECOL ELEMENT 1 WIDTH 10 Header "Description" ;
  759.    PARENT oBrowse
  760.  
  761. DCBROWSECOL ELEMENT 2 WIDTH 8 Header "Code" ;
  762.    PARENT oBrowse
  763.  
  764. DCREAD GUI FIT ADDBUTTONS MODAL ;
  765.    TITLE 'Browse with no Scroll Bars'
  766.  
  767. RETURN nil
  768. *** END OF EXAMPLE ***
  769.  
  770. /* ------------------- */
  771.  
  772. STATIC FUNCTION XSample_49()
  773.  
  774. /*
  775. This example shows how to create an array editor using
  776. cell-editing.   This is a database structure array editor.
  777. */
  778.  
  779.  
  780. LOCAL oBrowse, aStructure, aFields, GetList := {}, ;
  781.       oToolBar, GetOptions, aOldStruct, lOk, nPointer, ;
  782.       aField, xNIL := NIL, aTypes, aData, lEditing := .f.
  783.  
  784. USE collect VIA 'DBFNTX'
  785. aStructure := dbstruct()
  786. aOldStruct := AClone(aStructure)
  787. aFields := ARRAY(LEN(aStructure))
  788. aFields := aStructure[1]
  789.  
  790. FOR nPointer := 1 TO Len(aStructure)
  791.    aStructure[nPointer,1] := Pad(aStructure[nPointer,1],10)
  792. NEXT
  793. nPointer := 1
  794.  
  795. @ .1,.5 DCBROWSE oBrowse DATA aStructure ;
  796.         SIZE 43,14.1 ;
  797.         FIT ;
  798.         PRESENTATION DC_BrowPres() ;
  799.         NOHORIZSCROLL ;
  800.         EDIT xbeBRW_ItemSelected ;
  801.            MODE DCGUI_BROWSE_EDITACROSSDOWN ;
  802.            ACTION {||lEditing:=.t.,DC_GetRefresh(GetList)} ;
  803.            EXIT {||lEditing:=.f., ;
  804.                   _XSample49(11,aStructure,oBrowse,nPointer,,GetList), ;
  805.                   DC_GetRefresh(GetList)} ;
  806.         INTO aField ;
  807.         POINTER nPointer ;
  808.         DELETE xbeK_DEL ;
  809.         INSERT xbeK_INS ;
  810.            ACTION {||lEditing := .t.,DC_GetRefresh(GetList)} ;
  811.            DEFAULT { Space(10), Space(1), 0, 0 } ;
  812.            EXIT {||lEditing := .f., ;
  813.                    _XSample49(11,aStructure,oBrowse,nPointer,,GetList), ;
  814.                    DC_GetRefresh(GetList),DC_ClearEvents()} ;
  815.            APPEND xbeK_ALT_A ;
  816.         EVAL {|o|o:hitBottomBlock := {||PostAppEvent(xbeP_Keyboard,xbeK_ALT_A,,oBrowse)} }
  817.  
  818. DCBROWSECOL ELEMENT 1 WIDTH 10 HEADER "Name" PARENT oBrowse ;
  819.    EDITOR 'NAME' ;
  820.    ID 'NAME_COLUMN'
  821.  
  822. DCBROWSECOL ELEMENT 2 WIDTH 5 HEADER "Type" PARENT oBrowse ;
  823.    EDITOR 'TYPE'
  824.  
  825. DCBROWSECOL ELEMENT 3 WIDTH 5 HEADER "Length" PARENT oBrowse ;
  826.    EDITOR 'LENGTH' ;
  827.    PROTECT {|o|!_XSample49(7,aStructure,oBrowse,nPointer)}
  828.  
  829. DCBROWSECOL ELEMENT 4 WIDTH 5 HEADER "Decimals" PARENT oBrowse ;
  830.    EDITOR 'DECIMALS' ;
  831.    PROTECT {|o|!_XSample49(8,aStructure,oBrowse,nPointer)}
  832.  
  833. @ NIL,NIL DCGET xNIL PICT "@!" GETID 'NAME'  ;
  834.           VALID {|o|_XSample49(1,aStructure,oBrowse,nPointer)}
  835.  
  836. aTypes := {{'C'},{'N'},{'D'},{'M'},{'L'}}
  837. @ NIL,NIL DCGET xNIL PICTURE '@!' ;
  838.           COMBO DATA aTypes HEIGHT 100 ELEMENT 1 ;
  839.           ID 'TYPE' ;
  840.           VALID {|o|_XSample49(2,aStructure,oBrowse,nPointer)}
  841.  
  842. @ NIL,NIL DCGET xNIL PICT "999" GETID 'LENGTH' ;
  843.           VALID {|o|_XSample49(3,aStructure,oBrowse,nPointer)}
  844.  
  845. @ NIL,NIL DCGET xNIL PICT "999"  GETID 'DECIMALS' ;
  846.           VALID {|o|_XSample49(4,aStructure,oBrowse,nPointer)} ;
  847.           WHEN {|o|_XSample49(8,aStructure,oBrowse,nPointer)}
  848.  
  849. @ 15,1 DCTOOLBAR oToolBar SIZE 45,1.2 BUTTONSIZE 9,1.2
  850.  
  851. DCADDBUTTON CAPTION '&Insert' PARENT oToolBar ;
  852.    TOOLTIP 'Add New Field' ;
  853.    ACCELKEY xbeK_ALT_I ;
  854.    WHEN {||!lEditing} ;
  855.    ACTION {||SetAppFocus(DC_GetObject(GetList,'NAME_COLUMN')), ;
  856.              PostAppEvent(xbeP_Keyboard,xbeK_INS,,oBrowse)}
  857.  
  858. DCADDBUTTON CAPTION '&Delete' PARENT oToolBar ;
  859.    TOOLTIP 'Delete Field' ;
  860.    ACCELKEY xbeK_ALT_D ;
  861.    WHEN {||!lEditing} ;
  862.    ACTION {||PostAppEvent(xbeP_Keyboard,xbeK_DEL,,oBrowse), ;
  863.              SetAppFocus(DC_GetObject(GetList,'NAME_COLUMN'))}
  864.  
  865. DCADDBUTTON CAPTION '&Replicate' PARENT oToolBar ;
  866.    TOOLTIP 'Replicate a Group of Fields' ;
  867.    ACCELKEY xbeK_ALT_R ;
  868.    WHEN {||!lEditing} ;
  869.    ACTION {||_XSample49(5,aStructure,oBrowse,nPointer)}
  870.  
  871. DCADDBUTTON CAPTION '&Ok' PARENT oToolBar ;
  872.    TOOLTIP 'Exit and Save Changes' ;
  873.    ACCELKEY xbeK_ALT_O ;
  874.    WHEN {||!lEditing} ;
  875.    ACTION {||_XSample49(9,,,,,GetList)}
  876.  
  877. DCADDBUTTON CAPTION '&Cancel' PARENT oToolBar ;
  878.    TOOLTIP 'Exit and Abort Changes' ;
  879.    ACCELKEY xbeK_ALT_C ;
  880.    WHEN {||!lEditing} ;
  881.    ACTION {||_XSample49(10,,,,,GetList)}
  882.  
  883. DCGETOPTIONS ABORTQUERY
  884.  
  885. DCREAD GUI FIT TITLE "Database Structure Editor";
  886.    OPTIONS GetOptions ;
  887.    MODAL ;
  888.    TO lOk ;
  889.    SETFOCUS 'NAME_COLUMN' ;
  890.    EVAL {|o|SetAppWindow(o)}
  891.  
  892. RETURN IIF( lOk, aStructure, aOldStruct )
  893.  
  894. /* ------------------- */
  895.  
  896. STATIC FUNCTION _XSample49( nAction, aStructure, oBrowse, ;
  897.                             nPointer, xValue, aGetList )
  898.  
  899. LOCAL nFound, GetList := {}, GetOptions, ;
  900.       nVarLength, nNumStart, nNumEnd, nVarPointer, cNewString, ;
  901.       cFieldName, cFieldType, nFieldLen, nFieldDec, nFieldNmbr, lOk, ;
  902.       nFieldCount, cVarName, cVar, i
  903.  
  904. IF nAction < 9
  905.   IF nPointer > Len(aStructure)
  906.     nPointer := Len(aStructure)
  907.   ENDIF
  908.   cFieldName := aStructure[nPointer,1]
  909.   cFieldType := aStructure[nPointer,2]
  910.   nFieldLen  := aStructure[nPointer,3]
  911.   nFieldDec  := aStructure[nPointer,4]
  912. ENDIF
  913.  
  914. IF nAction = 1 // Validate field name
  915.  
  916.   nFound := 0
  917.   FOR i := 1 TO LEN(aStructure)
  918.     IF ALLTRIM(Upper(aStructure[i,1]))==ALLTRIM(Upper(cFieldName)) .AND. i # nPointer
  919.       nFound := i
  920.       EXIT
  921.     ENDIF
  922.   NEXT
  923.  
  924.   IF Empty(cFieldName)
  925.      DC_WinAlert('Field name cannot be empty')
  926.      RETURN .f.
  927.   ELSEIF nFound # 0 .AND. nFound # nPointer
  928.      DC_WinAlert('Duplicate Field Name.  Please re-enter')
  929.      RETURN .f.
  930.   ENDIF
  931.  
  932. ELSEIF nAction = 2 // Validate field type
  933.  
  934.    IF !(cFieldType $ 'cClLmMnNdD')
  935.       DCMSGBOX 'Valid Field types are:', ;
  936.                '', ;
  937.                'C - Character', ;
  938.                'N - Numeric', ;
  939.                'D - Date', ;
  940.                'L - Logical', ;
  941.                'M - Memo' ;
  942.       TITLE 'Field Type Error'
  943.       RETURN .f.
  944.    ENDIF
  945.  
  946. ELSEIF nAction = 3 // Validate field Length
  947.  
  948.   IF nFieldLen <= 0
  949.      DC_WinAlert('Length cannot be less than 1')
  950.      RETURN .f.
  951.   ENDIF
  952.  
  953. ELSEIF nAction = 4 // Validate field decimals
  954.  
  955.   IF cFieldType $ 'cCdDlLmM'
  956.     aStructure[nPointer,4] := 0
  957.   ELSEIF nFieldDec > nFieldLen - 2
  958.      DC_WinAlert('Decimals cannot be greater than ' + ;
  959.                   Str(nFieldLen-2))
  960.      RETURN .f.
  961.   ENDIF
  962.  
  963. ELSEIF nAction = 5 // Replicate a set of fields
  964.  
  965.   cFieldName := SPACE(10)
  966.   nFieldNmbr := 0
  967.   cFieldType := ' '
  968.   nFieldLen := 1
  969.   nFieldDec := 0
  970.   @ 1,0 DCSAY 'This dialog will create a set of new fields with an automatic'
  971.   @ 2,0 DCSAY 'Incrementation of any imbedded number string in the field name.'
  972.   @ 3,0 DCSAY '  Caution: If replicating 10-99 fields, use 1 leading zero'
  973.   @ 4,0 DCSAY '  on start number.  Ex: NMBR_01_A'
  974.   @ 5,0 DCSAY '  If replicating 100-999 fields, use 2 leading zeros'
  975.   @ 6,0 DCSAY '  on start number.  Ex: TRANS_001'
  976.  
  977.   @ 8,0 DCSAY 'Field Name' GET cFieldName PICT '@!' ;
  978.         VALID {||_XSample49(1,aStructure,oBrowse,nPointer,cFieldName)} ;
  979.         SAYSIZE 25
  980.   @ 9,0 DCSAY 'Field Type' GET cFieldType PICT '@!' ;
  981.         VALID {||_XSample49(2,aStructure,oBrowse,nPointer,cFieldType)} ;
  982.         SAYSIZE 25
  983.   @10,0 DCSAY 'Field Length' GET nFieldLen PICT '999999' ;
  984.         VALID {||_XSample49(3,aStructure,oBrowse,nPointer,nFieldLen)} ;
  985.         SAYSIZE 25
  986.   @11,0 DCSAY 'Field Decimals' GET nFieldDec PICT '99' ;
  987.         VALID {||_XSample49(4,aStructure,oBrowse,nPointer,nFieldDec)} ;
  988.         SAYSIZE 25
  989.   @13,8 DCSAY 'Number of Fields to Replicate' GET nFieldNmbr PICT '999' ;
  990.         SAYSIZE 25
  991.  
  992.   DCGETOPTIONS SAYRIGHTJUST SAYWIDTH 350
  993.   DCREAD GUI FIT ADDBUTTONS TO lOk OPTIONS GetOptions MODAL ;
  994.      TITLE 'Replicate a Group of Fields'
  995.  
  996.   IF lOk .AND. !Empty(cFieldName) .AND. !Empty(cFieldType) ;
  997.       .AND. !Empty(nFieldLen)
  998.     FOR nFieldCount := 1 TO nFieldNmbr
  999.        AADD( aStructure,;
  1000.             { cFieldName, cFieldType, nFieldLen, nFieldDec, cFieldName } )
  1001.        cFieldName := _XSample49(6,aStructure,oBrowse,nPointer,cFieldName)
  1002.     NEXT
  1003.     oBrowse:refreshAll()
  1004.   ENDIF
  1005.  
  1006. ELSEIF nAction = 6 // Increment a numeric value within a string
  1007.  
  1008.   cVarName := xValue
  1009.   nVarLength := LEN(cVarName)
  1010.   nVarPointer := nVarLength
  1011.   DO WHILE nVarPointer>0
  1012.     IF SUBSTR(cVarName,nVarPointer,1)>='0' ;
  1013.       .AND. SUBSTR(cVarName,nVarPointer,1)<='9'
  1014.       EXIT
  1015.     ENDIF
  1016.     nVarPointer--
  1017.   ENDDO
  1018.   nNumEnd := nVarPointer
  1019.   DO WHILE nVarPointer>0
  1020.     IF (SUBSTR(cVarName,nVarPointer,1)<'0' ;
  1021.       .OR. SUBSTR(cVarName,nVarPointer,1)>'9') .AND. ;
  1022.       SUBSTR(cVarName,nVarPointer,1)#' '
  1023.       EXIT
  1024.     ENDIF
  1025.     nVarPointer--
  1026.   ENDDO
  1027.   nNumStart := nVarPointer+1
  1028.   cNewString := STRTRAN(STR(VAL(SUBSTR(cVarName,nNumStart,;
  1029.              nNumEnd-nNumStart+1))+1,nNumEnd-nNumStart+1),' ','0')
  1030.   cVar := SUBSTR(cVarName,1,nNumStart-1)+cNewString+;
  1031.           SUBSTR(cVarName,nNumEnd+1,nVarLength-nNumEnd)
  1032.  
  1033.   RETURN cVar
  1034.  
  1035. ELSEIF nAction = 7 // When test for Field Length
  1036.  
  1037.   IF cFieldType $ 'mMdDlL'
  1038.      RETURN .f.
  1039.   ENDIF
  1040.   RETURN .t.
  1041.  
  1042. ELSEIF nAction = 8 // When test for Field Decimals
  1043.  
  1044.   IF cFieldType $ 'mMdDlLcC'
  1045.      RETURN .f.
  1046.   ENDIF
  1047.   RETURN .t.
  1048.  
  1049. ELSEIF nAction = 9 // Exit and Save
  1050.  
  1051.   IF DC_MsgBox(,,{'Exit and Save Changes?'},,,,.t.)
  1052.     DC_ReadGuiEvent(DCGUI_EXIT_OK,aGetList)
  1053.   ENDIF
  1054.   RETURN .t.
  1055.  
  1056. ELSEIF nAction = 10 // Exit and Abort
  1057.  
  1058.   IF DC_MsgBox(,,{'Exit and Abort Changes?'},,,,.t.)
  1059.     DC_ReadGuiEvent(DCGUI_EXIT_ABORT,aGetList)
  1060.   ENDIF
  1061.   RETURN .t.
  1062.  
  1063. ELSEIF nAction = 11 // Test if Empty  or duplicate
  1064.  
  1065.   cFieldName := aStructure[nPointer,1]
  1066.   cFieldType := aStructure[nPointer,2]
  1067.   nFieldLen  := aStructure[nPointer,3]
  1068.  
  1069.   nFound := 0
  1070.   FOR i := 1 TO LEN(aStructure)
  1071.     IF ALLTRIM(Upper(aStructure[i,1]))==ALLTRIM(Upper(cFieldName)) .AND. i # nPointer
  1072.       nFound := i
  1073.       EXIT
  1074.     ENDIF
  1075.   NEXT
  1076.  
  1077.   IF (nFound # 0 .AND. nFound # nPointer ) .OR. Empty(cFieldName) .OR. ;
  1078.       Empty(cFieldType) .OR. Empty(nFieldLen)
  1079.      ADel(aStructure,nPointer)
  1080.      ASize(aStructure,Len(aStructure)-1)
  1081.      oBrowse:refreshAll()
  1082.   ENDIF
  1083.  
  1084. ENDIF
  1085.  
  1086. IF nPointer > Len(aStructure)
  1087.   nPointer := Len(aStructure)
  1088. ENDIF
  1089.  
  1090. aStructure[nPointer,2] := Upper(aStructure[nPointer,2])
  1091.  
  1092. IF cFieldType = 'C'
  1093.    aStructure[nPointer,4] := 0
  1094. ELSEIF cFieldType = 'M'
  1095.    aStructure[nPointer,3] := 10
  1096.    aStructure[nPointer,4] := 0
  1097. ELSEIF cFieldType = 'D'
  1098.    aStructure[nPointer,3] := 8
  1099.    aStructure[nPointer,4] := 0
  1100. ELSEIF cFieldType = 'L'
  1101.    aStructure[nPointer,3] := 1
  1102.    aStructure[nPointer,4] := 0
  1103. ENDIF
  1104.  
  1105. RETURN .t.
  1106. *** END OF EXAMPLE ***
  1107.  
  1108. /* ---------------------------- */
  1109.  
  1110. STATIC FUNCTION XSample_50
  1111.  
  1112. /*
  1113. Browse with SORT (Array)
  1114.  
  1115. This sample demonstrates how a right click in
  1116. the header area of a browse column will select the sort
  1117. order of the browse.
  1118. */
  1119.  
  1120. LOCAL GetList := {}, aDirectory, i, bSortCol, oBrowse
  1121.  
  1122. aDirectory := Directory()
  1123. FOR i := 1 TO Len(aDirectory)
  1124.   aDirectory[i,1] := Upper(aDirectory[i,1])
  1125. NEXT
  1126. ASort(aDirectory,,,{|x,y|x[1]<y[1]})
  1127.  
  1128. @ 3,1 DCBROWSE oBrowse DATA aDirectory ;
  1129.       SIZE 55,12 FONT '10.Helv Bold' ;
  1130.       PRESENTATION DC_BrowPres() ;
  1131.       SORTSCOLOR GRA_CLR_WHITE, GRA_CLR_DARKGRAY ;
  1132.       SORTUCOLOR GRA_CLR_WHITE, GRA_CLR_DARKGRAY ;
  1133.       SORTUPBITMAP BITMAP_RD_UP_DARKGRAY ;
  1134.       SORTDOWNBITMAP BITMAP_RD_DOWN_DARKGRAY  ;
  1135.       OPTIMIZE ;
  1136.       FIT ;
  1137.       EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITACROSS
  1138.  
  1139. bSortCol := {|a,n,o| _XSample50(aDirectory,n,oBrowse) }
  1140.  
  1141. DCBROWSECOL ELEMENT 1 WIDTH 12 HEADER "Name" ;
  1142.    PARENT oBrowse SORT bSortCol LEFTBUTTON
  1143.  
  1144. DCBROWSECOL ELEMENT 2 WIDTH 7 HEADER "Size" ;
  1145.    PARENT oBrowse SORT bSortCol LEFTBUTTON
  1146.  
  1147. DCBROWSECOL ELEMENT 3 WIDTH 8 HEADER "Date" ;
  1148.    PARENT oBrowse SORT bSortCol LEFTBUTTON
  1149.  
  1150. DCBROWSECOL ELEMENT 4 WIDTH 7 HEADER "Time" ;
  1151.    PARENT oBrowse SORT bSortCol LEFTBUTTON
  1152.  
  1153. DCREAD GUI FIT MODAL ADDBUTTONS ;
  1154.    TITLE 'Right click mouse in column Header'
  1155.  
  1156. RETURN nil
  1157.  
  1158. /* ----------------------- */
  1159.  
  1160. STATIC PROCEDURE _XSample50( aArray, nColumn, oBrowse )
  1161.  
  1162. LOCAL i, aUnSelected, aSelected, bBlock, oColumn
  1163.  
  1164. ASort( aArray,,,{|x,y|x[nColumn] < y[nColumn]} )
  1165.  
  1166. #ifdef EXPRESS17
  1167.   RETURN
  1168. #endif
  1169.  
  1170. #ifdef EXPRESS20
  1171.   RETURN
  1172. #endif
  1173.  
  1174. aUnSelected := { ;
  1175.                 { XBP_PP_COL_HA_FGCLR, GRA_CLR_BLACK }, ;
  1176.                 { XBP_PP_COL_HA_BGCLR, GRA_CLR_PALEGRAY } ;
  1177.                }
  1178.  
  1179. aSelected := { ;
  1180.                 { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE }, ;
  1181.                 { XBP_PP_COL_HA_BGCLR, GRA_CLR_RED } ;
  1182.              }
  1183.  
  1184. FOR i := 1 TO oBrowse:colCount
  1185.   oColumn := oBrowse:GetColumn(i)
  1186.   bBlock := oColumn:heading:lbDown
  1187.   IF i == nColumn
  1188.      oColumn:configure(,,,,aSelected)
  1189.   ELSE
  1190.      oColumn:configure(,,,,aUnSelected)
  1191.   ENDIF
  1192.   oColumn:heading:lbDown := bBlock
  1193. NEXT
  1194.  
  1195. RETURN
  1196. *** END OF EXAMPLE ***
  1197.  
  1198. /* ---------------------------- */
  1199.  
  1200. STATIC FUNCTION XSample_51
  1201.  
  1202. /*
  1203. Dialog with Mouse Origin
  1204.  
  1205. This sample demonstrates how a dialog will start at
  1206. the current location of the mouse using the ORIGIN
  1207. clause of DCGETOPTIONS.  Click on the button to the
  1208. right of the GET to popup the "origined" dialog.
  1209. */
  1210.  
  1211. LOCAL GetList := {}, GetOptions, cName := Space(15), ;
  1212.       lToggle := .f.
  1213.  
  1214. @ 0,0 DCSAY 'Enter Name' GET cName ;
  1215.    POPUP {|c|_XSample51(c,@lToggle)}
  1216.  
  1217. DCREAD GUI ;
  1218.    FIT ;
  1219.    MODAL ;
  1220.    ADDBUTTONS ;
  1221.    TITLE 'Origin Example' ;
  1222.    EVAL {|o|SetAppWindow(o)}
  1223.  
  1224. RETURN nil
  1225.  
  1226. /* ------------------- */
  1227.  
  1228. STATIC FUNCTION _XSample51( cName, lToggle )
  1229.  
  1230. LOCAL GetList := {}, GetOptions, aNames, nPointer, oBrowse, lOk
  1231.  
  1232. aNames := { {'George'},{'Hillary'},{'Ken'},{'Monica'},{'Bill'} }
  1233. nPointer := 1
  1234.  
  1235. @ 0,0 DCBROWSE oBrowse DATA aNames SIZE 20,7 ;
  1236.       POINTER nPointer ;
  1237.       DATALINK {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList) } ;
  1238.  
  1239. DCBROWSECOL ELEMENT 1 HEADER 'Name' PARENT oBrowse WIDTH 20
  1240.  
  1241. DCGETOPTIONS ;
  1242.    ORIGIN XBPDLG_ORIGIN_MOUSE ;
  1243.    NOTITLEBAR
  1244.  
  1245. DCREAD GUI ;
  1246.    FIT ;
  1247.    MODAL ;
  1248.    OPTIONS GetOptions ;
  1249.    BUTTONS DCGUI_BUTTON_CANCEL ;
  1250.    TITLE 'Double-Click to Select'  ;
  1251.    TO lOk ;
  1252.    EVAL {|o|IIF( lToggle, ;
  1253.                  o:SetPos({o:currentPos()[1], ;
  1254.                            o:currentPos()[2]-o:currentSize()[2] } ), ;
  1255.                  nil )}
  1256.  
  1257. lToggle := !lToggle
  1258.  
  1259. RETURN IIF( lOk, aNames[nPointer,1], cName )
  1260. *** END OF EXAMPLE ***
  1261.  
  1262.  
  1263. STATIC FUNCTION XSample_52
  1264.  
  1265. /*
  1266. GET Options
  1267.  
  1268. This sample demonstrate the PASSWORD and PROPER
  1269. options of the @ DCSAY..GET command.
  1270. */
  1271.  
  1272. LOCAL GetList := {}, cPass1, cPass2, oPassWord, cName
  1273.  
  1274. cName  := Space(30)
  1275. cPass1 := Space(10)
  1276. cPass2 := Space(10)
  1277.  
  1278. @ 1,1 DCSAY '     Enter your name' GET cName PROPER PROPOPTIONS {.f.,' -12345'} TABSTOP
  1279.  
  1280. @ 3,1 DCSAY ' Enter your password' GET cPass1 PASSWORD ;
  1281.       GETOBJECT oPassWord TABSTOP
  1282.  
  1283. @ 5,1 DCSAY 'Enter password again' GET cPass2 PASSWORD ;
  1284.       TABSTOP ;
  1285.       VALID {|x|x:=cPass1==cPass2, ;
  1286.                 IIF(!x,DC_MsgBox('Passwords do not match'),nil), ;
  1287.                 IIF(!x,SetAppFocus(oPassWord),nil), .t. }
  1288.  
  1289. DCREAD GUI MODAL FIT ADDBUTTONS
  1290.  
  1291. RETURN nil
  1292. *** END OF EXAMPLE ***
  1293.  
  1294.  
  1295. STATIC FUNCTION XSample_53
  1296.  
  1297. /*
  1298. SIZE Options 1
  1299.  
  1300. This sample demonstrate the MINSIZE and MAXSIZE
  1301. options.
  1302. */
  1303.  
  1304. LOCAL GetList := {}, GetOptions
  1305.  
  1306. @ 1,1 DCSAY 'Try to resize the window'
  1307.  
  1308. DCGETOPTIONS ;
  1309.    MINSIZE 200,50 ;
  1310.    MAXSIZE 400,300
  1311.  
  1312. DCREAD GUI FIT BUTTONS DCGUI_BUTTON_EXIT ;
  1313.    MODAL ;
  1314.    OPTIONS GetOptions ;
  1315.    TITLE 'MINSIZE/MAXSIZE Options'
  1316.  
  1317. RETURN nil
  1318. *** END OF EXAMPLE ***
  1319.  
  1320. /* ------------------ */
  1321.  
  1322. STATIC FUNCTION XSample_54
  1323.  
  1324. /*
  1325. SIZE Options 2
  1326.  
  1327. This sample demonstrates the NORESIZE option.
  1328. */
  1329.  
  1330. LOCAL GetList := {}, GetOptions
  1331.  
  1332. @ 1,1 DCSAY 'Try to resize the window'
  1333.  
  1334. DCGETOPTIONS ;
  1335.   NORESIZE
  1336.  
  1337. DCREAD GUI FIT BUTTONS DCGUI_BUTTON_EXIT ;
  1338.    MODAL ;
  1339.    OPTIONS GetOptions ;
  1340.    TITLE 'NORESIZE option'
  1341.  
  1342. RETURN nil
  1343. *** END OF EXAMPLE ***
  1344.  
  1345. /* ------------------- */
  1346.  
  1347. STATIC FUNCTION XSample_55
  1348.  
  1349. /*
  1350. COMBOBOX with Database Browse
  1351.  
  1352. This sample demonstrates the how to create a COMBOBOX
  1353. that uses a database as the picklist.
  1354. */
  1355.  
  1356. LOCAL GetList := {}, GetOptions, lBrowseActive, cCommand, ;
  1357.       aPres, oBrowse, cOwner, oBrowseCol, oCommand
  1358.  
  1359. IF !File('..\XDOC\EXPRESS.DBF')
  1360.    DC_MsgBox({'Sorry.  The database required to show this feature',;
  1361.               'is not included in the demonstration version.'})
  1362.    RETURN nil
  1363. ENDIF
  1364.  
  1365. SET DEFA TO ..\XDOC
  1366. USE EXPRESS VIA FOXCDX ALIAS XDOC EXCLUSIVE
  1367. SET INDEX TO EXPRESS.CDX
  1368.  
  1369. OrdSetFocus('COMMAND')
  1370.  
  1371. lBrowseActive := .f.
  1372. cCommand := Space(30)
  1373. cOwner := Space(20)
  1374.  
  1375. @ 1,1 DCSAY 'Enter Command Name'
  1376.  
  1377. @ 2,1 DCGET cCommand PICT '@!' ;
  1378.   GETSIZE 30 ;
  1379.   GETOBJECT oCommand ;
  1380.   POPUP {|c|lBrowseActive:=.t., ;
  1381.             DC_GetRefresh(GetList), ;
  1382.             SetAppFocus(oBrowseCol), ;
  1383.             c } ;
  1384.   GOTFOCUS {||IIF(lBrowseActive,SetAppFocus(oBrowseCol),nil)}
  1385.  
  1386. aPres := ;
  1387.   { { XBP_PP_COL_DA_ROWSEPARATOR, XBPCOL_SEP_DOTTED },  /* Row Sep  */     ;
  1388.     { XBP_PP_COL_DA_COLSEPARATOR, XBPCOL_SEP_DOTTED },  /* Col Sep  */     ;
  1389.     { XBP_PP_COL_DA_ROWHEIGHT, 14 },                  /* Row Height */     ;
  1390.     { XBP_PP_COL_DA_CELLHEIGHT, 14 },                /* Cell Height */     ;
  1391.     { XBP_PP_COL_HA_HEIGHT, 0 } }             /* Header Cell Height */
  1392.  
  1393. @ 3,1 DCBROWSE oBrowse SIZE 30,7 ;
  1394.   ALIAS 'XDOC ' ;
  1395.   PRESENTATION aPres ;
  1396.   HIDE {||!lBrowseActive} ;
  1397.   EVAL {|o|o:hScroll:=.f., ;
  1398.            o:sizeCols:=.f., ;
  1399.            o:configure()} ;
  1400.   DATALINK {||lBrowseActive:=.f., ;
  1401.               cCommand := XDOC->command, ;
  1402.               DC_GetRefresh(GetList), ;
  1403.               SetAppFocus(oCommand)} ;
  1404.  
  1405. @ 5,1 DCSAY 'Owner' GET cOwner ;
  1406.   HIDE {||lBrowseActive}
  1407.  
  1408. DCBROWSECOL FIELD XDOC->command WIDTH 30 ;
  1409.   PARENT oBrowse ;
  1410.   OBJECT oBrowseCol
  1411.  
  1412. DCREAD GUI FIT MODAL ADDBUTTONS ;
  1413.    TITLE 'ComboBox with Database'
  1414.  
  1415. RETURN nil
  1416. *** END OF EXAMPLE ***
  1417.  
  1418. /* -------------------- */
  1419.  
  1420. STATIC FUNCTION XSample_56()
  1421.  
  1422. /*
  1423. PROCESSING dialog
  1424.  
  1425. This sample demonstrates how to create a dialog window
  1426. with messages that get updated during processing.
  1427. */
  1428.  
  1429. LOCAL GetList := {}, oMainDlg, oSay1, oSay2, oSay3, oSay4
  1430.  
  1431. @ 1,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay1 FONT "10.Helv"
  1432. @ 3,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay2 FONT "10.Helv"
  1433. @ 5,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay3 FONT "10.Helv"
  1434. @ 7,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay4 FONT "10.Helv"
  1435.  
  1436. DCREAD GUI FIT PARENT @oMainDlg ;
  1437.    TITLE 'Updating Databases. Please wait' ;
  1438.    EXIT
  1439.  
  1440. oSay1:SetCaption("Step 1 - Creating Backup Files")
  1441. DC_Pause(2) //  Put Backup code here
  1442. oSay1:SetCaption(oSay1:caption+" - DONE ")
  1443.  
  1444. oSay2:SetCaption("Step 2 - Creating New Empty Files")
  1445. DC_Pause(2) // Put Create code here
  1446. oSay2:SetCaption(oSay2:caption+" - DONE ")
  1447.  
  1448. oSay3:SetCaption("Step 3 - Appending from Backup Files")
  1449. DC_Pause(2) // Put Append code here
  1450. oSay3:SetCaption(oSay3:caption+" - DONE ")
  1451.  
  1452. oSay4:SetCaption("Step 4 - Performing CleanUp")
  1453. DC_Pause(2) // Put Cleanup code here
  1454. oSay4:SetCaption(oSay4:caption+" - DONE ")
  1455.  
  1456. DC_Pause(1)
  1457. oMainDlg:destroy()
  1458.  
  1459. RETURN nil
  1460. *** END OF EXAMPLE ***
  1461.  
  1462.  
  1463. STATIC FUNCTION XSample_57()
  1464.  
  1465. /*
  1466. LISTBOX
  1467.  
  1468. This example shows how to implement 'Mark All' and '
  1469. Clear All' buttons in a DCLISTBOX command.
  1470. */
  1471.  
  1472. LOCAL GetList := {}, aFields:={}, cField:={}
  1473. LOCAL oListBox
  1474.  
  1475. AADD(aFields, 'Alice')
  1476. AADD(aFields, 'Bob')
  1477. AADD(aFields, 'Carol')
  1478. AADD(aFields, 'Dick')
  1479. AADD(aFields, 'Harry')
  1480. AADD(aFields, 'Ted')
  1481. AADD(aFields, 'Tom')
  1482.  
  1483. @ 0,0 DCLISTBOX cField LIST aFields ;
  1484.     FONT "10.Courier" ;
  1485.     SIZE 15,10 ;
  1486.     OBJECT oListBox ;
  1487.     SELECT {2,4,5,6,7}
  1488.  
  1489. @ 0, 17 DCPUSHBUTTON ;
  1490.     CAPTION '~Mark All' ;
  1491.     SIZE 10, 1.1 ;
  1492.     FONT '8.MS Sans Serif' ;
  1493.    ACTION {|| AEVAL(aFields, {|x,i| oListBox:setData(i, .T.)}), ;
  1494.               DC_VarFromListBox(oListBox)} ;
  1495.     RELATIVE oListBox
  1496.  
  1497. @ 1.5, 17 DCPUSHBUTTON ;
  1498.     CAPTION 'C~lear All' ;
  1499.     SIZE 10, 1.1 ;
  1500.     FONT '8.MS Sans Serif' ;
  1501.    ACTION {|| AEVAL(aFields, {|x,i| oListBox:setData(i, .F.)}), ;
  1502.               DC_VarFromListBox(oListBox)} ;
  1503.     RELATIVE oListBox
  1504.  
  1505. DCREAD GUI ;
  1506.   TITLE 'List Box Demo' ;
  1507.   FIT ;
  1508.   ADDBUTTONS ;
  1509.   MODAL
  1510.  
  1511. DC_MsgBox(cField)
  1512.  
  1513. RETURN nil
  1514. *** END OF EXAMPLE ***
  1515.  
  1516. STATIC FUNCTION XSample_58()
  1517.  
  1518. /*
  1519. EXIT VALIDATION
  1520.  
  1521. The radio buttons toggle the bottom date section.  The date
  1522. validation occurs under program control.  The program
  1523. defaults to the second button.  Clicking the first button
  1524. causes the VALID clauses to trigger on the items that are
  1525. grayed out.   Dialog will not exit without validating.
  1526. */
  1527.  
  1528.  
  1529.  
  1530. LOCAL GetList := {}, GetOptions, oStatic1, dFrom, dThru, ;
  1531.       lOk, cOption
  1532.  
  1533. SET CENTURY ON
  1534. SET DATE FORMAT TO 'mm/dd/yyyy'
  1535.  
  1536. dFrom := CTOD('')
  1537. dThru := CTOD('')
  1538.  
  1539. cOption := '2'
  1540.  
  1541. @ 0,0 DCSTATIC XBPSTATIC_TYPE_GROUPBOX ;
  1542.     SIZE 22, 4 ;
  1543.     CAPTION 'Which Error(s)?' ;
  1544.     OBJECT oStatic1
  1545.  
  1546. @ .8,1 DCRADIO cOption ;
  1547.     PROMPT 'All Errors' ;
  1548.     SIZE 20, 1 ;
  1549.     VALUE '1' ;
  1550.    PARENT oStatic1
  1551.  
  1552. @ 1.8,1 DCRADIO cOption ;
  1553.     PROMPT 'Last Error Only' ;
  1554.     SIZE 20, 1 ;
  1555.     VALUE '2' ;
  1556.    PARENT oStatic1
  1557.  
  1558. @ 2.8,1 DCRADIO cOption ;
  1559.     PROMPT 'Errors From/Thru' ;
  1560.     SIZE 20, 1 ;
  1561.     VALUE '3' ;
  1562.    PARENT oStatic1
  1563.  
  1564. @ 5.8,0 DCSAY 'From Date:' ;
  1565.     GET dFrom ;
  1566.     PICTURE '@D' ;
  1567.     WHEN {|| cOption == '3'} ;
  1568.    VALID {|x|x:=!EMPTY(dFrom) .OR. cOption#'3', ;
  1569.              IIF(!x,DC_WinAlert('FROM Date cannot be empty.'),nil), x }
  1570.  
  1571. @ 6.8,0 DCSAY 'Thru Date:' ;
  1572.     GET dThru ;
  1573.     PICTURE '@D' ;
  1574.     WHEN {|| cOption == '3'} ;
  1575.    VALID {|x|x:=!EMPTY(dThru) .OR. cOption#'3', ;
  1576.              IIF(!x,DC_WinAlert('THRU Date cannot be empty.'),nil), x }
  1577.  
  1578. DCGETOPTIONS ;
  1579.    SAYRIGHTJUST ;
  1580.    EXITVALIDATE
  1581.  
  1582. DCREAD GUI ;
  1583.     MODAL ;
  1584.     TO lOk ;
  1585.     FIT ;
  1586.     TITLE ' VIEW ERROR LOG OPTIONS ' ;
  1587.     ADDBUTTONS ;
  1588.    OPTIONS GetOptions ;
  1589.    EVAL {|o|SetAppWindow(o)}
  1590.  
  1591. DC_MsgBox({dFrom,dThru})
  1592.  
  1593. RETURN nil
  1594. *** END OF EXAMPLE ***
  1595.  
  1596. /* ----------------- */
  1597.  
  1598. STATIC FUNCTION XSample_59()
  1599.  
  1600. #include "dcpick.ch"
  1601.  
  1602. /*
  1603. PICKLIST
  1604.  
  1605. This example shows how to use the function
  1606. DC_VarToListBox() to select a new group  of
  1607. Picklist items.
  1608. */
  1609.  
  1610. LOCAL GetList := {}, GetOptions, aMen, aWomen, ;
  1611.       aListNames, aPickNames, oPickList, cOption
  1612.  
  1613. aMen := {'Bob','Dick','Harry','Ted','Tom','Bill','Ken'}
  1614. aWomen := {'Alice','Carol','Hillary','Monica','Chelsie'}
  1615. aListNames := {'One','Two','Three'}
  1616. aPickNames := {}
  1617.  
  1618. @1,3 DCRADIO cOption PROMPT 'Women' VALUE 'W' ;
  1619.      ACTION {|| aListNames := aWomen, DC_VarToListBox(oPickList) }
  1620.  
  1621. @2,3 DCRADIO cOption PROMPT 'Men' VALUE 'M' ;
  1622.      ACTION {|| aListNames := aMen, DC_VarToListBox(oPickList) }
  1623.  
  1624. @4,3 DCPICKLIST aPickNames LIST aListNames ;
  1625.    CAPTION "Available People", "Selected People" ;
  1626.     SIZE 35,12 ;
  1627.    OBJECT oPickList ;
  1628.    DATALINK {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)}
  1629.  
  1630. DCREAD GUI ;
  1631.    MODAL ;
  1632.    TITLE "Pick a Person" ;
  1633.    BUTTONS DCGUI_BUTTON_CANCEL ;
  1634.     FIT
  1635.  
  1636. DC_MsgBox(aPickNames)
  1637.  
  1638. RETURN nil
  1639. *** END OF EXAMPLE ***
  1640.  
  1641. /* --------------------- */
  1642.  
  1643. STATIC FUNCTION XSample_60 ( )
  1644.  
  1645. /*
  1646. This example demonstrates how to use the Xbase to
  1647. Clipper interface to improve performance of
  1648. database operations.
  1649. */
  1650.  
  1651. LOCAL lX2Clip := .f., oProgress, GetList := {}, ;
  1652.       i, nSeconds, dDate := Date(), cAreaCode := '777', ;
  1653.       lReplacing := .f., oButton
  1654.  
  1655. @ 2,1 DCSAY 'This routine will replace the date field with'
  1656. @ 3,1 DCSAY 'the entered value for the selected area code.'
  1657. @ 5,1 DCSAY ' New Date' GET dDate POPUP {|d|DC_PopDate(d)}
  1658. @ 6,1 DCSAY 'Area Code' GET cAreaCode PICT '999' WHEN {||.f.}
  1659. @ 8,1 DCPROGRESS oProgress SIZE 40,1.2 ;
  1660.       COLOR GRA_CLR_RED PERCENT ;
  1661.       EVERY IIF( lX2Clip,1,100 )
  1662. @ 8,45 DCPUSHBUTTON CAPTION 'Replace' OBJECT oButton ;
  1663.       SIZE 9,1.2 ;
  1664.       ACTION {||_XSample60( oProgress, oButton, lX2Clip, ;
  1665.                             @lReplacing, dDate, cAreaCode, ;
  1666.                             GetList ) } ;
  1667.       WHEN {||!lReplacing}
  1668. @10,1 DCCHECKBOX lX2Clip PROMPT 'Use Xbase to Clipper Interface'
  1669.  
  1670. DCREAD GUI FIT ADDBUTTONS ;
  1671.    MODAL ;
  1672.    TITLE "Database Operation Example" ;
  1673.    EVAL {|o|SetAppWindow(o)}
  1674.  
  1675. RETURN nil
  1676.  
  1677. /* ----------------------- */
  1678.  
  1679. STATIC FUNCTION _XSample60( oProgress, oButton, lX2Clip, ;
  1680.                             lReplacing, dDate, cAreaCode, ;
  1681.                             GetList )
  1682.  
  1683. LOCAL nSeconds, nHandle, aData, bEval, aParams, aReturn, ;
  1684.       nRecords := 0, nEvery
  1685.  
  1686. BEGIN SEQUENCE
  1687.  
  1688. lReplacing := .t.
  1689. DC_GetRefresh(GetList)
  1690. CLOSE ALL
  1691. nSeconds := Seconds()
  1692.  
  1693. SET DEFA TO
  1694. SET PATH TO ..\DATA
  1695.  
  1696. IF lX2Clip
  1697.   nHandle := DC_XCOpen( 15, .t. )
  1698.   IF nHandle <= 0
  1699.     BREAK
  1700.   ENDIF
  1701.   nEvery := 100
  1702.   aData := { Set(_SET_DEFAULT), Set(_SET_PATH), 'XTEST.DBF', ;
  1703.              'XTEST.CDX', 'DBFNTX', dDate, cAreaCode, nEvery }
  1704.   bEval := {|nCurr,nMax,nEvery|DC_GetProgress(oProgress,nCurr,nMax,nEvery)}
  1705.   aParams := DC_XCArray()
  1706.   aParams[XC_ARRAY_OPERATION] := XC_PROGRAM
  1707.   aParams[XC_ARRAY_PROGRAM]   := 'XClip60'
  1708.   aParams[XC_ARRAY_DATA]      := aData
  1709.   IF !DC_XCCall( nHandle, aParams, bEval, 5, @aReturn, .t. )
  1710.     BREAK
  1711.   ENDIF
  1712.   DC_XCClose(nHandle)
  1713.   nRecords := aReturn[1]
  1714. ELSE
  1715.   USE XTEST.DBF VIA 'DBFNTX'
  1716.   GO TOP
  1717.   nRecords := 0
  1718.   DO WHILE !Eof()
  1719.     IF XTEST->areacode == cAreaCode
  1720.        IF _RecLock(5)
  1721.          REPL XTEST->date WITH DTOC(dDate)
  1722.          nRecords++
  1723.          COMMIT
  1724.          UNLOCK
  1725.        ENDIF
  1726.     ENDIF
  1727.     DC_GetProgress(oProgress,RecNo(),RecCount())
  1728.     SKIP
  1729.   ENDDO
  1730. ENDIF
  1731. DC_GetProgress(oProgress,100,100)
  1732.  
  1733. DC_MsgBox({ Alltrim(Str(nRecords)) + ' records updated.', ;
  1734.             'Update time: ' +  ;
  1735.              Alltrim(Str(Seconds()-nSeconds)) + ' seconds!' })
  1736.  
  1737. DC_GetProgress(oProgress,0,100)
  1738.  
  1739. END SEQUENCE
  1740. lReplacing := .f.
  1741.  
  1742. RETURN nil
  1743. *** END OF EXAMPLE ***
  1744.  
  1745. /* --------------------- */
  1746.  
  1747. STATIC FUNCTION XSample_61 ( nMode )
  1748.  
  1749. /*
  1750. This example demonstrates a re-indexing
  1751. progress bar comparing the Xbase++ DBFCDX DBE (Mode 1)
  1752. to the Clipper DBFCDX RDD (Mode 2) which is called via
  1753. the X2CLIP interface.  This interface spawns a Clipper
  1754. program to create the index.
  1755. */
  1756.  
  1757. LOCAL aParams, nHandle, lStatus := .t., aIndex, oDlg, ;
  1758.       oSay, oProgress, bEval, lOk := .t., GetList := {}, ;
  1759.       i, nSeconds, oAppFocus := SetAppFocus()
  1760.  
  1761. nMode := IIF( Valtype(nMode)='N',nMode,1 )
  1762.  
  1763. IF nMode = 2
  1764.   nHandle := DC_XCOpen( nil, .t. )
  1765.   IF nHandle <= 0
  1766.     RETURN .f.
  1767.   ENDIF
  1768. ENDIF
  1769.  
  1770. @ 1,1 DCSAY 'Creating Indexes'
  1771. @ 2,1 DCSAY '' SAYOBJECT oSay SAYSIZE 40
  1772. @ 4,1 DCPROGRESS oProgress SIZE 40,1.2 ;
  1773.       COLOR GRA_CLR_RED PERCENT ;
  1774.       EVERY IIF( nMode=1,100,1 )
  1775.  
  1776. DCREAD GUI EXIT FIT PARENT @oDlg ;
  1777.    TITLE "Indexing Example" ;
  1778.    MODAL
  1779.  
  1780. BEGIN SEQUENCE
  1781.  
  1782. SET PATH TO ..\data
  1783. SET DEFA TO
  1784.  
  1785. IF nMode = 1
  1786.   USE XTEST.DBF VIA 'DBFCDX'
  1787. ELSEIF nMode = 2
  1788.   aParams := DC_XCArray()
  1789.   aParams[XC_ARRAY_DEFAULT] := Set(_SET_DEFAULT)
  1790.   aParams[XC_ARRAY_PATH] := Set(_SET_PATH)
  1791.   aParams[XC_ARRAY_DATABASE] := 'XTEST.DBF'
  1792.   aParams[XC_ARRAY_RDD] := 'DBFCDX'
  1793.   aParams[XC_ARRAY_OPERATION] := XC_OPENDATA
  1794.   IF !DC_XCCall( nHandle, aParams, nil, nil, nil, .t. )
  1795.     lOk := .f.
  1796.     BREAK
  1797.   ENDIF
  1798. ENDIF
  1799.  
  1800. aIndex := { ;
  1801.    { 'AREACODE','AREACODE',nil,.f.,.f.}, ;
  1802.    { 'EXCHANGE','EXCHANGE',nil,.f.,.f.}, ;
  1803.    { 'CITY',    'CITY',nil,.f.,.f.}      ;
  1804.   }
  1805.  
  1806. bEval := {|nCurr,nMax|DC_GetProgress(oProgress,nCurr,nMax)}
  1807.  
  1808. nSeconds := Seconds()
  1809.  
  1810. FOR i := 1 TO Len(aIndex)
  1811.   oSay:setCaption('Creating Tag ' + aIndex[i,2])
  1812.   IF nMode = 1
  1813.     ordCondSet( ,  ,,{||lOk} , ,  , RECNO(), , , ,  )
  1814.     ordCreate('XTEST.CDX', aIndex[i,1], aIndex[i,2], ;
  1815.                {||DC_GetProgress(oProgress,RecNo(),RecCount()), ;
  1816.                   DC_AppEvent( @lOk, 0, .01 ), ;
  1817.                   &(aIndex[i,2]) }, , .F. )
  1818.   ELSEIF nMode = 2
  1819.     aParams := DC_XCArray()
  1820.     aParams[XC_ARRAY_DEFAULT] := '\express\sample'
  1821.     aParams[XC_ARRAY_INDEX] := 'XTEST.CDX'
  1822.     aParams[XC_ARRAY_OPERATION] := XC_CREATEINDEX
  1823.     aParams[XC_ARRAY_TAG] := aIndex[i,1]
  1824.     aParams[XC_ARRAY_KEY] := aIndex[i,2]
  1825.     aParams[XC_ARRAY_FOR] := aIndex[i,3]
  1826.     aParams[XC_ARRAY_UNIQUE] := aIndex[i,4]
  1827.     aParams[XC_ARRAY_DESCEND] := aIndex[i,5]
  1828.     IF !DC_XCCall( nHandle, aParams, bEval, 5, nil, .t. )
  1829.       lOk := .f.
  1830.       BREAK
  1831.     ENDIF
  1832.   ENDIF
  1833. NEXT
  1834.  
  1835. DC_MsgBox('Index creation time: ' + Alltrim(Str(Seconds()-nSeconds)) + ' seconds!')
  1836.  
  1837. END SEQUENCE
  1838.  
  1839. oDlg:setModalState(XBP_DISP_MODELESS)
  1840. oDlg:Destroy()
  1841. SetAppFocus(oAppFocus)
  1842.  
  1843. IF nMode = 2
  1844.   DC_XCClose( nHandle )
  1845. ENDIF
  1846.  
  1847. RETURN lOk
  1848. *** END OF EXAMPLE ***
  1849.  
  1850. * ---------------------
  1851.  
  1852. STATIC FUNCTION XSample_62 ()
  1853.  
  1854. /*
  1855. This example demonstrates a re-indexing
  1856. progress bar comparing the Xbase++ DBFCDX DBE (Mode 1)
  1857. to the Clipper DBFCDX RDD (Mode 2) which is called via
  1858. the X2CLIP interface.  This interface spawns a Clipper
  1859. program to create the index.
  1860. */
  1861.  
  1862. XSample_61(2)
  1863. RETURN nil
  1864. *** END OF EXAMPLE ***
  1865.  
  1866. * ----------------------
  1867.  
  1868. STATIC FUNCTION XSample_63 ()
  1869.  
  1870. /*
  1871. This example demonstrates how to use the ABORTQUERY
  1872. and CLOSEQUERY clauses to control exiting of a dialog.
  1873. */
  1874.  
  1875. LOCAL GetList := {}, cName := Space(20), GetOptions
  1876.  
  1877. @ 1,1 DCSAY 'Press ESCape or Click on Close Button' SAYSIZE 0
  1878.  
  1879. @ 3,1 DCSAY 'Enter Name ' GET cName SAYSIZE 0
  1880.  
  1881. DCGETOPTIONS ;
  1882.    ABORTQUERY MSG {||_XSample63(1)} ;
  1883.    CLOSEQUERY MSG {||_XSample63(2)}
  1884.  
  1885. DCREAD GUI ;
  1886.    FIT ;
  1887.    TITLE 'ABORT or CLOSE Query' ;
  1888.    ADDBUTTONS ;
  1889.    OPTIONS GetOptions
  1890.  
  1891. RETURN nil
  1892.  
  1893. /* -------------------- */
  1894.  
  1895. STATIC FUNCTION _XSample63( nMode )
  1896.  
  1897. IF nMode = 1
  1898.   RETURN DC_MsgBox(,,{'Are you sure you want to abort?'},,,,.t.)
  1899. ELSEIF nMode = 2
  1900.   RETURN DC_MsgBox(,,{'Are you sure you want to exit?'},,,,.t.)
  1901. ENDIF
  1902. RETURN nil
  1903. *** END OF EXAMPLE ***
  1904.  
  1905. /* --------------------- */
  1906.  
  1907. STATIC FUNCTION XSample_64 ()
  1908.  
  1909. /*
  1910. This example demonstrates how to use the ACCELKEY
  1911. clause of DC* commands.
  1912. */
  1913.  
  1914. LOCAL GetList := {}, aGet[6]
  1915.  
  1916. AFill(aGet,Space(30))
  1917.  
  1918. @ 1,1 DCSAY 'Press F2 to go to this Get' GET aGet[2] ;
  1919.       ACCELKEY xbeK_F2 SAYRIGHT
  1920.  
  1921. @ 2,1 DCSAY 'Press F3 to go to this Get' GET aGet[3];
  1922.       ACCELKEY xbeK_F3 SAYRIGHT
  1923.  
  1924. @ 3,1 DCSAY 'Press F4 to go to this Get' GET aGet[4] ;
  1925.       ACCELKEY xbeK_F4 SAYRIGHT
  1926.  
  1927. @ 4,1 DCSAY 'Press F5 to go to this Get' GET aGet[5] ;
  1928.       ACCELKEY xbeK_F5 SAYRIGHT
  1929.  
  1930. @ 6,1 DCPUSHBUTTON CAPTION 'Hit F6' SIZE 10,1.2 ;
  1931.       ACCELKEY xbeK_F6 ;
  1932.       ACTION {||DC_MsgBox('F6 was hit')}
  1933.  
  1934. @ 6,12 DCPUSHBUTTON CAPTION 'Hit F7' SIZE 10,1.2 ;
  1935.       ACCELKEY xbeK_F7 ;
  1936.       ACTION {||DC_MsgBox('F7 was hit')}
  1937.  
  1938. DCREAD GUI FIT MODAL ADDBUTTONS EVAL {|o|SetAppWindow(o)} ;
  1939.    TITLE 'Accelerator Keys'
  1940.  
  1941. RETURN nil
  1942. *** END OF EXAMPLE ***
  1943.  
  1944. /* --------------------- */
  1945.  
  1946. STATIC FUNCTION XSample_65 ()
  1947.  
  1948. /*
  1949. Fancy PushButtons.
  1950. */
  1951.  
  1952. LOCAL GetList := {}, oDesc, oMemo, oGroup
  1953.  
  1954. USE COLLECT VIA DBFNTX EXCL
  1955.  
  1956. @ 1,1 DCSAY 'Description' GET COLLECT->descrip ;
  1957.       GETOBJECT oDesc GETSIZE 30 SAYSIZE 10 SAYRIGHT
  1958.  
  1959. @ 3,1 DCSAY 'Memo' SAYSIZE 5
  1960. @ 4,1 DCMULTILINE COLLECT->memo SIZE 48,12 ;
  1961.       OBJECT oMemo
  1962.  
  1963. @ 1,50 DCSTATIC XBPSTATIC_TYPE_TEXT OBJECT oGroup SIZE 18, 18
  1964.  
  1965. @ 1,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
  1966. @ 2,2 DCSAY 'Top of File' PARENT oGroup
  1967. @ 3,2 DCPUSHBUTTON CAPTION {BITMAP_TOP_1,BITMAP_TOP_2} ;
  1968.        SIZE 12,2 ;
  1969.        FANCY ;
  1970.        WHEN {||!DC_TestBof()} ;
  1971.        ACTION {||dbGoTop(),DC_GetRefresh(GetList)} ;
  1972.        PARENT oGroup
  1973.  
  1974. @ 5,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
  1975. @ 6,2 DCSAY 'Previous Record' PARENT oGroup
  1976. @ 7,2 DCPUSHBUTTON CAPTION {BITMAP_PREVIOUS_1,BITMAP_PREVIOUS_2} ;
  1977.        SIZE 12,2 ;
  1978.        FANCY ;
  1979.        WHEN {||!DC_TestBof()} ;
  1980.        ACTION {||dbSkip(-1),DC_GetRefresh(GetList)} ;
  1981.        PARENT oGroup
  1982.  
  1983. @ 9,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
  1984. @10,2 DCSAY 'Next Record' PARENT oGroup
  1985. @11,2 DCPUSHBUTTON CAPTION {BITMAP_NEXT_1,BITMAP_NEXT_2} ;
  1986.        FANCY ;
  1987.        SIZE 12,2 ;
  1988.        WHEN {||!DC_TestEof()} ;
  1989.        ACTION {||dbSkip(1),DC_GetRefresh(GetList)} ;
  1990.        PARENT oGroup
  1991.  
  1992. @13,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
  1993. @14,2 DCSAY 'Bottom of File' PARENT oGroup
  1994. @15,2 DCPUSHBUTTON CAPTION {BITMAP_BOTTOM_1,BITMAP_BOTTOM_2} ;
  1995.        FANCY ;
  1996.        WHEN {||!DC_TestEof()} ;
  1997.        SIZE 12,2 ;
  1998.        ACTION {||dbGoBottom(),DC_GetRefresh(GetList)} ;
  1999.        PARENT oGroup
  2000.  
  2001. @17,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
  2002.  
  2003. DCREAD GUI FIT ADDBUTTONS
  2004.  
  2005. RETURN nil
  2006. *** END OF EXAMPLE ***
  2007.  
  2008. /* --------------------- */
  2009.  
  2010. STATIC FUNCTION XSample_66 ()
  2011.  
  2012. /*
  2013. Adding rows of numbers.
  2014. */
  2015.  
  2016. LOCAL GetList := {}, nNumber1 := 0, nNumber2 := 0, nNumber3 := 0, ;
  2017.       bGet, bRefresh := {||DC_GetRefresh(GetList)}
  2018.  
  2019. @ 1,1 DCSAY 'Number 1' GET nNumber1 ;
  2020.       PICT '9999.99' LOSTFOCUS bRefresh ;
  2021.       TABSTOP GETID 'NUMBER1'
  2022.  
  2023. @ 2,1 DCSAY 'Number 2' GET nNumber2 ;
  2024.       PICT '9999.99' LOSTFOCUS bRefresh ;
  2025.       TABSTOP
  2026.  
  2027. @ 3,1 DCSAY 'Number 3' GET nNumber3 ;
  2028.       PICT '9999.99' LOSTFOCUS bRefresh ;
  2029.       TABSTOP
  2030.  
  2031. bGet := {||nNumber1+nNumber2+nNumber3}
  2032.  
  2033. @ 5,1 DCGET bGet EDITPROTECT {||.t.} PICT '999999.99' ;
  2034.       GETFONT '12.Helv Bold' GETSIZE 20,1.5
  2035.  
  2036. DCREAD GUI FIT ADDBUTTONS SETFOCUS 'NUMBER1'
  2037.  
  2038. RETURN nil
  2039. *** END OF EXAMPLE ***
  2040.  
  2041. /* --------------------- */
  2042.  
  2043. STATIC FUNCTION XSample_67 ()
  2044.  
  2045. /*
  2046. Browse with Bitmaps
  2047. */
  2048.  
  2049. LOCAL GetList := {}, aBitMap, oBitMapGroup, oBitMapBrow, aPres, ;
  2050.       GetOptions
  2051.  
  2052. @ 0,0 DCSTATIC XBPSTATIC_TYPE_RECESSEDBOX SIZE 50,13 ;
  2053.       OBJECT oBitMapGroup
  2054.  
  2055. aPres := ;
  2056.   { { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE },     /*  Header FG Color  */     ;
  2057.     { XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY },  /*  Header BG Color  */     ;
  2058.     { XBP_PP_COL_DA_ROWHEIGHT, 25 },                   /* Row Height */     ;
  2059.     { XBP_PP_COL_DA_CELLHEIGHT, 25 } }                /* Cell Height */     ;
  2060.  
  2061. aBitMap := { ;
  2062.    { BITMAP_NEXT_1, 'Next (enabled)'}, ;
  2063.    { BITMAP_PREVIOUS_1, 'Previous (enabled)'}, ;
  2064.    { BITMAP_TOP_1, 'Top (enabled)'}, ;
  2065.    { BITMAP_BOTTOM_1, 'Bottom (enabled)'}, ;
  2066.    { BITMAP_NEW_1, 'New (enabled)'}, ;
  2067.    { BITMAP_DELETE_1, 'Delete (enabled)'}, ;
  2068.    { BITMAP_SAVE_1, 'Save (enabled)'}, ;
  2069.    { BITMAP_HELP_1, 'Help (enabled)'}, ;
  2070.    { BITMAP_FIND_1, 'Find (enabled)'}, ;
  2071.    { BITMAP_NEXT_2, 'Next (disabled)'}, ;
  2072.    { BITMAP_PREVIOUS_2, 'Previous (disabled)'}, ;
  2073.    { BITMAP_TOP_2, 'Top (disabled)'}, ;
  2074.    { BITMAP_BOTTOM_2, 'Bottom (disabled)'}, ;
  2075.    { BITMAP_NEW_2, 'New (disabled)'}, ;
  2076.    { BITMAP_DELETE_2, 'Delete (disabled)'}, ;
  2077.    { BITMAP_SAVE_2, 'Save (disabled)'}, ;
  2078.    { BITMAP_HELP_2, 'Help (disabled)'}, ;
  2079.    { BITMAP_FIND_2, 'Find (disabled)'} }
  2080.  
  2081. @ 2,2 DCBROWSE oBitMapBrow PARENT oBitMapGroup DATA aBitMap ;
  2082.       SIZE 297,253 PIXEL ;
  2083.       FONT '10.Arial Bold' ;
  2084.       PRESENTATION aPres ;
  2085.       FIT
  2086.  
  2087. DCBROWSECOL ELEMENT 1 WIDTH 6 HEADER "BitMap" ;
  2088.    PARENT oBitMapBrow TYPE XBPCOL_TYPE_BITMAP
  2089.  
  2090. DCBROWSECOL ELEMENT 1 WIDTH 6 HEADER "Resource #" ;
  2091.    PARENT oBitMapBrow
  2092.  
  2093. DCBROWSECOL ELEMENT 2 WIDTH 25 HEADER "Description" ;
  2094.    PARENT oBitMapBrow
  2095.  
  2096. DCGETOPTIONS AUTORESIZE
  2097.  
  2098. DCREAD GUI ;
  2099.    OPTIONS GetOptions ;
  2100.    FIT ;
  2101.    MODAL ;
  2102.    BUTTONS DCGUI_BUTTON_OK ;
  2103.    TITLE 'Array Browse of BitMaps'
  2104.  
  2105. ReTURN nil
  2106. *** END OF EXAMPLE ***
  2107.  
  2108. /* --------------------- */
  2109.  
  2110. STATIC FUNCTION XSample_68 ()
  2111.  
  2112. /*
  2113. Printing Labels
  2114. */
  2115.  
  2116. LOCAL GetList := {}, aParts, oPrinter, nPrintMode, aPrintMode, ;
  2117.       oBrowse, oColumn1, nLabelHeight, aLabelHeight
  2118.  
  2119. aParts := { ;
  2120.    { 'A700','23-897600','Switch, Toggle, Single-action' }, ;
  2121.    { 'A701','23-897610','Switch, Toggle, Double-action' }, ;
  2122.    { 'A702','23-897770','Switch, Push, Lighted, Red' }, ;
  2123.    { 'A703','23-897771','Switch, Push, Lighted, Green' }, ;
  2124.    { 'A704','23-897672','Switch, Push, Lighted, Amber' }, ;
  2125.    { 'A705','23-897680','Switch, Push, 3-State' }, ;
  2126.    { 'A706','23-897690','Switch, Lever, Type A' }, ;
  2127.    { 'A707','23-897691','Switch, Lever, Type B' }, ;
  2128.    { 'A708','23-897692','Switch, Lever, Type C' }, ;
  2129.    { 'A709','23-898001','Switch, DIP, 8 position, Type A' }, ;
  2130.    { 'A710','23-898002','Switch, DIP, 12 position, Type A' }, ;
  2131.    { 'A711','23-899104','Switch, Rotary, 1/4 position' }, ;
  2132.    { 'A712','23-899105','Switch, Rotary, 1/8 position' }, ;
  2133.    { 'A713','23-899108','Switch, Rotary, 2/8 position' } }
  2134.  
  2135. @ 0,0 DCBROWSE oBrowse DATA aParts SIZE 50,10.5 ;
  2136.   CURSORMODE XBPBRW_CURSOR_ROW
  2137.  
  2138. DCBROWSECOL ELEMENT 1 PARENT oBrowse WIDTH 4 ;
  2139.    HEADER 'Bin #' OBJECT oColumn1
  2140.  
  2141. DCBROWSECOL ELEMENT 2 PARENT oBrowse WIDTH 6 ;
  2142.    HEADER 'Part No.'
  2143.  
  2144. DCBROWSECOL ELEMENT 3 PARENT oBrowse WIDTH 30 ;
  2145.    HEADER 'Description'
  2146.  
  2147. @ 12,5 DCPUSHBUTTON CAPTION 'Print' SIZE 9,2 ;
  2148.    ACTION {||_XSample68(nPrintMode,nLabelHeight,aParts)}
  2149.  
  2150. nLabelHeight := 0 //  1 inch
  2151. aLabelHeight := {'1 inch Labels', ;
  2152.                  '2 inch Labels', ;
  2153.                  '3 inch Labels'}
  2154. @ 12,20 DC3STATE nLabelHeight PROMPT aLabelHeight SIZE 17
  2155.  
  2156. nPrintMode := 1 // Preview
  2157. aPrintMode := {'Send to Printer','Preview on Screen','Send to File'}
  2158. @ 13,20 DC3STATE nPrintMode PROMPT aPrintMode SIZE 17
  2159.  
  2160.  
  2161.  
  2162. DCREAD GUI FIT ;
  2163.    BUTTONS DCGUI_BUTTON_EXIT ;
  2164.    SETFOCUS @oColumn1 ;
  2165.    TITLE 'Print Part Number Labels'
  2166.  
  2167. RETURN nil
  2168.  
  2169. /* ------------------- */
  2170.  
  2171. STATIC FUNCTION _XSample68( nPrintMode, nLabelHeight, aParts )
  2172.  
  2173. LOCAL oPrinter, i, nRow, nCol, oScrn, aWhiteOnBlack[GRA_AS_COUNT], ;
  2174.       aBlackOnWhite[GRA_AS_COUNT], aBoxAttr[GRA_AA_COUNT]
  2175.  
  2176. aWhiteOnBlack[GRA_AS_COLOR] := GRA_CLR_WHITE
  2177. aWhiteOnBlack[GRA_AS_BACKCOLOR] := GRA_CLR_BLACK
  2178. aWhiteOnBlack[GRA_AS_BGMIXMODE] := GRA_BGMIX_OVERPAINT
  2179.  
  2180. aBlackOnWhite[GRA_AS_COLOR] := GRA_CLR_BLACK
  2181. aBlackOnWhite[GRA_AS_BACKCOLOR] := GRA_CLR_WHITE
  2182. aBlackOnWhite[GRA_AS_BGMIXMODE] := GRA_BGMIX_OVERPAINT
  2183.  
  2184. aBoxAttr[GRA_AA_SYMBOL] := GRA_SYM_HALFTONE
  2185.  
  2186. BEGIN SEQUENCE
  2187.  
  2188. IF nPrintMode = 0  // Standard Print
  2189.   DCPRINT ON SIZE 64,80 TO oPrinter
  2190. ELSEIF nPrintMode = 1 // Preview
  2191.   DCPRINT ON SIZE 64,80 TO oPrinter PREVIEW HIDE
  2192. ELSEIF nPrintMode = 2 // Print to Text File
  2193.   DCPRINT ON SIZE 64,80 TO oPrinter TEXTONLY TOFILE
  2194. ENDIF
  2195.  
  2196. IF Valtype(oPrinter) # 'O' .OR. !oPrinter:lActive
  2197.   BREAK
  2198. ENDIF
  2199.  
  2200. IF nPrintMode # 1 // Preview
  2201.   oScrn := DC_WaitOn('Printing.. Please wait..')
  2202. ENDIF
  2203.  
  2204. IF nPrintMode = 0
  2205.   DCPRINT EJECT // Must do this so first page top margin is correct
  2206. ENDIF
  2207.  
  2208. nRow := 0
  2209. nCol := 1
  2210.  
  2211. FOR i := 1 TO Len(aParts)
  2212.  
  2213.   IF nRow > 55
  2214.     nRow := 0
  2215.     nCol := 1
  2216.     IF i > 1
  2217.       DCPRINT EJECT
  2218.     ENDIF
  2219.   ENDIF
  2220.  
  2221.   @ nRow - .2, nCol-1, nRow + 3.4, nCol+30 DCPRINT BOX ATTRIBUTE aBoxAttr ;
  2222.     FILL GRA_OUTLINEFILL
  2223.  
  2224.   @ nRow + .1, nCol DCPRINT SAY 'Bin: ' ATTRIBUTE aBlackOnWhite
  2225.  
  2226.   @ nRow + .1, DC_PrinterCol()+1 DCPRINT SAY aParts[i,1] ;
  2227.     FONT '14.Arial Bold' ATTRIBUTE aBlackonWhite // Bin No.
  2228.  
  2229.   @ DC_PrinterRow()+1.5, nCol DCPRINT SAY aParts[i,2] ;
  2230.     FONT '14.Helv Bold' ATTRIBUTE aWhiteOnBlack // Part No.
  2231.  
  2232.   @ DC_PrinterRow()+1.5, nCol DCPRINT SAY aParts[i,3] ;
  2233.     FONT '12.Courier' ATTRIBUTE aBlackOnWhite // Description
  2234.  
  2235.   IF ( i % 2 ) == 1
  2236.      nCol += 40
  2237.   ELSE
  2238.      nRow += 6.1 * ( nLabelHeight + 1 )
  2239.      nCol := 1
  2240.   ENDIF
  2241.  
  2242. NEXT
  2243.  
  2244. DCPRINT OFF
  2245.  
  2246. IF nPrintMode # 1
  2247.    DCMSGBOX 'Print Complete!'
  2248.    DC_Impl(oScrn)
  2249. ENDIF
  2250.  
  2251. END SEQUENCE
  2252.  
  2253. RETURN nil
  2254. *** END OF EXAMPLE ***
  2255.  
  2256. /* --------------------- */
  2257.  
  2258. STATIC FUNCTION XSample_69 ()
  2259.  
  2260. /*
  2261. DCGET with Drop Down
  2262. */
  2263.  
  2264. LOCAL GetList := {}, oGet1, oGet2, cFileName1, cFileName2
  2265.  
  2266. cFileName1 := cFileName2 := Space(12)
  2267.  
  2268. @ 1,1 DCSAY 'File Name 1' GET cFileName1 ;
  2269.       GETOBJECT oGet1 ;
  2270.       PICT '@!' POPUP {|c|_XSample69(c,oGet1)}
  2271.  
  2272. @ 2,1 DCSAY 'File Name 2' GET cFileName2 ;
  2273.       GETOBJECT oGet2 ;
  2274.       PICT '@!' POPUP {|c|_XSample69(c,oGet2)}
  2275.  
  2276. @ 6,1 DCSAY ''
  2277.  
  2278. DCREAD GUI ;
  2279.   FIT ;
  2280.   MODAL ;
  2281.   ADDBUTTONS
  2282.  
  2283. RETURN nil
  2284.  
  2285. /* ----------------------- */
  2286.  
  2287. STATIC FUNCTION _XSample69( cFileName, oGet )
  2288.  
  2289. LOCAL GetList := {}, oParent, nPointer, nCol, nRow, aData[2], ;
  2290.       nWidth, nHeight, GetOptions, aPres, oStatic, aDirectory, lOk
  2291.  
  2292. aDirectory := Directory()
  2293. oParent := oGet:setParent()
  2294. nCol := oGet:currentPos()[1]
  2295. nRow := oGet:currentPos()[2]
  2296. nWidth := oGet:currentSize()[1] + 20
  2297. nPointer := 1
  2298. nHeight := 138
  2299.  
  2300. aPres := { { XBP_PP_COL_HA_HEIGHT, 0 }, ;
  2301.            { XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
  2302.            { XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
  2303.  
  2304. @ nRow-nHeight, nCol DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX ;
  2305.   OBJECT oStatic ;
  2306.   SIZE nWidth, nHeight
  2307.  
  2308. @ 2,2 DCBROWSE aData[1] DATA aDirectory ;
  2309.   PARENT oStatic ;
  2310.   SIZE nWidth-4, nHeight-4 ;
  2311.   POINTER nPointer ;
  2312.   EVAL {|o|o:itemSelected := ;
  2313.         {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)}, ;
  2314.             o:hScroll:=.f., ;
  2315.             o:sizeCols:=.f., ;
  2316.             o:configure()}
  2317.  
  2318. DCBROWSECOL ELEMENT 1 HEADER 'File Name ' ;
  2319.    PRESENTATION aPres  ;
  2320.    PARENT aData[1] ;
  2321.    WIDTH nWidth ;
  2322.    OBJECT aData[2]
  2323.  
  2324. DCGETOPTIONS PIXEL NOTRANSLATE VISIBLE
  2325.  
  2326. DCREAD GUI ;
  2327.    PARENT oParent ;
  2328.    OPTIONS GetOptions ;
  2329.    SAVE ;
  2330.    SETFOCUS @aData[2] ;
  2331.    MODAL ;
  2332.    TO lOk ;
  2333.    HANDLER _XSample69_handler REFERENCE aData
  2334.  
  2335. DC_GetDestroy(GetList)
  2336.  
  2337. RETURN IIF( lOk,aDirectory[nPointer,1],cFileName)
  2338.  
  2339. /* ------------------------ */
  2340.  
  2341. STATIC FUNCTION ;
  2342.   _XSample69_Handler( nEvent, mp1, mp2, oXbp, oDlg, GetList, a, lOk )
  2343.  
  2344. IF Valtype(oXbp)='O' .AND. nEvent = xbeM_LbDown .AND. ;
  2345.   !(oXbp:setParent()==a[1]) .AND. !(oXbp:setParent()==a[2])
  2346.    RETURN DCGUI_EXIT_ABORT
  2347. ENDIF
  2348. RETURN DCGUI_NONE
  2349. *** END OF EXAMPLE ***
  2350.  
  2351. /* ----------------------- */
  2352.  
  2353. STATIC FUNCTION XSample_70()
  2354.  
  2355. /*
  2356. This example shows how to use the HILITEGETS clause of
  2357. DCGETOPTIONS to create a Colored Highlight rectangle around
  2358. selected Get
  2359. */
  2360.  
  2361. LOCAL GetList := {}, cGet1, cGet2, cGet3, GetOptions
  2362.  
  2363. cGet1 := cGet2 := cGet3 := Space(10)
  2364.  
  2365. @ 1,1 DCSAY 'Get 1' GET cGet1
  2366.  
  2367. @ 2.5,1 DCSAY 'Get 2' GET cGet2
  2368.  
  2369. @ 4,1 DCSAY 'Get 3' GET cGet3
  2370.  
  2371. DCGETOPTIONS HILITEGETS GRA_CLR_YELLOW
  2372.  
  2373. DCREAD GUI FIT ADDBUTTONS ;
  2374.    OPTIONS GetOptions ;
  2375.    TITLE 'Highlighted Gets'
  2376.  
  2377. RETURN nil
  2378. *** END OF EXAMPLE ***
  2379.  
  2380. /* ----------------------- */
  2381.  
  2382. STATIC FUNCTION XSample_71()
  2383.  
  2384. /*
  2385. This dialog automatically adds items not in a Combo-box list
  2386. to the array.
  2387. */
  2388.  
  2389. LOCAL GetList := {}, cName := Space(10), aNames, lOk
  2390.  
  2391. aNames := { 'Bob', 'Carol', 'Ted', 'Alice' }
  2392.  
  2393. @ 1,1 DCSAY 'Select a name from list or type in new name' ;
  2394.   SAYSIZE 30
  2395.  
  2396. @ 2,1 DCSAY 'and press ENTER' ;
  2397.   SAYSIZE 30
  2398.  
  2399. @ 3,1 DCCOMBOBOX cName LIST aNames SIZE 10,5 ;
  2400.   TYPE XBPCOMBO_SIMPLE ;
  2401.   EVAL {|o|o:keyboard:={|a,b,o|_XSample_71(a,b,o,aNames,@cName)} }
  2402.  
  2403. DCREAD GUI FIT ADDBUTTONS ;
  2404.    TITLE 'Adding Names to ComboBox' ;
  2405.    MODAL ;
  2406.    EVAL {|o|SetAppWindow(o)} ;
  2407.    TO lOk
  2408.  
  2409. IF lOk
  2410.   DC_Gui(.t.)
  2411.   DC_MsgBox(aNames)
  2412. ENDIF
  2413.  
  2414. RETURN nil
  2415.  
  2416. /* -------------------- */
  2417.  
  2418. STATIC FUNCTION _XSample_71( a,b,o,aNames,cName )
  2419.  
  2420. STATIC cBuffer
  2421.  
  2422. LOCAL i
  2423.  
  2424. IF !(a == xbeK_ENTER)
  2425.   cBuffer := Alltrim(o:XbpSle:EditBuffer())
  2426. ENDIF
  2427.  
  2428. IF a == xbeK_ENTER .AND. !Empty(cBuffer)
  2429.  
  2430.   IF Ascan(aNames,{|c|c==cBuffer}) = 0
  2431.     AAdd(aNames,cBuffer)
  2432.     ASort(aNames)
  2433.     o:Clear()
  2434.     FOR i := 1 TO Len(aNames)
  2435.       o:addItem(aNames[i])
  2436.     NEXT
  2437.     cName := Space(10)
  2438.     o:XbpSle:setData()
  2439.   ENDIF
  2440. ENDIF
  2441. RETURN nil
  2442. *** END OF EXAMPLE ***
  2443.  
  2444. /* ----------------------- */
  2445.  
  2446. STATIC FUNCTION XSample_72()
  2447.  
  2448. /*
  2449. This dialog displays a running clock.
  2450. */
  2451.  
  2452. LOCAL GetList := {}, dDate := Date(), cTime := Time(), ;
  2453.       oStatic, lActive := .t., lOk, oTime
  2454.  
  2455. @ 1,1 DCSAY 'Enter Date' GET dDate ;
  2456.       POPUP {|d|DC_PopDate(d)} ;
  2457.       SAYRIGHT PIXEL
  2458.  
  2459. @ 40,1 DCSAY 'Enter Time' GET cTime ;
  2460.        SAYRIGHT PIXEL
  2461.  
  2462. @100,140 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX ;
  2463.        SIZE 76, 22 PIXEL OBJECT oStatic
  2464.  
  2465. @ 2,2 DCSAY Time() PARENT oStatic SAYSIZE 72,18 PIXEL ;
  2466.       SAYFONT '8.Alaska Crt' SAYOBJECT oTime
  2467.  
  2468. DCREAD GUI FIT ADDBUTTONS ;
  2469.    TO lOk ;
  2470.    EVAL {|o|o:=Thread():new(), ;
  2471.             o:Start({||_XSample72(lActive,oTime)}) }
  2472.  
  2473. lActive := .f.
  2474. Sleep(50)
  2475.  
  2476. RETURN nil
  2477.  
  2478. /* -------------------- */
  2479.  
  2480. STATIC FUNCTION _XSample72( lActive, oTime )
  2481.  
  2482. DO WHILE lActive
  2483.   Sleep(50)
  2484.   oTime:SetCaption(Time())
  2485. ENDDO
  2486.  
  2487. RETURN nil
  2488. *** END OF EXAMPLE ***
  2489.  
  2490. * ---------------------
  2491.  
  2492. STATIC FUNCTION _reclock ( nWaitTime )
  2493.  
  2494. LOCAL  nWait
  2495.  
  2496. nWaitTime := IIF(Valtype(nWaitTime)='N',nWaitTime,1)
  2497. IF DBRLOCK()
  2498.   RETURN (.T.)   // locked
  2499. ENDIF
  2500. DO WHILE .T.
  2501.   nWait := nWaitTime
  2502.   DO WHILE (nWaitTime=0 .OR. nWait>0)
  2503.     IF DBRLOCK()     // locked
  2504.       RETURN (.T.)
  2505.     ENDIF
  2506.     INKEY(.5)     // wait 1/2 second
  2507.     nWait  :=  nWait - .5
  2508.   ENDDO
  2509.   RETURN .F.
  2510. ENDDO
  2511. RETURN (.F.)      // not locked
  2512.  
  2513.  
  2514.  
  2515.