Sejam bem vindos a este tópico!
O que vou tratar aqui foi testado na HMG 3.0.35, não sei como seria na 3.0.46 em diante.
Espero contribuir muito em troca do que tenho recebido dos colegas do PCTOLEDO.
Certo dia, no tópico: http://www.pctoledo.com.br/forum/viewtopic.php?f=2&t=2501&p=96610#p96610 procurando encontrar (isso bem recente) um meio de melhorar a nossa tela de erro (não que não seja de fácil compreensão para nós) com relação ao usuário final poder interagir conosco (programadores), surgiu um comentário sobre trabalhar/migrar em MODO CONSOLE e poder abrir outros módulos (internos de nosso programa) em modo gráfico.
Aí, foi dito por alguém (que nem quero me comparar a ele no conhecimento por ser um Nerd no assunto e, eu só estar migrado mesmo desde janeiro/2015) que não era possível um aplicativo em MODO CONSOLE executar rotinas em MODO GRÁFICO e vice-versa.
Bom, aí fuçando aqui e fuçando ali, testando os exemplos da pasta SAMPLES da HMG 3.0.35 e dentre outros na net, descobri um jeito.
Conforme imagem abaixo, o meu aplicativo foi todo migrado de clipper 16bits para harbour 32bits usando a HMG 3.0.35 em MODO CONSOLE (.t.) e fiz um novo módulo chamado LIBERA O SiCCA que dentro do MENU CADASTROS/PARAMETROS executa um novo módulo em tela gráfica. Vejam:
Então, o que fiz acima, foi incluir na linha de código do meu programa (a princípio no MAIN.PRG ) que está 100% em MODO CONSOLE a seguinte linha:
#include 'HMG.CH'
Com essa inclusão, (todos os módulos do meu aplicativo) meu código que está 99% (era 100% pois agora tem uma janela em MODO GRÁFICO acho que é equivalente a 1% ou menos) em modo console, agora executa rotinas internas, ou seja, não é nada externo usando o comando RUN, é de dentro do código original mesmo.
Fiz assim:
MONTA_VETOR (LINHA,BLOCO,H_IND,'Libera o SiCCA',{|| EXECUTA_PROGRAMA ({|| TESTEGUI ()})},'TESTEGUI') // só pra teste de MODO CONSOLE com MODO GRÁFICO 24/5/15W
Essa linha acima é responsável por chamar o meu código em MODO GRÁFICO por nome de TESTEGUI. Ah! ela pertence ao MAIN.PRG.
Agora no tal arquivo TESTEGUI está com o seguinte código (nada que a maioria aqui não saiba fazer... pelo menos penso rsrs):
#include "hmg.ch" // TRABALHAR COM TELAS GRÁFICAS (FORMS, BOTÕES, LABELS, EDITS, etc) 24/5/15w.
procedure TESTEGUI
cDIR := 'c:\windows\system'
if file(cDIR+'\teste.dbf')
use &cDIR.\teste.dbf shared new
else
alert('arquivo inexistente')
quit
endif
if file(cDIR+'\teste.ntx')
set index to &cDIR.\teste.ntx
else
index on NMEMPRESA to &cDIR.\teste.ntx
endif
mEMPRESA := EMPRESA
mTESTE := TESTE
mTESTE1 := TESTE1
mTESTE2 := TESTE2
mDT1 := DT1
DEFINE WINDOW Form_shmv ;
AT 0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'Libera SiCCA v3.42.1' ;
MAIN // FORMULÁRIO PRINCIPAL (PAI)
//MAIN CHILD; //SPLITCHILD
//MODAL // FORMULÁRIO SECUNDÁRIO (FILHO);
@ 100,100 LABEL Label_1 ;
WIDTH 150 HEIGHT 40 ;
VALUE 'Empresa: ' ;
@ 100,250 LABEL Label_11 ;
AUTOSIZE ;
VALUE EMPRESA ;
@ 120,100 LABEL Label_2 ;
WIDTH 150 HEIGHT 40 ;
VALUE 'Registro: ' ;
@ 120,250 LABEL Label_21 ;
AUTOSIZE ;
VALUE mTESTE ;
@ 140,100 LABEL Label_3 ;
WIDTH 150 HEIGHT 40 ;
VALUE 'Versão do SiCCA: ' ;
@ 140,250 LABEL Label_31 ;
AUTOSIZE ;
VALUE mTESTE1 ;
@ 160,100 LABEL Label_4 ;
VALUE 'Data da Instalação: ' ;
@ 160,250 LABEL Label_41 ;
AUTOSIZE ;
VALUE dtoc(mDT1) ;
@ 180,100 LABEL Label_5 ;
WIDTH 150 HEIGHT 40 ;
VALUE 'Data da Validade: ' ;
@ 180,250 LABEL Label_51 ;
AUTOSIZE ;
VALUE dtoc(mDT2) ;
DEFINE MAIN MENU OF form_TESTEGUI
POPUP "&Editar"
ITEM "&Alterar os dados" ACTION EDIT WORKAREA TESTE // ARQUIVO DBF
SEPARATOR
ITEM "&Sair" ACTION form_TESTEGUI.Release
//ITEM "&Sair" ACTION EXIT PROGRAM // TANTO FAZ ESSA COMO A LINHA ACIMA
END POPUP
END MENU
DEFINE TOOLBAR ToolBar_1 FLAT BUTTONSIZE 110,35 RIGHTTEXT BORDER
BUTTON Button_1 ;
CAPTION 'Clique para alterar os dados' ;
ACTION EDIT WORKAREA SHMV
BUTTON Button_2 ;
CAPTION 'Voltar ao Menu Principal' ;
ACTION pFIM
//ONCLICK pFIM // TANTO FAZ ESSA COMO A LINHA ACIMA
END TOOLBAR
DEFINE STATUSBAR
STATUSITEM "(c) 2015 MVinfo Sistemas & Automação - by W de Paula email: <microvolution@hotmail.com>"
CLOCK
DATE
END STATUSBAR
END WINDOW
CENTER WINDOW form_TESTEGUI
ACTIVATE WINDOW form_TESTEGUI
Return nil
proc pFIM
ALERT('BOTAO PRESSIONADO')
release window form_TESTEGUI
exit program
RETURN
Tudo funciona e abre certinho como esperado.
Infelizmente :( só o retorno para o módulo anterior é que não dá certo:
1 - Se clico no no canto superior direito e (X) fechar ele fecha tudo até o módulo anterior;
2 - se clico no Menu Editar e no botão Sair, também não retorna ao MENU anterior e fecha tudo;
3 - se eu clico no botão Voltar ao Menu Principal, nada acontece, bem como no outro botão também.
Enfim, acredito que os mais renomados colegas ao pegarem esse meu código primário, conseguirão realizar não só o meu, mas, o de muita gente que migrou de clipper para harbour em modo console e por ser muito diferente do que aprendemos em clipper - o código para modo gráfico, acredito que não vale a pena mudar todo os nossos programas e, sim apenas os novos que forem surgindo.
Tá aí e #FicaAdica.
Abraços a todos e espero ter ajudado e trago muita gente à discussão e quebra de regras, paradigmas!
MICROVOLUTION / W de Paula.