Página 1 de 1

Posicionar na primeira linha do Grid

Enviado: 08 Jan 2017 10:06
por rubens
Olá Bom dia...

Tive que trocar um browse por um grid para poder usar a pesquisa com wildseek. Eu Leio o dbf na matriz aItems e indico essa matriz no grid. Daí na pesquisa letra a letra eu pesquiso na Matriz e retorno a linha para o grid. Muito rápido e eficiente só que se a tela do grid estiver preenchida ele sempre posiciona a linha encontrada na ultima linha do grid. Daí que ir na barra de rolagem para ver os restante dos itens. Preciso posicionar a linha encontrada na primeira linha do grid. Eu consigo fazer isso com o comando

Código: Selecionar todos

SetProperty('PesqPro','Grid_1','Value', {1,1} )
Mas só posiciona a linha e não os dados.
Na figura abaixo mostra exatamente o que acontece... Digito MA e ele encontra o primeiro MA, mas só mostra ele na última linha do grid. Eu quero que ele mostre o primeiro item encontrado na primeira linha do grid. Como disse acima se mandar ir para a primeira linha só vai a linha não rola os itens para cima.
Erro PesqPro.png
Formulário

Código: Selecionar todos

*HMGS-MINIGUI-IDE Two-Way Form Designer Generated Code
*OPEN SOURCE PROJECT 2005-2016 Walter Formigoni http://sourceforge.net/projects/hmgs-minigui/

DEFINE WINDOW TEMPLATE AT 190 , 331 WIDTH 1160 HEIGHT 574 VIRTUAL WIDTH NIL VIRTUAL HEIGHT NIL TITLE NIL ICON NIL MODAL CURSOR NIL ON INIT NIL ON RELEASE NIL ON INTERACTIVECLOSE NIL ON MOUSECLICK NIL ON MOUSEDRAG NIL ON MOUSEMOVE NIL ON MOVE NIL ON DROPFILES NIL ON SIZE NIL ON PAINT NIL BACKCOLOR NIL ON GOTFOCUS NIL ON LOSTFOCUS NIL ON SCROLLUP NIL ON SCROLLDOWN NIL ON SCROLLLEFT NIL ON SCROLLRIGHT NIL ON HSCROLLBOX NIL ON VSCROLLBOX NIL

     DEFINE TEXTBOX Text_1
            ROW    10
            COL    10
            WIDTH  1043
            HEIGHT 44
            FONTNAME 'Arial'
            FONTSIZE 24
            TOOLTIP ""
            ONCHANGE Pesq_Pro( Alltrim( This.Value) )
            ONGOTFOCUS NIL
            ONLOSTFOCUS NIL
            FONTBOLD .T.
            FONTITALIC .F.
            FONTUNDERLINE .F.
            FONTSTRIKEOUT .F.
            ONENTER NIL
            HELPID NIL
            TABSTOP .T.
            VISIBLE .T.
            READONLY .F.
            RIGHTALIGN .F.
            UPPERCASE .T.
            MAXLENGTH 40
            BACKCOLOR {{255,255,255},,{187,255,255}}
            FONTCOLOR {{0,0,255},,{0,64,128}}
            INPUTMASK NIL
            FORMAT NIL
            VALUE ""
     END TEXTBOX 

     DEFINE LABEL Label_1
            ROW    495
            COL    10
            WIDTH  1121
            HEIGHT 32
            VALUE "Label_1"
            FONTNAME "Arial"
            FONTSIZE 20
            TOOLTIP ""
            FONTBOLD .T.
            FONTITALIC .F.
            FONTUNDERLINE .F.
            FONTSTRIKEOUT .F.
            HELPID NIL
            VISIBLE .T.
            TRANSPARENT .F.
            ACTION NIL
            ONMOUSEHOVER NIL
            ONMOUSELEAVE NIL
            AUTOSIZE .F.
            BACKCOLOR NIL
            FONTCOLOR {255,0,0}
     END LABEL  

     DEFINE GRID Grid_1
            ROW    60
            COL    10
            WIDTH  1120
            HEIGHT 423
            HEADERS {'Codigo','Descrição','Un','Estoque','PrCusto','PrVenda','NCM','Gru'}
            WIDTHS {150,450,40,80,100,100,120,50}
            ITEMS aItems
            VALUE 0
            FONTNAME "Arial"
            FONTSIZE 12
            FONTBOLD .T.
            FONTITALIC .F.
            FONTUNDERLINE .F.
            FONTSTRIKEOUT .F.
            TOOLTIP ""
            BACKCOLOR NIL
            FONTCOLOR NIL
            DYNAMICBACKCOLOR { bColor, bColor,bColor,bColor,bColor,bColor,bColor,bColor }
            DYNAMICFORECOLOR { fColor, fColor,fColor,fColor,fColor,fColor,fColor,fColor }
            ONGOTFOCUS NIL
            ONCHANGE NIL
            ONLOSTFOCUS NIL
            ONDBLCLICK NIL
            ALLOWEDIT .F.
            ONHEADCLICK NIL
            ONCHECKBOXCLICKED NIL
            INPLACEEDIT ""
            CELLNAVIGATION .F.
            COLUMNCONTROLS NIL
            COLUMNVALID NIL
            COLUMNWHEN NIL
            VALIDMESSAGES NIL
            VIRTUAL .F.
            ITEMCOUNT NIL
            ONQUERYDATA NIL
            MULTISELECT .F.
            NOLINES .F.
            SHOWHEADERS .T.
            NOSORTHEADERS .F.
            IMAGE NIL
            JUSTIFY NIL
            HELPID NIL
            BREAK .F.
            HEADERIMAGE ""
            NOTABSTOP .T.
            CHECKBOXES .F.
            LOCKCOLUMNS NIL
            PAINTDOUBLEBUFFER .F.
     END GRID  

END WINDOW
Pesqpro

Código: Selecionar todos

Static Function Pesq_Pro(cNomePro)  
Local nFirst   := 0  // Primeiro Produto Encontrado
If LEft( cNomePro,1) = '*' 
	// Criar outra matriz filtrada com wildseek
	Return Nil
Else
	nFirst := Ascan( aItems,{|a|a[2] = cNomePro} )	
	If nFirst > 0 
		SetProperty('PesqPro','Grid_1','Value',nFirst )
	EndIf
EndIf
*SetProperty('PesqPro','Grid_1','Value', {1,1} )
Return nil 
Daí fui para o plano B, filtrar os dados porque aí a primeira linha sempre vai ser o primeiro item encontrado. Só que acontece o problema da lentidão no preenchimento do grid.Quando você deleta os itens e adiciona novamente até uns 20 itens fica quase imperceptível a velocidade mas acima disso fica extremamente lento. Para o wildseek dá porque tem que filtrar e apresentar os dados filtrados mesmo, mas letra a letra não...

Pensei em filtrar os dados em uma outra matriz e setar ela no grid, porque ao invés de adicionar item por item trocaria a matriz toda... mas não funcionou ...
Alguém sabe como posicionar na primeira linha do grid, dados e a linha?

Obrigado
Rubens

Posicionar na primeira linha do Grid

Enviado: 12 Jan 2017 11:11
por Nascimento
rubens vc poderia postar o dbf para poder-mos efetuar os testes?

Posicionar na primeira linha do Grid

Enviado: 12 Jan 2017 15:51
por rubens
Nascimento, segue em anexo o projeto com um dbf e um executável... Foi implementado pela IDE da Minigui Extends.
Tá isolado e simples de compilar.

