Página 1 de 2

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 27 Out 2012 00:57
por cjp
Ainda não consegui entender: o verdadeiro conceito de label. Ou, mais especificamente: não estou entendendo a "saída da tela". Explico: entendi perfeitamente este conceito:

Código: Selecionar todos

    DEFINE LABEL Label_1
        ROW    30
        COL    20
        WIDTH  530
        HEIGHT 20
        VALUE "Programa instalado com sucesso. Um atalho foi criado na área de trabalho para acessá-lo."
        FONTNAME "Arial"
        FONTSIZE 9
        CENTERALIGN .T. 
    END LABEL
O que eu não entendo é como dar sequência a isso. Se eu quiser, por exemplo, exibir uma segunda tela, como faço?
Tentei criar uma segunda Label, mas daí ele só executa a segunda, a primeira não aparece. Mais estranho é que, mesmo colocando um Button pra cada, só o primeiro Button aparece, embora com a segunda Label.

Em suma, não estou entendendo como é a sequência do programa.

Outra dúvida: como faço um get? Testei com get mesmo, mas não funciona.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 27 Out 2012 11:19
por Pablo César
Já percebi que você gosta de falar de tudo e ao mesmo tempo. Lembre, estou pedindo-lhe novamente, não misture os assuntos, por favor ! Aquele tópico você questionava sobre bibliotecas gráficas. E não dá para tratar especificamente tudo num só tópico. Entenda, sei que você está aprendendo, mas cada coisa no seu lugar, certo ?
O que eu não entendo é como dar sequência a isso. Se eu quiser, por exemplo, exibir uma segunda tela, como faço?
O conceito de programação GUI é totalmente diferente a que estávamos acostumado a fazer em Clipper, isto eu já mencionei nas traduções do rumi que fiz (tem que ler amigo). E sempre que coê pensar em fazer uma nova tela, em GUI é traduzido em nova JANELA. Portanto você precisar criar mais uma função onde contenha a composição de uma nova janela, como por exemplo a que eu postei, só que os nomes devem ser outros, isso é uma boa prática e necessário. Veja outro exemplo que fiz baseado no primeiro exemplo e pelo que você mencionou:

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} ON INIT Processa_Algo()

	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 Nil
		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 Abra_Outra() //ainda não substitui o que vc colocou, pois ainda não sei como vou fazer a próxima tela
		CAPTION "Prosseguir"
		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
Observe que tem o TEXTBOX que é o equivalente ao GET no modo console. Compile este código que ficará assim:
Tela60.PNG
Tentei criar uma segunda Label, mas daí ele só executa a segunda, a primeira não aparece. Mais estranho é que, mesmo colocando um Button pra cada, só o primeiro Button aparece, embora com a segunda Label.
Sempre que você fala que não conseguiu algo... é boa prática, você mostrar o seu código com a tentativa que você fez. Assim podemos seguir a mesma linha do seu pensamento. Ok ?
Outra dúvida: como faço um get? Testei com get mesmo, mas não funciona.
Esqueça GET na programação GUI, não podem ser usados. Lembre, a programação GUI, a interface na tela com usuário é feito de outra forma. Aconselho você ver os exemplos do C:\hmg.3.0.45\SAMPLES\TUTORIAL e especificamente para TEXTBOX veja em C:\hmg.3.0.45\SAMPLES\EXTERNAL.WINDOWS\TEXTBOX

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 30 Out 2012 02:16
por JoséQuintas
Vamos simplificar:

label equivale ao SAY.
textbox equivale ao GET.

No console você coloca lá
@ linha, coluna say "texto" color "w/b"

Nisso você define linha, coluna, texto, cor da letra , e cor de fundo.
Em GUI ainda poderia escolher: fonte da letra (Arial, courier, Lucida), tamanho da letra, alinhamento à direta, esquerda ou centralizado.
Também poderia escolher: se vai modificar quando o mouse passa por ele, sai dele, se clica no texto, se mostra ajuda ao mouse parar sobre ele, etc.
Os parâmetros a mais são opcionais, somente se quiser fazer diferente do padrão. (pra definir o padrão, aí já é outro tópico).

O problema dos exemplos é que eles querem mostrar todos os recursos possíveis, e aí complicam ao invés de facilitar.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 00:01
por cjp
Meu caro Pablo,

