Quer ver o que mudou do seu browse anterior para o atual?
Aqui comecei a mexer nos nomes, e cheguei naquela duplicação, mas tudo bem.
passou a receber como parâmetro uma lista de campos, e a rotina de usuário
Se a lista de campos estiver vazia, usa a criação automática que JÁ EXISTIA.
Senão, cria a lista a partir do que foi recebido no parâmetro
Código: Selecionar todos
IF aCamposList == Nil
nLen := oRs:fields():count() - 1
FOR nCont := 0 TO nLen
oColumn := TBColumnNew( oRs:fields( nCont ):name(), ADORecordSetFieldBlock( oRs, nCont ) )
oColumn:width := Max( Min( oRs:Fields( nCont ):definedSize,50), Len( oRs:fields( nCont ):name ) ) + 5
oBrowse:addColumn( oColumn )
NEXT
ELSE
FOR EACH aItem IN aCamposList
oColumn := TBColumnNew( aItem[1], aItem[2] )
IF Len( aItem ) > 2
oColumn:ColorBlock := aItem[3]
ENDIF
oBrowse:AddColumn( oColumn )
NEXT
ENDIF
E na checagem de teclas, se existir função de usuário, chama a função de usuário
Código: Selecionar todos
IF oBrowse:applyKey( nKey ) == TBR_EXIT
EXIT
ENDIF
IF bFuncaoUsuario != NIL
DO WHILE ! oBrowse:Stable
oBrowse:Stabilize()
ENDDO
Eval( bFuncaoUsuario, oBrowse, oRs, nKey )
oBrowse:RefreshAll()
ENDIF
No browse, foi isso acima.
Pra facilitar com o ADO, no que se refere a testar campos, foram adicionadas funções ao ADO.
Mas isso tem a ver com o ADO, que facilita os campos virem prontos, e facilita o browse.
Código: Selecionar todos
FUNCTION SuperADO( oRs )
__ObjAddMethod( oRs, "TOSTRING", @ADOToString() )
__ObjAddMethod( oRs, "TONUMBER", @ADOToNumber() )
__ObjAddMethod( oRs, "TODATE", @ADOToDate() )
__ObjAddMethod( oRs, "TOSTR", @ADOToStr() )
RETURN Nil
Essa parte vai poder usar não apenas no browse, mas em todo aplicativo.
Ao invés de, em todo fonte, ficar testando se o campo é Nil, ou formatando.... já diz exatamente do jeito que quer.
É só trocar :Field( "nome" ):Value por :ToString( "nome" ) ou :ToDate( "nome" ) ou :ToNumber( "nome" ) ou :ToStr( "nome" )
O campo já vém no formato que quiser.
Por exemplo, de adicional, :ToStr( "valor", 15, 2 ),
mais simples no fonte do que Str( :ToNumber( "valor" ), 15, 2 )
e muito mais simples que Str( iif( :Fields("valor") == Nil, 0, :Fields("Valor") ), 15, 2 )
Essa parte é pra reduzir fonte, e evitar esquecer de fazer o teste.
É pro ADO, que ajuda no browse.
NÃO considero defeito do ADO: ele trás o conteúdo, se na base de dados foi gravado NULL, é o que vém.
Então...
Foram essas as mudanças.
Até poderia ter feito na sua própria rotina anterior, se os nomes das variáveis estivessem claros.
E poderia ir removendo as particularidades, conforme for colocando "na parte de fora", na rotina de usuário.
Espero que não, mas o fonte postado deu a impressão de que voce pode estar querendo fazer um browse que chama o outro browse.
Se for assim, vai continuar com complicação do mesmo jeito, só vai trocar a complicação de lugar.
NÃO CONFUNDA um browse que pode ser usado em toda situação, com um browse que contém tudo que é fonte pra tudo que é situação.
Isso NÃO é browse genérico.