FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour TWBrowse Editable
Posts: 10
Joined: Fri Jun 29, 2007 01:52 PM
TWBrowse Editable
Posted: 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.
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
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
Posts: 210
Joined: Sun Jul 23, 2006 01:15 AM
TWBrowse Editable
Posted: Mon Sep 24, 2007 04: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 <!-- s:-( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":-(" title="Sad" /><!-- s:-( -->"),.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 &lt;= 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 ) &gt; 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 &gt;= 1 .and. nCod &lt;= 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
Posts: 114
Joined: Fri Nov 24, 2006 09:03 PM
TWBrowse Editable
Posted: Mon Sep 24, 2007 04:59 PM

Porque no le das ENTER en vez de ESC

Posts: 10
Joined: Fri Jun 29, 2007 01:52 PM
TWBrowse Editable
Posted: 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

Continue the discussion