TWBrowse Editable

TWBrowse Editable

Postby marizete » Mon Sep 24, 2007 12:04 pm

Buen dia amigos del foro, estoy necesitando una ayuda para editar valor en mi twbrowse con matriz, abajo el codigo crea la twbrowse, consigo incluir y excluir lineas, pero no consigo hacer que se deje incluir datos en las lineas para posteriormente hacer un aadd en la matriz.
Code: Select all  Expand view  RUN
FUNCTION fDesenhaLbxCompra()
AADD(aItens,{ strZero(cod,3),"","","",0,0,0})
cod +=1
    REDEFINE LISTBOX oLbxCompra ;
    FIELDS      ""     ,""       ,""          ,""          ,""              , ""         ;
    HEADERS    "Código","Produto","Un. Medida","Quantidade","Valor Unitário", "SUB-TOTAL";
    FIELDSIZES 50      , 230     , 80         , 80         , 80             ,  80        ;
    ID 4011 OF oDlgCompra
    oLbxCompra:SetArray( aItens )
    oLbxCompra:bLine        := { || { aItens[oLbxCompra:nAt,1] , aItens[oLbxCompra:nAt,2] , aItens[oLbxCompra:nAt,3] , Transform(aItens[oLbxCompra:nAt,4],"@E 99,999.99") , Transform(aItens[oLbxCompra:nAt,5],"@E 99,999,999.99") , Transform(aItens[oLbxCompra:nAt,6],"@E 99,999,999.99") } }
    oLbxCompra:nLineStyle   := 3
    oLbxCompra:nHeaderStyle := 3
    oLbxCompra:aJustify := {.T.,.F.,.F.,.T.,.T.,.T.}
   
    oLbxCompra:lAutoEdit  = .T.
 
    oLbxCompra:Refresh()
RETURN Nil

FUNCION PARA ADICIONAR O EXCLUIR UNA LINEA
Code: Select all  Expand view  RUN
FUNCTION fAdicionarLinha()
  AADD(aItens,{ strZero(cod,3),"","","",0,0,0})
  oLbxCompra:SetArray(aItens)
  oLbxCompra:Refresh()
  cod +=1
RETURN Nil

//------------------------------------------
FUNCTION fExcluirLinha()
  aDel(aItens, oLbxCompra:nAt)
  aSize(aItens,LEN(aItens)-1)
  oLbxCompra:SetArray(aItens)
  oLbxCompra:Refresh()
RETURN Nil

El caso es que con oLbxCompra:lAutoEdit = .T.
puedo escribir en la celda, pero tengo que dar un Esc para salir, entonces limpia todo. Si alguien ya tuvo un caso parecido, agradeceria la ayuda. Seria bueno poder ver un ejemplo. No he consiguido encontrar posts en los foros que hablen sobre esto.
Desde ya muchas gracias
Marizete C. Neuhaus
xHarbour 0.99.61, Fivewin 2.7, Pelles
User avatar
marizete
 
Posts: 10
Joined: Fri Jun 29, 2007 1:52 pm
Location: Brasil

Postby AOKISANTOS » Mon Sep 24, 2007 4:54 pm

Ola, veja este exemplos do samples da propria TWBROWSE:

Acho que o que precisas é a linha:

oLbx:bEdit:= {|nCol, cBuffer, lFirstEdit|;
EditaCelda( oLbx, nCol, cBuffer, aDatos, lFirstEdit, aTotal ) }


Exemplo:


#include "FiveWin.ch"


Function Main()
LOCAL aTotal:= {0,0,0, Nil, Nil, Nil}
LOCAL aDatos:= {} // Array MultiDimensional
// Cod.Art. Descrip. Cantidad $Unitario $Total MarcaDeNuevo
LOCAL l3d:= .F.
LOCAL oDlg, oLbx, cPic:= "@ze 999,999.99", oFont
LOCAL hBmp:= ReadBitMap( 0, "finger.bmp" ) // Dedicado a mi amigo Mario Goanzalez

If Alert("Quiere verlo en 3D ??", {"Aceptar","Cancelar"}) == 1
l3D:= .T.
EndIf

DEFINE FONT oFont NAME "Times New Roman" SIZE 0,-15 BOLD

DEFINE DIALOG oDlg FROM 0,0 TO 21,55 TITLE "::bEdit's TWBrowse Power !!!"

TWBrowse():lHScroll:= .F.
@2,2 LISTBOX oLbx FIELDS "" ;
HEADER "Id","Articulo", "Descripcion", "Cantidad", ;
"Unitario", "Total" ;
OF oDlg SIZE 207,100 PIXEL ;
SIZES 25,50, 130, 67,60,60

oLbx:bLine:= {|nAt| nAt:= oLbx:nAt, ;
If( Len(aDatos)<1 .or. nAt>Len(aDatos),;
Array(6), ;
{ If( oLbx!=Nil .and. oLbx:lSelect, hBmp, 0 ),;
If( aDatos[nAt,1]==0,Space(4),StrZero( aDatos[nAt,1], 4 ) ), ;
aDatos[nAt,2], ;
Transform( aDatos[nAt,3], cPic ), ;
Transform( aDatos[nAt,4], cPic ), ;
Transform( aDatos[nAt,5], cPic ) } ) }

oLbx:aJustify:= { 2, 2, .f., .t., .t. , .t. }
oLbx:SetArray( aDatos )

oLbx:lAdjLastCol:= .f.

oLbx:lAutoEdit := .t.
oLbx:lAutoSkip := .t.

oLbx:nLineStyle := 2
oLbx:nHeaderStyle:= 2

oLbx:bBkColor:= {|nRow,nCol,nStyle| ;
if( nStyle==1,if( nCol%2==0, CLR_RED , CLR_GREEN ),) }
oLbx:bTextColor:= {|nRow,nCol,nStyle| ;
if( nStyle==1,if( nCol%2==0, CLR_YELLOW, CLR_WHITE ),) }

If l3D
oLbx:Set3DStyle()
EndIf


oLbx:bEdit:= {|nCol, cBuffer, lFirstEdit|;
EditaCelda( oLbx, nCol, cBuffer, aDatos, lFirstEdit, aTotal ) }


@105, 110 SAY "Neto Gravado " OF oDlg PIXEL
@115, 110 SAY "I.V.A. 21% " OF oDlg PIXEL
@125, 110 SAY "Total " OF oDlg PIXEL
@105, 150 SAY aTotal[4] PROMPT aTotal[1] PICTURE '@ZE 999,999.99' OF oDlg PIXEL RIGHT SIZE 50,10
@115, 150 SAY aTotal[5] PROMPT aTotal[2] PICTURE '@ZE 999,999.99' OF oDlg PIXEL RIGHT SIZE 50,10
@125, 150 SAY aTotal[6] PROMPT aTotal[3] PICTURE '@ZE 999,999.99' OF oDlg PIXEL RIGHT SIZE 50,10



@137,10 BUTTON "Agrega" OF oDlg PIXEL ;
ACTION ( NewReg( aDatos, oLbx ), oLbx:Edit() ) SIZE 50,Nil

@137,80 BUTTON "Modifica" OF oDlg PIXEL ;
ACTION If( Len(aDatos) > 0 .and. ;
oLbx:nAt <= Len(aDatos) .and. oLbx:nAt > 0,;
oLbx:Edit(), ) SIZE 50,Nil

@137,150 BUTTON "Elimina" OF oDlg PIXEL ;
ACTION If( Len(aDatos) > 0 .and. ;
oLbx:nAt <= Len(aDatos) .and. oLbx:nAt > 0 .and. ;
Alert("Borra ?",{"ok","Cancela"}) == 1, ;
DelReg( aDatos, oLbx, aTotal ),) SIZE 50,Nil




ACTIVATE DIALOG oDlg CENTERED



RELEASE FONT oFont
ReleaseDC( hBmp )

return Nil

//----------------------------------------------------------------------------//
Function GetSysFont() ; return "MS Sans Serif"


//----------------------------------------------------------------------------//
STATIC Function EditaCelda( oLbx, nCol, cBuffer, aDatos, lFirstEdit, aTotal )
LOCAL aResult, nAt:= oLbx:nAt, uBuffer, lContinue:= .t.
LOCAL bValid, nColReal:= nCol

nCol-- // Para que sea como si no exisiera BitMap

uBuffer:= aDatos[nAt,nCol]

While .t.

Do Case
Case ( nCol == 2 .or. nCol == 5 ) .and. lFirstEdit
Alert( "Columnas NO EDITABLES" )
return .f.

Case nCol == 1
bValid:= {|| If( Empty( aResult:= SeekItem( uBuffer ) ), ;
(Alert( "Codigo Articulo Inexistente :-("),.F.) , .T. ) }

If lContinue:= oLbx:lEditCol( nColReal, @uBuffer, "@ZE 9999", bValid,,CLR_YELLOW )
aDatos[nAt,1]:= uBuffer
aDatos[nAt,2]:= aResult[1]
aDatos[nAt,4]:= aResult[2]
EndIf

Case nCol == 3 // Cantidad
If lContinue:= oLbx:lEditCol( nColReal, @uBuffer, "@ZE 999,999.99",,,CLR_YELLOW )
If uBuffer <= 0
Alert("Debe Especificar una cantidad !!!")
Loop
EndIf
aDatos[nAt,3]:= uBuffer
EndIf

Case nCol == 4 // Unitario
If lContinue:= oLbx:lEditCol( nColReal, @uBuffer, "@ZE 999,999.99",,,CLR_YELLOW )
aDatos[nAt,4]:= uBuffer
aDatos[nAt,6]:= .f. // Ya no es un Nuevo Registro !!!
EndIf

Case nCol == 5 .and. ! lFirstEdit .and. Len( aDatos ) == nAt
NewReg( aDatos, oLbx )

EndCase

If ! lContinue .and. aDatos[nAt,6] // Se habia agregado un nuevo Item !!!
If Alert( "Cancela este Nuevo Registro", { "Ok","Cancelar" } ) == 1
DelReg( aDatos, oLbx, aTotal )
return .f.
Else
Loop
EndIf
EndIf

Exit

EndDo

If Len( aDatos ) > 0
aDatos[nAt,5]:= Round( aDatos[nAt,3] * aDatos[nAt,4], 2 )
Suma( aDatos, aTotal )
EndIf


If lContinue
Do Case
Case oLbx:nLastKey == VK_UP
return If( !GetKeyState(VK_SHIFT), -3, -2 )
Case oLbx:nLastKey == VK_DOWN
return If( !GetKeyState(VK_SHIFT), 3, 2 )
Case oLbx:nLastKey == VK_TAB
return If( GetKeyState(VK_SHIFT), -1, 1 )
EndCase
EndIf


return lContinue


//----------------------------------------------------------------------------//
STATIC Function SeekItem( nCod ) // Simulamos busqueda en Base de Datos :-)

If nCod >= 1 .and. nCod <= 500
return { "Producto " + StrZero( nCod, 4 ), nCod + 0.55 }
EndIf

return ""
//----------------------------------------------------------------------------//
STATIC Function NewReg( aDatos, oLbx )
Aadd( aDatos, {0,"",0,0,0,.t.} )
oLbx:Refresh()
oLbx:lHitBottom:= .f.
oLbx:GoBottom()
SysRefresh()
return Nil
//----------------------------------------------------------------------------//
STATIC Function DelReg( aDatos, oLbx, aTotal )
ADel( aDatos, oLbx:nAt )
ASize( aDatos, Len( aDatos ) - 1 )
oLbx:GoUp()
oLbx:Refresh()
Suma( aDatos, aTotal )
return Nil
//----------------------------------------------------------------------------//
STATIC Function Suma( aDatos, aTotal )
aTotal[1]:= 0
AEval( aDatos, {|aItem| aTotal[1]+= aItem[5] } )
aTotal[1]:= Round( aTotal[1], 2 )
aTotal[2]:= Round( aTotal[1] * 0.21, 2 )
aTotal[3]:= Round( aTotal[1] + aTotal[2],2 )
AEval( aTotal, {|oSay| oSay:Refresh(.F.) }, 4 )

return Nil
//----------------------------------------------------------------------------//



Fique com Deus


Aoki
FWH25+XHARBOUR 99.50
AOKISANTOS
 
Posts: 210
Joined: Sun Jul 23, 2006 1:15 am

Postby jacgsoft » Mon Sep 24, 2007 4:59 pm

Porque no le das ENTER en vez de ESC
User avatar
jacgsoft
 
Posts: 105
Joined: Fri Nov 24, 2006 9:03 pm
Location: Lima - Peru

Postby marizete » Tue Sep 25, 2007 11:42 am

Estimado Aoki

Sem comentários. Você acertou na mosca o que eu precisava.

Muito obrigada mesmo...
xHarbour 0.99.61, Fivewin 2.7, Pelles
User avatar
marizete
 
Posts: 10
Joined: Fri Jun 29, 2007 1:52 pm
Location: Brasil


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: SantaCroya and 53 guests