Página 2 de 4

Iniciando com hwgui

Enviado: 13 Set 2020 19:59
por JoséQuintas
Meu teste é assim: funcionou vai pro cliente, não funcionou não vai.
Não tem essa de ficar convertendo uma coisa de cada vez pra algum dia instalar.

Como estou gostando muito do resultado do SQL, e muita coisa é browse....
um browse gráfico seria ideal pra complementar o SQL, e já substituir várias telas.

Por enquanto terminar o serviço, que precisa funcionar, e outro dia vejo GUI novamente.

Iniciando com hwgui

Enviado: 13 Set 2020 20:10
por Itamar M. Lins Jr.
Ola!
Tem como postar zipado este conteúdo ?

Código: Selecionar todos

 cnSQL
Saudações,
Itamar M. Lins Jr.

Iniciando com hwgui

Enviado: 13 Set 2020 22:47
por JoséQuintas
Pensar em alguma coisa equivalente, que dê pra fazer teste isolado.
Talvez até um array hash.

Iniciando com hwgui

Enviado: 13 Set 2020 23:38
por JoséQuintas
Deu sinal de vida

Código: Selecionar todos

#include "hwgui.ch"

Function Main
Local oMainWindow

   INIT WINDOW oMainWindow MAIN TITLE "Example" ;
     AT 200,0 SIZE 400,150

   MENU OF oMainWindow
      MENUITEM "&Exit" ACTION hwg_EndWindow()
      MENUITEM "&Dialog" ACTION DlgGet()
   ENDMENU

   ACTIVATE WINDOW oMainWindow
Return Nil

