HMG3 pra objeto

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20365
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

HMG3 pra objeto

Mensagem por JoséQuintas »

A mudança tá muito interessante.

A classe de controle:

Código: Selecionar todos

METHOD Type( ... )             CLASS _HmgControlclass; RETURN ::SetGetSYSDATA( 1, ... )
METHOD Name( ... )             CLASS _HmgControlclass; RETURN ::SetGetSYSDATA( 2, ... )
METHOD Handle( ... )           CLASS _HmgControlclass; RETURN ::SetGetSYSDATA( 3, ... )
METHOD ParentForm( ... )       CLASS _HmgControlclass; RETURN ::SetGetSYSDATA( 4, ... )
METHOD IsDeleted( ... )        CLASS _HmgControlclass; RETURN ::SetGetSYSDATA( 13, ... )
Porque?
_HMG_SYSDATA[1], é o array com tipos
_HMG_SYSDATA[2] é o array com nomes
_HMG_SYSDATA[3] é o array com handle

um button, por exemplo, que seria o controle 5, o tipo dele fica em _HMG_SYSDATA[ 1, 5 ]
A definição então é _HMG_SYSDATA[ nTipoValor, nControleIndex ]
É exatamente o que é o método usa pra localizar a informação.

Tem esta rotina da bostaurus

Código: Selecionar todos

Function bt_StatusBarHandle (Win)
   LOCAL hWnd := bt_WinHandle (Win)
   LOCAL k, hWndStatusBar := 0
   FOR k := 1 TO HMG_LEN (_HMG_SYSDATA [1])
       IF _HMG_SYSDATA [1] [k] == "STATUSBAR" .AND. _HMG_SYSDATA [4] [k] == hWnd
          hWndStatusBar := _HMG_SYSDATA [3] [k]
       ENDIF
   NEXT
Return hWndStatusBar
Uma primeira alteração pode ser esta

Código: Selecionar todos

Function bt_StatusBarHandle (Win)
   
   LOCAL hWnd := bt_WinHandle (Win)
   LOCAL hWndStatusBar := 0, oControl
   
   FOR EACH oControl IN _oHmgApp():AllControls()
       IF oControl:Type == "STATUSBAR" .AND. oControl:ParentForm == hWnd
          hWndStatusBar := oControl:Handle
       ENDIF
   NEXT

   Return hWndStatusBar
Mais legal ainda é esta:

Código: Selecionar todos

Function bt_StatusBarHandle (Win)
   
   LOCAL hWnd := bt_WinHandle (Win)
   LOCAL hWndStatusBar := 0, oControl
   
   oControl := oHmgApp():ControlByBCode( { | e | e:Type == "STATUSBAR" .AND. e:ParentForm == hWnd } )
   IF oControl != Nil
      hWndStatusBar := oControl:Handle
   ENDIF

   Return hWndStatusBar
Pra que trazer todos, se quero apenas o que atende aquele filtro ?
Mais prático passar o filtro.

Eliminado _HMG_SYSDATA do fonte, trabalhando direto com a classe.

Não mudou nada ?
Lógico que mudou.
Agora é classe.
O array.... todos os fontes usam o array, ele precisa ser mantido.
No final sim, só alterar a classe.

Código: Selecionar todos

VAR Type INIT ""
VAR Name INIT ""
VAR Handle INIT 0
VAR FormParent INIT 0
Só fazer isso, e já era, objeto total.

Se alterar isso agora.... vai dar erro em todas as outras partes do fonte.

É como eu disse: é alterar 6 pra meia dúzia, de um tipo de variável pra outro.
Mas a mágica está pronta, objeto disponível pra uso.
Começa virtual, e alterando algumas linhas depois, vira real.

Não adianta ter pressa.
É muito número, errar número é fácil.

O fonte passa a ser auto-explicativo

Já mexi no coração dos forms, ainda não terminei, agora é no coração dos controles.
É porque TUDO é baseado em Index, Name, handle, Parent
Qualquer erro nisso é fatal.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20365
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

HMG3 pra objeto

Mensagem por JoséQuintas »

o que atrapalha é errorsys de lib gráfica.

Código: Selecionar todos

