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 >
Wrap
Text File
|
2002-01-30
|
64KB
|
2,515 lines
*-- PROGRAM FILE -------------------------------------------------------------
* Application: eXPress++ Library
* Description: eXPress++ sample programs
* File Name: xsample2.prg
* Author: Roger Donnay Tester:
* Date created: 11/04/98 Date updated: 11/07/2001
* Copyright: (c) 2001 by DONNAY Software Designs
*-----------------------------------------------------------------------------
#include "DCDIALOG.CH"
#include "SET.CH"
#include "XBP.CH"
#include "APPEVENT.CH"
#include "dcpick.ch"
#include "dcapp.ch"
#include "dcbitmap.ch"
#include "dcicon.ch"
#include "dccursor.ch"
#include "dcxtoc.ch"
#include "class.ch"
#include "font.ch"
#INCLUDE "dcprint.CH"
FUNCTION X_Samples_2( oDialog )
LOCAL GetList := {}, nTest := 0, cMemo := '', oMemo, i, j, oDlg, ;
lDebugCreate := .f., lDebugEvent := .f., GetOptions, aApp[1], ;
cTitle, oDlgWindow, aCoords, oSourceFile, cSource
SET DEFA TO
SET PATH TO ..\DATA
cTitle := 'eXPress++ Sample Programs (Set 2)'
nTest := 0
cMemo := ''
lDebugEvent := .f.
lDebugCreate := .f.
FOR i := 1 TO 5
FOR j := 1 TO 6
nTest++
@ j-1,1 + (i-1)*14 DCRADIO nTest ;
VALUE nTest ;
PROMPT XSample_Header(nTest) ;
ACTION {||XSample_Memo(nTest,oMemo,oSourceFile,@cSource)}
NEXT j
NEXT i
nTest := 1
@ 2,73 DCPUSHBUTTON CAPTION 'Run Sample' ;
SIZE 12, 1 ;
ACTION {||XSample_Run(nTest,oDialog,lDebugCreate,lDebugEvent)}
@ 3,73 DCPUSHBUTTON CAPTION 'Print Source' ;
SIZE 12, 1 ;
ACTION {||XSample_Print(cSource)}
@ 4,73 DCPUSHBUTTON CAPTION 'Exit' ;
SIZE 12, 1 ;
ACTION {||PostAppEvent(xbeP_Close,,,oDlg)}
@ 5,73 DCCHECKBOX lDebugEvent PROMPT 'Debug Events'
@ 6.3,5 DCSAY '' SAYSIZE 60 COLOR GRA_CLR_DARKBLUE ;
OBJECT oSourceFile FONT '8.Courier Bold'
@ 7,1 DCMULTILINE cMemo ;
OBJECT oMemo ;
SIZE 85,12 ;
FONT '8.Alaska Crt'
DCGETOPTIONS ;
ICON ICON_EXPRESS ;
CASCADE
DCREAD GUI ;
OPTIONS GetOptions ;
EVAL {||XSample_Memo(nTest,oMemo,oSourceFile,@cSource)} ;
APPWINDOW oDialog ;
PARENT @oDlg ;
TITLE cTitle ;
FIT
CLOSE DATABASES
RETURN nil
* -------------------------
STATIC FUNCTION XSample_Memo( nTest, oMemo, oSourceFile, cSource )
LOCAL cFunction, nFound, cSourceFile
cSource := ''
nTest += 42
cFunction := 'XSample_' + Alltrim(Str(nTest))
cSourceFile := 'XSAMPLE2.PRG'
cSource := MemoRead(cSourceFile)
IF Empty(cSource)
cSourceFile := '..\PRG\XSAMPLE2.PRG'
cSource := MemoRead(cSourceFile)
ENDIF
IF Empty(cSource)
cSource := 'XSAMPLE2.PRG cannot be found'
ENDIF
nFound := AT('FUNCTION ' + cFunction,cSource)
cSource := Substr(cSource,nFound)
nFound := AT('*** END OF EXAMPLE ***',cSource)
cSource := Substr(cSource,1,nFound+21)
IF !Empty(cSource)
oMemo:setData(cSource)
oSourceFile:setCaption(cSourceFile)
ENDIF
RETURN nil
* -------------------
STATIC FUNCTION XSample_Print( cSource )
LOCAL oPrinter, nLineCount := MLCount(cSource), i, cMemoLine, nRow
DCPRINT ON TO oPrinter PREVIEW FONT '10.Courier' NONSTOP HIDE
IF Valtype(oPrinter) # 'O' .OR. !oPrinter:lActive
RETURN nil
ENDIF
nRow := 1
FOR i := 1 TO nLineCount - 1
cMemoLine := MemoLine( cSource, nil, i )
@ nRow++,2 DCPRINT SAY cMemoLine PRINTER oPrinter
IF nRow > 60
DCPRINT EJECT
nRow := 1
ENDIF
NEXT
DCPRINT OFF
RETURN nil
* ---------------------
STATIC FUNCTION XSample_Run( nTest, oDialog, lDebugCreate, lDebugEvent )
LOCAL nDebug := 0
DC_Gui(.t.)
nTest += 42
IF lDebugCreate
nDebug += DCGUI_DEBUG_CREATE
ENDIF
IF lDebugEvent
nDebug += DCGUI_DEBUG_EVENTS
ENDIF
DC_ReadGuiDebug(nDebug)
CLOSE ALL
SET DEFA TO
IF nTest = 43
XSample_43()
ELSEIF nTest = 44
XSample_44()
ELSEIF nTest = 45
XSample_45()
ELSEIF nTest = 46
XSample_46()
ELSEIF nTest = 47
XSample_47()
ELSEIF nTest = 48
XSample_48()
ELSEIF nTest = 49
XSample_49()
ELSEIF nTest = 50
XSample_50()
ELSEIF nTest = 51
XSample_51()
ELSEIF nTest = 52
XSample_52()
ELSEIF nTest = 53
XSample_53()
ELSEIF nTest = 54
XSample_54()
ELSEIF nTest = 55
XSample_55()
ELSEIF nTest = 56
XSample_56()
ELSEIF nTest = 57
XSample_57()
ELSEIF nTest = 58
XSample_58()
ELSEIF nTest = 59
XSample_59()
ELSEIF nTest = 60
XSample_60()
ELSEIF nTest = 61
XSample_61()
ELSEIF nTest = 62
XSample_62()
ELSEIF nTest = 63
XSample_63()
ELSEIF nTest = 64
XSample_64()
ELSEIF nTest = 65
XSample_65()
ELSEIF nTest = 66
XSample_66()
ELSEIF nTest = 67
XSample_67()
ELSEIF nTest = 68
XSample_68()
ELSEIF nTest = 69
XSample_69()
ELSEIF nTest = 70
XSample_70()
ELSEIF nTest = 71
XSample_71()
ELSEIF nTest = 72
XSample_72()
ELSEIF nTest = 73
ELSEIF nTest = 74
ELSEIF nTest = 75
ELSEIF nTest = 76
ELSEIF nTest = 77
ELSEIF nTest = 78
ELSEIF nTest = 79
ELSEIF nTest = 80
ELSEIF nTest = 81
ELSEIF nTest = 82
ELSEIF nTest = 83
ELSEIF nTest = 84
ENDIF
DC_ClearEvents()
RETURN nil
/* ---------------------------- */
STATIC FUNCTION XSample_Header( nTest, oDlg )
nTest += 42
IF nTest = 43
RETURN "AutoSeek 1"
ELSEIF nTest = 44
RETURN "AutoSeek 2"
ELSEIF nTest = 45
RETURN "Drag/Drop"
ELSEIF nTest = 46
RETURN "Cut/Paste"
ELSEIF nTest = 47
RETURN 'ParaCombo'
ELSEIF nTest = 48
RETURN 'BrowNoBars'
ELSEIF nTest = 49
RETURN 'ArrayEdit'
ELSEIF nTest = 50
RETURN 'ColumnSort'
ELSEIF nTest = 51
RETURN 'Origin'
ELSEIF nTest = 52
RETURN 'GET Options'
ELSEIF nTest = 53
RETURN 'DialogSize 1'
ELSEIF nTest = 54
RETURN 'DialogSize 2'
ELSEIF nTest = 55
RETURN 'Combo/Data'
ELSEIF nTest = 56
RETURN 'Processing'
ELSEIF nTest = 57
RETURN 'ListBox'
ELSEIF nTest = 58
RETURN 'ProgValid'
ELSEIF nTest = 59
RETURN 'PickList'
ELSEIF nTest = 60
RETURN 'XtoClipper'
ELSEIF nTest = 61
RETURN 'IndexSlow'
ELSEIF nTest = 62
RETURN 'IndexFast'
ELSEIF nTest = 63
RETURN 'ExitQuery'
ELSEIF nTest = 64
RETURN 'Accelerators'
ELSEIF nTest = 65
RETURN 'FancyButt'
ELSEIF nTest = 66
RETURN 'Totalling'
ELSEIF nTest = 67
RETURN 'BitMapBrow'
ELSEIF nTest = 68
RETURN 'PrintLabels'
ELSEIF nTest = 69
RETURN 'Get/Combo'
ELSEIF nTest = 70
RETURN 'HiliteGets'
ELSEIF nTest = 71
RETURN 'Combo/Add'
ELSEIF nTest = 72
RETURN 'Clock'
ENDIF
RETURN ''
//* ---------------------------- */
STATIC FUNCTION XSample_43
/*
Browse with AUTOSEEK (DataBase)
This sample demonstrates a single @ DCSAY..GET and a Browse. The
GET is used to enter a string to seek.
*/
LOCAL GetList := {}, cSeek := Space(20), oBrowse
IF !File('..\XDOC\EXPRESS.DBF')
DC_MsgBox({'Sorry. The database required to show this feature',;
'is not included in the demonstration version', ;
'or the ..\XDOC\EXPRESS.DBF file does not exist'})
RETURN nil
ENDIF
SET DEFA TO ..\XDOC
USE EXPRESS VIA FOXCDX EXCLUSIVE ALIAS 'XDOC'
SET INDEX TO EXPRESS.CDX
OrdSetFocus('COMMAND')
SET DEFA TO
@ 1,1 DCSAY 'Seek' GET cSeek SAYRIGHT PICT '@!' ;
KEYBLOCK {|a,b,o|_XSample_43(a,b,o,oBrowse,@cSeek)}
@ 3,1 DCBROWSE oBrowse ALIAS 'XDOC' SIZE 77,11.8
DCBROWSECOL FIELD XDOC->command HEADER "Command" PARENT oBrowse ;
WIDTH 7
DCBROWSECOL FIELD XDOC->type HEADER "Type" PARENT oBrowse ;
WIDTH 6
DCBROWSECOL FIELD XDOC->category HEADER "Category" PARENT oBrowse ;
WIDTH 6
DCBROWSECOL FIELD XDOC->short HEADER "Short Description" PARENT oBrowse
DCBROWSECOL FIELD XDOC->module HEADER "Module" PARENT oBrowse ;
DCBROWSECOL FIELD XDOC->see_also HEADER "See Also" PARENT oBrowse
DCBROWSECOL DATA {||XDOC->(recno())} HEADER "Record" PARENT oBrowse ;
WIDTH 4
DCREAD GUI ;
TITLE 'AUTOSEEK Demo' ;
FIT ;
ADDBUTTONS ;
MODAL
RETURN nil
/* ---------------------- */
STATIC FUNCTION _XSample_43( a, b, o, oBrowse, cSeek )
LOCAL lClearBuffer := .t., lSoftSeek := Set(_SET_SOFTSEEK,.t.)
IF a = xbeK_UP
oBrowse:up()
ELSEIF a = xbeK_DOWN
oBrowse:down()
ELSEIF a = xbeK_PGUP
oBrowse:pageup()
ELSEIF a = xbeK_PGDN
oBrowse:pagedown()
ELSEIF a = xbeK_END
oBrowse:gobottom()
ELSEIF a = xbeK_HOME
oBrowse:gotop()
ELSE
SEEK AllTrim(o:EditBuffer())
lClearBuffer := .f.
ENDIF
oBrowse:refreshall()
IF lClearBuffer
cSeek := Space(20)
o:Get:home()
o:setData()
ENDIF
Set(_SET_SOFTSEEK,lSoftSeek)
RETURN nil
*** END OF EXAMPLE ***
//* ---------------------------- */
STATIC FUNCTION XSample_44
/*
Browse with AUTOSEEK (Array)
This sample demonstrates a single @ DCSAY..GET and a Browse. The
GET is used to enter a string to seek.
*/
LOCAL GetList := {}, cSeek := Space(20), oBrowse, aDirectory, i
@ 1,1 DCSAY 'Seek' GET cSeek SAYRIGHT PICT '@!' ;
GETEVAL {|oXbp|oXbp:keyboard := {|a,b,o|_XSample_44(a,b,o,oBrowse)} }
aDirectory := Directory()
FOR i := 1 TO Len(aDirectory)
aDirectory[i,1] := Upper(aDirectory[i,1])
NEXT
ASort(aDirectory,,,{|x,y|x[1]<y[1]})
@ 3,1 DCBROWSE oBrowse DATA aDirectory ;
SIZE 55,12 FONT '10.Helv Bold' ;
FIT ;
PRESENTATION DC_BrowPres()
DCBROWSECOL ELEMENT 1 WIDTH 10 HEADER "Name" PARENT oBrowse
DCBROWSECOL ELEMENT 2 WIDTH 7 HEADER "Size" PARENT oBrowse
DCBROWSECOL ELEMENT 3 WIDTH 8 HEADER "Date" PARENT oBrowse
DCBROWSECOL ELEMENT 4 WIDTH 6 HEADER "Time" PARENT oBrowse
DCREAD GUI ;
FIT ;
MODAL ;
BUTTONS DCGUI_BUTTON_OK + DCGUI_BUTTON_CANCEL ;
TITLE 'Array Browse of Directory'
RETURN nil
/* ---------------------- */
STATIC FUNCTION _XSample_44( a, b, o, oBrowse )
LOCAL aArray := oBrowse:cargo[5], nElement
nElement := AScan(aArray,{|x|Upper(x[1])=Upper(Alltrim(o:editBuffer()))})
IF nElement > 0
IF IsMemberVar(oBrowse,'arrayElement') // eXPress++ 1.7 or later
oBrowse:arrayElement := nElement
ENDIF
oBrowse:cargo[4] := nElement
oBrowse:refreshAll()
ENDIF
RETURN nil
*** END OF EXAMPLE ***
/* ---------------------------- */
STATIC FUNCTION XSample_45
/*
Drag and Drop
This sample demonstrates dragging a value from a row/column in
an array browse to another row/column. The value in the cell
that is grabbed is swapped with the value in the cell dropped.
*/
LOCAL GetList := {}, oBrowse, aDirectory, i
aDirectory := Directory()
FOR i := 1 TO Len(aDirectory)
aDirectory[i,1] := Upper(aDirectory[i,1])
NEXT
ASort(aDirectory,,,{|x,y|x[1]<y[1]})
@ 3,1 DCBROWSE oBrowse DATA aDirectory ;
SIZE 43,12 FONT '10.Helv Bold' ;
PRESENTATION DC_BrowPres()
DCBROWSECOL ELEMENT 1 WIDTH 30 HEADER "File Name" PARENT oBrowse
DCREAD GUI ;
FIT ;
MODAL ;
BUTTONS DCGUI_BUTTON_EXIT ;
TITLE 'Drag a Value from one Row to another' ;
HANDLER _XSample_45 REFERENCE @oBrowse
RETURN nil
/* ------------------- */
STATIC FUNCTION ;
_XSample_45 ( nEvent, mp1, mp2, oXbp, oDlg, GetList, oBrowse )
STATIC lButtonDown := .f., nTopRow, nGrabRow, cFileName, oCellGroup
LOCAL oColumn, nRowPos, nElement, lHitBottom := .f.
IF Valtype(oXbp) = 'O'
/* -- Left button pressed in a cell -- */
IF nEvent = xbeM_LbDown .AND. oXbp:ClassName() = 'XbpCellGroup'
nRowPos := Int((oXbp:currentSize()[2]-mp1[2]) / (oXbp:CellRect(1)[4]-oXbp:CellRect(1)[2]))
oBrowse:forcestable()
nElement := oBrowse:cargo[4] // Get current array pointer
nTopRow := nElement - nRowPos
nGrabRow := nElement
oBrowse:setPointer( nil, POINTER_MOVE_1, 1)
lButtonDown := .t.
oCellGroup := oXbp
/* -- Left button released in new cell -- */
ELSEIF nEvent = xbeM_LbUp .AND. oXbp:ClassName() = 'XbpCellGroup' .AND. ;
oXbp == oCellGroup
nRowPos := Int((oXbp:currentSize()[2]-mp1[2]) / (oXbp:CellRect(1)[4]-oXbp:CellRect(1)[2]))
nElement := nTopRow + nRowPos
cFileName := oBrowse:cargo[5,nElement,1]
oBrowse:cargo[5,nElement,1] := oBrowse:cargo[5,nGrabRow,1]
oBrowse:cargo[5,nGrabRow,1] := cFileName
oBrowse:refreshAll()
oBrowse:setPointer( nil, 1, 1 )
lButtonDown := .f.
ELSEIF lButtonDown
oBrowse:setPointer( nil, POINTER_MOVE_1, 1)
/* -- Mouse moved in Bottom ScrollBar area -- */
IF nEvent = xbeM_Motion .AND. oXbp:ClassName() = 'XbpScrollbar' .AND. ;
oXbp:type = XBPSCROLL_HORIZONTAL
DO WHILE oBrowse:cargo[4] < Len(oBrowse:cargo[5])
IF oBrowse:RowPos+1 = oBrowse:RowCount
nTopRow++
ENDIF
oBrowse:down()
oBrowse:refreshAll()
nEvent := AppEvent( @mp1, @mp2, @oXbp, .1 )
IF nEvent = xbeM_LbUp
EXIT
ELSEIF nEvent = xbeP_None .OR. Valtype(oXbp) # 'O' .OR. oXbp:ClassName() = 'XbpScrollbar'
Sleep(7)
LOOP
ENDIF
EXIT
ENDDO
/* -- Mouse moved in Header area -- */
ELSEIF nEvent = xbeM_Motion .AND. oXbp:ClassName() = 'XbpCellGroup' .AND. ;
!(oXbp==oCellGroup) .AND. oXbp:setParent()==oCellGroup:setParent()
DO WHILE oBrowse:cargo[4] > 1
IF oBrowse:RowPos = 1
nTopRow--
ENDIF
oBrowse:up()
oBrowse:refreshAll()
nEvent := AppEvent( @mp1, @mp2, @oXbp, .1 )
IF nEvent = xbeM_LbUp
EXIT
ELSEIF nEvent = xbeP_None .OR. Valtype(oXbp) # 'O' .OR. ;
(oXbp:ClassName() = 'XbpCellGroup' .AND. ;
!(oXbp==oCellGroup) .AND. oXbp:setParent()==oCellGroup:setParent())
Sleep(7)
LOOP
ENDIF
EXIT
ENDDO
ENDIF
ENDIF
ENDIF
IF nEvent = xbeM_LbUp
lButtonDown := .f.
ENDIF
RETURN DCGUI_NONE
*** END OF EXAMPLE ***
/* ---------------------------- */
STATIC FUNCTION XSample_46
/*
Cut and Paste
This sample demonstrates cutting a value from a row/column in
an array browse and pasting it to another row/column. The value
in the cell that is cut is swapped with the value in the cell
pasted. Use the right mouse button.
*/
LOCAL GetList := {}, oBrowse, aSchedule, i, j, oMenuBrow
aSchedule := Array(24)
FOR i := 1 TO 24
aSchedule[i] := Array(8)
aSchedule[i,1] := Str(i,2) + ':00'
FOR j := 2 TO 8
aSchedule[i,j] := Space(25)
NEXT
NEXT
aSchedule[6,2] := Pad('John Smith',25)
aSchedule[8,3] := Pad('Laurie Jones',25)
aSchedule[9,4] := Pad('Tom Walker',25)
aSchedule[7,5] := Pad('Nancy Buffet',25)
@ 3,1 DCBROWSE oBrowse DATA aSchedule ;
SIZE 80,14.5 FREEZELEFT {1} ;
EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITDOWN ;
DELETE xbeK_DEL ;
INSERT xbeK_INS ;
RBSELECT
DCBROWSECOL ELEMENT 1 WIDTH 4 HEADER "Time" PARENT oBrowse
DCBROWSECOL ELEMENT 2 WIDTH 9 HEADER "Sunday" PARENT oBrowse
DCBROWSECOL ELEMENT 3 WIDTH 9 HEADER "Monday" PARENT oBrowse
DCBROWSECOL ELEMENT 4 WIDTH 9 HEADER "Tuesday" PARENT oBrowse
DCBROWSECOL ELEMENT 5 WIDTH 9 HEADER "Wednesday" PARENT oBrowse
DCBROWSECOL ELEMENT 6 WIDTH 9 HEADER "Thursday" PARENT oBrowse
DCBROWSECOL ELEMENT 7 WIDTH 9 HEADER "Friday" PARENT oBrowse
DCBROWSECOL ELEMENT 8 WIDTH 9 HEADER "Saturday" PARENT oBrowse
DCSUBMENU oMenuBrow PROMPT "&Browse" PARENT oBrowse
DCMENUITEM "~Cut" PARENT oMenuBrow ACTION {||_XSample_46(oBrowse,2)}
DCMENUITEM "C~opy" PARENT oMenuBrow ACTION {||_XSample_46(oBrowse,3)}
DCMENUITEM "~Paste" PARENT oMenuBrow ACTION {||_XSample_46(oBrowse,4)}
DCREAD GUI ;
FIT ;
MODAL ;
BUTTONS DCGUI_BUTTON_EXIT ;
TITLE 'Double Click to EDIT, Right Click to Cut/Paste' ;
EVAL {||_XSample_46(@oBrowse,1,@oMenuBrow,1)}
RETURN nil
/* -------------------------- */
STATIC FUNCTION _XSample_46 ( oBrowse, nMode, oMenuBrow )
STATIC cClipData
LOCAL i, aChildList, oXbp, nRow, nCol, oCellGroup
IF nMode = 1
aChildList := oBrowse:ChildList()
FOR i := 2 TO 8
oXbp := oBrowse:getColumn(i)
oCellGroup := oXbp:dataArea
/* -- Attach menu to each cellgroup -- */
oCellGroup:RbDown := DC_MergeBlocks(oCellGroup:RbDown,;
{ |x,y,z| oMenuBrow:PopUp ( nil, x, 1 , ;
XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN ) })
NEXT
ELSEIF nMode = 2 // Cut
nRow := oBrowse:cargo[4]
nCol := oBrowse:colPos
cClipData := oBrowse:cargo[5,nRow,nCol]
oBrowse:cargo[5,nRow,nCol] := Space(25)
oBrowse:refreshCurrent()
ELSEIF nMode = 3 // Copy
nRow := oBrowse:cargo[4]
nCol := oBrowse:colPos
cClipData := oBrowse:cargo[5,nRow,nCol]
ELSEIF nMode = 4 // Paste
nRow := oBrowse:cargo[4]
nCol := oBrowse:colPos
oBrowse:cargo[5,nRow,nCol] := cClipData
oBrowse:refreshCurrent()
ENDIF
RETURN nil
*** END OF EXAMPLE ***
/* ------------------------ */
STATIC FUNCTION XSample_47()
/* This example shows how to create two combo boxes which link
to each other thus allowing the operator to choose a pay
method from either combo box */
LOCAL aPayType, aTextList, aCodeList, cCodeName, cTextName, ;
GetList := {}, oCode, oText
aPayType:= {{PADR("Visa ",30) ,"V "},;
{PADR("MasterCard",30) ,"M "},;
{PADR("Cash",30) ,"C "},;
{PADR("Account",30) ,"A "},;
{PADR("Discover",30) ,"D "},;
{PADR("Net-30",30) ,"N "},;
{PADR("ChecK",30) ,"K "},;
{PADR("Other",30) ,"O "},;
{SPACE(30) ,SPACE(5)} }
aTextList:= DC_AConvert(aPayType)[1]
aCodeList:= DC_AConvert(aPayType)[2]
cCodeName:= aCodeList[1]
cTextName:= aTextList[1]
@ 1,2 DCCOMBOBOX cCodeName LIST aCodeList SIZE 7,5 OBJECT oCode ;
DATALINK {||oText:XbpSLE:setData(cTextName := ;
aTextList[ASCAN(aCodeList,cCodeName)] ) }
@ 1,9 DCCOMBOBOX cTextName LIST aTextList SIZE 20,5 OBJECT oText ;
DATALINK {||oCode:XbpSLE:setData(cCodeName := ;
aCodeList[ASCAN(aTextList,cTextName)] ) }
DCREAD GUI FIT MODAL ADDBUTTONS
DC_MsgBox({'You Chose:', cCodeName, cTextName})
RETURN cCodeName
*** END OF EXAMPLE ***
/* ------------------------ */
STATIC FUNCTION XSample_48()
/*
This example shows how to create a browse without scroll bars.
The :configure() method is necessary because the EVAL code
block is evaluated after :create()
*/
LOCAL aPayType, GetList := {}, oBrowse, oBrowBox
aPayType:= {{PADR("Visa ",30) ,"V "},;
{PADR("MasterCard",30) ,"M "},;
{PADR("Cash",30) ,"C "},;
{PADR("Account",30) ,"A "},;
{PADR("Discover",30) ,"D "},;
{PADR("Net-30",30) ,"N "},;
{PADR("ChecK",30) ,"K "},;
{PADR("Other",30) ,"O "}}
@ 1,2 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX OBJECT oBrowBox ;
SIZE 30, 10
@ .1,.2 DCBROWSE oBrowse DATA aPayType SIZE 29.4,9.7 ;
PARENT oBrowBox ;
EVAL {|o|o:hScroll:=.f., ;
o:vScroll:=.f., ;
o:sizeCols:=.f., ;
o:configure()}
DCBROWSECOL ELEMENT 1 WIDTH 10 Header "Description" ;
PARENT oBrowse
DCBROWSECOL ELEMENT 2 WIDTH 8 Header "Code" ;
PARENT oBrowse
DCREAD GUI FIT ADDBUTTONS MODAL ;
TITLE 'Browse with no Scroll Bars'
RETURN nil
*** END OF EXAMPLE ***
/* ------------------- */
STATIC FUNCTION XSample_49()
/*
This example shows how to create an array editor using
cell-editing. This is a database structure array editor.
*/
LOCAL oBrowse, aStructure, aFields, GetList := {}, ;
oToolBar, GetOptions, aOldStruct, lOk, nPointer, ;
aField, xNIL := NIL, aTypes, aData, lEditing := .f.
USE collect VIA 'DBFNTX'
aStructure := dbstruct()
aOldStruct := AClone(aStructure)
aFields := ARRAY(LEN(aStructure))
aFields := aStructure[1]
FOR nPointer := 1 TO Len(aStructure)
aStructure[nPointer,1] := Pad(aStructure[nPointer,1],10)
NEXT
nPointer := 1
@ .1,.5 DCBROWSE oBrowse DATA aStructure ;
SIZE 43,14.1 ;
FIT ;
PRESENTATION DC_BrowPres() ;
NOHORIZSCROLL ;
EDIT xbeBRW_ItemSelected ;
MODE DCGUI_BROWSE_EDITACROSSDOWN ;
ACTION {||lEditing:=.t.,DC_GetRefresh(GetList)} ;
EXIT {||lEditing:=.f., ;
_XSample49(11,aStructure,oBrowse,nPointer,,GetList), ;
DC_GetRefresh(GetList)} ;
INTO aField ;
POINTER nPointer ;
DELETE xbeK_DEL ;
INSERT xbeK_INS ;
ACTION {||lEditing := .t.,DC_GetRefresh(GetList)} ;
DEFAULT { Space(10), Space(1), 0, 0 } ;
EXIT {||lEditing := .f., ;
_XSample49(11,aStructure,oBrowse,nPointer,,GetList), ;
DC_GetRefresh(GetList),DC_ClearEvents()} ;
APPEND xbeK_ALT_A ;
EVAL {|o|o:hitBottomBlock := {||PostAppEvent(xbeP_Keyboard,xbeK_ALT_A,,oBrowse)} }
DCBROWSECOL ELEMENT 1 WIDTH 10 HEADER "Name" PARENT oBrowse ;
EDITOR 'NAME' ;
ID 'NAME_COLUMN'
DCBROWSECOL ELEMENT 2 WIDTH 5 HEADER "Type" PARENT oBrowse ;
EDITOR 'TYPE'
DCBROWSECOL ELEMENT 3 WIDTH 5 HEADER "Length" PARENT oBrowse ;
EDITOR 'LENGTH' ;
PROTECT {|o|!_XSample49(7,aStructure,oBrowse,nPointer)}
DCBROWSECOL ELEMENT 4 WIDTH 5 HEADER "Decimals" PARENT oBrowse ;
EDITOR 'DECIMALS' ;
PROTECT {|o|!_XSample49(8,aStructure,oBrowse,nPointer)}
@ NIL,NIL DCGET xNIL PICT "@!" GETID 'NAME' ;
VALID {|o|_XSample49(1,aStructure,oBrowse,nPointer)}
aTypes := {{'C'},{'N'},{'D'},{'M'},{'L'}}
@ NIL,NIL DCGET xNIL PICTURE '@!' ;
COMBO DATA aTypes HEIGHT 100 ELEMENT 1 ;
ID 'TYPE' ;
VALID {|o|_XSample49(2,aStructure,oBrowse,nPointer)}
@ NIL,NIL DCGET xNIL PICT "999" GETID 'LENGTH' ;
VALID {|o|_XSample49(3,aStructure,oBrowse,nPointer)}
@ NIL,NIL DCGET xNIL PICT "999" GETID 'DECIMALS' ;
VALID {|o|_XSample49(4,aStructure,oBrowse,nPointer)} ;
WHEN {|o|_XSample49(8,aStructure,oBrowse,nPointer)}
@ 15,1 DCTOOLBAR oToolBar SIZE 45,1.2 BUTTONSIZE 9,1.2
DCADDBUTTON CAPTION '&Insert' PARENT oToolBar ;
TOOLTIP 'Add New Field' ;
ACCELKEY xbeK_ALT_I ;
WHEN {||!lEditing} ;
ACTION {||SetAppFocus(DC_GetObject(GetList,'NAME_COLUMN')), ;
PostAppEvent(xbeP_Keyboard,xbeK_INS,,oBrowse)}
DCADDBUTTON CAPTION '&Delete' PARENT oToolBar ;
TOOLTIP 'Delete Field' ;
ACCELKEY xbeK_ALT_D ;
WHEN {||!lEditing} ;
ACTION {||PostAppEvent(xbeP_Keyboard,xbeK_DEL,,oBrowse), ;
SetAppFocus(DC_GetObject(GetList,'NAME_COLUMN'))}
DCADDBUTTON CAPTION '&Replicate' PARENT oToolBar ;
TOOLTIP 'Replicate a Group of Fields' ;
ACCELKEY xbeK_ALT_R ;
WHEN {||!lEditing} ;
ACTION {||_XSample49(5,aStructure,oBrowse,nPointer)}
DCADDBUTTON CAPTION '&Ok' PARENT oToolBar ;
TOOLTIP 'Exit and Save Changes' ;
ACCELKEY xbeK_ALT_O ;
WHEN {||!lEditing} ;
ACTION {||_XSample49(9,,,,,GetList)}
DCADDBUTTON CAPTION '&Cancel' PARENT oToolBar ;
TOOLTIP 'Exit and Abort Changes' ;
ACCELKEY xbeK_ALT_C ;
WHEN {||!lEditing} ;
ACTION {||_XSample49(10,,,,,GetList)}
DCGETOPTIONS ABORTQUERY
DCREAD GUI FIT TITLE "Database Structure Editor";
OPTIONS GetOptions ;
MODAL ;
TO lOk ;
SETFOCUS 'NAME_COLUMN' ;
EVAL {|o|SetAppWindow(o)}
RETURN IIF( lOk, aStructure, aOldStruct )
/* ------------------- */
STATIC FUNCTION _XSample49( nAction, aStructure, oBrowse, ;
nPointer, xValue, aGetList )
LOCAL nFound, GetList := {}, GetOptions, ;
nVarLength, nNumStart, nNumEnd, nVarPointer, cNewString, ;
cFieldName, cFieldType, nFieldLen, nFieldDec, nFieldNmbr, lOk, ;
nFieldCount, cVarName, cVar, i
IF nAction < 9
IF nPointer > Len(aStructure)
nPointer := Len(aStructure)
ENDIF
cFieldName := aStructure[nPointer,1]
cFieldType := aStructure[nPointer,2]
nFieldLen := aStructure[nPointer,3]
nFieldDec := aStructure[nPointer,4]
ENDIF
IF nAction = 1 // Validate field name
nFound := 0
FOR i := 1 TO LEN(aStructure)
IF ALLTRIM(Upper(aStructure[i,1]))==ALLTRIM(Upper(cFieldName)) .AND. i # nPointer
nFound := i
EXIT
ENDIF
NEXT
IF Empty(cFieldName)
DC_WinAlert('Field name cannot be empty')
RETURN .f.
ELSEIF nFound # 0 .AND. nFound # nPointer
DC_WinAlert('Duplicate Field Name. Please re-enter')
RETURN .f.
ENDIF
ELSEIF nAction = 2 // Validate field type
IF !(cFieldType $ 'cClLmMnNdD')
DCMSGBOX 'Valid Field types are:', ;
'', ;
'C - Character', ;
'N - Numeric', ;
'D - Date', ;
'L - Logical', ;
'M - Memo' ;
TITLE 'Field Type Error'
RETURN .f.
ENDIF
ELSEIF nAction = 3 // Validate field Length
IF nFieldLen <= 0
DC_WinAlert('Length cannot be less than 1')
RETURN .f.
ENDIF
ELSEIF nAction = 4 // Validate field decimals
IF cFieldType $ 'cCdDlLmM'
aStructure[nPointer,4] := 0
ELSEIF nFieldDec > nFieldLen - 2
DC_WinAlert('Decimals cannot be greater than ' + ;
Str(nFieldLen-2))
RETURN .f.
ENDIF
ELSEIF nAction = 5 // Replicate a set of fields
cFieldName := SPACE(10)
nFieldNmbr := 0
cFieldType := ' '
nFieldLen := 1
nFieldDec := 0
@ 1,0 DCSAY 'This dialog will create a set of new fields with an automatic'
@ 2,0 DCSAY 'Incrementation of any imbedded number string in the field name.'
@ 3,0 DCSAY ' Caution: If replicating 10-99 fields, use 1 leading zero'
@ 4,0 DCSAY ' on start number. Ex: NMBR_01_A'
@ 5,0 DCSAY ' If replicating 100-999 fields, use 2 leading zeros'
@ 6,0 DCSAY ' on start number. Ex: TRANS_001'
@ 8,0 DCSAY 'Field Name' GET cFieldName PICT '@!' ;
VALID {||_XSample49(1,aStructure,oBrowse,nPointer,cFieldName)} ;
SAYSIZE 25
@ 9,0 DCSAY 'Field Type' GET cFieldType PICT '@!' ;
VALID {||_XSample49(2,aStructure,oBrowse,nPointer,cFieldType)} ;
SAYSIZE 25
@10,0 DCSAY 'Field Length' GET nFieldLen PICT '999999' ;
VALID {||_XSample49(3,aStructure,oBrowse,nPointer,nFieldLen)} ;
SAYSIZE 25
@11,0 DCSAY 'Field Decimals' GET nFieldDec PICT '99' ;
VALID {||_XSample49(4,aStructure,oBrowse,nPointer,nFieldDec)} ;
SAYSIZE 25
@13,8 DCSAY 'Number of Fields to Replicate' GET nFieldNmbr PICT '999' ;
SAYSIZE 25
DCGETOPTIONS SAYRIGHTJUST SAYWIDTH 350
DCREAD GUI FIT ADDBUTTONS TO lOk OPTIONS GetOptions MODAL ;
TITLE 'Replicate a Group of Fields'
IF lOk .AND. !Empty(cFieldName) .AND. !Empty(cFieldType) ;
.AND. !Empty(nFieldLen)
FOR nFieldCount := 1 TO nFieldNmbr
AADD( aStructure,;
{ cFieldName, cFieldType, nFieldLen, nFieldDec, cFieldName } )
cFieldName := _XSample49(6,aStructure,oBrowse,nPointer,cFieldName)
NEXT
oBrowse:refreshAll()
ENDIF
ELSEIF nAction = 6 // Increment a numeric value within a string
cVarName := xValue
nVarLength := LEN(cVarName)
nVarPointer := nVarLength
DO WHILE nVarPointer>0
IF SUBSTR(cVarName,nVarPointer,1)>='0' ;
.AND. SUBSTR(cVarName,nVarPointer,1)<='9'
EXIT
ENDIF
nVarPointer--
ENDDO
nNumEnd := nVarPointer
DO WHILE nVarPointer>0
IF (SUBSTR(cVarName,nVarPointer,1)<'0' ;
.OR. SUBSTR(cVarName,nVarPointer,1)>'9') .AND. ;
SUBSTR(cVarName,nVarPointer,1)#' '
EXIT
ENDIF
nVarPointer--
ENDDO
nNumStart := nVarPointer+1
cNewString := STRTRAN(STR(VAL(SUBSTR(cVarName,nNumStart,;
nNumEnd-nNumStart+1))+1,nNumEnd-nNumStart+1),' ','0')
cVar := SUBSTR(cVarName,1,nNumStart-1)+cNewString+;
SUBSTR(cVarName,nNumEnd+1,nVarLength-nNumEnd)
RETURN cVar
ELSEIF nAction = 7 // When test for Field Length
IF cFieldType $ 'mMdDlL'
RETURN .f.
ENDIF
RETURN .t.
ELSEIF nAction = 8 // When test for Field Decimals
IF cFieldType $ 'mMdDlLcC'
RETURN .f.
ENDIF
RETURN .t.
ELSEIF nAction = 9 // Exit and Save
IF DC_MsgBox(,,{'Exit and Save Changes?'},,,,.t.)
DC_ReadGuiEvent(DCGUI_EXIT_OK,aGetList)
ENDIF
RETURN .t.
ELSEIF nAction = 10 // Exit and Abort
IF DC_MsgBox(,,{'Exit and Abort Changes?'},,,,.t.)
DC_ReadGuiEvent(DCGUI_EXIT_ABORT,aGetList)
ENDIF
RETURN .t.
ELSEIF nAction = 11 // Test if Empty or duplicate
cFieldName := aStructure[nPointer,1]
cFieldType := aStructure[nPointer,2]
nFieldLen := aStructure[nPointer,3]
nFound := 0
FOR i := 1 TO LEN(aStructure)
IF ALLTRIM(Upper(aStructure[i,1]))==ALLTRIM(Upper(cFieldName)) .AND. i # nPointer
nFound := i
EXIT
ENDIF
NEXT
IF (nFound # 0 .AND. nFound # nPointer ) .OR. Empty(cFieldName) .OR. ;
Empty(cFieldType) .OR. Empty(nFieldLen)
ADel(aStructure,nPointer)
ASize(aStructure,Len(aStructure)-1)
oBrowse:refreshAll()
ENDIF
ENDIF
IF nPointer > Len(aStructure)
nPointer := Len(aStructure)
ENDIF
aStructure[nPointer,2] := Upper(aStructure[nPointer,2])
IF cFieldType = 'C'
aStructure[nPointer,4] := 0
ELSEIF cFieldType = 'M'
aStructure[nPointer,3] := 10
aStructure[nPointer,4] := 0
ELSEIF cFieldType = 'D'
aStructure[nPointer,3] := 8
aStructure[nPointer,4] := 0
ELSEIF cFieldType = 'L'
aStructure[nPointer,3] := 1
aStructure[nPointer,4] := 0
ENDIF
RETURN .t.
*** END OF EXAMPLE ***
/* ---------------------------- */
STATIC FUNCTION XSample_50
/*
Browse with SORT (Array)
This sample demonstrates how a right click in
the header area of a browse column will select the sort
order of the browse.
*/
LOCAL GetList := {}, aDirectory, i, bSortCol, oBrowse
aDirectory := Directory()
FOR i := 1 TO Len(aDirectory)
aDirectory[i,1] := Upper(aDirectory[i,1])
NEXT
ASort(aDirectory,,,{|x,y|x[1]<y[1]})
@ 3,1 DCBROWSE oBrowse DATA aDirectory ;
SIZE 55,12 FONT '10.Helv Bold' ;
PRESENTATION DC_BrowPres() ;
SORTSCOLOR GRA_CLR_WHITE, GRA_CLR_DARKGRAY ;
SORTUCOLOR GRA_CLR_WHITE, GRA_CLR_DARKGRAY ;
SORTUPBITMAP BITMAP_RD_UP_DARKGRAY ;
SORTDOWNBITMAP BITMAP_RD_DOWN_DARKGRAY ;
OPTIMIZE ;
FIT ;
EDIT xbeBRW_ItemSelected MODE DCGUI_BROWSE_EDITACROSS
bSortCol := {|a,n,o| _XSample50(aDirectory,n,oBrowse) }
DCBROWSECOL ELEMENT 1 WIDTH 12 HEADER "Name" ;
PARENT oBrowse SORT bSortCol LEFTBUTTON
DCBROWSECOL ELEMENT 2 WIDTH 7 HEADER "Size" ;
PARENT oBrowse SORT bSortCol LEFTBUTTON
DCBROWSECOL ELEMENT 3 WIDTH 8 HEADER "Date" ;
PARENT oBrowse SORT bSortCol LEFTBUTTON
DCBROWSECOL ELEMENT 4 WIDTH 7 HEADER "Time" ;
PARENT oBrowse SORT bSortCol LEFTBUTTON
DCREAD GUI FIT MODAL ADDBUTTONS ;
TITLE 'Right click mouse in column Header'
RETURN nil
/* ----------------------- */
STATIC PROCEDURE _XSample50( aArray, nColumn, oBrowse )
LOCAL i, aUnSelected, aSelected, bBlock, oColumn
ASort( aArray,,,{|x,y|x[nColumn] < y[nColumn]} )
#ifdef EXPRESS17
RETURN
#endif
#ifdef EXPRESS20
RETURN
#endif
aUnSelected := { ;
{ XBP_PP_COL_HA_FGCLR, GRA_CLR_BLACK }, ;
{ XBP_PP_COL_HA_BGCLR, GRA_CLR_PALEGRAY } ;
}
aSelected := { ;
{ XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE }, ;
{ XBP_PP_COL_HA_BGCLR, GRA_CLR_RED } ;
}
FOR i := 1 TO oBrowse:colCount
oColumn := oBrowse:GetColumn(i)
bBlock := oColumn:heading:lbDown
IF i == nColumn
oColumn:configure(,,,,aSelected)
ELSE
oColumn:configure(,,,,aUnSelected)
ENDIF
oColumn:heading:lbDown := bBlock
NEXT
RETURN
*** END OF EXAMPLE ***
/* ---------------------------- */
STATIC FUNCTION XSample_51
/*
Dialog with Mouse Origin
This sample demonstrates how a dialog will start at
the current location of the mouse using the ORIGIN
clause of DCGETOPTIONS. Click on the button to the
right of the GET to popup the "origined" dialog.
*/
LOCAL GetList := {}, GetOptions, cName := Space(15), ;
lToggle := .f.
@ 0,0 DCSAY 'Enter Name' GET cName ;
POPUP {|c|_XSample51(c,@lToggle)}
DCREAD GUI ;
FIT ;
MODAL ;
ADDBUTTONS ;
TITLE 'Origin Example' ;
EVAL {|o|SetAppWindow(o)}
RETURN nil
/* ------------------- */
STATIC FUNCTION _XSample51( cName, lToggle )
LOCAL GetList := {}, GetOptions, aNames, nPointer, oBrowse, lOk
aNames := { {'George'},{'Hillary'},{'Ken'},{'Monica'},{'Bill'} }
nPointer := 1
@ 0,0 DCBROWSE oBrowse DATA aNames SIZE 20,7 ;
POINTER nPointer ;
DATALINK {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList) } ;
DCBROWSECOL ELEMENT 1 HEADER 'Name' PARENT oBrowse WIDTH 20
DCGETOPTIONS ;
ORIGIN XBPDLG_ORIGIN_MOUSE ;
NOTITLEBAR
DCREAD GUI ;
FIT ;
MODAL ;
OPTIONS GetOptions ;
BUTTONS DCGUI_BUTTON_CANCEL ;
TITLE 'Double-Click to Select' ;
TO lOk ;
EVAL {|o|IIF( lToggle, ;
o:SetPos({o:currentPos()[1], ;
o:currentPos()[2]-o:currentSize()[2] } ), ;
nil )}
lToggle := !lToggle
RETURN IIF( lOk, aNames[nPointer,1], cName )
*** END OF EXAMPLE ***
STATIC FUNCTION XSample_52
/*
GET Options
This sample demonstrate the PASSWORD and PROPER
options of the @ DCSAY..GET command.
*/
LOCAL GetList := {}, cPass1, cPass2, oPassWord, cName
cName := Space(30)
cPass1 := Space(10)
cPass2 := Space(10)
@ 1,1 DCSAY ' Enter your name' GET cName PROPER PROPOPTIONS {.f.,' -12345'} TABSTOP
@ 3,1 DCSAY ' Enter your password' GET cPass1 PASSWORD ;
GETOBJECT oPassWord TABSTOP
@ 5,1 DCSAY 'Enter password again' GET cPass2 PASSWORD ;
TABSTOP ;
VALID {|x|x:=cPass1==cPass2, ;
IIF(!x,DC_MsgBox('Passwords do not match'),nil), ;
IIF(!x,SetAppFocus(oPassWord),nil), .t. }
DCREAD GUI MODAL FIT ADDBUTTONS
RETURN nil
*** END OF EXAMPLE ***
STATIC FUNCTION XSample_53
/*
SIZE Options 1
This sample demonstrate the MINSIZE and MAXSIZE
options.
*/
LOCAL GetList := {}, GetOptions
@ 1,1 DCSAY 'Try to resize the window'
DCGETOPTIONS ;
MINSIZE 200,50 ;
MAXSIZE 400,300
DCREAD GUI FIT BUTTONS DCGUI_BUTTON_EXIT ;
MODAL ;
OPTIONS GetOptions ;
TITLE 'MINSIZE/MAXSIZE Options'
RETURN nil
*** END OF EXAMPLE ***
/* ------------------ */
STATIC FUNCTION XSample_54
/*
SIZE Options 2
This sample demonstrates the NORESIZE option.
*/
LOCAL GetList := {}, GetOptions
@ 1,1 DCSAY 'Try to resize the window'
DCGETOPTIONS ;
NORESIZE
DCREAD GUI FIT BUTTONS DCGUI_BUTTON_EXIT ;
MODAL ;
OPTIONS GetOptions ;
TITLE 'NORESIZE option'
RETURN nil
*** END OF EXAMPLE ***
/* ------------------- */
STATIC FUNCTION XSample_55
/*
COMBOBOX with Database Browse
This sample demonstrates the how to create a COMBOBOX
that uses a database as the picklist.
*/
LOCAL GetList := {}, GetOptions, lBrowseActive, cCommand, ;
aPres, oBrowse, cOwner, oBrowseCol, oCommand
IF !File('..\XDOC\EXPRESS.DBF')
DC_MsgBox({'Sorry. The database required to show this feature',;
'is not included in the demonstration version.'})
RETURN nil
ENDIF
SET DEFA TO ..\XDOC
USE EXPRESS VIA FOXCDX ALIAS XDOC EXCLUSIVE
SET INDEX TO EXPRESS.CDX
OrdSetFocus('COMMAND')
lBrowseActive := .f.
cCommand := Space(30)
cOwner := Space(20)
@ 1,1 DCSAY 'Enter Command Name'
@ 2,1 DCGET cCommand PICT '@!' ;
GETSIZE 30 ;
GETOBJECT oCommand ;
POPUP {|c|lBrowseActive:=.t., ;
DC_GetRefresh(GetList), ;
SetAppFocus(oBrowseCol), ;
c } ;
GOTFOCUS {||IIF(lBrowseActive,SetAppFocus(oBrowseCol),nil)}
aPres := ;
{ { XBP_PP_COL_DA_ROWSEPARATOR, XBPCOL_SEP_DOTTED }, /* Row Sep */ ;
{ XBP_PP_COL_DA_COLSEPARATOR, XBPCOL_SEP_DOTTED }, /* Col Sep */ ;
{ XBP_PP_COL_DA_ROWHEIGHT, 14 }, /* Row Height */ ;
{ XBP_PP_COL_DA_CELLHEIGHT, 14 }, /* Cell Height */ ;
{ XBP_PP_COL_HA_HEIGHT, 0 } } /* Header Cell Height */
@ 3,1 DCBROWSE oBrowse SIZE 30,7 ;
ALIAS 'XDOC ' ;
PRESENTATION aPres ;
HIDE {||!lBrowseActive} ;
EVAL {|o|o:hScroll:=.f., ;
o:sizeCols:=.f., ;
o:configure()} ;
DATALINK {||lBrowseActive:=.f., ;
cCommand := XDOC->command, ;
DC_GetRefresh(GetList), ;
SetAppFocus(oCommand)} ;
@ 5,1 DCSAY 'Owner' GET cOwner ;
HIDE {||lBrowseActive}
DCBROWSECOL FIELD XDOC->command WIDTH 30 ;
PARENT oBrowse ;
OBJECT oBrowseCol
DCREAD GUI FIT MODAL ADDBUTTONS ;
TITLE 'ComboBox with Database'
RETURN nil
*** END OF EXAMPLE ***
/* -------------------- */
STATIC FUNCTION XSample_56()
/*
PROCESSING dialog
This sample demonstrates how to create a dialog window
with messages that get updated during processing.
*/
LOCAL GetList := {}, oMainDlg, oSay1, oSay2, oSay3, oSay4
@ 1,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay1 FONT "10.Helv"
@ 3,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay2 FONT "10.Helv"
@ 5,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay3 FONT "10.Helv"
@ 7,2 DCSAY "" SAYSIZE 50 SAYOBJECT oSay4 FONT "10.Helv"
DCREAD GUI FIT PARENT @oMainDlg ;
TITLE 'Updating Databases. Please wait' ;
EXIT
oSay1:SetCaption("Step 1 - Creating Backup Files")
DC_Pause(2) // Put Backup code here
oSay1:SetCaption(oSay1:caption+" - DONE ")
oSay2:SetCaption("Step 2 - Creating New Empty Files")
DC_Pause(2) // Put Create code here
oSay2:SetCaption(oSay2:caption+" - DONE ")
oSay3:SetCaption("Step 3 - Appending from Backup Files")
DC_Pause(2) // Put Append code here
oSay3:SetCaption(oSay3:caption+" - DONE ")
oSay4:SetCaption("Step 4 - Performing CleanUp")
DC_Pause(2) // Put Cleanup code here
oSay4:SetCaption(oSay4:caption+" - DONE ")
DC_Pause(1)
oMainDlg:destroy()
RETURN nil
*** END OF EXAMPLE ***
STATIC FUNCTION XSample_57()
/*
LISTBOX
This example shows how to implement 'Mark All' and '
Clear All' buttons in a DCLISTBOX command.
*/
LOCAL GetList := {}, aFields:={}, cField:={}
LOCAL oListBox
AADD(aFields, 'Alice')
AADD(aFields, 'Bob')
AADD(aFields, 'Carol')
AADD(aFields, 'Dick')
AADD(aFields, 'Harry')
AADD(aFields, 'Ted')
AADD(aFields, 'Tom')
@ 0,0 DCLISTBOX cField LIST aFields ;
FONT "10.Courier" ;
SIZE 15,10 ;
OBJECT oListBox ;
SELECT {2,4,5,6,7}
@ 0, 17 DCPUSHBUTTON ;
CAPTION '~Mark All' ;
SIZE 10, 1.1 ;
FONT '8.MS Sans Serif' ;
ACTION {|| AEVAL(aFields, {|x,i| oListBox:setData(i, .T.)}), ;
DC_VarFromListBox(oListBox)} ;
RELATIVE oListBox
@ 1.5, 17 DCPUSHBUTTON ;
CAPTION 'C~lear All' ;
SIZE 10, 1.1 ;
FONT '8.MS Sans Serif' ;
ACTION {|| AEVAL(aFields, {|x,i| oListBox:setData(i, .F.)}), ;
DC_VarFromListBox(oListBox)} ;
RELATIVE oListBox
DCREAD GUI ;
TITLE 'List Box Demo' ;
FIT ;
ADDBUTTONS ;
MODAL
DC_MsgBox(cField)
RETURN nil
*** END OF EXAMPLE ***
STATIC FUNCTION XSample_58()
/*
EXIT VALIDATION
The radio buttons toggle the bottom date section. The date
validation occurs under program control. The program
defaults to the second button. Clicking the first button
causes the VALID clauses to trigger on the items that are
grayed out. Dialog will not exit without validating.
*/
LOCAL GetList := {}, GetOptions, oStatic1, dFrom, dThru, ;
lOk, cOption
SET CENTURY ON
SET DATE FORMAT TO 'mm/dd/yyyy'
dFrom := CTOD('')
dThru := CTOD('')
cOption := '2'
@ 0,0 DCSTATIC XBPSTATIC_TYPE_GROUPBOX ;
SIZE 22, 4 ;
CAPTION 'Which Error(s)?' ;
OBJECT oStatic1
@ .8,1 DCRADIO cOption ;
PROMPT 'All Errors' ;
SIZE 20, 1 ;
VALUE '1' ;
PARENT oStatic1
@ 1.8,1 DCRADIO cOption ;
PROMPT 'Last Error Only' ;
SIZE 20, 1 ;
VALUE '2' ;
PARENT oStatic1
@ 2.8,1 DCRADIO cOption ;
PROMPT 'Errors From/Thru' ;
SIZE 20, 1 ;
VALUE '3' ;
PARENT oStatic1
@ 5.8,0 DCSAY 'From Date:' ;
GET dFrom ;
PICTURE '@D' ;
WHEN {|| cOption == '3'} ;
VALID {|x|x:=!EMPTY(dFrom) .OR. cOption#'3', ;
IIF(!x,DC_WinAlert('FROM Date cannot be empty.'),nil), x }
@ 6.8,0 DCSAY 'Thru Date:' ;
GET dThru ;
PICTURE '@D' ;
WHEN {|| cOption == '3'} ;
VALID {|x|x:=!EMPTY(dThru) .OR. cOption#'3', ;
IIF(!x,DC_WinAlert('THRU Date cannot be empty.'),nil), x }
DCGETOPTIONS ;
SAYRIGHTJUST ;
EXITVALIDATE
DCREAD GUI ;
MODAL ;
TO lOk ;
FIT ;
TITLE ' VIEW ERROR LOG OPTIONS ' ;
ADDBUTTONS ;
OPTIONS GetOptions ;
EVAL {|o|SetAppWindow(o)}
DC_MsgBox({dFrom,dThru})
RETURN nil
*** END OF EXAMPLE ***
/* ----------------- */
STATIC FUNCTION XSample_59()
#include "dcpick.ch"
/*
PICKLIST
This example shows how to use the function
DC_VarToListBox() to select a new group of
Picklist items.
*/
LOCAL GetList := {}, GetOptions, aMen, aWomen, ;
aListNames, aPickNames, oPickList, cOption
aMen := {'Bob','Dick','Harry','Ted','Tom','Bill','Ken'}
aWomen := {'Alice','Carol','Hillary','Monica','Chelsie'}
aListNames := {'One','Two','Three'}
aPickNames := {}
@1,3 DCRADIO cOption PROMPT 'Women' VALUE 'W' ;
ACTION {|| aListNames := aWomen, DC_VarToListBox(oPickList) }
@2,3 DCRADIO cOption PROMPT 'Men' VALUE 'M' ;
ACTION {|| aListNames := aMen, DC_VarToListBox(oPickList) }
@4,3 DCPICKLIST aPickNames LIST aListNames ;
CAPTION "Available People", "Selected People" ;
SIZE 35,12 ;
OBJECT oPickList ;
DATALINK {||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)}
DCREAD GUI ;
MODAL ;
TITLE "Pick a Person" ;
BUTTONS DCGUI_BUTTON_CANCEL ;
FIT
DC_MsgBox(aPickNames)
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_60 ( )
/*
This example demonstrates how to use the Xbase to
Clipper interface to improve performance of
database operations.
*/
LOCAL lX2Clip := .f., oProgress, GetList := {}, ;
i, nSeconds, dDate := Date(), cAreaCode := '777', ;
lReplacing := .f., oButton
@ 2,1 DCSAY 'This routine will replace the date field with'
@ 3,1 DCSAY 'the entered value for the selected area code.'
@ 5,1 DCSAY ' New Date' GET dDate POPUP {|d|DC_PopDate(d)}
@ 6,1 DCSAY 'Area Code' GET cAreaCode PICT '999' WHEN {||.f.}
@ 8,1 DCPROGRESS oProgress SIZE 40,1.2 ;
COLOR GRA_CLR_RED PERCENT ;
EVERY IIF( lX2Clip,1,100 )
@ 8,45 DCPUSHBUTTON CAPTION 'Replace' OBJECT oButton ;
SIZE 9,1.2 ;
ACTION {||_XSample60( oProgress, oButton, lX2Clip, ;
@lReplacing, dDate, cAreaCode, ;
GetList ) } ;
WHEN {||!lReplacing}
@10,1 DCCHECKBOX lX2Clip PROMPT 'Use Xbase to Clipper Interface'
DCREAD GUI FIT ADDBUTTONS ;
MODAL ;
TITLE "Database Operation Example" ;
EVAL {|o|SetAppWindow(o)}
RETURN nil
/* ----------------------- */
STATIC FUNCTION _XSample60( oProgress, oButton, lX2Clip, ;
lReplacing, dDate, cAreaCode, ;
GetList )
LOCAL nSeconds, nHandle, aData, bEval, aParams, aReturn, ;
nRecords := 0, nEvery
BEGIN SEQUENCE
lReplacing := .t.
DC_GetRefresh(GetList)
CLOSE ALL
nSeconds := Seconds()
SET DEFA TO
SET PATH TO ..\DATA
IF lX2Clip
nHandle := DC_XCOpen( 15, .t. )
IF nHandle <= 0
BREAK
ENDIF
nEvery := 100
aData := { Set(_SET_DEFAULT), Set(_SET_PATH), 'XTEST.DBF', ;
'XTEST.CDX', 'DBFNTX', dDate, cAreaCode, nEvery }
bEval := {|nCurr,nMax,nEvery|DC_GetProgress(oProgress,nCurr,nMax,nEvery)}
aParams := DC_XCArray()
aParams[XC_ARRAY_OPERATION] := XC_PROGRAM
aParams[XC_ARRAY_PROGRAM] := 'XClip60'
aParams[XC_ARRAY_DATA] := aData
IF !DC_XCCall( nHandle, aParams, bEval, 5, @aReturn, .t. )
BREAK
ENDIF
DC_XCClose(nHandle)
nRecords := aReturn[1]
ELSE
USE XTEST.DBF VIA 'DBFNTX'
GO TOP
nRecords := 0
DO WHILE !Eof()
IF XTEST->areacode == cAreaCode
IF _RecLock(5)
REPL XTEST->date WITH DTOC(dDate)
nRecords++
COMMIT
UNLOCK
ENDIF
ENDIF
DC_GetProgress(oProgress,RecNo(),RecCount())
SKIP
ENDDO
ENDIF
DC_GetProgress(oProgress,100,100)
DC_MsgBox({ Alltrim(Str(nRecords)) + ' records updated.', ;
'Update time: ' + ;
Alltrim(Str(Seconds()-nSeconds)) + ' seconds!' })
DC_GetProgress(oProgress,0,100)
END SEQUENCE
lReplacing := .f.
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_61 ( nMode )
/*
This example demonstrates a re-indexing
progress bar comparing the Xbase++ DBFCDX DBE (Mode 1)
to the Clipper DBFCDX RDD (Mode 2) which is called via
the X2CLIP interface. This interface spawns a Clipper
program to create the index.
*/
LOCAL aParams, nHandle, lStatus := .t., aIndex, oDlg, ;
oSay, oProgress, bEval, lOk := .t., GetList := {}, ;
i, nSeconds, oAppFocus := SetAppFocus()
nMode := IIF( Valtype(nMode)='N',nMode,1 )
IF nMode = 2
nHandle := DC_XCOpen( nil, .t. )
IF nHandle <= 0
RETURN .f.
ENDIF
ENDIF
@ 1,1 DCSAY 'Creating Indexes'
@ 2,1 DCSAY '' SAYOBJECT oSay SAYSIZE 40
@ 4,1 DCPROGRESS oProgress SIZE 40,1.2 ;
COLOR GRA_CLR_RED PERCENT ;
EVERY IIF( nMode=1,100,1 )
DCREAD GUI EXIT FIT PARENT @oDlg ;
TITLE "Indexing Example" ;
MODAL
BEGIN SEQUENCE
SET PATH TO ..\data
SET DEFA TO
IF nMode = 1
USE XTEST.DBF VIA 'DBFCDX'
ELSEIF nMode = 2
aParams := DC_XCArray()
aParams[XC_ARRAY_DEFAULT] := Set(_SET_DEFAULT)
aParams[XC_ARRAY_PATH] := Set(_SET_PATH)
aParams[XC_ARRAY_DATABASE] := 'XTEST.DBF'
aParams[XC_ARRAY_RDD] := 'DBFCDX'
aParams[XC_ARRAY_OPERATION] := XC_OPENDATA
IF !DC_XCCall( nHandle, aParams, nil, nil, nil, .t. )
lOk := .f.
BREAK
ENDIF
ENDIF
aIndex := { ;
{ 'AREACODE','AREACODE',nil,.f.,.f.}, ;
{ 'EXCHANGE','EXCHANGE',nil,.f.,.f.}, ;
{ 'CITY', 'CITY',nil,.f.,.f.} ;
}
bEval := {|nCurr,nMax|DC_GetProgress(oProgress,nCurr,nMax)}
nSeconds := Seconds()
FOR i := 1 TO Len(aIndex)
oSay:setCaption('Creating Tag ' + aIndex[i,2])
IF nMode = 1
ordCondSet( , ,,{||lOk} , , , RECNO(), , , , )
ordCreate('XTEST.CDX', aIndex[i,1], aIndex[i,2], ;
{||DC_GetProgress(oProgress,RecNo(),RecCount()), ;
DC_AppEvent( @lOk, 0, .01 ), ;
&(aIndex[i,2]) }, , .F. )
ELSEIF nMode = 2
aParams := DC_XCArray()
aParams[XC_ARRAY_DEFAULT] := '\express\sample'
aParams[XC_ARRAY_INDEX] := 'XTEST.CDX'
aParams[XC_ARRAY_OPERATION] := XC_CREATEINDEX
aParams[XC_ARRAY_TAG] := aIndex[i,1]
aParams[XC_ARRAY_KEY] := aIndex[i,2]
aParams[XC_ARRAY_FOR] := aIndex[i,3]
aParams[XC_ARRAY_UNIQUE] := aIndex[i,4]
aParams[XC_ARRAY_DESCEND] := aIndex[i,5]
IF !DC_XCCall( nHandle, aParams, bEval, 5, nil, .t. )
lOk := .f.
BREAK
ENDIF
ENDIF
NEXT
DC_MsgBox('Index creation time: ' + Alltrim(Str(Seconds()-nSeconds)) + ' seconds!')
END SEQUENCE
oDlg:setModalState(XBP_DISP_MODELESS)
oDlg:Destroy()
SetAppFocus(oAppFocus)
IF nMode = 2
DC_XCClose( nHandle )
ENDIF
RETURN lOk
*** END OF EXAMPLE ***
* ---------------------
STATIC FUNCTION XSample_62 ()
/*
This example demonstrates a re-indexing
progress bar comparing the Xbase++ DBFCDX DBE (Mode 1)
to the Clipper DBFCDX RDD (Mode 2) which is called via
the X2CLIP interface. This interface spawns a Clipper
program to create the index.
*/
XSample_61(2)
RETURN nil
*** END OF EXAMPLE ***
* ----------------------
STATIC FUNCTION XSample_63 ()
/*
This example demonstrates how to use the ABORTQUERY
and CLOSEQUERY clauses to control exiting of a dialog.
*/
LOCAL GetList := {}, cName := Space(20), GetOptions
@ 1,1 DCSAY 'Press ESCape or Click on Close Button' SAYSIZE 0
@ 3,1 DCSAY 'Enter Name ' GET cName SAYSIZE 0
DCGETOPTIONS ;
ABORTQUERY MSG {||_XSample63(1)} ;
CLOSEQUERY MSG {||_XSample63(2)}
DCREAD GUI ;
FIT ;
TITLE 'ABORT or CLOSE Query' ;
ADDBUTTONS ;
OPTIONS GetOptions
RETURN nil
/* -------------------- */
STATIC FUNCTION _XSample63( nMode )
IF nMode = 1
RETURN DC_MsgBox(,,{'Are you sure you want to abort?'},,,,.t.)
ELSEIF nMode = 2
RETURN DC_MsgBox(,,{'Are you sure you want to exit?'},,,,.t.)
ENDIF
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_64 ()
/*
This example demonstrates how to use the ACCELKEY
clause of DC* commands.
*/
LOCAL GetList := {}, aGet[6]
AFill(aGet,Space(30))
@ 1,1 DCSAY 'Press F2 to go to this Get' GET aGet[2] ;
ACCELKEY xbeK_F2 SAYRIGHT
@ 2,1 DCSAY 'Press F3 to go to this Get' GET aGet[3];
ACCELKEY xbeK_F3 SAYRIGHT
@ 3,1 DCSAY 'Press F4 to go to this Get' GET aGet[4] ;
ACCELKEY xbeK_F4 SAYRIGHT
@ 4,1 DCSAY 'Press F5 to go to this Get' GET aGet[5] ;
ACCELKEY xbeK_F5 SAYRIGHT
@ 6,1 DCPUSHBUTTON CAPTION 'Hit F6' SIZE 10,1.2 ;
ACCELKEY xbeK_F6 ;
ACTION {||DC_MsgBox('F6 was hit')}
@ 6,12 DCPUSHBUTTON CAPTION 'Hit F7' SIZE 10,1.2 ;
ACCELKEY xbeK_F7 ;
ACTION {||DC_MsgBox('F7 was hit')}
DCREAD GUI FIT MODAL ADDBUTTONS EVAL {|o|SetAppWindow(o)} ;
TITLE 'Accelerator Keys'
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_65 ()
/*
Fancy PushButtons.
*/
LOCAL GetList := {}, oDesc, oMemo, oGroup
USE COLLECT VIA DBFNTX EXCL
@ 1,1 DCSAY 'Description' GET COLLECT->descrip ;
GETOBJECT oDesc GETSIZE 30 SAYSIZE 10 SAYRIGHT
@ 3,1 DCSAY 'Memo' SAYSIZE 5
@ 4,1 DCMULTILINE COLLECT->memo SIZE 48,12 ;
OBJECT oMemo
@ 1,50 DCSTATIC XBPSTATIC_TYPE_TEXT OBJECT oGroup SIZE 18, 18
@ 1,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
@ 2,2 DCSAY 'Top of File' PARENT oGroup
@ 3,2 DCPUSHBUTTON CAPTION {BITMAP_TOP_1,BITMAP_TOP_2} ;
SIZE 12,2 ;
FANCY ;
WHEN {||!DC_TestBof()} ;
ACTION {||dbGoTop(),DC_GetRefresh(GetList)} ;
PARENT oGroup
@ 5,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
@ 6,2 DCSAY 'Previous Record' PARENT oGroup
@ 7,2 DCPUSHBUTTON CAPTION {BITMAP_PREVIOUS_1,BITMAP_PREVIOUS_2} ;
SIZE 12,2 ;
FANCY ;
WHEN {||!DC_TestBof()} ;
ACTION {||dbSkip(-1),DC_GetRefresh(GetList)} ;
PARENT oGroup
@ 9,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
@10,2 DCSAY 'Next Record' PARENT oGroup
@11,2 DCPUSHBUTTON CAPTION {BITMAP_NEXT_1,BITMAP_NEXT_2} ;
FANCY ;
SIZE 12,2 ;
WHEN {||!DC_TestEof()} ;
ACTION {||dbSkip(1),DC_GetRefresh(GetList)} ;
PARENT oGroup
@13,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
@14,2 DCSAY 'Bottom of File' PARENT oGroup
@15,2 DCPUSHBUTTON CAPTION {BITMAP_BOTTOM_1,BITMAP_BOTTOM_2} ;
FANCY ;
WHEN {||!DC_TestEof()} ;
SIZE 12,2 ;
ACTION {||dbGoBottom(),DC_GetRefresh(GetList)} ;
PARENT oGroup
@17,2 DCSTATIC XBPSTATIC_TYPE_RAISEDRECT SIZE 12,.1 PARENT oGroup
DCREAD GUI FIT ADDBUTTONS
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_66 ()
/*
Adding rows of numbers.
*/
LOCAL GetList := {}, nNumber1 := 0, nNumber2 := 0, nNumber3 := 0, ;
bGet, bRefresh := {||DC_GetRefresh(GetList)}
@ 1,1 DCSAY 'Number 1' GET nNumber1 ;
PICT '9999.99' LOSTFOCUS bRefresh ;
TABSTOP GETID 'NUMBER1'
@ 2,1 DCSAY 'Number 2' GET nNumber2 ;
PICT '9999.99' LOSTFOCUS bRefresh ;
TABSTOP
@ 3,1 DCSAY 'Number 3' GET nNumber3 ;
PICT '9999.99' LOSTFOCUS bRefresh ;
TABSTOP
bGet := {||nNumber1+nNumber2+nNumber3}
@ 5,1 DCGET bGet EDITPROTECT {||.t.} PICT '999999.99' ;
GETFONT '12.Helv Bold' GETSIZE 20,1.5
DCREAD GUI FIT ADDBUTTONS SETFOCUS 'NUMBER1'
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_67 ()
/*
Browse with Bitmaps
*/
LOCAL GetList := {}, aBitMap, oBitMapGroup, oBitMapBrow, aPres, ;
GetOptions
@ 0,0 DCSTATIC XBPSTATIC_TYPE_RECESSEDBOX SIZE 50,13 ;
OBJECT oBitMapGroup
aPres := ;
{ { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE }, /* Header FG Color */ ;
{ XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY }, /* Header BG Color */ ;
{ XBP_PP_COL_DA_ROWHEIGHT, 25 }, /* Row Height */ ;
{ XBP_PP_COL_DA_CELLHEIGHT, 25 } } /* Cell Height */ ;
aBitMap := { ;
{ BITMAP_NEXT_1, 'Next (enabled)'}, ;
{ BITMAP_PREVIOUS_1, 'Previous (enabled)'}, ;
{ BITMAP_TOP_1, 'Top (enabled)'}, ;
{ BITMAP_BOTTOM_1, 'Bottom (enabled)'}, ;
{ BITMAP_NEW_1, 'New (enabled)'}, ;
{ BITMAP_DELETE_1, 'Delete (enabled)'}, ;
{ BITMAP_SAVE_1, 'Save (enabled)'}, ;
{ BITMAP_HELP_1, 'Help (enabled)'}, ;
{ BITMAP_FIND_1, 'Find (enabled)'}, ;
{ BITMAP_NEXT_2, 'Next (disabled)'}, ;
{ BITMAP_PREVIOUS_2, 'Previous (disabled)'}, ;
{ BITMAP_TOP_2, 'Top (disabled)'}, ;
{ BITMAP_BOTTOM_2, 'Bottom (disabled)'}, ;
{ BITMAP_NEW_2, 'New (disabled)'}, ;
{ BITMAP_DELETE_2, 'Delete (disabled)'}, ;
{ BITMAP_SAVE_2, 'Save (disabled)'}, ;
{ BITMAP_HELP_2, 'Help (disabled)'}, ;
{ BITMAP_FIND_2, 'Find (disabled)'} }
@ 2,2 DCBROWSE oBitMapBrow PARENT oBitMapGroup DATA aBitMap ;
SIZE 297,253 PIXEL ;
FONT '10.Arial Bold' ;
PRESENTATION aPres ;
FIT
DCBROWSECOL ELEMENT 1 WIDTH 6 HEADER "BitMap" ;
PARENT oBitMapBrow TYPE XBPCOL_TYPE_BITMAP
DCBROWSECOL ELEMENT 1 WIDTH 6 HEADER "Resource #" ;
PARENT oBitMapBrow
DCBROWSECOL ELEMENT 2 WIDTH 25 HEADER "Description" ;
PARENT oBitMapBrow
DCGETOPTIONS AUTORESIZE
DCREAD GUI ;
OPTIONS GetOptions ;
FIT ;
MODAL ;
BUTTONS DCGUI_BUTTON_OK ;
TITLE 'Array Browse of BitMaps'
ReTURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_68 ()
/*
Printing Labels
*/
LOCAL GetList := {}, aParts, oPrinter, nPrintMode, aPrintMode, ;
oBrowse, oColumn1, nLabelHeight, aLabelHeight
aParts := { ;
{ 'A700','23-897600','Switch, Toggle, Single-action' }, ;
{ 'A701','23-897610','Switch, Toggle, Double-action' }, ;
{ 'A702','23-897770','Switch, Push, Lighted, Red' }, ;
{ 'A703','23-897771','Switch, Push, Lighted, Green' }, ;
{ 'A704','23-897672','Switch, Push, Lighted, Amber' }, ;
{ 'A705','23-897680','Switch, Push, 3-State' }, ;
{ 'A706','23-897690','Switch, Lever, Type A' }, ;
{ 'A707','23-897691','Switch, Lever, Type B' }, ;
{ 'A708','23-897692','Switch, Lever, Type C' }, ;
{ 'A709','23-898001','Switch, DIP, 8 position, Type A' }, ;
{ 'A710','23-898002','Switch, DIP, 12 position, Type A' }, ;
{ 'A711','23-899104','Switch, Rotary, 1/4 position' }, ;
{ 'A712','23-899105','Switch, Rotary, 1/8 position' }, ;
{ 'A713','23-899108','Switch, Rotary, 2/8 position' } }
@ 0,0 DCBROWSE oBrowse DATA aParts SIZE 50,10.5 ;
CURSORMODE XBPBRW_CURSOR_ROW
DCBROWSECOL ELEMENT 1 PARENT oBrowse WIDTH 4 ;
HEADER 'Bin #' OBJECT oColumn1
DCBROWSECOL ELEMENT 2 PARENT oBrowse WIDTH 6 ;
HEADER 'Part No.'
DCBROWSECOL ELEMENT 3 PARENT oBrowse WIDTH 30 ;
HEADER 'Description'
@ 12,5 DCPUSHBUTTON CAPTION 'Print' SIZE 9,2 ;
ACTION {||_XSample68(nPrintMode,nLabelHeight,aParts)}
nLabelHeight := 0 // 1 inch
aLabelHeight := {'1 inch Labels', ;
'2 inch Labels', ;
'3 inch Labels'}
@ 12,20 DC3STATE nLabelHeight PROMPT aLabelHeight SIZE 17
nPrintMode := 1 // Preview
aPrintMode := {'Send to Printer','Preview on Screen','Send to File'}
@ 13,20 DC3STATE nPrintMode PROMPT aPrintMode SIZE 17
DCREAD GUI FIT ;
BUTTONS DCGUI_BUTTON_EXIT ;
SETFOCUS @oColumn1 ;
TITLE 'Print Part Number Labels'
RETURN nil
/* ------------------- */
STATIC FUNCTION _XSample68( nPrintMode, nLabelHeight, aParts )
LOCAL oPrinter, i, nRow, nCol, oScrn, aWhiteOnBlack[GRA_AS_COUNT], ;
aBlackOnWhite[GRA_AS_COUNT], aBoxAttr[GRA_AA_COUNT]
aWhiteOnBlack[GRA_AS_COLOR] := GRA_CLR_WHITE
aWhiteOnBlack[GRA_AS_BACKCOLOR] := GRA_CLR_BLACK
aWhiteOnBlack[GRA_AS_BGMIXMODE] := GRA_BGMIX_OVERPAINT
aBlackOnWhite[GRA_AS_COLOR] := GRA_CLR_BLACK
aBlackOnWhite[GRA_AS_BACKCOLOR] := GRA_CLR_WHITE
aBlackOnWhite[GRA_AS_BGMIXMODE] := GRA_BGMIX_OVERPAINT
aBoxAttr[GRA_AA_SYMBOL] := GRA_SYM_HALFTONE
BEGIN SEQUENCE
IF nPrintMode = 0 // Standard Print
DCPRINT ON SIZE 64,80 TO oPrinter
ELSEIF nPrintMode = 1 // Preview
DCPRINT ON SIZE 64,80 TO oPrinter PREVIEW HIDE
ELSEIF nPrintMode = 2 // Print to Text File
DCPRINT ON SIZE 64,80 TO oPrinter TEXTONLY TOFILE
ENDIF
IF Valtype(oPrinter) # 'O' .OR. !oPrinter:lActive
BREAK
ENDIF
IF nPrintMode # 1 // Preview
oScrn := DC_WaitOn('Printing.. Please wait..')
ENDIF
IF nPrintMode = 0
DCPRINT EJECT // Must do this so first page top margin is correct
ENDIF
nRow := 0
nCol := 1
FOR i := 1 TO Len(aParts)
IF nRow > 55
nRow := 0
nCol := 1
IF i > 1
DCPRINT EJECT
ENDIF
ENDIF
@ nRow - .2, nCol-1, nRow + 3.4, nCol+30 DCPRINT BOX ATTRIBUTE aBoxAttr ;
FILL GRA_OUTLINEFILL
@ nRow + .1, nCol DCPRINT SAY 'Bin: ' ATTRIBUTE aBlackOnWhite
@ nRow + .1, DC_PrinterCol()+1 DCPRINT SAY aParts[i,1] ;
FONT '14.Arial Bold' ATTRIBUTE aBlackonWhite // Bin No.
@ DC_PrinterRow()+1.5, nCol DCPRINT SAY aParts[i,2] ;
FONT '14.Helv Bold' ATTRIBUTE aWhiteOnBlack // Part No.
@ DC_PrinterRow()+1.5, nCol DCPRINT SAY aParts[i,3] ;
FONT '12.Courier' ATTRIBUTE aBlackOnWhite // Description
IF ( i % 2 ) == 1
nCol += 40
ELSE
nRow += 6.1 * ( nLabelHeight + 1 )
nCol := 1
ENDIF
NEXT
DCPRINT OFF
IF nPrintMode # 1
DCMSGBOX 'Print Complete!'
DC_Impl(oScrn)
ENDIF
END SEQUENCE
RETURN nil
*** END OF EXAMPLE ***
/* --------------------- */
STATIC FUNCTION XSample_69 ()
/*
DCGET with Drop Down
*/
LOCAL GetList := {}, oGet1, oGet2, cFileName1, cFileName2
cFileName1 := cFileName2 := Space(12)
@ 1,1 DCSAY 'File Name 1' GET cFileName1 ;
GETOBJECT oGet1 ;
PICT '@!' POPUP {|c|_XSample69(c,oGet1)}
@ 2,1 DCSAY 'File Name 2' GET cFileName2 ;
GETOBJECT oGet2 ;
PICT '@!' POPUP {|c|_XSample69(c,oGet2)}
@ 6,1 DCSAY ''
DCREAD GUI ;
FIT ;
MODAL ;
ADDBUTTONS
RETURN nil
/* ----------------------- */
STATIC FUNCTION _XSample69( cFileName, oGet )
LOCAL GetList := {}, oParent, nPointer, nCol, nRow, aData[2], ;
nWidth, nHeight, GetOptions, aPres, oStatic, aDirectory, lOk
aDirectory := Directory()
oParent := oGet:setParent()
nCol := oGet:currentPos()[1]
nRow := oGet:currentPos()[2]
nWidth := oGet:currentSize()[1] + 20
nPointer := 1
nHeight := 138
aPres := { { XBP_PP_COL_HA_HEIGHT, 0 }, ;
{ XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
{ XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
@ nRow-nHeight, nCol DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX ;
OBJECT oStatic ;
SIZE nWidth, nHeight
@ 2,2 DCBROWSE aData[1] DATA aDirectory ;
PARENT oStatic ;
SIZE nWidth-4, nHeight-4 ;
POINTER nPointer ;
EVAL {|o|o:itemSelected := ;
{||DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList)}, ;
o:hScroll:=.f., ;
o:sizeCols:=.f., ;
o:configure()}
DCBROWSECOL ELEMENT 1 HEADER 'File Name ' ;
PRESENTATION aPres ;
PARENT aData[1] ;
WIDTH nWidth ;
OBJECT aData[2]
DCGETOPTIONS PIXEL NOTRANSLATE VISIBLE
DCREAD GUI ;
PARENT oParent ;
OPTIONS GetOptions ;
SAVE ;
SETFOCUS @aData[2] ;
MODAL ;
TO lOk ;
HANDLER _XSample69_handler REFERENCE aData
DC_GetDestroy(GetList)
RETURN IIF( lOk,aDirectory[nPointer,1],cFileName)
/* ------------------------ */
STATIC FUNCTION ;
_XSample69_Handler( nEvent, mp1, mp2, oXbp, oDlg, GetList, a, lOk )
IF Valtype(oXbp)='O' .AND. nEvent = xbeM_LbDown .AND. ;
!(oXbp:setParent()==a[1]) .AND. !(oXbp:setParent()==a[2])
RETURN DCGUI_EXIT_ABORT
ENDIF
RETURN DCGUI_NONE
*** END OF EXAMPLE ***
/* ----------------------- */
STATIC FUNCTION XSample_70()
/*
This example shows how to use the HILITEGETS clause of
DCGETOPTIONS to create a Colored Highlight rectangle around
selected Get
*/
LOCAL GetList := {}, cGet1, cGet2, cGet3, GetOptions
cGet1 := cGet2 := cGet3 := Space(10)
@ 1,1 DCSAY 'Get 1' GET cGet1
@ 2.5,1 DCSAY 'Get 2' GET cGet2
@ 4,1 DCSAY 'Get 3' GET cGet3
DCGETOPTIONS HILITEGETS GRA_CLR_YELLOW
DCREAD GUI FIT ADDBUTTONS ;
OPTIONS GetOptions ;
TITLE 'Highlighted Gets'
RETURN nil
*** END OF EXAMPLE ***
/* ----------------------- */
STATIC FUNCTION XSample_71()
/*
This dialog automatically adds items not in a Combo-box list
to the array.
*/
LOCAL GetList := {}, cName := Space(10), aNames, lOk
aNames := { 'Bob', 'Carol', 'Ted', 'Alice' }
@ 1,1 DCSAY 'Select a name from list or type in new name' ;
SAYSIZE 30
@ 2,1 DCSAY 'and press ENTER' ;
SAYSIZE 30
@ 3,1 DCCOMBOBOX cName LIST aNames SIZE 10,5 ;
TYPE XBPCOMBO_SIMPLE ;
EVAL {|o|o:keyboard:={|a,b,o|_XSample_71(a,b,o,aNames,@cName)} }
DCREAD GUI FIT ADDBUTTONS ;
TITLE 'Adding Names to ComboBox' ;
MODAL ;
EVAL {|o|SetAppWindow(o)} ;
TO lOk
IF lOk
DC_Gui(.t.)
DC_MsgBox(aNames)
ENDIF
RETURN nil
/* -------------------- */
STATIC FUNCTION _XSample_71( a,b,o,aNames,cName )
STATIC cBuffer
LOCAL i
IF !(a == xbeK_ENTER)
cBuffer := Alltrim(o:XbpSle:EditBuffer())
ENDIF
IF a == xbeK_ENTER .AND. !Empty(cBuffer)
IF Ascan(aNames,{|c|c==cBuffer}) = 0
AAdd(aNames,cBuffer)
ASort(aNames)
o:Clear()
FOR i := 1 TO Len(aNames)
o:addItem(aNames[i])
NEXT
cName := Space(10)
o:XbpSle:setData()
ENDIF
ENDIF
RETURN nil
*** END OF EXAMPLE ***
/* ----------------------- */
STATIC FUNCTION XSample_72()
/*
This dialog displays a running clock.
*/
LOCAL GetList := {}, dDate := Date(), cTime := Time(), ;
oStatic, lActive := .t., lOk, oTime
@ 1,1 DCSAY 'Enter Date' GET dDate ;
POPUP {|d|DC_PopDate(d)} ;
SAYRIGHT PIXEL
@ 40,1 DCSAY 'Enter Time' GET cTime ;
SAYRIGHT PIXEL
@100,140 DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX ;
SIZE 76, 22 PIXEL OBJECT oStatic
@ 2,2 DCSAY Time() PARENT oStatic SAYSIZE 72,18 PIXEL ;
SAYFONT '8.Alaska Crt' SAYOBJECT oTime
DCREAD GUI FIT ADDBUTTONS ;
TO lOk ;
EVAL {|o|o:=Thread():new(), ;
o:Start({||_XSample72(lActive,oTime)}) }
lActive := .f.
Sleep(50)
RETURN nil
/* -------------------- */
STATIC FUNCTION _XSample72( lActive, oTime )
DO WHILE lActive
Sleep(50)
oTime:SetCaption(Time())
ENDDO
RETURN nil
*** END OF EXAMPLE ***
* ---------------------
STATIC FUNCTION _reclock ( nWaitTime )
LOCAL nWait
nWaitTime := IIF(Valtype(nWaitTime)='N',nWaitTime,1)
IF DBRLOCK()
RETURN (.T.) // locked
ENDIF
DO WHILE .T.
nWait := nWaitTime
DO WHILE (nWaitTime=0 .OR. nWait>0)
IF DBRLOCK() // locked
RETURN (.T.)
ENDIF
INKEY(.5) // wait 1/2 second
nWait := nWait - .5
ENDDO
RETURN .F.
ENDDO
RETURN (.F.) // not locked