Página 1 de 1

HMG3 3.7 (*) sem _HMG_SYSDATA

Enviado: 08 Set 2025 09:59
por JoséQuintas
Pra quem não sabe, TUDO da hmg3 fica na variável pública _hmg_sysdata.
Ficava...

Os fontes tinham 16.000 usos de _hmg_sysdata, agora restam 145 pra resolver.
Resta algum uso na IDE, e depois tentar entender porque em grid/grid_ex usa diferente.

Antes de mexer era

Código: Selecionar todos

PUBLIC _HMG_SYSDATA[518]
agora

Código: Selecionar todos

   PUBLIC _HMG_SYSDATA := {}
distribuídos pelos objetos, APP, FORM e CONTROL.

DLGAUTO funcionando com a HMG3 alterada pra objeto,_hmg_sysdata tamanho ZERO !!!!!
Alterações apenas internas, mas pronto pra expansão geral.

HMG3 3.7 (*) sem _HMG_SYSDATA

Enviado: 08 Set 2025 22:23
por JoséQuintas
ide.png
IDE da HMG3, também trabalhando com os novos objetos e sem _HMG_SYSDATA.

Lembrando:
Isso não significa que sei acrescentar recursos ou resolver bugs.
Apenas mudei o "tipo de variável", e resolvendo algum possível bug sobre essa mudança.
Isso é igual pra qualquer aplicativo.

HMG3 3.7 (*) sem _HMG_SYSDATA

Enviado: 09 Set 2025 12:59
por JoséQuintas
Basicamente qual foi a mudança:

Existia o _HMG_SYSDATA com 518 elementos
Elementos 1 a 41 eram pra controle, array, 1=Type, 2=Name, 3=Handle, e outros
Elementos 42 a 64 uso diverso
Elementos 65 a 108 pra forms, 65=type, 66=name, 67=handle, e outros
Elementos 109 a 518 uso diverso, mas alguns pra contole/form

Por falta de nome, e pra não perder tempo com nomes adotei XXXnnn, conforme a localização.

Para os elementos fixos, deixei em APPClass, com o nome de APP042 até APP518
Nesta classe criei aControlList pra substituir 1 a 41 referente controle
Nesta classe criei aFormList pra substituir 65 a 108 referente a forms

aControlList contém elementos da classe control.
Usei nomes CTRL001 a CTRL041, alguns já nomeei pra Nome, Handle, Index, Isdeted

aFormList contém elementos da classe form
Usei comes FORM065 a FORM108,. alguns já nomeei pra Nome, Handle, Index, IsDeleted

Basicmente estas 3 classes.
Como eu disse antes, é como mudar nome de variável, apesar de ser classe.

O que era _HMG_SYSDATA[ 42 ] um elemento comum
virou oHmgApp():APP042

O que era _HMG_SYSDATA[ 1, nIndex ] propriedade de controle (1 a 41)
Diretamente virou oHmgApp():aAllControls[ nIndex ):CTRL001
Podendo ser acessado por ControlByIndex( nIndex ):CTRL001
Ou, conforme fonte, oControl:CTRL001
Esse 1 já renomeei pra oControl:001 pra oControl:Type

O que era _HMG_SYSDATA[ 65, nIndex ] propriedade de forms (65 a 108)
Diretamente virou oHmgApp():aAllForms( nIndex ):FORM065
Podendo ser acessado por FormByIndex( nIndex ):FORM065
Ou, conforme fonte, oForm:FORM065
Esse 65 já renomeei, oForm:065 pra oForm:Type

Como eu disse, é como trocar 6 por meia dúzia, trocar um tipo de variável por outro.
Mas deixa mais flexível, conforme a necessidade.

Acontece muito na HMG, FOR/NEXT nos controles ou forms pra procurar alguma coisa.

Código: Selecionar todos

FOR nIndex = 1 TO LEN( _HMG_SYSDATA[ 1 ] )
   IF _HMG_SYSDATA[ 1, nIndex ] == "BUTTON"
   ...
   ENDIF
NEXT
Isso acima pode ser alterado agora para:

Código: Selecionar todos

FOR EACH oControl IN oHmgApp():ALLControls
   IF oControl:Type == "BUTTON"
   ...
   ENDIF
NEXT
Tá tudo a mesma coisa, mas o formato classe ajuda a deixar o fonte "mais humano".
Fica mais fácil entender o que ele faz, facilita manutenção, e deixa flexível pra novas possibilidades.

Minha alteração não foi nada do outro mundo, apenas troquei o tipo de variável.
Deu trabalho porque eram 16.000 usos dentro dos fontes.
Mas abriu possibilidades de uso.
E em 16.000 alterações.... é de se imaginar que posso ter cometido erros.
Ao alterar _HMG_SYSDATA[ 1 ] pra :CTRL001, eu destaquei que se refere a controle
Ao alterar _HMG_SYSDATA[65] pra :FORM065, eu destaquei que se refere a form
Ao alterar os demais pra :APPxxx, eu destaquei que se refere a uso normal
Isso ajuda a identificar mais rápido se é propriedade de controle, de form, ou outro.
:APP125 [ x] já destaca que mesmo sendo array, não tem a ver com algo vindo de controle ou de form.

FormByIndex( 65 ):CTRL012 já indica que está errado, CTRL012 é propriedade de controle e não de form.
Com certeza vai dar erro em run-time disso

Basicamente foi isso.
Alterei o tipo de variável, de uma forma que esse novo tipo já ajuda a identificar problemas.
Ao invés de preso a quem conhece _HMG_SYSDATA, já fica mais claro pra quem nunca mexeu na HMG3.
Até na dúvida se chamo Handle ou FormHandle ou ControlHandle..... pra continuar com esse destaque.

Erro conhecido:
ASCan( listahandle, handle ) funciona, mesmo não sendo número
AScan( listaobj, { | e | obj:handle == handle } ) dá erro, se :handle for Nil ou array, nesse caso precisa ajuste extra nessa pesquisa, testar também o ValType()

A princípio parece tudo certo.
Testei a parte básica, pode ter mais ajustes do tipo acima pra coisas que não cheguei a testar.
Se acontecer, será acrescentar o ValType() - erro tradicional de tipo de variável, com a solução tradicional
Não significa que sei mexer em HMG, só significa que sei mexer com problema de tipo de variável, causado pela mudança.

O uso de APPnnn, FORMnnn, CONTROLnnn é enquanto não se tem o nome correto de cada coisa.
Ao invés de ficar anotando no fonte :CTRL013 // isdeleted, podemos usar :IsDeleted e o fonte fica auto-explicativo.
Mas sair alterando nomes durante a mudança seria perigoso... melhor quando definir os nomes corretos.
Vai ser um replace all nos textos, de :CTRL013 pra :IsDeleted por exemplo.