HMG3 3.7 (*) sem _HMG_SYSDATA

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

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

HMG3 3.7 (*) sem _HMG_SYSDATA

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

HMG3 3.7 (*) sem _HMG_SYSDATA

Mensagem 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.
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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

HMG3 3.7 (*) sem _HMG_SYSDATA

Mensagem 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.
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