Application Internal Error - d:\github\dlgauto\source\test.exe
Terminated at: 2025-08-25 20:10:43
Unrecoverable error 9003: Too many recursive error handler calls
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from (b)_HMGAPPCLASS(40) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYINDEX(0) in source\_hmgapp.prg
Called from EVENTS(883) in source\h_windows.prg
Called from C_MSGSTOP(0)
Called from SHOWERROR(181) in source\ErrorSys.prg
Called from DEFERROR(129) in source\ErrorSys.prg
Called from (b)ERRORSYS(66) in source\ErrorSys.prg
Called from __ERRRT_SBASE(0)
Called from _HMGAPPCLASS:ERROR(0) in ../../../tobject.prg
Called from (b)HBOBJECT(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:MSGNOTFOUND(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:AADDCONTROL(0) in ../../../tobject.prg
Called from _HMGAPPCLASS:CONTROLCOUNT(295) in source\_hmgapp.prg
Called from _HMGAPPCLASS:CONTROLBYBLOCK(219) in source\_hmgapp.prg
Called from BT_STATUSBARHANDLE(408) in source\BosTaurus\h_BosTaurus.prg
Called from BT_STATUSBARHEIGHT(426) in source\BosTaurus\h_BosTaurus.prg
Called from REPOSITIONTOOLBAR(421) in source\h_toolbar.prg
Called from EVENTS(1466) in source\h_windows.prg
Called from UPDATEWINDOW(0)
Called from EVENTS(898) in source\h_windows.prg
Called from SHOWWINDOW(0)
Called from _SHOWWINDOW(3937) in source\h_windows.prg
Called from _ACTIVATEWINDOW(5462) in source\h_windows.prg
Called from GUI_DIALOGACTIVATE(324) in lib.prg
Called from (b)HMG3CLASS(26) in lib.prg
Called from HMG3CLASS:DIALOGACTIVATE(0) in lib.prg
Called from GUI_DLGMENU(114) in lib.prg
Called from (b)HMG3CLASS(30) in lib.prg
Called from HMG3CLASS:DLGMENU(0) in lib.prg
Called from FRM_DIALOGMENU(25) in frm_DialogMenu.prg
Called from MAIN(52) in test.prg
------------------------------------------------------------------------
Mas já identifiquei o problema.
É que... se dá erro... não adianta querer enfeitar o erro, que só atrapalha.

AADDcontrol, quando deveria ser ADDControl

Com mensagem de erro enfeitada.... se dá erro pra adicionar controle... adicionar mais controle pra mostrar o erro resulta em erros infinitos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20365
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

HMG3 pra objeto

Mensagem por JoséQuintas »

hmg3.png
Janelas dependendo de classe, controles dependendo de classe.
Está funcionando, melhor que antes.

Não sei porque, desde 2023 o programa ficava zumbi ao fechar, e não fica mais.
Sei lá.... só estou alterando pra objeto, e testando se funciona.

Por exempo, pra testar se é textbox, label, browse, grid, etc., isso já está sendo feito pela classe.
Sinal de que está dando certo... kkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Claudio Soto
Colaborador
Colaborador
Mensagens: 568
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Re: HMG3 pra objeto

Mensagem por Claudio Soto »

Muy bueno José!!! Gracias por compartir
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20365
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Re: HMG3 pra objeto

Mensagem por JoséQuintas »

Não consegui postar no hmgforum.com, pra um teste mais amplo.
O projeto está em:

https://github.com/JoseQuintas/hmg3_fork

Como atualizo este projeto com mais frequência, toda geração está nele
https://github.com/JoseQuintas/sefazcla ... ildall.yml

Nesse workflow é criado harbour, hmg3, hmg extended, oohg, hwgui, dlgauto com cada lib, sefazclass, e outros.
Fica tudo em zip nos workflows, como se fossem pendrives, e os zips ficam no github em separado do projeto.
Assim tá sempre testando tudo, sem precisar fazer teste separado pra cada projeto.
E como deixo as LIBs em harbour/addons, nem precisa configuração extra, seria baixar e usar.
Só precisaria o path para harbour, mingw, e as IDEs.
O dlgauto, no workflow, é o teste de compilar com as libs sem configuração extra
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20365
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Re: HMG3 pra objeto

Mensagem por JoséQuintas »

Uma coisa que não sei fazer.

https://github.com/JoseQuintas/dlgauto/ ... in/testmix

Nesse teste dá pra escolher GTWVG, HWGUI e ( HMG 3 ou HMG Extended ou OOHG ).
Ao fechar HMG3 fecha o aplicativo inteiro.
Como impedir isso ?

Com HWGUI ok, dá pra fechar toda hwgui e o resto continua.
Com FIVEWIN ok, dá pra fechar todo fivewin e o resto continua.
Com GTWVG ok, dá pra fechar toda gtwvg e o resto continua.
Com minigui, somente HMG3 é multithread, mas se fechar a primeira dialog fecha tudo.
Lembrando também que MAIN WINDOW OFF só tem na HMG3, em HMG Extended é apenas pra compatibilidade, e uso limitado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder