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.