Desculpe mais uma vez. Ainda estou tentando me acostumar com o sistema do fórum.

Entendi o que vc explicou, mas não era exatamente nisso que eu estava pensando. Quando eu disse prosseguir, quis dizer não abrir outra janela, mas prosseguir na mesma janela com outra fase do programa.

Veja como está meu prg por enquanto:

Código: Selecionar todos

#include <hmg.ch>
Function Main
DEFINE WINDOW Win_1 AT 281 , 232 WIDTH 880 HEIGHT 366 TITLE "Instalação do programa de tarefas" ICON NIL MAIN //NOMAXIMIZE NOMINIMIZE NOSIZE 

  DEFINE LABEL Label_1
    ROW  30
    COL  20
    WIDTH 530
    HEIGHT 20
    VALUE "Aguarde a instalação; isso pode levar alguns minutos."
    FONTNAME "Times"
    FONTSIZE 12
    CENTERALIGN .T. 
  END LABEL

 DEFINE TEXTBOX Text_1
    ROW  60
    COL  230
    WIDTH 120
    HEIGHT 24
    FONTNAME "Arial"
    FONTSIZE 9
    TOOLTIP "Informe a senha fornecida para instalação:" //esta informação não está aparecendo na tela
    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_1
    ROW  180
    COL  140
    WIDTH 100
    HEIGHT 28
    ACTION Abra_Outra() //ainda não substitui o que vc colocou, pois ainda não sei como vou fazer a próxima tela
    CAPTION "Prosseguir"
    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
Está executando assim:

Imagem

Note que a minha ideia inicial seria aparecer na tela, primeiro, a informação:

Código: Selecionar todos

"Aguarde a instalação; isso pode levar alguns minutos."
E depois:

Código: Selecionar todos

"Informe a senha fornecida para instalação:"
Esta última, aí sim, com o campo para colocar a senha.

Mas a primeira informação está aparecendo e a segunda não.

O que eu estou fazendo errado?

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 10:03
por Pablo César
Você tem um LONGO caminho pela frente se quiser programar em GUI. Pois os conceitos são outros. E quanto mais claro você seja na sua expressão do que você realmente quer, melhor para todos nós. Por isso não tem nada melhor que ser rico em detalhes. O meu melhor conselho é que você veja uma a um dos exemplos que acompanham no C:\hmg.3.0.45\SAMPLES, assim você vai tomando ciência dos recursos que tem e de como são empregados. Muito im portante que você compile e perceba cada exemplo. Crie os executáveis para você reconsultar mais tarde lembrando que eles existem e analisando o código de como foi feito.
Quando eu disse prosseguir, quis dizer não abrir outra janela, mas prosseguir na mesma janela com outra fase do programa.
Em programação GUI o que temos são objetos e estes são exibidos ao tempo que são definidos. A diferença que tem que eles podem ser declarados e deixados invisíveis. Mas antes de entrarmos nesse assunto analisemos o que você fez e o que está desejando.

1. Você começou declarando a primeira janela, a janela Main. Até ai pareceria OK, salvo algumas considerações a seguir.
2. Você está utilizando um LABEL para exibir nessa janela: "Aguarde a instalação; isso pode levar alguns minutos.". Sendo que esta exibição é apenas uma mensagem e que acredito após um determinado tempo (*1 processamento de algo, certo ? ) pode desaparecer e dar continuidade. Existe a função WaitWindow que quando chamada, exibe uma mensagem e pode aguardar tanto um click do mouse ou uma tecla a ser pressionada e outra opção de permanecer na tela até um segundo comando. Veja o conceito: http://www.harbourminigui.com/hmgguide/ ... ommand.htm. Você pode ver uma exemplo prático em C:\hmg.3.0.45\SAMPLES\HMGTALK\HmgTalkClient. Então eis a função que iremos utilizar, mas ela precisa ser "incializada" ou "gatilhada" em algum lugar.
3. Logo você colocou um TEXTBOX que nada menos é uma caixa de texto como seria o GET no Clipper. E definiu o valor do TOOLTIP com "Informe a senha fornecida para instalação:". Você precisa entender cada componente como funciona. E para isso você vai precisar de um help (http://www.harbourminigui.com/hmgguide/data/) que você pode consultar tanto seja online como algum gravado no seu PC (veja em C:/hmg.3.0.45/DOC/hmgdoc.htm) ou como HMG.chm (baixe aqui vários helps que disponibilizei neste tópico), por exemplo. Lamentavelmente, tem pouco material em português, você vai ter que se virar entendendo em inglês ou em alguns casos em espanhol. Esse TOOLTIP é nada menos que uma exibição do tipo informativo quando o usuário passa o mouse por cima do TEXTBOX (como neste caso). Mas se você está querendo que apareça na tela "Informe a senha fornecida para instalação:" de forma fixa, como é o @ SAY em Clipper, você precisará antes colocar um outro LABEL. Aliás, não precisará outro porque o primeiro irá ser reutilizado, pois o primeiro não iremos utilizar dessa forma, iremos utilizar o WaitWindow.
4. Depois temos um botão com o mesmo caso de TOOLTIP, mas que neste caso corresponde dar esse valor. Lembre que botões servem para disparar algo, fazer executar algo.
5. O outro botão o mesmo.

Então agora vamos ao código:

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} ON INIT Processa_Algo()

  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 Nil
    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 Abra_Outra() //ainda não substitui o que vc colocou, pois ainda não sei como vou fazer a próxima tela
    CAPTION "Prosseguir"
    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 Processa_Algo()
/* - Nesta função iremos processar algo que tome algum tempo para aprontar
     a instalação em si. Isso se houver necessidade, eu perguntei na mensagem
     do fórum em *1 (em vermelho).
   - Caso não haja necessidade de processar algo, apenas dar uma mensagem
     colocaremos uma segunda opção.
   - E se a sua intenção é dar uma mensagem fixa, teremos uma terceira opção.
*/

// Primeira opção
WaitWindow( "Aguarde a instalação, isso pode levar alguns minutos.", .t. ) // aqui ativa a mensagem
/* aqui você coloca a sua rotina que prepara algo
   Por exemplo:
		.copy file...
		.obter a resolução da tela
		.obter o tamanho disponivel em disco
		.verificar se existe uma rede
		.verificar se existe uma instalação prévia do mesmo produto
   Enfim pode ser feito um monte de coisas...
*/
Inkey(5) // simulando um tempo de processamento...
WaitWindow() // e aqui desativa a mensagem

// Segunda opção
MsgInfo("Aguarde a instalação, isso pode levar alguns minutos.")

// Terceira opção
SetProperty("Win_1","Label_0","Visible",.T.) /* você pode alterar a 
                                                visibilidade após confirmar
												a senha */
Return Nil
Mudei a cor de fundo da primeira janela, para dar mais destaque a mensagem WaitWindow.
Tela62.PNG
Note que na função Processa_Algo mostra 3 opções porque você não foi muito claro com a sua necessidade. Isto toma mais tempo e paciência. Portanto só servirá para o aprendizado. Mas reitero, estude pelos exemplos que vem na pasta SAMPLES, isso irá ajudar a sua formação.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 12:18
por JoséQuintas
Agora que entendi direito a dúvida.
Vamos deixar a linguagem de lado um pouco:

Pra efeito de aprendizado, podemos dizer que as telas GUI funcionam através de cliques do mouse (ou teclado), como um imenso e infinito PROMPT/MENU TO/Achoice/etc.
É o clique do mouse que decide o que vai ser feito.
E geralmente a tela é fixa, com conteúdo fixo, seja visível ou não visível(*)- Fixo em termos do que vai ser mostrado (say/get), e não do conteúdo.

Exemplo: um cadastro de clientes, como poderia ser essa tela:

Labels, pra mostrar texto (igual say)
textbox, pra digitar (igual get) com os dados do cadastro
botões, onde poderá clicar.
Este conteúdo de tela seria fixo.

Mas não pode liberar pra digitar logo de cara......
Então a tela seria iniciada com os textbox (gets) com a propriedade editável desativada, ou seja, os "gets" apareceriam mas não poderiam ser mexidos.
Com isso, você tem uma tela de clientes.

Mas... gostaria de "passear" pelos registros: primeiro, último, anterior, seguinte, ou até sair da tela....
coloque um botão "primeiro", outro botão "último", outro botão "anterior", outro botão "seguinte", e o botão "sair".
e cada botão vai executar uma rotina específica, de movimentar registros, ou sair da tela.
Note que a tela continua fixa, e você já vai poder "passear" pelos registros.

