Here is some code that does what you want except the button is anchored to the right side of the cell.
Code: Select all
#INCLUDE "dcdialog.ch"
STATIC sxClipBoard := nil
* ----------
FUNCTION Main()
LOCAL GetList[0], oBrowse, oButtonFile, oButtonSize, oMenuFile, oMenuSize, aDir
aDir := Directory()
@ 0,0 DCBROWSE oBrowse SIZE 20,20 FIT DATA aDir ;
FONT '10.Lucida Console' ;
ITEMMARKED {||ApplyButton(oButtonFile,oButtonSize,oBrowse)}
DCBROWSECOL ELEMENT 1 PARENT oBrowse HEADER 'File Name' WIDTH 15
DCBROWSECOL ELEMENT 2 PARENT oBrowse HEADER 'File Size' WIDTH 15 PICTURE '99999 ' ALIGN DCGUI_ALIGN_LEFT
DCBROWSECOL ELEMENT 3 PARENT oBrowse HEADER 'File Date' WIDTH 15
DCBROWSECOL ELEMENT 4 PARENT oBrowse HEADER 'File Time' WIDTH 15
@ 0,0 DCPUSHBUTTONXP CAPTION 'p' SIZE 20,20 PIXEL OBJECT oButtonFile ;
EVAL {|o|o:hide()} ;
FONT '12.Marlett' ;
COLOR GRA_CLR_BLACK, GRA_CLR_PINK GRADIENT 5 RADIUS 2 ;
ACTION {|a,b,o| SetColumn(oBrowse,1), ;
oMenuFile:PopUp( o:setParent(), o:currentPos(),, ;
XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN ) }
@ 0,0 DCPUSHBUTTONXP CAPTION 'p' SIZE 20,20 PIXEL OBJECT oButtonSize ;
EVAL {|o|o:hide()} ;
COLOR GRA_CLR_BLACK, GRA_CLR_PALEGRAY GRADIENT 5 RADIUS 2 ;
FONT '12.Marlett' ;
ACTION {|a,b,o| SetColumn(oBrowse,2), ;
oMenuSize:PopUp( o:setParent(), o:currentPos(),, ;
XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN ) }
DCSUBMENU oMenuFile PROMPT 'File Menu' OWNERDRAW
DCMENUITEM 'Cut' PARENT oMenuFile ACTION {||CellCut(oBrowse,'C',1)}
DCMENUITEM 'Copy' PARENT oMenuFile ACTION {||CellCopy(oBrowse,'C',1)}
DCMENUITEM SEPARATOR PARENT oMenuFile
DCMENUITEM 'Paste' PARENT oMenuFile ACTION {||CellPaste(oBrowse,'C',1)}
DCSUBMENU oMenuSize PROMPT 'Size Menu' OWNERDRAW
DCMENUITEM 'Cut' PARENT oMenuSize ACTION {||CellCut(oBrowse,'N',2)}
DCMENUITEM 'Copy' PARENT oMenuSize ACTION {||CellCopy(oBrowse,'N',2)}
DCMENUITEM SEPARATOR PARENT oMenuSize
DCMENUITEM 'Paste' PARENT oMenuSize ACTION {||CellPaste(oBrowse,'N',2)}
DCREAD GUI FIT TITLE 'Browse with Cell Push Button'
RETURN nil
* ----------
PROC appsys ; RETURN
* ----------
STATIC FUNCTION ApplyButton( oButtonFile, oButtonSize, oBrowse )
LOCAL oColumn, oCell, aRect
oColumn := oBrowse:getColumn(1)
oCell := oColumn:dataArea
aRect := oCell:cellRect(oBrowse:rowPos)
oButtonFile:setParent(oCell)
oButtonFile:show()
oButtonFile:setPos({aRect[3]-21,aRect[2]+1})
oColumn := oBrowse:getColumn(2)
oCell := oColumn:dataArea
aRect := oCell:cellRect(oBrowse:rowPos)
oButtonSize:setParent(oCell)
oButtonSize:show()
oButtonSize:setPos({aRect[3]-21,aRect[2]+1})
RETURN nil
* ----------
STATIC FUNCTION CellCut( oBrowse, nType )
LOCAL oColumn, bEval, xValue
oColumn := oBrowse:getColumn(oBrowse:colPos)
bEval := oColumn:dataLink
xValue := Eval(bEval)
sxClipBoard := xValue
IF nType $ 'CM'
xValue := ''
ELSEIF nType == 'N'
xValue := 0
ELSEIF nType == 'L'
xValue := .f.
ELSEIF nType == 'D'
xValue := Ctod('')
ENDIF
Eval(bEval,xValue)
oBrowse:refreshCurrent()
RETURN nil
* ---------
STATIC FUNCTION CellCopy( oBrowse, nType )
LOCAL oColumn, bEval, xValue
oColumn := oBrowse:getColumn(oBrowse:colPos)
bEval := oColumn:dataLink
IF nType == 'N'
xValue := Val(DC_XtoC(Eval(bEval)))
ELSE
xValue := Eval(bEval)
ENDIF
sxClipBoard := xValue
RETURN nil
* ---------
STATIC FUNCTION CellPaste( oBrowse, nType )
LOCAL oColumn, bEval, xValue, cPaste
oColumn := oBrowse:getColumn(oBrowse:colPos)
bEval := oColumn:dataLink
xValue := Eval(bEval)
cPaste := DC_XtoC(sxClipBoard)
IF nType $ 'CM'
xValue := cPaste
ELSEIF nType == 'N'
xValue := Val(cPaste)
ELSEIF nType == 'L'
xValue := cPaste == 'Y'
ELSEIF nType == 'D'
xValue := DtoC(cPaste)
ENDIF
Eval(bEval,xValue)
oBrowse:refreshCurrent()
RETURN nil
* ---------
STATIC FUNCTION SetColumn( oBrowse, nPos )
IF nPos > oBrowse:colPos
DO WHILE nPos > oBrowse:colPos
oBrowse:right()
oBrowse:forceStable()
ENDDO
ELSEIF nPos < oBrowse:colPos
DO WHILE nPos < oBrowse:colPos
oBrowse:left()
oBrowse:forceStable()
ENDDO
ENDIF
RETURN nil