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
Agora sim - começando já sabendo muita coisa
Moderador: Moderadores
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Basicamente voce deverá acrescentar o seguinte codigo:
Como exemplo compile o codigo abaixo:
Com este exemplo voce poderá entender melhor o funcionamento de um browse e como se comporta quando editamos os campos no mesmo.
@braços :?)
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 ) }
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
@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.
@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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
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
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
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Coloque um DBGOTOP() antes do DEFINE FONT...
Faça o teste sem abrir o indices do arquivo e depois com o indice.
Troque:
Por:
Muitas vezes o que ocorre é o fechamento dos arquivos abertos quando fechamos arquivos apos o ACTIVATE WINDOW/DIALOG.
@braços :?)
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())
Código: Selecionar todos
activate dialog oDlg centered valid( aptos->(dbclosearea()) , .t. )
@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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.