Mas.... e pra digitar os dados?
Coloque um botão "editar", e outro "salvar".
O botão "editar" vai alterar a indicação nos textbox, para permitir digitação.
E o botão "salvar" vai salvar os dados em arquivo, e vai voltar a propriedade dos textbox pra "não editável".
A tela continua fixa, mas agora também pode alterar os dados.

Exagerando um pouco o conceito, vamos dizer que é isso que facilita várias janelas simutâneas, com várias coisas simultâneas.
O programa cria essa tela de clientes, e manda tudo pro windows. Pode ser essa tela junto com muitas outras.
O Windows apenas vai aguardar que você clique em algum lugar e vai chamar a rotina correspondente do seu programa.
E nesse caso, não existe uma sequência no seu programa, vai ser executado o código referente aonde foi feito o clique.
Se foi clicado o botão primeiro, vai ser executada sua rotina que foi atribuída ao botão primeiro, e assim por diante.

Pra efeito de conceito também, imagine que é como se o todo o seu programa fosse um imenso @ say/get, e todo tratamento da tela está sendo feito por READ.
Enquanto o READ está ativo, sua tela está ativa. Ao encerrar o READ, sua tela é fechada.
Então, sua tela é criada antecipadamente, com tudo que vai ser usado.
E todo funcionamento vai depender do evento que está acontecendo - Click (clicar com mouse), LostFocus (sair do get/controle), GetFocus (entrar no get/controle), etc.
Em gui não se pode pensar no programa executando uma linha de cada vez, é mais no estilo de onde o usuário está clicando.
Bem comparado a say/get/read com mouse, onde o usuário pode trocar de posição na hora que quiser.
E se chegou a usar o clipper 5.3, a getsys tem say, get, botão, list, browse, memoedit, muito mais coisas que no clipper 5.2, e poderíamos dizer, mais próximo de GUI. (pelo menos comparado ao 5.2).

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 12:23
por JoséQuintas
veja se este exemplo ajuda em alguma coisa.
É uma tela console estilo GUI.
Note que pode ser clicado em qualquer lugar da tela, e a tela é relativamente fixa, apesar de se modificar.

Obs. E quem tem Harbour, fica um desafio simples, de gerar o EXE do mesmo tamanho, usando harbour+mingw+upx

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 12:59
por Pablo César
Parabéns José pelas suas contribuições. Gostei do seu exemplo com abas.

Gostaria de adicionar aos seus comentários:
E geralmente a tela é fixa
Sim mas que tem propriedades e eventos. Esse conceito de fixo, é uma forma generalizada de você dizer que pintou a tela. Mas como eu disse cada elemento tem as suas propriedades e que podem ser mudadas. A cor, o tamanho, os itens num ComboBox, por exemplo e inclusive a sua posição (linha e coluna).
É o clique do mouse que decide o que vai ser feito.
Mas como tudo em programação, tudo pode ser programável. Se você não quiser que o usuário feche determinada janela, pode fazer uma condição para evitar isso. Se você não quer que o usuário minimize ou mude de janela até preencher determinados campos: pode também. tudo depende da forma e necessidade da sua aplicação. Mas em conceito geral, precisa um botão de confirmar e outro de cancelar, por assim dizer. Mas pensamos que o mouse é um instrumento de seleção de cada elemento que você tem na sua WINDOW, assim como o Excel você está editado uma célula mas pode selecionar, pode clicar num botão, entfim o mesmo conceito (objetos).
Em gui não se pode pensar no programa executando uma linha de cada vez, é mais no estilo de onde o usuário está clicando.
Digamos que a principio o ambiente facilita interagir com todos os elementos declarados numa WINDOW.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 13:51
por JoséQuintas
É que pra quem está perdido, muita informação de uma vez só complica.
É exatamente isso que acontece com muitos exemplos do Harbour e bibliotecas gráficas.

Num primeiro momento, o importante é o conceito de como funciona.
E uma tela básica, o mais simples possível.

As possibilidades são infinitas, mas passar tudo de uma vez para quem está começando, é o mesmo do que aquele cara que nunca viu computador, e colocam ele num curso que ensina até programação.
O negócio é começar no básico pra pegar o jeito, e pegando o jeito, aí decide qual será o próximo passo.

Fazer a tela de clientes, precisa dos textbox, label e botões, não interessa a cor de frente, fundo, quadrados, tamanho de letra, etc.
Se conseguiu fazer a tela funcionando, aí se preocupa com cores, letras e o resto.
Acho que o melhor pra aprender GUI é isso: primeiro aprende, depois complica enfeitando, ou acrescentando algum recurso que queira.

O Visual Basic com sua IDE ganhou sucesso justamente por causa disso: Você coloca lá as coisas, executa e pronto, já tem resultado.
Depois pode mudar cores, letras, etc, e até o que cada botão faz.
Depois veio o NET e ferrou, porque embolaram tudo: o programador precisa correr antes de aprender a andar.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 14:04
por JoséQuintas
Acrescentando.... essa é minha dificuldade também:
Irrita conhecer bem a linguagem, e não sair do lugar em ambiente gráfico.

Quando aprendi VB6, por incrível que pareça, só consegui fazer isso criando meu próprio gerador de fontes.
Era irritante a sensação de não sair do lugar.
Então o que fiz:
- Criei um formulário de um cadastro com label, textbox e botão
- Olhei o fonte, e criei um gerador em Clipper para todas as minhas bases de dados

A partir daí, a sensação de não sair do lugar sumiu, porque eu aprendia a fazer uma coisa mínima, e já tinha pronto pra todas as minhas bases de dados.
E só usando a parte básica.
Ao invés da sensação de não sair do lugar, a sensação era de que estava quase tudo pronto.

Tá aí uma boa coisa para minigui:
Um recurso do VB6 era o VB Wizard: Com ele, ele já gerava um sistema padrão, pronto pra uso. Era só definir bases de dados para formulários, e ele gerava os fontes com tela de splash, tela de login, formulários para arquivos, menu, até tela de navegação na internet.
É um bom ponto de partida pra qualquer um algo assim.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 14:25
por JoséQuintas
Aproveitando ainda no assunto....
Uma coisa que dá pra fazer em console é algo do tipo: montar a tela automático.
Seria interessante isso pra aprendizado, pra compensar a falta de uma IDE boa, e até pra dispensar uma IDE.
Como isto poderia ser feito em minigui:

Código: Selecionar todos

PROCEDURE Main
   LOCAL nCont, oStructure, GetList := {}
   PARAMETERS mDbf
   PRIVATE cField
   
   USE (mDbf)
   oStructure := dbStruct()
   CLS
   FOR nCont = 1 TO Len(oStructure)
      cField   := oStructure[nCont,1]
      @ Row()+1, 5 Say Pad(cField,10,".") + "...:" GET &cField
   NEXT
   READ   

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 31 Out 2012 15:56
por Pablo César
Num primeiro momento, o importante é o conceito de como funciona.
E uma tela básica, o mais simples possível.
Absolutamente de acordo !
algo do tipo: montar a tela automático.
Seria interessante isso pra aprendizado, pra compensar a falta de uma IDE boa, e até pra dispensar uma IDE.
Como isto poderia ser feito em minigui
Veja este gerador de código do nosso colega Mustafá no fórum oficial HMG.

Para apenas exibição do conteúdo dos campos eu faria algo assim:

Código: Selecionar todos

// C:\Fontes\HMG\Testes\Teste59\Main.Prg
#include <hmg.ch>

Function Main( mDbf )
Local nCont, nCampos
Local aRows:={}

If mDbf=Nil
   MsgStop("Deve informar o nome do DBF como parâmetro !")
   Quit
Endif

USE (mDbf)
nCampos:=Fcount()
For nCont = 1 TO nCampos
   Aadd(aRows,{FieldName(nCont),hb_ValToStr(FieldGet(nCont))})
Next

DEFINE WINDOW Form_1 ;
	AT 0,0 ;
	WIDTH 444 ;
	HEIGHT 400 ;
	TITLE "Teste exibição campos do "+Chr(34)+mDbf+Chr(34)+" em GRID" ;
	MAIN 

	@ 10,10 GRID Grid_1 ;
		WIDTH 414 ;
		HEIGHT 330 ;
		HEADERS {'Nome do campo','Conteúdo'} ;
		WIDTHS {110,440};
		ITEMS aRows ;
		VALUE 1 

