cjp escreveu:Ainda não consegui analisar todos os exemplos da pasta SAMPLE, mas já vi bastante coisa interessante.
Ótimo, tinha certeza que iria gostar.
Acho que consegui montar a tela quase como pretendia, embora não sei se tenha feito certo, mas pelo menos está funcionando bem.
Bom o importante que você está tendo iniciativa e está fazendo tudo na prática do que você precisa.
1) a HMG não aceita todas as funções do Harbour? Percebi que ele não aceita, por exemplo, a função Hb_eol(), que eu uso normalmente no Harbour;
Não tem nada de errado com as funções do Harbour no HMG. Tudo depende da forma que você utiliza. Lembre, você estava acostumado a utilizá-lo em modo console. Mas de qualquer forma preparei um exemplo para que você compile e veja que o Hb_eol() funciona sem problemas, tanto em modo console quanto em GUI:
Código: Selecionar todos
#include <hmg.ch>
REQUEST HB_GT_WIN_DEFAULT
Function Main()
SetMode(25,80)
MsgInfo("Teste 1ª linha"+hb_eol()+"Teste 2ª linha")
Cls
? Hb_AnsiToOem("Teste 1ª linha")+hb_eol()+Hb_AnsiToOem("Teste 2ª linha")
@ 20,00 Say PadC("Tecle algo para finalizar",80) Color "N/W"
Inkey(0)
Return Nil
Se você achou dificuldades de utilização do Hb_eol(), mostre a linha da qual você está utilizando para vermos de que forma está sendo usada.
2) quando executo algo do dos, chamando via ! ou run, ele abre uma tela do dos, preta; tem como evitar isso?
A tela preta é decorrente da utilização do
REQUEST HB_GT_WIN_DEFAULT para obter a sessão em modo console (caso você esteja utilizando). Senão este exemplo bastaria:
Código: Selecionar todos
#include <hmg.ch>
Function Main()
MyRun( "Notepad" )
MsgInfo("Clique Ok para terminar...")
Return Nil
Function MyRun( cRun )
Local hIn, hOut, nRet
Local hProc := HB_OpenProcess( cRun , @hIn, @hOut, @hOut )
If hProc < 0
FClose( hProc )
FClose( hIn )
FClose( hOut )
Return(.F.)
Endif
nRet := HB_ProcessValue( hProc,.f. )
If nRet > 0
FClose( hProc )
FClose( hIn )
FClose( hOut )
Return(.F.)
Endif
FClose( hProc )
FClose( hIn )
FClose( hOut )
Return .T.
Note que o código não é para modo console.
3) como faço para obter no programa a senha digitada pelo usuário no textbox? Vou precisar conferir a senha, pra ver se está certa.
Vai precisar chamar uma função que verifique a senha digitada (eu chamei de
Ver_Senha) e você deve colocá-la no evento ONENTER no TEXTBOX do Text_1. Muitos usuário após digitar a senha acostumam dar ENTER. Também precisará mudar o CAPTION do botão Button_1 para "Login" assim quando o usuário clicar neste botão irá chamar a função
Ver_Senha e para isso mude também o evento ACTION do do botão Button_1 para Ver_Senha(GetProperty("Win_1","Text_1","Value")).
Visto que a função Processa_Algo() ficou sem sentido, excluí ela e removi também na inicialização onde é declarada o WINDOW Win_1.
Estou disponibilizando o código para você compilar e ver se é isso que você queria:
Código: Selecionar todos
#include <hmg.ch>
Function Main
DEFINE WINDOW Win_1 AT 281 , 132 WIDTH 580 HEIGHT 266 ;
TITLE "Instalação do programa de tarefas" ICON NIL MAIN ;
BACKCOLOR {0,128,255}
DEFINE LABEL Label_0
ROW 30
COL 20
WIDTH 530
HEIGHT 20
VALUE "Aguarde a instalação, isso pode levar alguns minutos..."
VISIBLE .F.
FONTBOLD .T.
FONTNAME "Times"
FONTSIZE 12
BACKCOLOR {0,128,255}
FONTCOLOR {255,255,0}
CENTERALIGN .T.
END LABEL
DEFINE LABEL Label_1
ROW 90
COL 140
WIDTH 120
HEIGHT 20
VALUE "Digite a senha:"
VISIBLE .T.
FONTBOLD .T.
FONTNAME "Times"
FONTSIZE 12
BACKCOLOR {0,128,255}
FONTCOLOR {0,0,0}
CENTERALIGN .T.
END LABEL
DEFINE TEXTBOX Text_1
ROW 90
COL 270
WIDTH 120
HEIGHT 24
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP "Informe a senha fornecida para instalação"
ONCHANGE Nil
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONENTER Ver_Senha(This.Value)
HELPID Nil
TABSTOP .T.
VISIBLE .T.
READONLY .F.
RIGHTALIGN .F.
PASSWORD .T.
BACKCOLOR {0,128,255}
FONTCOLOR Nil
INPUTMASK Nil
FORMAT Nil
VALUE ""
END TEXTBOX
DEFINE BUTTON Button_1
ROW 180
COL 140
WIDTH 100
HEIGHT 28
ACTION Ver_Senha(GetProperty("Win_1","Text_1","Value"))
CAPTION "Login"
FONTNAME "Times"
FONTSIZE 12
TOOLTIP "Digite a senha e clique aqui para continuar"
END BUTTON
DEFINE BUTTON Button_2
ROW 180
COL 340
WIDTH 100
HEIGHT 28
ACTION Thiswindow.Release()
CAPTION "Sair"
FONTNAME "Times"
FONTSIZE 12
TOOLTIP "Clique aqui para sair do programa de instalação"
END BUTTON
END WINDOW
Win_1.Center
Win_1.Activate
Return Nil
Function Abra_Outra()
DEFINE WINDOW Win_2 AT 381 , 262 WIDTH 480 HEIGHT 266 TITLE "Outra janela" ICON NIL CHILD
DEFINE LABEL Label_2
ROW 20
COL 20
WIDTH 430
HEIGHT 20
VALUE "TESTE DA SEGUNDA JANELA"
FONTNAME "Arial"
FONTSIZE 9
CENTERALIGN .T.
END LABEL
DEFINE LABEL Label_3
ROW 60
COL 100
WIDTH 120
HEIGHT 24
VALUE "Nome completo:"
FONTNAME "Arial"
FONTSIZE 9
FONTBOLD .T.
RIGHTALIGN .T.
END LABEL
DEFINE TEXTBOX Text_1
ROW 60
COL 230
WIDTH 120
HEIGHT 24
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP "Informe o nome completo"
ONCHANGE Nil
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONENTER Nil
HELPID Nil
TABSTOP .T.
VISIBLE .T.
READONLY .F.
RIGHTALIGN .F.
BACKCOLOR Nil
FONTCOLOR Nil
INPUTMASK Nil
FORMAT Nil
VALUE ""
END TEXTBOX
DEFINE BUTTON Button_3
ROW 140
COL 210
WIDTH 100
HEIGHT 28
ACTION Thiswindow.Release()
CAPTION "Retornar"
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP "Clique aqui para voltar a primeira janela"
END BUTTON
END WINDOW
// Win_2.Center
Win_2.Activate
Return Nil
Function Ver_Senha(cSenha)
If Upper(cSenha) == "HMG"
// MsgInfo("Senha aprovada")
SetProperty("Win_1","Label_0","Visible",.T.)
Abra_Outra()
Else
MsgStop("Senha não confere !")
SetProperty("Win_1","Text_1","Value","")
Win_1.Text_1.SetFocus()
Endif
Return Nil
Aqui ainda tem a função Abra_Outra() mas é porque não sei o que você pretende exibir em tela de agora em mais.
Posto a função como fiz até agora
Quanto ao resto, gostaria de dar alguns conselhos se você me permite:
1. Notei que no começo você adicionou algumas variáveis que acredito que você irá precisar. Mas sempre declare as variáveis como
Local quando você apenas utilizar dentro da função onde você as declarou (isto economiza memória) ou
Private caso você precisa ser enxergado em outras funções. Portanto declare as variáveis na função onde elas irão ser usadas de preferência.
2. Mantenha a indentação do texto para poder visualizar bem as linhas do seu código fonte.
3. Na função inst2() que você criou, tem uma definição de LABEL, porém lembre que este deve ser feito após a declaração do WINDOW, portanto ai você precisava definir a segunda janela. Creio que para este caso você utilizaria do meu código acima, a função Abra_Outra() ai renomeie ela.
4. O que tenho observado, que você tem uma série de comandos externos que você excuta pelo RUN ou pelo
"!". Na minha opinião, como são muitos comandos externos a serem executados, sugiro que você crie um arquivo .BAT listando todos esses comandos. Crie esse arquivo BAT desde este aplicativo de instalação e depois de ter criado, você pode executá-lo e depois apagar o arquivo. Pois imagino que contenha informações confidenciais como: senha do servidor. Ai o seu código irá ficar bem mais limpo. Você pode utilizar o hb_MemoWrit() ou funções de baixo nível. Mas a grande ideia é você criar esse arquivo/executá-lo e apagá-lo. Inclusive será bem mais fácil e entendível fazer esse comando como se você executasse ele na linha de comando. Até mesmo posicionar-se na pasta que você deseja e retorná-la onde o programa de instalação estiver sendo executado.
Bom espero ter sido útil e aguardo as suas melhorias do programa.