STATIC FUNCTION DlgGet()

   LOCAL oModDlg, oBrw1, cnSQL

   cnSQL := win_OleCreateObject( "ADODB.Recordset" )
   cnSQL:Open( hb_cwd() + "teste.ado" )

   INIT DIALOG oModDlg TITLE "Licenças" AT 0,0 SIZE 1024,768

   @ 1,1 BROWSE oBrw1 SIZE 1022,700 ;
        STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL
   @ 500,720 OWNERBUTTON ON CLICK {|| hwg_EndDialog()} ;
       SIZE 180,36 FLAT                                ;
       TEXT "Close" COLOR hwg_ColorC2N("0000FF")
   oBrw1:aarray := cnSQL
   oBrw1:AddColumn( HColumn():New( "Codigo", { |v,o| (v), o:aArray:Fields( "CODIGO" ):Value },"C",6,0,.F.,DT_CENTER ) )
   oBrw1:AddColumn( HColumn():New( "Nome",   { |v,o| (v), o:aArray:Fields( "NOME" ):Value }, "C",30,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrw1:aColumns[2]:lResizable := .F.
   oBrw1:bSkip := { |o,nSkip| ADOSkipper( o:aArray, nSkip ) }
   oBrw1:bGotop := { |o| o:aArray:MoveFirst() }
   oBrw1:bGobot := { |o| o:aArray:MoveLast() }
   oBrw1:bEof  := { |o| o:aArray:Eof() }
   oBrw1:bBof  := { |o| o:aArray:Bof() }
   oBrw1:bRcou := { |o| o:aArray:RecordCount() }
   oBrw1:bRecno := { |o| o:aArray:AbsolutePosition }
   oBrw1:bGOTO := { |o,n| (o),o:aArray:Move( n ) }

   ACTIVATE DIALOG oModDlg
   Inkey(10)
Return Nil

FUNCTION ADOSkipper( cnSQL, nSkip )

   LOCAL nRec := cnSQL:AbsolutePosition()
      IF ! cnSQL:Eof()
         cnSQL:Move( nSkip )
         IF cnSQL:Eof()
            cnSQL:MoveLast()
         ENDIF
         IF cnSQL:Bof()
            cnSQL:MoveFirst()
         ENDIF
      ENDIF
      RETURN cnSQL:AbsolutePosition() - nRec
hwgui.png
Gravei isto, é o que aparece na tela:

Código: Selecionar todos

PROCEDURE PTESRSADO

LOCAL cnSQL := ADOClass():New()
LOCAL cLetra

WITH OBJECT cnSQL
   :RsCreate( { ;
      { "CODIGO", "C", 5, 0 } , ;
      { "NOME", "C", 30, 0 } } )
   FOR EACH cLetra IN { "A", "B", "C", "D", "E", "F" }
      :AddNew()
      :Fields( "CODIGO" ):Value := Asc( cLetra )
      :Fields( "NOME" ):Value := Replicate( cLetra, 30 )
      :Update()
   NEXT
   cnSQL:Rs:Save( "teste.ado" )
   cnSQL:Close()
ENDWITH
O erro até dá pra considerar normal no ADO, porque ADO NÃO deixa acessar quando Eof(), ao contrário do DBF.
Justamente minha classe é pra evitar esse tipo de problema.
Só não sei dizer se deveria acontecer ou não.

Pelo menos mostrou o conteúdo, e deu erro depois.

Iniciando com hwgui

Enviado: 13 Set 2020 23:57
por JoséQuintas
As coisas estranhas é precisar de GOTO e RECNO.
Se tentar acessar o que não existe.... daria erro.

Iniciando com hwgui

Enviado: 14 Set 2020 00:33
por JoséQuintas
bingo.

Código: Selecionar todos

   oBrw1:bGOTO     := { | o, n | (o), o:aArray:Move( n ), ;
      iif( o:aarray:Bof(), o:aarray:MoveFirst(), nil ), ;
      iif( o:aarray:Eof(), o:aarray:MoveLast(), nil ) }
hwgui.png
Ficou doidão, e não deu erro.

o tal GOTO ferra tudo.

Iniciando com hwgui

Enviado: 14 Set 2020 01:12
por JoséQuintas

Código: Selecionar todos

   oBrw1:bGOTO     := { | o, n | (o), o:aArray:Move( n - 1, 1 ) }
Errei no equivalente ao GOTO.
Move, se não indicar, é a partir do registro atual.

Foi o mais próximo que deu de funcionar.
PGUP ok até o primeiro
PGDN ok até o último
seta pra cima ok até primeiro
seta pra baixo não para nunca, ou melhor... vai em frente além do limite, até dar aquele mesmo erro de Eof()
Tipo, tem 10 registros, vai até o 20 ou mais antes de dar erro.

Iniciando com hwgui

Enviado: 14 Set 2020 01:29
por JoséQuintas
pgup
br1.png
pgdn
br2.png
seta pra baixo
br3.png

Iniciando com hwgui

Enviado: 14 Set 2020 01:43
por JoséQuintas
E antes que comentem....

Código: Selecionar todos

   oBrw1:bGOTO     := { | o, n | (o), o:aArray:Move( n - 1, 1 ) }
Se eu alterar pra Move( n, 1 ).... aí não mostra o primeiro.
Como o 1 indica a partir do primeiro, provavelmente move (1, 1, ) indica mover pro segundo, por isso usei o n-1
Mas mesmo que eu altere, o final não chega nunca.

Se eu usar minha classe, provavelmente o resultado vai ser o mesmo, porque ela é apenas intermediária.

Apelei agora, tentei browse array e browse database com ADO.
Também alterei estes dois igual array

Código: Selecionar todos

   oBrw1:bEof      := { | o | o:nCurrent > o:aArray:RecordCount() }
   oBrw1:bBof      := { | o | o:nCurrent < 1 }
Tanto faz ARRAY, DATABASE ou nenhum, coloque o que colocar, o resultado é sempre o mesmo, problema em seta pra baixo.

Iniciando com hwgui

Enviado: 14 Set 2020 01:52
por JoséQuintas
NÃO tem a ver com esse problema.
Acrescentei pra fechar o recordset.

Código: Selecionar todos

@ 500,720 OWNERBUTTON ON CLICK {|| cnSQL:Close(), hwg_EndDialog()} ;
e retirei o inkey(10) que não sei porque estava lá no fonte.
Pensei até que estava travando no final, mas era o inkey(10).

Iniciando com hwgui

Enviado: 14 Set 2020 08:19
por Itamar M. Lins Jr.
Ola!
Tem uma classe ADO que o pessoal da OOH usa. Pode ser aproveitado na Hwgui. Quando sobrar tempo vou olhar...
Agora vou ter que ir na cidade comprar tinta, para pintar um quarto... Mas vc já viu que na Hwgui podemos mexer em tudo é tudo classe.
Quando tiver pronto um exemplo com ADO vou mandar para commit no SVN, tomara que aceitem. Tem outros exemplos com browse etc.. que foram perdidos na sobreposição da versão 2.16 em cima da 2.17. Vou avisar para o Wilfried...

Saudações,
Itamar M. Lins Jr.

browse ADO

Enviado: 14 Set 2020 09:50
por JoséQuintas
O teste, incluindo um arquivo que é o recordset ADO.
teste.zip
(1.41 KiB) Baixado 196 vezes
É justamente essa parte que as LIBs esquecem: o recordset ADO é independente, não importa conexão, se MySQL, PostgreSQL, etc. O recordset é sempre um recordset. Ficar querendo vincular isso junto com a origem, é onde estraga tudo.
Mesmo que o ADO tenha muito mais recursos, o básico e importante é esse.

browse ADO

Enviado: 14 Set 2020 18:59
por Itamar M. Lins Jr.
Ola!
Acredito que é um BUG do hBrowse.prg (fonte da Hwgui).
Quando chega no final volta para o primeiro.

Tô vendo aqui...tá correto isso ? Chegando no fim vai para o primeiro ?

Código: Selecionar todos

         // Modified by Luiz Henrique dos Santos (luizhsantos@gmail.com)
         IF Eval( ::bEof, Self ) .OR. Eval( ::bBof, Self )
            Eval( ::bGoTop, Self )
            ::rowPos := 1
         ENDIF
Saudações,
Itamar M. Lins Jr.

browse ADO

Enviado: 14 Set 2020 19:25
por JoséQuintas
Depende aonde tem isso.
Se for na navegação tá errado, causaria o problema que mostrei.
Mas aconteceria com qualquer coisa: DBF, array, etc.

browse ADO

Enviado: 14 Set 2020 19:58
por JoséQuintas
LineDown()

Código: Selecionar todos

METHOD LINEDOWN( lMouse ) CLASS HBrowse

   LOCAL minPos, maxPos, nPos, colpos

   Eval( ::bSkip, Self, 1 )
   IF Eval( ::bEof, Self )
      Eval( ::bSkip, Self, - 1 )
LineUp

Código: Selecionar todos

METHOD LINEUP() CLASS HBrowse

   LOCAL minPos, maxPos, nPos

   Eval( ::bSkip, Self, - 1 )
   IF Eval( ::bBof, Self )
      Eval( ::bGoTop, Self )
Reparou algo diferente?