Agora sim - começando já sabendo muita coisa

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Agora sim - começando já sabendo muita coisa

Mensagem por Mário Isa »

Boa noite.... eh eh.... boa madrugada....
Bom gente. só agora é que eu consegui entender, ou seja, sair da programação normal do clipper para uma orientada a objetos e olha que falta muito hein?

lance seguinte:
tenho um listbox com os campos de um arquivo.
ocorre que quando dou seta para baixo, a barra desce inteira cobrindo todos os cambos e eu queria editar o campo ali mesmo sabe, sem ter que dar duplo clique chamando uma função, ou seja, quero poder andar de campo em campo como se fosse no dbedit() e poder "editar" o campo ali mesmo... tem jeito?
Mário
:)Pos
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Basicamente voce deverá acrescentar o seguinte codigo:

Código: Selecionar todos

oLbx:lAutoEdit  := .t.
oLbx:lAutoSkip  := .t.
oLbx:bEdit:= {|nCol, cBuffer, lFirstEdit| SuaFuncaoEditaCelula( oLbx, nCol ) }
Como exemplo compile o codigo abaixo:

Código: Selecionar todos

#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
Com este exemplo voce poderá entender melhor o funcionamento de um browse e como se comporta quando editamos os campos no mesmo.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Mensagem por Mário Isa »

Achei melhor postar o meu código prá você ver se pode me ajudar, veja:
Sim, antes uma coisa: Quando utilizo set filter os dados não aparecem no listbox, o que será?.





// ------------------------------------------------------------------ //
Function Reservas()
Local oDlg,oLbx,oLista,wFontMain

if wMain:nRight() > 900
nSizeGet := { 440,350 }
nSizeLbx := { 470,270 }
nSizeDlg := { 997,611 }
nPosBott := 24
else
nSizeGet := { 300,190 }
nSizeLbx := { 300,190 }
nSizeDlg := { 624,478 }
nPosBott := 17.5
endif



//aí faz o seguinte:
//-pergunta o período que se quer visualizar


marven := mtipo := " "
DEFINE DIALOG oDlg FROM 10, 20 TO 22, 59.5 TITLE "INFORME"
@ 0.6, 2 RADIO mTIPO PROMPT "&Single", "&Duplo" , "&Triplo" OF oDlg
@ 4.6, 2 RADIO marven PROMPT "&Ar Condic." , "Ventilador" of oDlg
@ 5.6, 15 BUTTON "&Ok" OF oDlg SIZE 35, 12 ACTION ( oDlg:End()) DEFAULT
ACTIVATE DIALOG oDlg CENTERED

as2 := 'SDT'
as3 := 'AV'
mtipo := subs(as2,mtipo,1)
marven := subs(as3,marven,1)

// -abre o arquivo de aptos
//-veja quanto aptos tem

use c:\stoq2000\stoq2000\aptos index c:\stoq2000\stoq2000\aptos shared new
//set filter to arven == marven .and. mtipo == tipo
n_aptos := recc()

//-abre este arquivo e dá um browse nele pelo listbox sei lá
// só sei que é igual ao do secreta

dbgotop()
msginfo(if(eof(),"T","F"))
msginfo(mtipo+marven)
if eof()
msginfo('Não há dados a mostrar.')
aptos->(dbclosearea())
return nil
end

DEFINE FONT wFontMain NAME "Courier New" SIZE 0,-11 BOLD
ACTIVATE FONT wFontMain

DEFINE DIALOG oDlg TITLE "RESERVAS" ;
SIZE nSizeDlg[1],nSizeDlg[2]

@ 1, 1 LISTBOX oLbx FIELDS QUARTO,D01,D02,D03,D04,D05,D06,D07,D08,D09,D10,D11,D12,D13,D14,D15,D16,D17,D18,D19,D20,D21,D22,D23,D24,D25,D26,D27,D28,D29,D30,D31 ;
ON DBLCLICK altera(oLbx) ;
FONT wFontMain UPDATE;
size nSizeLbx[1],nSizeLbx[2]

activate dialog oDlg centered

aptos->(dbclosearea())

//-aí monta os gets

return nil
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Coloque um DBGOTOP() antes do DEFINE FONT...

Faça o teste sem abrir o indices do arquivo e depois com o indice.

Troque:

Código: Selecionar todos

activate dialog oDlg centered 
aptos->(dbclosearea()) 
Por:

Código: Selecionar todos

activate dialog oDlg centered valid( aptos->(dbclosearea()) , .t. )
Muitas vezes o que ocorre é o fechamento dos arquivos abertos quando fechamos arquivos apos o ACTIVATE WINDOW/DIALOG.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder