Gracias Daniel
Eso era justo lo que querÃa, y ya que estamos, una pegunta...para ti y para Antonio.
En la clase TxBrowse (últimas versiones) debo suponer que se ha corregido algo, pues siguiendo tu mismo ejemplo
con xBrwAppe, resulta que al crear la primera columna, en el bOnPosEdit, he puesto un If nKey == VK_Return .......
y un If nKey == VK_ESCAPE, pues bien si he pulsado return primero y luego escape, me da un error DBCMD/2001 al hacer un dbappend() (que no hago en la linea que da) y si solo pulso escape, se cierra el dialogo.
las lineas de creación son estas
oBrw = TXBrowse():New( oDlgAlb )
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:lRecordSelector := .t.
oBrw:nHeaderLines := 1
oBrw:nDataLines := 1
oBrw:nRowSel := 1
oBrw:nMarqueeStyle := 3 //Highlight row //MARQSTYLE_HIGHLCELL
oBrw:bClrSelFocus := {||{CLR_WHITE,RGB(176,196,222 )}}
oBrw:cAlias := cAlias1
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
oBrw:bClrSel := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
oBrw:lFastEdit := .T.
oBrw:bPastEof = {|| (cAlias1)->(Dbappend()), oBrw:GoLeftMost(),oBrw:Refresh(),;
oBrw:aCols[ 1 ]:Edit() }
//agrega registro y "oprime" enter
oCol = oBrw:AddCol()
oCol:bStrData := { ||TRANSFORM((cAlias1)->codigo,"99999") }
oCol:nEditType := EDIT_GET
oCol:cHEADER := "CODIGO"
oCol:bEditValid = {|o| if ( VAL(o:value()) == 0 , .f., .t.) }
oCol:bOnPostEdit := { | oCol, xVal, nKey | If( RecCount() == 0,( DbAppend(), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, If(Barticulo(oBrw,xVal),oBrw:Refresh(),oBrw:GoleftMost()),),;
If( nKey == VK_ESCAPE .and. VAL((cAlias1)->codigo)=0,( (cAlias1)->(dbDelete()),;
(cAlias1)->(__dbPack()),(cAlias1)->(dbGoBottom()),oBrw:Refresh() ), ) }
Las de tu código de ejemplo son estas
@ 0, 0 XBROWSE oBrw OF oWndChild ALIAS "test"
oBrw:nMarqueeStyle = 3
oBrw:nColDividerStyle = LINESTYLE_BLACK
oBrw:nRowDividerStyle = LINESTYLE_BLACK
oBrw:lHScroll = .T.
oBrw:lColDividerComplete = .T.
oBrw:lAutoAppend = lAuto
oBrw:lFastEdit = .T.
oBrw:bPastEof = {|| Dbappend(), oBrw:refresh(), oBrw:aCols[ 1 ]:Edit() }
oBrw:bKeyDown = {|nKey| if( nKey == VK_DELETE ,;
( nLast:=recno(),test->( dbdelete() ), __Dbpack(), dbgoto(nLast) ),), oBrw:refresh() }
oCol = oBrw:AddCol()
oCol:bStrData = { || test->First }
oCol:cHeader = "First"
oCol:nEditType = EDIT_GET
oCol:bOnPostEdit = ;
{ | oCol, xVal, nKey | if( xVal == space( 20 ) .and. nKey == VK_ESCAPE,;
( nLast:=recno(),test->( dbdelete() ), __Dbpack(),dbgoto(nLast-1) ),;// Afirmacion
( If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),), ;//Negativa
If( nKey == VK_RETURN, test->First := xVal,) )), oBrw:refresh() }
oCol:bEditValid = {|o| if ( o:value() == space(20), .f., .t.) }
Al margen de que tu ejemplo es una Windows y el mÃo un dialog, ¿qué diferencia hay?
Yo no veo ninguna salvo lo que dije antes, que se haya corregido algo en la clase.
Un abrazo y feliz año nuevo
Pedro