Página 1 de 2

hprogres e NewBox()

Enviado: 27 Out 2021 21:05
por Itamar M. Lins Jr.
Olá!
Vou precisar verificar isso:

Código: Selecionar todos

oBar   := HProgressBar():NewBox( "Ordenando, "+lTrim(str(nRec,9))+" De "+lTrim(str(nTRec,9))+" Registro(s)",,,350,,nTRec)
index on ticket tag mo99 for &cQuery temporary eval {||oBar:Step(),.t.}
mo->(dbGoTop())
oBar:Close()

Código: Selecionar todos

Error BASE/1072  Erro nos parƒmetros: <>
Called from source\winapi\hdialog.prg->HWG_ENDDIALOG(551)
Called from source\winapi\hprogres.prg->HPROGRESSBAR:CLOSE(190)
Called from prg\FecharMovimento.prg->PROCESSADIAS(164)
Amanhã vou tentar isolar o BUG e avisar lá para alguém corrigir.

Saudações,
Itamar M. Lins Jr.

Erro em hwg_EndDialog()

Enviado: 27 Out 2021 21:13
por Itamar M. Lins Jr.
Olá!
No fonte a classe hDialog está assim:

Código: Selecionar todos

 
CLASS HDialog INHERIT HWindow
...
  METHOD Close()    INLINE hwg_EndDialog( ::handle )
Saudações,
Itamar M. Lins Jr.

Erro em hwg_EndDialog()

Enviado: 27 Out 2021 21:16
por Itamar M. Lins Jr.
Olá!
Método close() da hprogress.prg

Código: Selecionar todos

METHOD CLOSE()

   hwg_Destroywindow( ::handle )
   IF ::lNewBox
      hwg_EndDialog( ::oParent:handle )
   ENDIF

   RETURN Nil
Suadações,
Itamar M. Lins Jr.

Erro em hwg_EndDialog()

Enviado: 27 Out 2021 21:48
por JoséQuintas
Só me chamou a atenção o NewBox() criar uma dialog NOMODAL, não sei se deveria ser assim.

Erro em hwg_EndDialog()

Enviado: 27 Out 2021 22:23
por JoséQuintas
A parte que comentou está correta:

Código: Selecionar todos

METHOD NewBox( cTitle, nLeft, nTop, nWidth, nHeight, maxPos, nRange, bExit, lPercent ) CLASS HProgressBar
...
   INIT DIALOG ::oParent TITLE cTitle       ;
      At nLeft, nTop SIZE nWidth, nHeight   ;
      STYLE WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_SIZEBOX + iif( nTop == 0, DS_CENTER, 0 ) + DS_SYSMODAL + MB_USERICON
...
   IF bExit != Nil
      ::oParent:bDestroy := bExit
   ENDIF

   ACTIVATE DIALOG ::oParent NOMODAL

   ::id := ::NewId()
   ::Activate()
   ::oParent:AddControl( Self )

   RETURN Self
Quando usa NewBox() é criada uma janela Dialog com o progressbar dentro.
::oParent do NewBox() contém essa Dialog.

Código: Selecionar todos

METHOD CLOSE()

   hwg_Destroywindow( ::handle )
   IF ::lNewBox
      hwg_EndDialog( ::oParent:handle )
   ENDIF

   RETURN Nil
o close() do progressbar destrói primeiro a janela da progressbar, e depois, se foi newbox criando dialog, destrói a dialog criada.
só estranhei o nomodal, porque teoricamente se não tem parada, fecha sozinho.

hprogres e NewBox()

Enviado: 28 Out 2021 08:19
por JoséQuintas
Apesar do erro ser no mesmo lugar do outro, a causa parece diferente, por isso separei as mensagens do outro tópico.

hprogres e NewBox()

Enviado: 28 Out 2021 08:22
por JoséQuintas

Código: Selecionar todos

METHOD CLOSE()

   hwg_Destroywindow( ::handle )
   IF ::lNewBox
      hwg_EndDialog( ::oParent:handle )
   ENDIF

   RETURN Nil
Faça um teste aonde envia o Close(), antes do close, testando o que tem em ::oParent:Handle
É pra ter uma variável do tipo pointer - valtype( variavelprogressbar::oParent:Handle ) == "P"