O que ocorre: Quando executa e vai pressionando as teclas para pesquisar o produto (letra a letra) ele pesquisa na matriz aItens a posição e seta no grid aquela posição encontrada na matriz. Encontra tudo beleza e rápido, só que a sempre posiciona no grid na última linha. Daí para o cliente ver os itens encontrados tem que clicar no grid e rolar manualmente. Queria que quando encontrasse um item ele fosse posicionado na primeira linha do grid.
Aqui no fórum tem uma consultacdx que a cada tecla pressionada limpa o grid e adiciona os itens filtrados. Seria o Ideal, mas nos meus testes fica muito lento assim. Existe uma condição para mostra somente 60 registros. Nos testes que fiz aqui para ficar satisfatório tem que deixar somente 20 registros. Daí não vai funcionar. Tenho que tentar resolver pesquisando a primeira ocorrência.

Tá funcionando com Browse e muito rápido ele vai fazendo um seek e movimentando no dbf e o browse acompanhando, mas aí na hora wildseek como que faz não tem de jeito de filtrar no dbf. Daí uso o SetFilter, se for local e até rápido, mas quando é e um terminal a consulta, já viu a lentidão né..

Do jeito que tá tá ótimo mas preciso posiciona o grid na primeira linha sempre que pressionar uma tecla... isso que não estou conseguindo fazer....

Obrigado
Rubens
PESQUISA.rar
(708.09 KiB) Baixado 144 vezes

Posicionar na primeira linha do Grid

Enviado: 12 Jan 2017 17:51
por Daniel
altera esta linha para

Código: Selecionar todos

SetProperty('Main','Grid_1','Value',nFirst + 13) //13 total de linha do grid

Posicionar na primeira linha do Grid

Enviado: 12 Jan 2017 18:18
por rubens
Essa é uma daquelas questões que você acha a solução mas parece que ficou faltando um algo mais, né...
No Browse tem as funções _Home(), _End().
Eu tava procurando como levar a barra para cima e na realidade teve que empurrar os dados para cima...

Obrigado Daniel..

Rubens

Posicionar na primeira linha do Grid

Enviado: 13 Jan 2017 12:40
por Daniel
E para colocar a barra azul no local
ponha esta linha

Código: Selecionar todos

SetProperty('Main','Grid_1','Value', nFirst + 13)
SetProperty('Main','Grid_1','Value', (GetProperty('Main','Grid_1','Value') - 13))

Posicionar na primeira linha do Grid

Enviado: 15 Jan 2017 12:41
por Nascimento
dê uma olhaa na seção dowloads tem um exemplo feito por toledo com o nome ConsultaCdx eu acho que é isso que vc precisa

https://pctoledo.org/forum/fileba ... rd=&page=1

Posicionar na primeira linha do Grid

Enviado: 16 Mai 2017 13:50
por heveraldo
Function Localiza()
//***********************************************************
//cFormulario := thiswindow.name
//cGrid := this.focusedcontrol

IF VK_0 <= HMG_GetLastVirtualKeyDown() .AND. HMG_GetLastVirtualKeyDown() <= VK_Z .OR.;
HMG_GetLastVirtualKeyDown() = VK_SPACE .OR. HMG_GetLastVirtualKeyDown() == VK_BACK

ch := UPPER(HMG_GetLastCharacter())
if HMG_GetLastVirtualKeyDown() == VK_BACK // backspace
HMG_CleanLastVirtualKeyDown()
cLocaliza := LEFT(cLocaliza, max(0,HMG_LEN(cLocaliza)-1))
else
IF EventMsg() <> WM_CHAR
Return Nil // enable processing the current message
ENDIF
cLocaliza := cLocaliza + ch
endif

CadastroProduto.Grid_Produto.RecNo := 1 // Recurso, para mostrar registro na primeira linha do grid.

Produto->(DbSeek(cLocaliza))
nRegistro := Produto->(RecNo())
CadastroProduto.Grid_Produto.RecNo := Produto->(RecNo())
CadastroProduto.Text_Localizar.Value := cLocaliza

//HMG_PressKey ( VK_END, VK_NEXT, VK_PRIOR)

// Atualiza()
ELSE
// Atualiza()
Return Nil // enable processing the current message
ENDIF
Return 1