A coisa ficou assim, espero que seja útil para mais alguém.
A função 'array_select ' pode retornar a posição do cursor dentro da matriz ou o valor da célula
Foi feita tendo como base a sugestão que me deram em uma mensagem anterior
_sql -> Consulta SQL é passada para a função para mostrar ao usuário a mensagem "ORDER BY"
_secs -> Tempo que a consulta sql demorou para processar, para mostrar a mensagem "X linhas em X secs"
Pode melhorar ainda, mas é o que eu precisava
&& CARREGAMENTO DA MATRIZ PARA CHAMAR A FUNÇÃO
_matriz := {}
_tb_titl := {"ID", "NOME", "SETOR", "EAN"}
_tb_pict := {"@E 99999999", "@!S32", "@!S30", "@!"}
for _i := 1 to _maxrow
giragira ("Processando " + allstr (_i) + " de " + allstr (_maxrow) + ", [ESC] para terminar")
_ln := _result:getrow (_i)
aadd (_matriz, {pg_get (_ln, "id"), pg_get (_ln, "nome"), pg_get (_ln, "setor"), pg_get (_ln, "ean")})
if esc_foi ()
exit
endif
giragira ("fim")
next
&& CHAMADA DA FUNÇÃO
_row := array_select (_matriz, 03, 00, 24, 79, _tb_expr, _tb_titl, _tb_pict, _sql, _secs)
&&----------------------------------------------------------------
* June 19, 2021 - 11:30:17 PM
*
* Sistema.....: PROTEUS II
* Linguagem...: xBase.
* Compilador..: HARBOUR 3.2.0DEV (R2104142025)
* Autor.......: Ariobar Lima Pontes.
* Email.......: ariobar.pontes@gmail.com
*
/* ARRAY_SELECT */
#include "box.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "tbrowse.ch"
#xtrans :data => :cargo\[1]
#xtrans :recno => :cargo\[2]
function array_select (_carga, _lin_ini, _col_ini, _lin_fim, _col_fim, _tb_expr, _tb_titl, _tb_pict, _sql, _secs)
local _anterior := savescreen (_lin_ini, _col_ini, _lin_fim, _col_fim)
local _i, _inkey, _bblock, _otbrowse, _otbcolumn
local _order_by := rat ("ORDER BY", upper (_sql))
local _order := substr (_sql, _order_by, len (_sql))
local _return := 0
dispbox (_lin_ini, _col_ini, _lin_fim, _col_fim, B_SINGLE + chr (32), "W+/B")
_otbrowse := tbrowse ():new (_lin_ini + 1, _col_ini + 1, _lin_fim - 3, _col_fim - 1)
_otbrowse:cargo := {_carga, 1} && _otbrowse:cargo := {directory ("*.*"), 1} ???
_otbrowse:headsep := chr (196)
_otbrowse:colsep := chr (179) && " " + chr (179) + " "
_otbrowse:colorspec := "W+/B, B/W, W+/R, W+/BG, GR+/GR"
*** NAVIGATION CODE BLOCKS FOR ARRAY ***
_otbrowse:gotopblock := {||_otbrowse:recno := 1}
_otbrowse:gobottomblock := {||_otbrowse:recno := len (_otbrowse:data)}
_otbrowse:skipblock := {|_nskip| arrayskipper (_nskip, _otbrowse)}
*** CREATE TBCOLUMN OBJECTS AND ADD THEM TO TBROWSE OBJECT ***
for _i := 1 to len (_tb_titl)
*** CODE BLOCK FOR INDIVIDUAL COLUMNS OF THE ARRAY ***
_bblock := arrayblock (_otbrowse, _i)
_otbcolumn := tbcolumn ():new (_tb_titl [_i], _bblock)
_otbcolumn:picture := _tb_pict [_i]
_otbrowse:addcolumn (_otbcolumn)
next
/* MONTAGEM DA TELA */
@ _lin_fim - 2, _col_ini + 1, _lin_fim - 2, _col_fim - 1 box replicate (chr (196), 9) color "W+/B"
if empty (_secs)
@ _lin_fim - 1, 02 say alltrim (str (len (_carga))) + " linhas" color "W+/B"
else
@ _lin_fim - 1, 02 say alltrim (str (len (_carga))) + " linhas em " + alltrim (str (_secs)) + " secs" color "W+/B"
endif
@ _lin_fim - 1, 42 say _order color "W+/B"
&& DISPLAY BROWSER AND PROCESS USER INPUT
do while .t.
setcursor (3)
_otbrowse:forcestable ()
_inkey := inkey (0)
if _otbrowse:applykey (_inkey) == TBR_EXIT
exit
endif
do case
case _inkey == K_ENTER
*** _return := eval (_otbrowse:getcolumn (1):block) && RETORNA VALOR DA CÉLULA DA COLUNA 1
_return := _otbrowse:recno && RETORNA A POSIÇÃO DENTRO DA MATRIZ PASSADA
exit
case _inkey == K_ESC
exit
endcase
enddo
restscreen (_lin_ini, _col_ini, _lin_fim, _col_fim, _anterior)
return _return
/* ARRAYBLOCK */
&& THIS CODE BLOCK USES DETACHED LOCAL VARIABLES TO
&& ACCESS SINGLE ELEMENTS OF A TWO-DIMENSIONAL ARRAY.
function arrayblock (_otbrowse, _nsubscript)
return {||_otbrowse:data [_otbrowse:recno, _nsubscript]}
/* ARRAYSKIPPER */
&& THIS FUNCTION NAVIGATES THE ROW POINTER OF THE
&& THE DATA SOURCE (ARRAY)
function arrayskipper (_nskiprequest, _otbrowse)
local _nlastrec := len (_otbrowse:data) && LENGTH OF ARRAY
local _nskipped := 0
do case
case _otbrowse:recno + _nskiprequest < 1 && SKIP REQUESTED THAT NAVIGATES PAST FIRST ARRAY ELEMENT
_nskipped := 1 - _otbrowse:recno
case _otbrowse:recno + _nskiprequest > _nlastrec && SKIP REQUESTED THAT NAVIGATES PAST LAST ARRAY ELEMENT
_nskipped := _nlastrec - _otbrowse:recno
otherwise && SKIP REQUESTED THAT NAVIGATES WITHIN ARRAY
_nskipped := _nskiprequest
endcase
_otbrowse:recno += _nskipped && ADJUST ROW POINTER
&& TELL TBROWSE HOW MANY ROWS ARE ACTUALLY SKIPPED.
return _nskipped
/*_END_OF_FILE_*/