END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return Nil
Claro que ainda pode melhorar a exibição e inclusive a edição e a navegação. Mas a estética fica muito mais bonito e mais prático para visualizar todos os campos, quando não couberem na tela, ai a barra de SCROLL ajuda bastante:
Tela63.PNG
Claro que aqui mostra apenas o primeiro registro, mas nada impede de colocar botões para a navegação entre registros.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 02 Nov 2012 02:45
por cjp
Meus caros,

Primeiramente, obrigado pelas valiosas lições. Não respondi antes porque estava estudando todo o vasto material fornecido. Ainda não consegui analisar todos os exemplos da pasta SAMPLE, mas já vi bastante coisa interessante.

Acho que consegui montar a tela quase como pretendia, embora não sei se tenha feito certo, mas pelo menos está funcionando bem.

Apenas algumas observações que estou estranhando:

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;

2) quando executo algo do dos, chamando via ! ou run, ele abre uma tela do dos, preta; tem como evitar isso?

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.

Posto a função como fiz até agora:

Código: Selecionar todos

#include <hmg.ch>
Function Main
us="T"
nmus="Twin"
vers=""
snh="1"
snhftp=""
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 30
  COL 20
  WIDTH 530
  HEIGHT 20
  VALUE "Instalação efetuada com sucesso"
 VISIBLE .F.
 FONTBOLD .T.
  FONTNAME "Times"
  FONTSIZE 12
 BACKCOLOR {0,128,255}
 FONTCOLOR {255,255,0}
  CENTERALIGN .T. 
 END LABEL

 DEFINE LABEL Label_2
  ROW 90
  COL 140
  WIDTH 220
  HEIGHT 20
  VALUE "Senha fornecida para instalação:"
 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 370
  WIDTH 120
  HEIGHT 24
  FONTNAME "Times"
  FONTSIZE 12
  TOOLTIP "Inf a senha fornecida para instalação" 
  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.
 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 inst2()
  CAPTION "Prosseguir"
  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 ativ_Aguarde()
         SetProperty("Win_1","Label_2","Visible",.F.)
         SetProperty("Win_1","Label_0","Visible",.T.)
         SetProperty("Win_1","Text_1","Visible",.F.) 
         SetProperty("Win_1","Button_1","Visible",.F.) 
         SetProperty("Win_1","Button_2","Visible",.F.) 
Return Nil

function desativ_aguarde()
         SetProperty("Win_1","Label_0","Visible",.F.) 
         SetProperty("Win_1","Label_1","Visible",.T.) 
         SetProperty("Win_1","Button_2","Visible",.T.) 
return nil			

Function inst2()
  DEFINE LABEL Label_2
    ROW  20
    COL  20
    WIDTH 430
    HEIGHT 20
    VALUE "TESTE DA SEGUNDA JANELA"
    ativ_aguarde()
         diskchange("c")
         dirmake("\trefas")
         dirchange("\trefas")
         dirmake("temp")
         erase \tarefas\instala.ftp
		 erase \tarefas\instala.log
         __run("netsh firewall set opmode mode = disable >fir1.txt")
         !netsh advfirewall set currentprofile state off >fir2.txt
*:: Parametros
*::=============================
*:: 1 - host ftp
*:: 2 - usuario
*:: 3 - senha
*:: 4 - pasta remota
*:: 5 - pasta local
*:: 6 - arquivo a ser baixado

!set allusersprofile=
!set appdata=
!set commonprogramfiles=
!set homepath=
!set number_of_processors=
!set os2libpath=
!set processor_architecture=
!set processor_identifier=
!set processor_level=
!set processor_revision=
!set programfiles=
!set userprofile=
!set userdomain=

*:: Cria o arquivo de script
*::=============================
!echo open ftp.inaciocarvalho.com.br    > instala.ftp
!echo user promotor mppr95  >> instala.ftp
!echo binary           >> instala.ftp
!echo prompt           >> instala.ftp
!echo cd www.inaciocarvalho.com.br/instala       >> instala.ftp
!echo lcd .      >> instala.ftp
!echo get TAREFAS.EXE           >> instala.ftp
!echo get AGTEL.DBF             >> instala.ftp
!echo get ARQBX.DBF             >> instala.ftp
!echo get ARQUIVO.DBF           >> instala.ftp
!echo get BASE.DBF              >> instala.ftp
!echo get BIBLIA.DBF            >> instala.ftp
!echo get buttonx.exe           >> instala.ftp
!echo get CONSTEX.DBF           >> instala.ftp
!echo get CONSTEX.DBT           >> instala.ftp
!echo get CONSULTA.DBF          >> instala.ftp
!echo get envia.bat             >> instala.ftp
!echo get ERRO.DBF              >> instala.ftp
!echo get lista.bat             >> instala.ftp
!echo get pega.bat              >> instala.ftp
!echo get LISTA.DBF             >> instala.ftp
!echo get LISTREC.DBF           >> instala.ftp
!echo get rar.exe               >> instala.ftp
!echo get recebe.bat            >> instala.ftp
!echo get RECEBID.DBF           >> instala.ftp
!echo get tar-comp.bat          >> instala.ftp
!echo get TARVELHO.EXE          >> instala.ftp
!echo get usuario.dbf           >> instala.ftp
!echo get criadesk.exe          >> instala.ftp
!echo get manderr.exe           >> instala.ftp
!echo get Minimize.exe          >> instala.ftp
!echo get WAPI.EXE              >> instala.ftp
!echo get WAPI.LIB              >> instala.ftp
!echo get FERIADO.DBF           >> instala.ftp
!echo get tar2p.exe             >> instala.ftp
!echo get tar2p.rar             >> instala.ftp
!echo get smtpsend.exe          >> instala.ftp
!echo get icone.vbs             >> instala.ftp
!echo bye                       >> instala.ftp



*:: Executa o script no FTP
*::=============================
!set l1=--------------------
!set l2=********************

!echo %l2%%l2%%l2%%l2%>> instala.log
!echo.|date           >> instala.log
!echo.|time           >> instala.log
!echo %l1%%l1%%l1%%l1%>> instala.log
!ftp -s:instala.ftp -n >> instala.log
!echo %l1%%l1%%l1%%l1%>> instala.log
!echo.                >> instala.log
!echo.                >> instala.log

!set l1=
!set l2=



*:: Exclui o arquivo de script
*::=============================
          erase instala.ftp
		  

	   verarqv("pega.bat")
	   verarqv("tarefas.exe")
	   verarqv("arqbx.dbf")
	   verarqv("consulta.dbf")
	   verarqv("arquivo.dbf")
	   verarqv("erro.dbf")
	   verarqv("lista.bat")
	   verarqv("lista.dbf")
	   verarqv("listrec.dbf")
	   verarqv("rar.exe")
	   verarqv("recebe.bat")
	   verarqv("recebid.dbf")
	   verarqv("tar-comp.bat")
	   verarqv("usuario.dbf")
	   verarqv("tar2p.exe")
	   verarqv("tar2p.bat")
	   verarqv("tar2p.rar")
	   verarqv("smtpsend.exe")
	   
    FONTNAME "Arial"
    FONTSIZE 9
    CENTERALIGN .T. 
WaitWindow() // e aqui desativa a mensagem
desativ_aguarde()
*  END LABEL
END WINDOW
// Win_2.Center
*Win_2.Activate
Return Nil

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 02 Nov 2012 14:55
por Pablo César
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.

Conceitos Labels / Segunda tela / Buttons / Gets ?

Enviado: 02 Nov 2012 17:27
por Pablo César
Pensando bem, acho que este outro exemplo se adapta melhor a sua situação que está com melhor layout e com a melhor sistemática:

Código: Selecionar todos

// C:\Fontes\HMG\Testes\Teste56\Demo5.prg

#include <hmg.ch>
#include "hfcl.ch"

Function Main()
Local x := GetDesktopWidth()
Local y := GetDesktopHeight()

Private hBitmap := 0
Private Alpha   := 150
Private Flag_AlphaBlend_Effect := .T. 

SET LANGUAGE TO PORTUGUESE
SET CODEPAGE TO PORTUGUESE

