A rotina é boa, só contém uma falha simples:
O ESC encerra a seleção, mas também encerra tudo.
Por isso o dbEdit não aparece, porque não chega nele.
Só formatei o fonte, e retirei o ESC.
Código: Selecionar todos
#include "inkey.ch"
MEMVAR acFields
PROCEDURE Main
LOCAL acSelectedFields, nCont, nFCount
PRIVATE acFields
SetMode( 40, 120 )
CLS
USE d:\jpa\cordeiro\jpcadas
nFCount = FCount()
DO WHILE .T.
acFields := {}
FOR nCont = 1 TO nFCount
aadd( acFields, " " + FieldName( nCont ) )
NEXT
@ 1, 5 SAY "ESPACO = Seleciona os campos para exibicao"
@ 2, 5 TO 2, MaxCol() - 5
@ MaxRow() - 1, 5 TO MaxRow() - 1, MaxCol() - 5
@ MaxRow(), 5 SAY Padc( "ESC - Para sair", 63 )
Achoice( 3, 5, MaxRow() - 2, MaxCol() - 10, acFields, "", "UDFSelecao" )
acSelectedFields := {}
FOR nCont = 1 TO Len( acFields )
IF Left( acFields[ nCont ], 1 ) == "*"
Aadd( acSelectedFields, Substr( acFields[ nCont ], 2 ) )
ENDIF
NEXT
Alert( Str( Len( acSelectedFields ) ) + " campos selecionados" )
IF Len( acSelectedFields ) == 0
Alert( "Nenhum campo escolhido!;Escolha um campo pelo menos." )
LOOP
ENDIF
@ 1, 5 CLEAR TO MaxRow() - 2, MaxCol()
@ 1, 5 SAY "RESULTADO - Somente campos escolhidos "
DbEdit( 2, 5, MaxRow() - 2, MaxCol() - 10, acSelectedFields )
EXIT
ENDDO
USE
QUIT
FUNCTION UDFSelecao( nModo, nElemento, nSelecao )
IF LastKey() = K_SPACE
acFields[ nElemento ] := iif( Left( acFields[ nElemento ], 1 ) == "*", " ", "*" ) + Substr( acFields[ nElemento ], 2 )
KEYBOARD Chr(1)
RETURN 2
ELSEIF LastKey() = K_ESC .OR. LastKey() = K_ENTER
RETURN 0
ENDIF
HB_SYMBOL_UNUSED( nModo + nSelecao )
RETURN 2
Nota:
Comparem os dois fontes.
É exatamente o mesmo código, mas agora formatado.
Só pra ilustrar como isso ajuda a entender o fonte, e ajuda em manutenções futuras.
Não faz diferença para o compilador, mas faz pra nós mesmos na hora de fazer manutenção.
Mas é o mesmo fonte do ANDRIL, o mérito da rotina é dele.
Apenas formatei, pra mostrar como isso ajuda a decifrar rápido um fonte.