BrowseGet

This forum is for eXpress++ general support.
Post Reply
Message
Author
User avatar
unixkd
Posts: 565
Joined: Thu Feb 11, 2010 1:39 pm

BrowseGet

#1 Post by unixkd »

Hi Roger,

I am trying to modify your sample to achieve a dynamic browse get. Many a times I want users to enter a set of record(s) in form of a browse for further actions. My modified function below is not behaving well. The cursor stays permanently at the bottom of the browse.
*

#include "dcbitmap.ch"
#include "dcicon.ch"
#include "dcdialog.ch"
#include "appevent.ch"
#include "xbp.ch"
*
Function TestMyBrowseGet()
Local aDir := Directory("*.*")
Local aData[0]
Local aDefault := aDir[1]
Local aColWidth := aFill(Array(10),10)
Local aHead[0]
Local aPic[0]
Local aSize := {100,20}
Local cTitle := "Browse Get Test"
DC_ForNext(1,10,1,{|n| Aadd(aHead,"Col"+StrZero(n,2))})
ArrayGet(aData,aDefault,aColWidth,aHead,aPic, aSize, cTitle)
Return nil
*
Function ArrayGet(aData,aDefault,aColWidth,aHead,aPic, aSize, cTitle)
Local GetList[0],oBrowse, oBrowseBox, nPointer:=1, lOk, GetOptions
Local aColor := GRA_CLR_COLORS({13,14,15,16}), oToolBar, I, lEditing := .f.

@ 0.5,.5 DCSTATIC XBPSTATIC_TYPE_RECESSEDBOX SIZE aSize[1],aSize[2] OBJECT oBrowseBox

@ 0.5,1 DCBROWSE oBrowse DATA aData ;
SIZE aSize[1]-2,aSize[2]-1 ;
FIT ;
PRESENTATION DC_BrowPres() ;
NOHORIZSCROLL ;
EDIT xbeBRW_ItemSelected ;
MODE DCGUI_BROWSE_EDITACROSSDOWN ;
ACTION {||lEditing:=.t.,DC_GetRefresh(GetList)} ;
EXIT {||lEditing:=.f., ;
Browse_Action(4,aData,oBrowse,nPointer,,GetList), ;
DC_GetRefresh(GetList)} ;
INTO aField ;
POINTER nPointer ;
DELETE xbeK_DEL ;
INSERT xbeK_INS ;
ACTION {||lEditing := .t.,DC_GetRefresh(GetList)} ;
DEFAULT aDefault ;
EXIT {||lEditing := .f., ;
Browse_Action(4,aData,oBrowse,nPointer,,GetList), ;
DC_GetRefresh(GetList),DC_ClearEvents()} ;
EVAL {|o|o:hitBottomBlock := {||PostAppEvent(xbeP_Keyboard,xbeK_ALT_A,,oBrowse)} }

DCSETPARENT oBrowse
DCBROWSECOL DATA {||DC_BrowseRow(oBrowse)} WIDTH 4 HEADER "Ser.No" EDITPROTECT {||.T.}
For I := 1 TO LEN(aHead)
DCBROWSECOL ELEMENT I;
WIDTH aColWidth;
HEADER aHead;
EVAL {|o| o:colorBlock := {||aColor}};
PICTURE aPic ID IF(I==1,'NAME_COLUMN',"")
NEXT
DCSETPARENT TO
@ aSize[2]+1,1 DCTOOLBAR oToolBar SIZE 45,1.2 BUTTONSIZE 7,1
*
DCADDBUTTON CAPTION '&Add' PARENT oToolBar ;
TOOLTIP 'Add New Record' ;
ACCELKEY xbeK_ALT_A ;
WHEN {||!lEditing} ;
ACTION {||SetAppFocus(DC_GetObject(GetList,'NAME_COLUMN')), ;
PostAppEvent(xbeP_Keyboard,xbeK_INS,,oBrowse)}

DCADDBUTTON CAPTION '&Insert' PARENT oToolBar ;
TOOLTIP 'Insert New Record' ;
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 Record' ;
ACCELKEY xbeK_ALT_D ;
WHEN {||!lEditing} ;
ACTION {||PostAppEvent(xbeP_Keyboard,xbeK_DEL,,oBrowse), ;
SetAppFocus(DC_GetObject(GetList,'NAME_COLUMN'))}

DCADDBUTTON CAPTION '&Ok' PARENT oToolBar ;
TOOLTIP 'Exit and Save Changes' ;
ACCELKEY xbeK_ALT_O ;
WHEN {||!lEditing} ;
ACTION {||Browse_Action(2,,,,,GetList)}

DCADDBUTTON CAPTION '&Cancel' PARENT oToolBar ;
TOOLTIP 'Exit and Abort Changes' ;
ACCELKEY xbeK_ALT_C ;
WHEN {||!lEditing} ;
ACTION {||Browse_Action(3,,,,,GetList)}

DCGETOPTIONS ABORTQUERY

DCREAD GUI FIT TITLE cTitle;
OPTIONS GetOptions ;
MODAL ;
TO lOk ;
SETFOCUS 'NAME_COLUMN' ;
SETAPPWINDOW

RETURN({lOK,aData})
/* ------------------- */

STATIC FUNCTION Browse_Action( nAction, aData, oBrowse, nPointer, xValue, aGetList )
LOCAL nFound, i,j
IF nAction == 1 .And. nPointer > Len(aData)
nPointer := Len(aData)
ElseIF nAction == 2 // Exit and Save
IF DC_MsgBox(,,{'Exit and Save Changes?'},DEVELOPER,,,.t.)
DC_ReadGuiEvent(DCGUI_EXIT_OK,aGetList)
ENDIF
RETURN .t.
ELSEIF nAction == 3 // Exit and Abort
IF DC_MsgBox(,,{'Exit and Abort Changes?'},DEVELOPER,,,.t.)
DC_ReadGuiEvent(DCGUI_EXIT_ABORT,aGetList)
ENDIF
RETURN .t.
ELSEIF nAction = 4 // Test if Empty
nFound := 0
FOR i := 1 TO LEN(aData)
IF IsEmptyRow(aData)
nFound := i
EXIT
ENDIF
NEXT
IF nFound # 0
ADel(aData,nPointer)
ASize(aData,Len(aData)-1)
oBrowse:refreshAll()
ENDIF
ENDIF
IF nPointer > Len(aData)
nPointer := Len(aData)
ENDIF
RETURN .t.
*
Static Function IsEmptyRow(aRow)
Local n := 0, nFound := 0
For N := 1 To Len(aRow)
IF !Empty(aRow[n])
nFound := n
Exit
EndIf
Next
Return ( nFound == 0 )

Post Reply