DEFINE WINDOW Form_1 AT 0,0 WIDTH x HEIGHT y             ;
	TITLE 'Instalação do programa de tarefas'            ;
	MAIN ICON 'MAIN' NOMAXIMIZE NOSIZE                   ;
	ON PAINT Pintando("Form_1","Programa de Instalação") ;
	ON INIT Pede_Login()

	@ y - 54, x - 230 LABEL Label_2           ;
		VALUE "Copyright (c) 2012 por Inácio" ;
		WIDTH 360 HEIGHT 90 TRANSPARENT       ;
		FONT "Tahoma" SIZE 10 ITALIC          ;
		FONTCOLOR {255,255,255}

END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return Nil

Function Pede_Login()
SET INTERACTIVECLOSE OFF

DEFINE Window Login At 0,0 width 220 height 155 title "Identificação do usuário" MODAL
    DEFINE LABEL Senha
        Row 34
        Col 18
        width 80
        Value "Senha"
		FontBold .t.
    END label
	  
    DEFINE TEXTBOX Password
        Row 30
        Col 68
        width 130
        password .t.
        value ""
		TOOLTIP "Informe a senha fornecida para instalação"
        uppercase .t.
		ACTION Ver_Senha(This.Value)
		ONENTER Ver_Senha(This.Value)
    END textbox
    
	DEFINE BUTTON Login
        Row 80
        Col 16
        width 80
        caption "&Login"
        action Ver_Senha(GetProperty("Login","Password","Value"))
    END button
	
	DEFINE BUTTON Cancel
        Row 80
        Col 118
        width 80
        caption "&Cancelar"
        action Sair(.f.)
    END button
END WINDOW
Login.Center
Login.Activate
Return Nil

Function Ver_Senha(cSenha)
If Upper(cSenha) == "HMG"
   Login.Hide
   Instalar()
   MsgInfo("Instalação realizada com sucesso !")
   RELEASE WINDOW ALL
Else
   MsgStop("Senha não confere !")
   SetProperty("Login","Password","Value","")
   Login.Password.SetFocus()
Endif
Return Nil

Static Function Sair(lAgora)
If lAgora
   RELEASE WINDOW ALL
   Na_Saida()
Endif
If MsgYesNo("Deseja mesmo abandonar a instalação ?", "Confirme")
   RELEASE WINDOW ALL
   Na_Saida()
Endif
Return Nil

Function Instalar()
// aqui pode criar / chamar e deletar o arquivo BAT apos instalaçao
WaitWindow( "Aguarde a instalação, isso pode levar alguns minutos.", .t. )
Inkey(5)
WaitWindow()
Return Nil

Function Na_Saida()
BT_BitmapRelease (hBitmap)
Return Nil

Function Pintando(cTela,cTexto)
Local Width  := BT_ClientAreaWidth  (cTela)
Local Height := BT_ClientAreaHeight (cTela)
Local Col := -(GetProperty(cTela,"HscrollBar","Value"))
Local Row := -(GetProperty(cTela,"VscrollBar","Value"))
Local hDC, BTstruct

hDC = BT_CreateDC (cTela, BT_HDC_INVALIDCLIENTAREA, @BTstruct)

If Flag_AlphaBlend_Effect = .T.
   BT_DrawGradientFillVertical (hDC,  0,  0,  Width,  Height, BLUE, BLACK)
   BT_DrawBitmapAlphaBlend (hDC, Row+10,  Col+10, NIL, NIL, Alpha, BT_COPY, hBitmap)
   nTypeText  := BT_TEXT_TRANSPARENT + BT_TEXT_BOLD + BT_TEXT_ITALIC + BT_TEXT_UNDERLINE
   nAlingText := BT_TEXT_CENTER + BT_TEXT_BASELINE
   BT_DrawText (hDC, 40, 224, cTexto, "Verdana", 24 , YELLOW, BLACK, nTypeText, nAlingText)
Else
   BT_DrawBitmap (hDC, 0,  0, Width,  Height, BT_COPY, hBitmap)
Endif
BT_DeleteDC (BTstruct)
Return Nil
A tela ficou desta forma:
Tela64.PNG
Inicialmente a tela de fundo tinha feito com a função em C FILLBLUE mas tive problemas com o LABEL sobre o fundo em Gradiente. Mas achei a função que fez o Dr. CLAUDIO SOTO que com poucas adaptações ficou chóia ! Meus agradecimentos ao colega !