hprogres e NewBox()

Enviado: 28 Out 2021 08:26
por JoséQuintas
Aproveitando...

Então... não tenho como testar.
Pra simular esse progressbar eu teria que fazer outras coisas que ainda não cheguei lá.

hprogres e NewBox()

Enviado: 28 Out 2021 08:35
por JoséQuintas
achei um exemplo nos samples, mas nele vai normal

Código: Selecionar todos

Function Test()
Local cMsgErr := "Bar doesn't exist"

        PREPARE FONT oFont NAME "Courier New" WIDTH 0 HEIGHT -11

        INIT DIALOG oForm CLIPPER NOEXIT TITLE "Progress Bar Demo";
             FONT oFont ;
             AT 0, 0 SIZE 700, 425 ;
             STYLE DS_CENTER + WS_VISIBLE + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU ;
             ON EXIT {||Iif(oBar==Nil,.T.,(oBar:Close(),.T.))}

             @ 300, 395 BUTTON 'Reset Bar'  SIZE 75,25 ;
               ON CLICK {|| Iif(oBar==Nil,hwg_Msgstop(cMsgErr),oBar:Reset()) }

             @ 380, 395 BUTTON 'Step Bar'   SIZE 75,25 ;
               ON CLICK {|| Iif(oBar==Nil,hwg_Msgstop(cMsgErr),oBar:Step()) }

             @ 460, 395 BUTTON 'Create Bar' SIZE 75,25 ;
               ON CLICK {|| oBar := HProgressBar():NewBox( "Testing ...",,,,, 10, 100 ) }

             @ 540, 395 BUTTON 'Close Bar'  SIZE 75,25 ;
               ON CLICK {|| Iif(oBar==Nil,hwg_Msgstop(cMsgErr),(oBar:Close(),oBar:=Nil)) }

             @ 620, 395 BUTTON 'Close'      SIZE 75,25 ;
               ON CLICK {|| oForm:Close() }

        ACTIVATE DIALOG oForm

Return Nil

hprogres e NewBox()

Enviado: 28 Out 2021 08:54
por JoséQuintas
progbar.png
Mas é muito feia, qual a vantagem dessa?

hprogres e NewBox()

Enviado: 28 Out 2021 09:23
por Itamar M. Lins Jr.
Olá!
Com tema dos windows "gafanhoto". Ai está sem os temas.

Aqui não aconteceu o erro.
Acho que ele está fechando a progress tem que ficar sem esse X ai no canto.
Nisso o CLOSE vai fechar mais o quê ?
Esse é o mesmo erro lá da DIALOG. No mesmo local -> oDlg:handle != handle.

Saudações,
Itamar M. Lins Jr.

hprogres e NewBox()

Enviado: 28 Out 2021 09:54
por JoséQuintas
Nesse fonte tem os testes se a janela existe.
Se fechar no X, os testes evitam erro.
Esse X não deveria existir.
A janela deveria ser trocada pela outra que não tem X.

hprogres e NewBox()

Enviado: 28 Out 2021 10:05
por JoséQuintas

Código: Selecionar todos

      STYLE WS_POPUP + WS_VISIBLE + WS_CAPTION + /* WS_SYSMENU + */ WS_SIZEBOX + iif( nTop == 0, DS_CENTER, 0 ) + DS_SYSMODAL + MB_USERICON
Mas.... falta confirmar se este comportamento foi depois da alteração:
teste.png

hprogres e NewBox()

Enviado: 28 Out 2021 10:10
por JoséQuintas
progbar.png
O "problema" já existia antes.
A janela da barra de progresso fica por cima de tudo.

hprogres e NewBox()

Enviado: 28 Out 2021 10:12
por JoséQuintas
DS_SYSMODAL
This style is obsolete and is included for compatibility with 16-bit versions of Windows. If you specify this style, the system creates the dialog box with the WS_EX_TOPMOST style. This style does not prevent the user from accessing other windows on the desktop.
Do not combine this style with the DS_CONTROL style.
O estilo usado é pra isso mesmo, precisamos verificar qual a alternativa.

https://docs.microsoft.com/en-us/window ... box-styles