Clipper On Line • Ver Tópico - Modo gráfico Tutor Plug and Play - Hwgui
Página 1 de 4

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 25 Jun 2015 20:34
por Itamar M. Lins Jr.
Ola!
Não precisa de nada instalado, apenas faça e veja o resultado!
Para as pessoas que estão vindo do clipper e quer uma coisa bem fácil!
Aprenda a programar em modo visual sem traumas.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 28 Jun 2015 21:46
por Araújo
Prezado Itamar,
Baixei o tutorial, segui as orientações do tópico Instruction e atualizei as tags conforme abaixo no arquivo "tutor.xml", porém quando dou um duplo clic para compilar, apresenta a mensagem de erro "compile erro".
<init>
<hilight>
<keywords> init window activate dialog menu menuitem endmenu action font click tooltip editbox button combobox and case class data do else elseif end endcase enddo endif exit for func function get if local loop method next or private proc procedure prompt public request return say set seek skip static use while </keywords>
<functions> aadd abs adel aeval afill ains alert alias alltrim array asc ascan asize asort at bof chr col ctod curdir date day dtoc dtos empty eof eval fclose fcreate ferase file fopen found fread fseek fwrite isalpha isdigit islower left recno right set str stuff substr updated upper val valtype year </functions>
<single_line_comment> // </single_line_comment>
<multi_line_comment> /* */ </multi_line_comment>
</hilight>
<tutorial file="tutor_eng.xml" />
<hwgui_dir path="C:\hwgui\tutorial" />
<harbour_inc path="C:\hb32\include" />
<harbour_bin path="C:\hb32\bin" />
</init>

Você poderia me ajudar?!..

Grato,
Araújo

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 30 Jun 2015 00:05
por Itamar M. Lins Jr.
Ola!
Refiz novamente.
Precisa do Harbour.exe e da Hwgui. Adicionei eles no arquivo.
Já modifiquei o tutor.xml

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 26 Ago 2015 17:15
por Duda 'Sgluber'
Muito legal, Itamar! Dei uma olhada rápida e gostei, vou dar uma boa olhada depois. Imagem

Corrija-me se eu estiver errado: a HwGui parece ser a lib visual mais parecida com a notação do Clipper, não é? Em outras palavras, pra quem quer caminhar na direção da interface gráfica pela primeira vez, a HwGui é a mais próxima daquilo que se escreve em Clipper puro?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 28 Ago 2015 15:59
por Itamar M. Lins Jr.
Sim, sem dúvida.
A Hwgui foi feita pelo Russo Alexander um dos gurus do Harbour.
Outra muito legal é a Minigui com sintaxe parecida com VB.
Na época eu foquei na Hwgui e uso ela. Achei mais fácil de entender/migrar o sistema console.
Vantagens da Hwgui é que a sintaxe p/ usar no LINUX é a mesma e a sintaxe p/ usar no Android também muito similar.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 25 Set 2019 17:53
por Marcelo Baliza
Boa noite,
Estou conseguindo compilar meu programa Clipper em HB32.

Agora surgiu a necessidade de uma tela em modo gráfico, para marcação com mouse.

Verifiquei o seu tutorial, mas como não sou um expert, fiquei perdido.

Eu já utilizo a compilação:

set path=C:\hb32\bin;C:\hb32\comp\mingw\bin;%path%
set HB_COMPILER=mingw
hbmk2 CCPBNB

e para o modo gráfico, muda tudo ?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 25 Set 2019 18:24
por JoséQuintas
Marcelo Baliza escreveu:Agora surgiu a necessidade de uma tela em modo gráfico, para marcação com mouse.


Traduz isso.
Quer usar o mouse, é isso? ou precisa de uma tela gráfica?
Se for só mouse... poderia ter usado no Clipper há 30 anos atrás.... e pode usar do mesmo jeito no Harbour.
Correção: pode usar mais fácil ainda no Harbour.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 25 Set 2019 18:31
por Marcelo Baliza
Como faço uma tela dessas do Itamar e compilo ?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 25 Set 2019 18:35
por Marcelo Baliza
Estou utilizando uma tabela no Excel e estou querendo implantá-la no Harbour.

É um DBF com 4 campos e uns 200 registros.

Preciso de uma forma ágil de responder o questionário.

São os seguintes:

Pergunta, sim, nao, naoaplica

Apresentou identidade? Sim(x) Não( ) Não aplica( )

Preciso marcar um campo acima e gravar no DBF.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 26 Set 2019 16:55
por Marcelo Baliza
ITENS DE CADASTRO - SIM NÃO NSA
Certidao de casamento X
Comprovante de endereco X
Comprovante de renda X
Comprovante de renda - DAP X
Documento de identidade X
Roteiro p/ controle qualidade X

É isso que estou querendo fazer. Tenho um roteiro de mais de 200 questões para responder de cada cliente e estou tendo de chamar cada um na edição. Se eu tivesse uma tela com barra de rolagem, facilitaria muito, pois eu iria somente clicar em uma das 3 respostas com o mouse.

Não estou conseguindo fazer. Algum mestre me ajuda ?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 01 Out 2019 16:53
por asimoes
Poderia usar uma grid editável

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 04 Out 2019 17:08
por Marcelo Baliza
o que seria uma grid editável ?

vc teria um código exemplo ?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 04 Out 2019 21:51
por Itamar M. Lins Jr.
Ola!
Já está montado o ambiente para Hwgui ?
Precisamos de mais informações.
Coloca um micro exemplo em clipper para ser convertido em harbour+hwgui.

Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 07 Out 2019 16:29
por Marcelo Baliza
#include "inkey.ch"
#include "hbgtinfo.ch"
SET WRAP ON
SET ESCAPE ON
SET SAFETY OFF
SET STATUS OFF
SET TALK OFF
SET CONSOLE OFF
SET SCOREBOARD OFF
SET INTENSITY ON
**************************VIRADA DO MILENIO******
set epoc to 2000
**************************VIRADA DO MILENIO******
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
REQUEST HB_GT_WVT_DEFAULT
REQUEST HB_GT_WIN_DEFAULT

MAIN()

FUNCTION MAIN()
IF !FILE('MTESTE.DBF')
   MTESTE := {}
   AADD(MTESTE, {'QUESTAO     ', 'C', 65, 0})
   AADD(MTESTE, {'SIM         ', 'C',  1, 0})
   AADD(MTESTE, {'NAO         ', 'C',  1, 0})
   AADD(MTESTE, {'NAOAPLI     ', 'C',  1, 0})
   DBCREATE('MTESTE.DBF', MTESTE)
   RELEASE MTESTE
ENDIF

USE MTESTE

IF RECCOUNT()=0
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Cedula de Identidade ?                      '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Carteira de Habilitacao ?                   '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Comprovante de Endereco ?                   '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Prova de Quitacao com Servico Militar ?     '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Comprovante de Renda ?                      '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Certificado de Conclusao de Ensino Medio ?  '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Cartao de Vacina ?                          '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Titulo de Eleitor ?                         '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Ultima Declaracao IRRF ?                    '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Nota Fiscal da Compra ?                     '
ENDIF

GO TOP

LIN=5

DO WHILE !EOF()

   @ LIN,02 SAY QUESTAO
   @ LIN,70 GET SIM
   @ LIN,74 GET NAO
   @ LIN,78 GET NAOAPLI
   READ

   IF LASTKEY()=27
      CLOSE DATABASES
      RETURN
   ENDIF

   LIN++

   SKIP
   LOOP

ENDDO
CLOSE DATABASES
RETURN

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 07 Out 2019 16:51
por Marcelo Baliza
Assim é minha compilação:(BAT)

set path=C:\hb32\bin;C:\hb32\comp\mingw\bin;%path%
set HB_COMPILER=mingw
hbmk2 MTESTE.hbp

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 14:58
por Itamar M. Lins Jr.
Ola!
#include "hwgui.ch"
FUNCTION MAIN()
Local nLin, mTeste

IF !FILE('MTESTE.DBF')
   mTESTE := {}
   AADD(MTESTE, {'QUESTAO     ', 'C', 65, 0})
   AADD(MTESTE, {'SIM         ', 'C',  1, 0})
   AADD(MTESTE, {'NAO         ', 'C',  1, 0})
   AADD(MTESTE, {'NAOAPLI     ', 'C',  1, 0})
   DBCREATE('MTESTE.DBF', MTESTE)
   RELEASE MTESTE
ENDIF

USE MTESTE

IF RECCOUNT()=0
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Cedula de Identidade ?                      '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Carteira de Habilitacao ?                   '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Comprovante de Endereco ?                   '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Prova de Quitacao com Servico Militar ?     '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Comprovante de Renda ?                      '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Certificado de Conclusao de Ensino Medio ?  '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Cartao de Vacina ?                          '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Titulo de Eleitor ?                         '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Ultima Declaracao IRRF ?                    '
   APPEND BLANK
   REPL QUESTAO WITH 'Apresentou Nota Fiscal da Compra ?                     '
ENDIF

GO TOP
nLin := 5
INIT Dialog oDlg AT 0,0 SIZE 800,600 CLIPPER noexit

   @ nLIN,02 SAY oQuestao Caption QUESTAO size 200,30
   @ nLIN,60 GET SIM size 30,30
   @ nLIN,90 GET NAO size 30,30
   @ nLIN,120 GET NAOAPLI size 30,30

   @ nLin,160 button oBotao caption "Pular" size 60,30 on click {||next()}

ACTIVATE Dialog oDlg center

CLOSE DATABASES
RETURN NIL

Function Next()
   if !eof()
      dbskip()
   endif

oQuestao:settext(mteste->questao)

Return .t.


hbmk2 mteste.prg

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 15:16
por Marcelo Baliza
A linha
ACTIVATE Dialog oDlg center
está dando erro
Error E0030 Syntax error "syntax error at 'dialog'"

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 15:39
por Itamar M. Lins Jr.
Ola!
Eu uso a versão mais recente do SVN. Changelog 2797 2019-09-18 11:49:13Z alkresin
#xcommand ACTIVATE WINDOW <oWnd> ;
               [<lNoShow: NOSHOW>] ;
               [<lMaximized: MAXIMIZED>] ;
               [<lMinimized: MINIMIZED>] ;
               [<lCenter: CENTER>]       ;
               [ ON ACTIVATE <bInit> ]   ;
           => ;
      <oWnd>:Activate( !<.lNoShow.>, <.lMaximized.>, <.lMinimized.>, <.lCenter.>, <bInit> )


Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 15:42
por Marcelo Baliza
Agradeço a sua atenção, ao mesmo tempo peço desculpas. Sou clippeiro das antigas, mas harbour pra mim tudo é novo.

Tem mais algum .ch que tenho que acrescentar ?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 15:46
por Marcelo Baliza
Está faltando funcoes: HDIALOG(), HSTATIC(), HEDIT(), HBUTTON()

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:13
por Itamar M. Lins Jr.
Ola!
Dessa forma não chegaremos a lugar nenhum.
Eu não posso ficar seguindo você. Você deve informar qual é o seu nível ai de entendimento do assunto.
Pelo que estou vendo a biblioteca da Hwgui não está instalada ou não está sendo encontrada pelo hbmk2.
Você consegue compilar alguma coisa com a Hwgui ? Algum exemplo dela ?

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:29
por Marcelo Baliza
Agradeço a sua atenção, ao mesmo tempo peço desculpas. Sou clippeiro das antigas, mas harbour pra mim tudo é novo.

Tem mais algum .ch que tenho que acrescentar ?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:30
por Itamar M. Lins Jr.
Ola!
Qual é a versão do seu GCC(MinGW) ?
>harbour -build

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:32
por Itamar M. Lins Jr.
Ola!
Não é apenas .ch é a biblioteca gráfica HWGUI que precisa estar ai compilada no seu computador, na versão do GCC que vc usa.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:37
por Marcelo Baliza
harbour 3.2.0dev (r1812311432)

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:50
por Itamar M. Lins Jr.
Ola!
Qual é o seu GCC ? Sabe o que é GCC(Mingw) ? Você mesmo escreveu isso... mais acima.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 16:54
por Marcelo Baliza
nao sei o que GCC

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 17:23
por Itamar M. Lins Jr.
Ola!
Vc mesmo escreveu isso:
Assim é minha compilação:(BAT)

set path=C:\hb32\bin;C:\hb32\comp\mingw\bin;%path%
set HB_COMPILER=mingw
hbmk2 MTESTE.hbp


Eu pensei que já sabia o que é um arquivo .HBP, etc... ainda não executou o comando que pedi.
>harbour -build

Coloca aqui a saida da tela.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 08 Out 2019 17:34
por Marcelo Baliza
A minha compilação é console ou gráfica ?

harbour 3.2.0dev (r1812311432)

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 11 Set 2020 01:46
por cjp
Estou tentando começar a aprender a usar Hwgui. Achei excelente o tutorial deste post.
Estou testando um a um os exemplos fornecidos. Alguns estão dando erro na compilação (ex: o Dialog with various gets; e um que tem um color diferente).
Mas estou entendendo os exemplos e vou começar a tentar algumas coisas simples. Por ora, apenas agradeço pela indicação deste post.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 13 Set 2020 00:40
por cjp
Poderia, por favor, me explicar como funciona o @ say? Vi nos exemplos números bem maiores do que os usados no modo console, mas não entendi bem qual a lógica desses dados.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 13 Set 2020 11:40
por Itamar M. Lins Jr.
Ola!
Vi nos exemplos números bem maiores do que os usados no modo console, mas não entendi bem qual a lógica desses dados.

Qual é a resolução ai da sua tela no windows ?
Pode usar como era antigamente 80x25.
Uma tela 80x25 dentro de uma tela 1280x720 que tamanho fica ? Qual é a resolução de tela do seu celular ?
Monitores antigos trabalhavam com LINHAS e COLUNAS agora os monitores trabalham com PONTOS(pixel) É possível acender(ativar) um pontinho desse no monitor e trocar de cor... Antes agente acendia( @ 1,1 say chr(255) ) uma LINHA em uma coluna do monitor.
A MALHA(REDE) da TELA antes tinha apenas 80x25, agora tem (minimamente falando hoje em dia) 1280x720.
A resolução mais baixa 640x480, a mais alta não sabemos varia de acordo com as novas tecnologias.
Quando vc desenhar sua tela deverá levar isso em consideração.
Se fizer(desenhar) seu aplicativo em tela 1280x720, não irá aparecer em monitores 1024x620 vai cortar alguns objetos da tela.
Quanto MENOR resolução usarmos MENOR fica em resoluções maiores.
Por isso a confusão(difícil entender) que possivelmente podemos fazer usando os GTs pois não é possível usar LETRAS(Fonts) diferentes na mesma tela.
GTs são os antigos métodos, herança do DOS. Porque ele LIMITA o desenvolvedor usar APENAS 1(uma) FONTE de letra no aplicativo todo.
No Hwgui, Minigui, podemos colocar qualquer tamanho, estilo, cor de fonte com total liberdade, basta apenas escolher nossa DIAGRAMAÇÃO da tela, que acharmos melhor.
@ 1,1 say "X" // No windows é a mesma coisa, PORÉM qual será o último ? Vai depender da resolução de cada TELA que irá cessar o sistema.
@ 1280,720 say "X" seria no caso a ultima, no DOS seria, @ 24,79 say "X" isso em uma tela (gráfica) windows é bem pequeno.

Qual quadro seria melhor para colocar mais elementos ?
Um quadro de 1,0m X 1,0m metro para desenhar ? ou um quadro 100,0m X 100,0m ?

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 13 Set 2020 22:01
por cjp
Vamos ver se eu entendi o que vc disse: o Harbour trabalha com linhas/colunas, e a Hwgui trabalha com pontos, que são muito menores que uma linha/coluna. É isso?
Isso permite que a Hwgui seja mais precisa e detalhada, além de se adaptar melhor aos diversos tamanhos de monitores, correto?
Meu computador está com resolução de tela de 1366 X 768. No celular eu não uso meu sistema.
Mas o que eu ainda não entendi: como faço para desenhar a tela com textos comuns, do tipo @ say? Qual é o parâmetro? Quanto seria o maxrow() X maxcol()?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 13 Set 2020 22:31
por Itamar M. Lins Jr.
Ola!
o Harbour trabalha com linhas/colunas, e a Hwgui trabalha com pontos, que são muito menores que uma linha/coluna. É isso?

A Hwgui, Minigui, FiveWin, HBQT, Xailer... São feitas usando também o Harbour, compiladas com o Harbour e LINKADAS com GCC/BCC/MSVC...
Então são 100% dependentes do Harbour. São feitas para uso com o Harbour.
trabalha com linhas/colunas,
Quem trabalha com linhas/colunas é o ambiente que vai ser executado nosso aplicativo. No caso a linha de comando do win10(CMD/prompt de comando). Que vai passar a ser igual ao LINUX ( terminal de comando ) em breve.
Hwgui seja mais precisa e detalhada, além de se adaptar melhor aos diversos tamanhos de monitores, correto?

Não! a Hwgui usa os recursos de outro ambiente que é o windows.(gráfico).
São DOIS ambientes que vc tem. O do PROMPT/CMD limitado que está dentro de um maior, o windows (sistema operacional).
A Hwgui usa recursos do Windows e as GTs(GTWVG/GTWIN/GTWVW) usam recursos limitados pelo CMD/Prompt(ambiente limitado dentro de um maior).
Mas o que eu ainda não entendi: como faço para desenhar a tela com textos comuns, do tipo @ say? Qual é o parâmetro? Quanto seria o maxrow() X maxcol()?

Cadê seu código ? Mostre algo para poder ensinar o que tem dúvida.
No tutor tem vários exemplos escolha algum para podermos trabalhar em cima de suas dúvidas.
Da forma que está no tutor é forma normal que usamos fora do tutor.
tutorial.rar
Tutorial compilado atualizado e corrigido
(2.29 MiB) Baixado 20 vezes


Olhe na pasta "Get System" que tem o que vc perguntou.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 13 Set 2020 23:44
por cjp
Estou fazendo com base no tutorial.
Vi a seção Get System, que tem dois exemplos. O primeiro está dando erro na compilação (vide anexo).
Mas o segundo exemplo deu certo e eu entendi. Mas acho que não é bem isso que preciso.
Estou querendo apenas colocar dados na tela, o que faria com @ say no modo console.
Ainda não fiz quase nada, mas o início que fiz não deu certo.
Veja o princípio do código:

   IF ADOconecta( nProvAcoes, 5 )
      cProc=conexao:execute("select dtcotacao,cotacao,quemcad,compvenda,conta from acoes where codigo='"+cod+"' AND status='M' order by dtcotacao")
     if cProc:recordcount()>0
        @ 22,5 say "Ordens marcadas:" size 500,45
       a=34
       do while !cProc:Eof()
           @ a,5 say cProc:Fields("dtcotacao"):Value size 500,45
           @ a+10,5 say cProc:Fields("quemcad"):Value size 500,45
         @ a+20,5 say cProc:Fields("compvenda"):Value size 500,45
         @ a+30,5 say cProc:Fields("cotacao"):Value size 500,45
         @ a+40,5 say cProc:Fields("conta"):Value size 500,45
         a=a+50
         cProc:MoveNext()
         enddo
     endif
   endif


Veja no anexo como está aparecendo.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 14 Set 2020 08:10
por Itamar M. Lins Jr.
Ola!
Você nem baixou o tutor novo que postei, mais acima.
Esse tem 3 exemplos.
Sem título.png

Mostre seu código todo.
Está fazendo uma coisa e perguntando outra.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 15 Set 2020 14:17
por cjp
De fato, eu não tinha baixado o último tutorial, pois não sabia que ele tinha sido atualizado. Baixei agora.

Segue o código inteiro:

* -----------------------------------------------------------------
* Programa...: ASAPREV.PRG
* Finalidade.: Controlar o Menu de Op??es do Sistema da ASAPREV
* Autor......: Alexandre Sim?es
* Data.......: 09/2010 at? presente data
* -----------------------------------------------------------------
* Manuten??o atual por: Alexandre Sim?es (SET/2010 A PRESENTE DATA)
* C?digo migrado para Harbour 32Bit
* -----------------------------------------------------------------
* Harbour    : 3.4 FORK
* Compilador : LLVM/CLANG 9.0 (32-bit)
* Lib Gr?fica: HwGui 2.17 (FORK)
* -----------------------------------------------------------------
THREAD STATIC ThisFormMain

#include "hwgui.ch"
#include "inkey.ch"
#include "dbinfo.ch"
#include "fileio.ch"
#include "hbclass.ch"
#include "hbver.ch"
#include "hbdyn.ch"
#include "hbthread.ch"

//#define WM_QUERYENDSESSION          0x0011
//#define WM_ENDSESSION               0x0016
//#define WM_ENDSESSION                   22

#define NIIF_INFO               0x00000001
#define NIIF_WARNING            0x00000002
#define NIIF_ERROR              0x00000003
#define NIIF_USER               0x00000004

#define HB_SYMBOL_UNUSED( symbol )  ( symbol := ( symbol ) )

FUNCTION MAIN()
PUBLIC oDEMO

   WITH OBJECT oDEMO := ClDEMO():New()
      :DEMO()
   END
ANNOUNCE Errors2
   
RETURN Nil

CREATE CLASS ClDEMO

   PROTECTED :
   
   EXPORTED :   
   
   VAR nWidth           AS INTEGER INIT Nil PROPERTY
   VAR nHeight          AS INTEGER INIT Nil PROPERTY
   VAR nOpcao           AS INTEGER INIT 1   PROPERTY
   VAR nTmpSistema      AS INTEGER INIT 60  PROPERTY
   VAR nLoop            AS INTEGER INIT 1   PROPERTY
   VAR nTimeOut         AS INTEGER INIT -1  PROPERTY
   VAR aOpcao           AS ARRAY   INIT {}  PROPERTY
   VAR aCompDateTime    AS ARRAY   INIT {}  PROPERTY
   VAR aEstacaoFoto     AS ARRAY   INIT {"PC2"} PROPERTY
                       
   VAR oIcon001         AS OBJECT  INIT Nil PROPERTY
   VAR oIcon002         AS OBJECT  INIT Nil PROPERTY
   VAR oIcon003         AS OBJECT  INIT Nil PROPERTY
   VAR oIcon004         AS OBJECT  INIT Nil PROPERTY
   VAR oIcon005         AS OBJECT  INIT Nil PROPERTY
   VAR oIcon006         AS OBJECT  INIT Nil PROPERTY
   VAR oIconCEP         AS OBJECT  INIT Nil PROPERTY
   VAR oIconOpe         AS OBJECT  INIT Nil PROPERTY
   VAR oOpcoes          AS OBJECT  INIT Nil PROPERTY
   VAR ThisFormInit     AS OBJECT  INIT Nil PROPERTY
   
   METHOD DEMO()
   METHOD AppSetup()
   METHOD SaidaSistema()
   METHOD ChamaRotina( cRotina, lGui )
     
ENDCLASS

METHOD DEMO()
LOCAL  oStatus1, oMenu1, oToolbar1, oToolbutton1, oToolbutton2, oToolbutton3, oToolbutton4 ;
       , oToolbutton5
LOCAL oIcon, oFont1, oFont2, oFont3, oFont4
LOCAL nIconIndex
LOCAL nHandleFile, nWidthW, nHeightH, nWidth, nHeight, aListBox:={}, oElemento

PUBLIC oWin
PUBLIC cDirSis          := Hb_DirBase() + [NETIO\SERVER5\DB\], ;
       cDirTMP          := Hb_GetEnv("TEMP") + Hb_Ps()
PUBLIC cVersao
PUBLIC Tecla
PUBLIC cUsuSis
PUBLIC cSenSis
PUBLIC cCor_0101
PUBLIC cCor_2424
PUBLIC iGiro            := 1
PUBLIC cArqPrint       
PUBLIC aTexto           := {}, oEdit
PUBLIC nRed             := Round(212 / 255, 2), ;
       nGreen           := Round(255 / 255, 2), ;
       nBlue            := Round(255 / 255, 2)
PUBLIC lPaint           := .F.
PUBLIC aAzul            := {0, 0, Round(255/255, 2)}
PUBLIC aVermelho        := {Round(255/255, 2), 0, 0}
PUBLIC aVerde           := {0, Round(255/255, 2), 0}
PUBLIC aPreto           := {0, 0, 0}
PUBLIC AzulHTML         := '<span style="color:#0000FF">'
PUBLIC VermelhoHTML     := '<span style="color:#FF0000">'
PUBLIC QuebraHTML       := "<br>"
PUBLIC cAlineL          := '<td align="left">'
PUBLIC cAlineC          := '<td align="center">'
PUBLIC cAlineR          := '<td align="right">'
PUBLIC oThisForm
PUBLIC cEstacaoCobranca := Hb_GetEnv( "COMPUTERNAME" )
PUBLIC cMens_, ;
       cCor__, ;
       nLin__, ;
       nCol__   
PUBLIC xMedia
PUBLIC oAchoice, ;
       oEditor, ;
       oMemo, ;
       oBrowse, ;
       oGuiProc, ;
       oClRede, ;
       oClShow, ;
       oClJustificaTexto       
PUBLIC pWindowGTI
PUBLIC N_BLUE           := 16711680
PUBLIC N_DARKBLUE       := 10027008
PUBLIC N_WHITE          := 16777215
PUBLIC N_CYAN           := 16776960
PUBLIC N_BLACK          :=        0
PUBLIC N_RED            :=      255
PUBLIC N_GREEN          :=    32768
PUBLIC N_GRAY           :=  8421504
PUBLIC N_YELLOW         :=    65535
PUBLIC N_CLEANBLUE      := 16771276
PUBLIC N_CLEANGRAY      := 12632256
PUBLIC N_BLUE001        := 16777172
*
PRIVATE cUserName       := Hb_GetEnv("USERNAME")
PRIVATE aPrn            := Win_PrinterList()
PRIVATE oSayMsg0
PRIVATE oSayMsg1
PRIVATE oSayMsg2
PRIVATE oSayMsg3
PRIVATE oBar
PRIVATE nTempoInicio
   
   ::AppSetup()
     
   nIconIndex := NIIF_USER
   
   hwg_SetColorInFocus( .T., 16711680, 8388607 )
   
   hwg_SetTooltipBalloon( .T. )
   
   oFont1     := HFont():Add( "Georgia", 15, -30, , 0 )
             
   oFont2     := HFont():Add( "Tahoma", 8, -20, , 0 )
             
   oFont3     := HFont():Add( "Tahoma", 6, -20, , 0 )
             
   oFont4     := HFont():Add( "Tahoma", 6 )

   oIcon      := HIcon():AddResource("ICON_A", 24, 24)
   
   nWidth      := hwg_GetDesktopWidth()
   
   nHeight     := hwg_GetDesktopHeight()
   
   ::nWidth    := hwg_GetDesktopWidth()
   
   ::nHeight   := hwg_GetDesktopHeight()
     
   lErro := .F.
   
   cCor_0101 := "B/W*"
   cCor_0202 := "W+/B*"
   cCor_0322 := "W+/B,B/GR*,,,N/W"
   cCor_2424 := "W+/B*"
   
   ::aOpcao := {}

   INIT WINDOW oWin ;
               MAIN ;
               TITLE       "Agenda" ;
               AT          0, 0 ;
               SIZE        hwg_GetDesktopWidth() , hwg_GetDesktopHeight() ;
               FONT        HFont():Add( 'Tahoma', 0 , -13, 400 ) ;
               ICON        oIcon ;
               STYLE       WS_CAPTION + WS_SYSMENU + WS_MAXIMIZEBOX ;
               ON INIT     {|this| hwg_Keyb_Event( VK_UP ), ;
                                   _CONTROLPOS_C_SETSTYLE_( oWin:handle, WS_SIZEBOX, .T. ) ;
                           } ;
               ON EXIT     {|this| ::SaidaSistema() }

   ThisFormMain           := oWin

   @ 0,0  BITMAP        Bitmap1 ;
          SHOW          "\lixo\WALLPAPER.JPG" ;
          OF            ThisFormMain ;
          STRETCH       0 ;
          SIZE          nWidth, nHeight - 65
       
public vers :="17/06/20"
sh="S"
snh=654
*#require "rddsql"
*#require "sddodbc"
*#include "dbinfo.ch"
*#include "hbcompat.ch"
*#include "inkey.ch"
*#include "hbgtinfo.ch"
*         #define RDDI_CONNECT     1001
*         #define RDDI_DISCONNECT   1002
*         #define RDDI_EXECUTE     1003
         REQUEST SQLMIX, SDDODBC, DBFNTX
*         ANNOUNCE RDDSYS

pargerais()
save scre to tl0                                                                                                                                                                                                                                                                                                                                             
         
   MENU OF ThisFormMain 
         MENUITEM 'Sair do Sistema' ID 32129  ACTION {|| ::SaidaSistema() }
         MENUITEM 'Agenda financeira' ID 32001                                     ACTION {|| ::ChamaRotina( "CONTAGEN34()", .F. ) }
*         MENUITEM 'Contas bancrias' ID 32002                                     ACTION {|| ::ChamaRotina( "BANCOS34()", .F. ) }
         MENUITEM 'Compromissos' ID 32003                                     ACTION {|| ::ChamaRotina( "AGCOM34()", .F. ) }
*         MENUITEM '&Graph1' ID 32004 ACTION Graph1()
         MENUITEM 'Cotacoes' ID 32005 ACTION Cotacoes34()
         MENUITEM '&Graph2' ID 32006 ACTION Graph2()
   ENDMENU
     
   ACTIVATE WINDOW oWin MAXIMIZED CENTER ON ACTIVATE {|| .T. }
   
RETURN Nil

METHOD SaidaSistema()
LOCAL lSair := .F.
   
   hwg_ExitProcess()
   
RETURN lSair

Static Function Graph1
Local oModDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oGraph
Local i, aGraph[1]

   aGraph[1] := {}
*   FOR i := -40 TO 40
*      Aadd( aGraph[1], { i, hwg_cos(i/10) } )
      Aadd( aGraph[1], { day(date()-6), 5 } )
      Aadd( aGraph[1], { day(date()-5), 6 } )
      Aadd( aGraph[1], { day(date()-4), 7 } )
      Aadd( aGraph[1], { day(date()-3), 8 } )
      Aadd( aGraph[1], { day(date()-2), 9 } )
      Aadd( aGraph[1], { day(date()-1), 10 } )
      Aadd( aGraph[1], { day(date()), 11 } )
*   NEXT

   INIT DIALOG oModDlg CLIPPER TITLE "Gr?fico"        ;
           AT 410,30  SIZE 300,300                  ;
           FONT oFont

   @ 50,30 GRAPH oGraph DATA aGraph SIZE 200,100 COLOR 65280
   // oGraph:oPen := HPen():Add( PS_SOLID,2,oGraph:tcolor )

   @ 90,250 BUTTON "Close"  ;
       SIZE 120,30          ;
       ON CLICK {||EndDialog()}

   ACTIVATE DIALOG oModDlg

Return Nil

Function Graph2(cod)
       Local oModDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oGraph
       Local i, aGraph[1]
      local cProc, nCotMax, dDtMax, nCotMin,dDtMin, nCotMax30d, dDtMax30d, nCotMin30d, dDtMin30d, nCotAgora, dDtAgora
      private conexao
      
       IF ADOconecta( nProvAcoes, 5 )
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND cotacao<9999 AND compvenda=0 order by cotacao DESC limit 1")
        nCotMax=cProc:Fields("cotacao"):Value
        dDtMax=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND cotacao>0 AND compvenda=0 order by cotacao limit 1")
        nCotMin=cProc:Fields("cotacao"):Value
        dDtMin=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND cotacao<9999 AND dtcotacao>'"+dtsql(date()-30)+"' AND compvenda=0 order by cotacao DESC limit 1")
        nCotMax30d=cProc:Fields("cotacao"):Value
        dDtMax30d=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND dtcotacao>'"+dtsql(date()-30)+"' AND cotacao>0 AND compvenda=0 order by cotacao limit 1")
        nCotMin30d=cProc:Fields("cotacao"):Value
        dDtMin30d=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND dtcotacao>'"+dtsql(date()-30)+"' AND cotacao>0 AND cotacao<9999 AND compvenda=0 order by dtcotacao DESC limit 1")
        nCotAgora=cProc:Fields("cotacao"):Value
        dDtAgora=cProc:Fields("dtcotacao"):Value
          cProc:Close()
        conexao:close()
      Endif
      

       aGraph[1] := {}
       Aadd( aGraph[1], { day(dDtMin), nCotMin } )
       Aadd( aGraph[1], { day(dDtMax), nCotMax } )
       Aadd( aGraph[1], { day(dDtMin30d), nCotMin30d } )
       Aadd( aGraph[1], { day(dDtMax30d), nCotMax30d } )
       Aadd( aGraph[1], { day(dDtAgora), nCotAgora } )

       INIT DIALOG oModDlg CLIPPER TITLE "Graph"        ;
       AT 38,5  SIZE 1310,800                  ;
       FONT oFont
         
        @ 9,15 say cod size 500,45
       
        @ 1087,384 say alltrim(str(nCotMin)) size 100,45
        @ 1127,384 say alltrim(str(nCotMax)) size 100,45
        @ 1166,384 say alltrim(str(nCotMin30d)) size 100,45
        @ 1207,384 say alltrim(str(nCotMax30d)) size 100,45
        @ 1250,384 say alltrim(str(nCotAgora)) size 100,45
       
        @ 1090,647 say substr(dtoc(dDtMin),1,2) size 100,45
        @ 1090,666 say substr(dtoc(dDtMin),4,2) size 100,45
        @ 1090,684 say substr(dtoc(dDtMin),9,2) size 100,45
       
        @ 1130,647 say substr(dtoc(dDtMax),1,2) size 100,45
        @ 1130,666 say substr(dtoc(dDtMax),4,2) size 100,45
        @ 1130,684 say substr(dtoc(dDtMax),9,2) size 100,45
       
        @ 1170,647 say substr(dtoc(dDtMin30d),1,2) size 100,45
        @ 1170,666 say substr(dtoc(dDtMin30d),4,2) size 100,45
        @ 1170,684 say substr(dtoc(dDtMin30d),9,2) size 100,45
       
        @ 1212,647 say substr(dtoc(dDtMax30d),1,2) size 100,45
        @ 1212,666 say substr(dtoc(dDtMax30d),4,2) size 100,45
        @ 1212,684 say substr(dtoc(dDtMax30d),9,2) size 100,45
       
        @ 1255,647 say substr(dtoc(dDtAgora),1,2) size 100,45
        @ 1255,666 say substr(dtoc(dDtAgora),4,2) size 100,45
        @ 1255,684 say substr(dtoc(dDtAgora),9,2) size 100,45

   @ 1070,410 GRAPH oGraph DATA aGraph SIZE 230,230 COLOR 65280
   oGraph:nType := 2
   
   IF ADOconecta( nProvAcoes, 5 )
      cProc=conexao:execute("select dtcotacao,cotacao,quemcad,compvenda,conta from acoes where codigo='"+cod+"' AND status='M' order by dtcotacao")
     if cProc:recordcount()>0
        @ 22,5 say "Ordens marcadas:" size 500,45
       a=34
       do while !cProc:Eof()
           @ a,5 say cProc:Fields("dtcotacao"):Value size 500,45
           @ a+10,5 say cProc:Fields("quemcad"):Value size 500,45
         @ a+20,5 say cProc:Fields("compvenda"):Value size 500,45
         @ a+30,5 say cProc:Fields("cotacao"):Value size 500,45
         @ a+40,5 say cProc:Fields("conta"):Value size 500,45
         a=a+50
         cProc:MoveNext()
         enddo
     endif
   endif

*   @ 130,250 BUTTON "Close"  ;
*       SIZE 130,30          ;
*       ON CLICK {||EndDialog()}

   ACTIVATE DIALOG oModDlg

Return Nil

Function velhaCotacoes
        local opcotvar
        private oRs, conexao
       private dti := date()
       private dtf := date()

         GetDt()      

/*      
        if seconds()<30000
           dt=date()-1
        else
           dt=date()
        endif
        dtf=date()
*/
      
        opcotvar=2
*?procline(0)
*?"Conferir:"
*inkey(11)      
*                          @ 11,29 say "Data inicial:"get dt
*                        @ 12,29 say "Data final:"get dtf
*                        read
*?procline(0)
*inkey(11)      

         IF ADOconecta( nProvAcoes, 5 )
            oRs=conexao:execute("SELECT codigo,dtcotacao,hrcotacao,cotacao,quemcad,dtvisto,hrvisto,dtver from acoes WHERE dtcotacao>='"+dtsql(dt-3)+"' AND dtcotacao<'"+dtsql(dtf+1)+"' AND compvenda=0"+if(opcotvar=2," AND quemcad like 'var-%'","")+if(opcotvar=3," ORDER by dtvisto,hrvisto"," ORDER by dtcotacao,hrcotacao"))
          browseado()
            oRs:Close()
          conexao:close()
        Endif

Return .t.

function enddialog
return

METHOD ChamaRotina( cRotina, lGui )
THREAD STATIC lInicio := .F., lContinua := .T., oErro

   Hb_Default(@lGui, .F.)
   
         If ! lGui
            If ! lInicio
               lInicio := .T.
               nThread  :=  Hb_ThreadStart( Hb_BitOr( HB_THREAD_INHERIT_PUBLIC, HB_THREAD_INHERIT_PRIVATE, HB_THREAD_INHERIT_MEMVARS ), {|| &cRotina.} )
               
//               DO WHILE .T.
//                  IF Hb_ThreadWait( nThread, 0.1, .T. ) == 1
//                     Exit
//                  ENDIF
//                  hwg_DoEvents()
//               ENDDO
               //Eval( {|| &cRotina. } )
               If pWindowGTI != Nil
                  wapi_DestroyWindow( pWindowGTI )
               Endif
               lInicio := .F.
            Endif
         Endif
                               
RETURN Nil

/*
function logerro
return

function sendmessage
return

*function enddialog
*return
*/

function cotacoes34
         oJanela := Janela():New():IniciaJanelaRotina( "Cotacoes" )
       cotacoes()
return .t.

function agcom34
         oJanela := Janela():New():IniciaJanelaRotina( "Compromissos" )
       agcom()
?procline(0)
inkey(11)      
return .t.

function bancos34
         oJanela := Janela():New():IniciaJanelaRotina( "Bancos" )
       bancos()
return .t.

function contagen34
         oJanela := Janela():New():IniciaJanelaRotina( "Agenda financeira" )
       contagen()
return .t.

function envmailkativ(dstmail,arqmand,contmail,arqanx,inc)
         local ret :="S"

*return .f.
      
*if "RODRIGO"$upper(netname()) .or. "CAMYLLA"$upper(netname()) .or. "INACIO"$upper(netname()) .or. "VANESSA"$upper(netname()) .or. "LUIZ"$upper(netname()) .or. "MVAZ"$upper(netname())
*   return .f.
*else
*?"Entrou no envmailkativ; ver se vai dar erro:"
*?netname()
*inkey(11)   
*endif   
         bError := ErrorBlock( {|e| Break(e) } )
         begin sequence
if inc=4 .and. us="I"
?dstmail
?arqmand
?contmail
?arqanx
?procline(0)
?"Ver se vai mandar pelo envmailkativ"
inkey(5)
endif
*             if hb_sendmail("smtp"+if(upper(netname())="LUIZ" .or. "MVAZ"$upper(netname()),"i","")+".kinghost.net",587,"programa@inacio.kinghost.net",{dstmail},,,memoread(arqmand)+ansi(contmail),assuntomail,{arqanx},"programa@inacio.kinghost.net","piuma2018","pop.kinghost.net",,,.T.,.t.,,,)=.f.
             if tip_mailsend("smtp"+if(upper(netname())="LUIZ" .or. "MVAZ"$upper(netname()),"i","")+".kinghost.net",587,"programa@inacio.kinghost.net",{dstmail},,,memoread(arqmand)+ansi(contmail),assuntomail,{arqanx},"programa@inacio.kinghost.net","piuma2018","pop.kinghost.net",,,.T.,.t.,,,)=.f.
if inc=4 .and. us="I"
?dstmail
?arqmand
?contmail
?arqanx
?procline(0)
?"N?o mandou pelo envmailkativ"
inkey(5)
endif
*?"Retornou falso"
*inkey(11)
*inkey(11)            
                ret="F"
                if us="I" .and. inc#4
                   @ maxrow()-1,1 say "Aguarde... (mandmail n?o enviou pelo programa@inacio.kinghost.net)"
                 endif
*else
*?"Enviou"
*inkey(11)
*inkey(11)             
            endif
         
         recover using e
                 cMessage := ErrorMessage(e)
                 logerro()
                 mandmail1("error.log","Erro na fun??o envmailkativ contornado com o recover do begin sequence")
             ret="F"
         endsequence
         ErrorBlock( bError )

         if ret="F"
            return .f.
         endif

return .t.

function envmailking(dstmail,arqmand,contmail,arqanx,inc)
         local ret :="S"
*if "RODRIGO"$upper(netname()) .or. "CAMYLLA"$upper(netname()) .or. "VANESSA"$upper(netname()) .or. "LUIZ"$upper(netname()) .or. "MVAZ"$upper(netname())
*   return .f.
*else
*if us="I"
*?upper(netname())
*inkey(1)
*endif   
*endif   
         bError := ErrorBlock( {|e| Break(e) } )
         begin sequence
if inc=4 .and. us="I"
?dstmail
?arqmand
?contmail
?arqanx
?procline(0)
?"Ver se vai mandar pelo envmailking"
inkey(5)
endif
             if tip_mailsend("smtp"+if(netname()="INACIO" .or. netname()="inaciocarvalho","i","")+".kinghost.net",587,"programa@inaciocarvalho.com.br",{dstmail},,,memoread(arqmand)+ansi(contmail),assuntomail,if(!empty({arqanx}),arqanx,""),"programa@inaciocarvalho.com.br","Rfvv2015","pop.kinghost.net",,,.T.,.t.,,,)=.f.
*             if hb_sendmail("smtp"+if(netname()="INACIO" .or. netname()="inaciocarvalho","i","")+".kinghost.net",587,"programa@inaciocarvalho.com.br",{dstmail},,,memoread(arqmand)+ansi(contmail),assuntomail,if(!empty({arqanx}),arqanx,""),"programa@inaciocarvalho.com.br","Rfvv2015","pop.kinghost.net",,,.T.,.t.,,,)=.f.
if inc=4 .and. us="I"
?dstmail
?arqmand
?contmail
?arqanx
?procline(0)
?"N?o mandou pelo envmailking"
inkey(5)
endif
                ret="F"
                if us="I" //.and. inc#4
                   @ maxrow()-1,1 say "Aguarde... (mandmail n?o enviou pelo programa@inaciocarvalho.com.br)"
                 endif
            endif
         
         recover using e
                 cMessage := ErrorMessage(e)
                 logerro()
                 mandmail1("error.log","Erro na fun??o envmailking contornado com o recover do begin sequence")
             ret="F"
         endsequence
         ErrorBlock( bError )

         if ret="F"
            return .f.
         endif
      
if us="I"
?procline(0)
inkey(11)
endif
      
return .t.

METHOD AppSetup()

PUBLIC cEstacaoCobranca := Hb_GetEnv( "COMPUTERNAME" )

PUBLIC cTaskMens1 := Hb_Eol() + ;
                     Hb_Eol() + ;
                     Hb_Eol() + ;
                     Hb_Eol() + ;
                     Hb_Eol() + ;
                     Hb_Version() + ;
                     Hb_Eol() + ;
                     Hb_Eol() + ;
                     Hb_Compiler()
                     
PUBLIC cTaskMens2 := "Constru?do por: Alexandre Sim?es" + ;
                     Hb_Eol() + ;
                     Hb_Eol() + ;
                     "Email: asimoesluz@gmail.com"
                   
  * Verificar portas no windows 7: netstat -an

PUBLIC hWnd, ;
       oSayMsg, ;
       oDlgHabla, ;
       cTituloJanela, ;
       oTimer, ;
       cPrinter, ;
       nJanelaAsaPrev, ;
       cBuild, ;
       OldHandler     

   //ANNOUNCE hwg_ErrSys
   
   //ErrorSistema()
   
   *
   
   cPrinter := Win_PrinterGetDefault()
   
   REQUEST DBFCDX
   
   REQUEST SIXCDX
   
   REQUEST HB_MEMIO
   
   RddSetDefault('DBFCDX')
   
   REQUEST HB_LANG_PT
 
   REQUEST HB_CODEPAGE_PT850
 
   REQUEST HB_CODEPAGE_PTISO
   
   Hb_LangSelect("PT")
 
   Hb_SetCodePage( "PTISO" )
 
   Hb_CdpSelect("PTISO")
 
   Set( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE )
   
   SET TYPEAHEAD TO 0
   SET INTENSITY ON
   SET DELETED ON
   SET DATE ANSI
   SET DATE FORMAT "DD/MM/YY"
   SET DELIMITERS TO
   SET EXCLUSIVE OFF
   SET EPOCH TO 1965
   SET CENTURY ON
   SET OPTIMIZE ON
   SET AUTOPEN OFF
   SET DBFLOCKSCHEME TO DB_DBFLOCK_CLIPPER
   
   Set( _SET_FORCEOPT, .T. )
     
RETURN Self
 
#pragma BEGINDUMP

#include <windows.h>

#include "hbapi.h"

HB_FUNC( HB_GTI_DESTROY_WINDOW )
{
   DestroyWindow( (HWND) hb_parnl( 1 ) );
}

#pragma ENDDUMP

#pragma BEGINDUMP

#if defined ( __MINGW32__ )
   #define _WIN32_WINNT 0x0500
#endif

#include <windows.h>
#include "hbapi.h"

HB_FUNC( SETTRANSPARENT )
{

   typedef BOOL (__stdcall *PFN_SETLAYEREDWINDOWATTRIBUTES) (HWND, COLORREF, BYTE, DWORD);

   PFN_SETLAYEREDWINDOWATTRIBUTES pfnSetLayeredWindowAttributes = NULL;

   HINSTANCE hLib = LoadLibrary("user32.dll");

   if (hLib != NULL)
   {
      pfnSetLayeredWindowAttributes = (PFN_SETLAYEREDWINDOWATTRIBUTES) GetProcAddress(hLib, "SetLayeredWindowAttributes");
   }

   if (pfnSetLayeredWindowAttributes)
   {
      SetWindowLong((HWND) hb_parnl (1), GWL_EXSTYLE, GetWindowLong((HWND) hb_parnl (1), GWL_EXSTYLE) | WS_EX_LAYERED);
      pfnSetLayeredWindowAttributes((HWND) hb_parnl (1), 0, hb_parni (2), LWA_ALPHA);
   }

   if (!hLib)
   {
      FreeLibrary(hLib);
   }

}

#pragma ENDDUMP

Function GetDt()
Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer
*Local e1 := Date()-1
*Local e2 := Date()

   INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Datas inicial e final"  ;
         AT 210,10  SIZE 300,320 FONT oFont

   SET KEY FSHIFT,VK_F3 TO hwg_Msginfo("Shift-F3")
   SET KEY FCONTROL,VK_F3 TO hwg_Msginfo("Ctrl-F3")
   SET KEY 0,VK_F3 TO hwg_Msginfo("F3")
   SET KEY 0,VK_RETURN TO hwg_Msginfo("Return")
   
   @ 20,10 SAY "Datas:" SIZE 260, 22

   @ 20,35 GET dti  SIZE 260, 26
   
   @ 20,95 GET dtf  SIZE 260, 26

   @  20,250  BUTTON "Ok" SIZE 100, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}
   @ 180,250 BUTTON "Cancel" ID IDCANCEL SIZE 100, 32

   ACTIVATE DIALOG oDlg

*   IF oDlg:lResult
*      hwg_Msginfo( Dtoc(e1) + chr(10) + chr(13) +   ;
*               Dtoc(e2) + chr(10) + chr(13)  ;
*               ,"Results:" )
*   ENDIF

Return Nil
     
Function Cotacoes
        local opcotvar
         Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer
        private oRs, conexao
       private dti := date()
       private dtf := date()

         INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Datas inicial e final"  ;
         AT 210,10  SIZE 300,320 FONT oFont

   SET KEY FSHIFT,VK_F3 TO hwg_Msginfo("Shift-F3")
   SET KEY FCONTROL,VK_F3 TO hwg_Msginfo("Ctrl-F3")
   SET KEY 0,VK_F3 TO hwg_Msginfo("F3")
   SET KEY 0,VK_RETURN TO hwg_Msginfo("Return")
   
   @ 20,10 SAY "Datas:" SIZE 260, 22

   @ 20,35 GET dti  SIZE 260, 26
   
   @ 20,95 GET dtf  SIZE 260, 26

   @  20,250  BUTTON "Ok" SIZE 100, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}
   @ 180,250 BUTTON "Cancel" ID IDCANCEL SIZE 100, 32

   ACTIVATE DIALOG oDlg

      
        opcotvar=2

         IF ADOconecta( nProvAcoes, 5 )
            oRs=conexao:execute("SELECT codigo,dtcotacao,hrcotacao,cotacao,quemcad,dtvisto,hrvisto,dtver from acoes WHERE dtcotacao>='"+dtsql(dti)+"' AND dtcotacao<'"+dtsql(dtf)+"' AND compvenda=0"+if(opcotvar=2," AND quemcad like 'var-%'","")+if(opcotvar=3," ORDER by dtvisto,hrvisto"," ORDER by dtcotacao,hrcotacao"))
         if oRs:recordcount()=0
               @ 30,10 SAY "Não há cotações cadastradas neste período" SIZE 260, 22
               oRs:Close()
             conexao:close()
         endif
          browseado()
            oRs:Close()
          conexao:close()
        Endif

Return .t.
    

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 15 Set 2020 16:35
por Itamar M. Lins Jr.
Ola!
Para vc ver como é...
O tutorial tem exemplos pequenos, simples, que usa GCC, Hwgui 2.22.
Vc colocou um programa enorme todo diferente da proposta do tutorial. Usando Hwgui 2.17, CLANG..., Harbour 3.4...
Dentro desse texto, que é complexo cheio "coisas" diferente dos comandos da Hwgui, tem lá.
        @ 1087,384 say alltrim(str(nCotMin)) size 100,45
Linha 320!
Vai ver que tem uma DIALOG, ANTES! Então o @ SAY está escrevendo nessa DIALOG(Janela) do windows.
Simplifica, não pega uma coisa assim para aprender q só faz complicar mais, sem necessidade.
#include "hwgui.ch"
Function main
LOCAL oDlg

INIT DIALOG oDlg AT 100,100 SIZE 500,160
   
@ 10,10 say "ALO MUNDO" size 100,25
 
oDlg:Activate()

Return Nil

Tá ai o que vc pediu. Uma janela(DIALOG) com um SAY na Hwgui.
Primeira coisa é entender que no windows precisa de uma JANELA para COLOCAR ALGO.

As janelas são WINDOW e DIALOG(Na Hwgui). Ai tem mais explicações... Mas por ora tá bom.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 15 Set 2020 23:07
por cjp
Eu entendo e peço desculpas, mas é a ânsia fazer algo útil.
Vi todos os exemplos e entendi todos eles.
Só estou tentando aplicá-los ao que eu preciso.
No caso que vc citou, tem sim um dialog antes. Veja especificamente esta função:

Function Graph2(cod)
       Local oModDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oGraph
       Local i, aGraph[1]
      local cProc, nCotMax, dDtMax, nCotMin,dDtMin, nCotMax30d, dDtMax30d, nCotMin30d, dDtMin30d, nCotAgora, dDtAgora
      private conexao
      
       IF ADOconecta( nProvAcoes, 5 )
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND cotacao<9999 AND compvenda=0 order by cotacao DESC limit 1")
        nCotMax=cProc:Fields("cotacao"):Value
        dDtMax=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND cotacao>0 AND compvenda=0 order by cotacao limit 1")
        nCotMin=cProc:Fields("cotacao"):Value
        dDtMin=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND cotacao<9999 AND dtcotacao>'"+dtsql(date()-30)+"' AND compvenda=0 order by cotacao DESC limit 1")
        nCotMax30d=cProc:Fields("cotacao"):Value
        dDtMax30d=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND dtcotacao>'"+dtsql(date()-30)+"' AND cotacao>0 AND compvenda=0 order by cotacao limit 1")
        nCotMin30d=cProc:Fields("cotacao"):Value
        dDtMin30d=cProc:Fields("dtcotacao"):Value
          cProc=conexao:execute("select dtcotacao,cotacao from acoes where codigo='"+cod+"' AND dtcotacao>'"+dtsql(date()-30)+"' AND cotacao>0 AND cotacao<9999 AND compvenda=0 order by dtcotacao DESC limit 1")
        nCotAgora=cProc:Fields("cotacao"):Value
        dDtAgora=cProc:Fields("dtcotacao"):Value
          cProc:Close()
        conexao:close()
      Endif
      

       aGraph[1] := {}
       Aadd( aGraph[1], { day(dDtMin), nCotMin } )
       Aadd( aGraph[1], { day(dDtMax), nCotMax } )
       Aadd( aGraph[1], { day(dDtMin30d), nCotMin30d } )
       Aadd( aGraph[1], { day(dDtMax30d), nCotMax30d } )
       Aadd( aGraph[1], { day(dDtAgora), nCotAgora } )

       INIT DIALOG oModDlg CLIPPER TITLE "Graph"        ;
       AT 38,5  SIZE 1310,800                  ;
       FONT oFont
         
        @ 9,15 say cod size 500,45
       
        @ 1087,384 say alltrim(str(nCotMin)) size 100,45
        @ 1127,384 say alltrim(str(nCotMax)) size 100,45
        @ 1166,384 say alltrim(str(nCotMin30d)) size 100,45
        @ 1207,384 say alltrim(str(nCotMax30d)) size 100,45
        @ 1250,384 say alltrim(str(nCotAgora)) size 100,45
       
        @ 1090,647 say substr(dtoc(dDtMin),1,2) size 100,45
        @ 1090,666 say substr(dtoc(dDtMin),4,2) size 100,45
        @ 1090,684 say substr(dtoc(dDtMin),9,2) size 100,45
       
        @ 1130,647 say substr(dtoc(dDtMax),1,2) size 100,45
        @ 1130,666 say substr(dtoc(dDtMax),4,2) size 100,45
        @ 1130,684 say substr(dtoc(dDtMax),9,2) size 100,45
       
        @ 1170,647 say substr(dtoc(dDtMin30d),1,2) size 100,45
        @ 1170,666 say substr(dtoc(dDtMin30d),4,2) size 100,45
        @ 1170,684 say substr(dtoc(dDtMin30d),9,2) size 100,45
       
        @ 1212,647 say substr(dtoc(dDtMax30d),1,2) size 100,45
        @ 1212,666 say substr(dtoc(dDtMax30d),4,2) size 100,45
        @ 1212,684 say substr(dtoc(dDtMax30d),9,2) size 100,45
       
        @ 1255,647 say substr(dtoc(dDtAgora),1,2) size 100,45
        @ 1255,666 say substr(dtoc(dDtAgora),4,2) size 100,45
        @ 1255,684 say substr(dtoc(dDtAgora),9,2) size 100,45

   @ 1070,410 GRAPH oGraph DATA aGraph SIZE 230,230 COLOR 65280
   oGraph:nType := 2
   
   IF ADOconecta( nProvAcoes, 5 )
      cProc=conexao:execute("select dtcotacao,cotacao,quemcad,compvenda,conta from acoes where codigo='"+cod+"' AND status='M' order by dtcotacao")
     if cProc:recordcount()>0
        @ 22,5 say "Ordens marcadas:" size 500,45
       a=34
       do while !cProc:Eof()
           @ a,5 say cProc:Fields("dtcotacao"):Value size 500,45
           @ a+10,5 say cProc:Fields("quemcad"):Value size 500,45
         @ a+20,5 say cProc:Fields("compvenda"):Value size 500,45
         @ a+30,5 say cProc:Fields("cotacao"):Value size 500,45
         @ a+40,5 say cProc:Fields("conta"):Value size 500,45
         a=a+50
         cProc:MoveNext()
         enddo
     endif
   endif

*   @ 130,250 BUTTON "Close"  ;
*       SIZE 130,30          ;
*       ON CLICK {||EndDialog()}

   ACTIVATE DIALOG oModDlg

Return Nil



Tem:
       INIT DIALOG oModDlg CLIPPER TITLE "Graph"        ;
       AT 38,5  SIZE 1310,800                  ;
       FONT oFont


antes da linha que vc citou.

E, de fato, está criando a janela normalmente.

O problema é que as escritas na tela com o @ say estão truncadas.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 15 Set 2020 23:53
por Itamar M. Lins Jr.
Ola!
Sim, e vc não sabe pq está saindo truncada.

@ coluna,linha say "XXXXXXXXXXXXXX" size comprimento,largura (do seu texto)

INIT DIALOG oModDlg CLIPPER TITLE "Graph" AT 38,5 SIZE 1310,800 FONT oFont

Aqui vc abriu uma janela de 1320 por 800.
O "@ say" está escrevendo ai dentro.

@ a,5 say cProc:Fields("dtcotacao"):Value size 500,45

A tela tem 1310 de comprimento vc tá usando METADE dela só com SIZE 500

Se colocar grande demais 500 ai não vai dar mesmo, vai ficar com uma área reservada de QUINHENTOS ESPAÇOS!
E escrevendo tudo na mesma linha! No caso LINHA := 5 tá escrevendo por cima do outro.

DTCOTACAO sai na linha a:=34 + 500(quinhentos) espaços! O próximo na mesma linha será igual a 34+8(data)+500 será @ a+543! Entendeu ?

@ a,5 say cProc:Fields("dtcotacao"):Value size 500,45
@ a+10,5 say cProc:Fields("quemcad"):Value size 500,45
Seria @ a+543,5 say cProc:Fields("quemcad"):Value size 500,45
O terceiro nem cabe mais na janela(dialog)

Lembrando que HWGUI/Minigui DATA tem oito(8) caracteres, mas o SIZE deverá ser maior 70(size) e largura 30 "SIZE 70,30" dependendo da sua FONTE de letra.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 17 Set 2020 00:50
por cjp
Entendi o que vc disse.
Mas testei com vários outros tamanhos, e em todas as tentativas as escritas continuam truncadas.
Uma outra dúvida, por favor: inkey(x) não funciona na Hwgui?

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 17 Set 2020 12:55
por Itamar M. Lins Jr.
Ola!
Uma outra dúvida, por favor: inkey(x) não funciona na Hwgui?

Inkey() é para DOS.
Temos
HWG_LASTKEY(), OnkeyDown, OnKeyUp..., HWG_GETKEYSTATE().
Lembre-se que no windows trabalhamos com FOCO, e não com cursor. O usuário pode clicar/colocar a seta do mouse onde desejar.

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 22 Set 2020 00:01
por cjp
Estou tentando começar por algo mais simples, pra tentar entender algumas coisas.

Fiz um programinha bem simples:

#include "hwgui.ch"
Function Tempo
   Local oDlg, oFont, oFontSay, oFontC
   Local nTp :=0
   private nInicio :=0

   PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
   PREPARE FONT oFontSay NAME "MS Sans Serif" WIDTH 0 HEIGHT -13 WEIGHT 700
   PREPARE FONT oFontC NAME "Georgia" WIDTH 0 HEIGHT -15

   INIT DIALOG oDlg TITLE "Standard dialogs" AT 100, 100 SIZE 340, 300 FONT oFont

   @ 20,12 SAY "Escolha:" SIZE 260, 24 ;
         FONT oFontSay COLOR 8404992

   @ 20,50 BUTTON "Iniciar contagem" SIZE 180,28 ;
      ON CLICK {||iniciacontagem()}

   @ 20,100 BUTTON "Ver contagem" SIZE 180,28 ;
      ON CLICK {||vercontagem()}
    
   nTp=seconds()-nInicio

   @ 20,150 SAY nTp SIZE 180, 28
*   @ 20,185 GET nTp PICTURE "@e 999,999,999.9999" SIZE 260, 26
   
   @ 20, 250 LINE LENGTH 300
   @ 120,258 BUTTON "Close" SIZE 100,30 ON CLICK {||oDlg:Close()}

   ACTIVATE DIALOG oDlg
 
Return Nil
     
function iniciacontagem
         Local oDlg, oFont
         
       nInicio=seconds()
      
         PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
      
         INIT DIALOG oDlg TITLE "Inicia contagem" AT 280, 210 SIZE 250, 250 FONT oFont
      
         @ 10,40 SAY "Contagem iniciada" SIZE 360, 36
      
         @  10,190  BUTTON "Ok" SIZE 100, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}
      
         ACTIVATE DIALOG oDlg

return Nil    

Function vercontagem()
         Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer
         Local e5 := 0

         INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Contagem" AT 250,20 SIZE 250,350 FONT oFont

         hwg_SetColorinFocus( oDlg,, 13172680 )
   
         @ 15,20 SAY "Contagem:" SIZE 260, 22

         e5=seconds()-nInicio
   
         @ 15,65 GET e5 PICTURE "@e 999,999,999.9999" SIZE 150, 26
         @ 15,115 SAY e5 SIZE 150, 26

         @  15,250  BUTTON "Ok" SIZE 80, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}

         ACTIVATE DIALOG oDlg

Return Nil
     


Tem uma coisa que não está funcionando, não sei porquê:

      @ 15,115 SAY e5 SIZE 150, 26


Note que o get antes disso funciona, com o mesmo dado. Mas o Say não aparece.

Da mesma forma este também não aparece, não sei porquê:

   @ 20,150 SAY nTp SIZE 180, 28


Também gostaria de saber como fazer para a contagem em questão aparecer em tempo real, já na tela inicial. Pensei em colocar um do while e ficar atualizando, mas daí não sei se o button funcionaria.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 22 Set 2020 06:35
por Itamar M. Lins Jr.
Ola!
//Qualquer coisa que vc usa, colocando na DIALOG precisa do objeto! (botões, says, gets...)
//Um say tem objeto, o get tem objeto, o button tem objeto, não esqueça disso!
//Vc não está colocando nada disso. Tem a VARIAVEL no caso dos GET e o OBJETO!

//@ 20,50 BUTTON oBotao_01 CAPTION "Iniciar contagem" size 180,28 on CLICK...
//@ 20,100 BUTTON oBotao_02 CAPTION "Ver contagem" size 180,28 on CLICK...

//E o ACTIVATE DIALO oDLG //é a mesma coisa do READ

//Em clipper @ x,y say "x"
//Na Hwgui @ x,y SAY OBJETO_SAY CAPTION "X" ...
//Em clipper @ x,y GET cNome
//Na Hwgui @ x,y GET OBJETO_GET VAR cNome ...
//Todos os controles tem um objeto.(controles são "coisas, SAY,GET,Button, etc" que colocamos dentro da DIALOG/Window)
//Porquê tem esses OBJETOS ????
//Exatamente é usando o OBJETO que vc VERIFICA os EVENTOS no caso dos BOTÕES se foi pressionado, se passou o mouse por cima, se recebeu foco...
//Um GET na HWGUI RECEBE e PERDE o FOCO, ninguém sabe ONDE o usuário vai CLICAR com o MOUSE!
//Pelo FOCO vc vai saber ONDE o usuário está na DIALOG(Em qual controle ele está!) o antigo CURSOR do CLIPPER.
//ComboBox, CheckBox, RadioButton é para ESCOLHER! não é para escrever nada(normalmente) então pelo FOCO vc fica sabendo ONDE está.

#include "hwgui.ch"
Function Main
   Local oDlg, oFont, oFontSay, oFontC
   Local nTp :=0, oSAY1, oSAY2
   private nInicio :=0

   PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
   PREPARE FONT oFontSay NAME "MS Sans Serif" WIDTH 0 HEIGHT -13 WEIGHT 700
   PREPARE FONT oFontC NAME "Georgia" WIDTH 0 HEIGHT -15

   INIT DIALOG oDlg TITLE "Standard dialogs" AT 100, 100 SIZE 340, 300 FONT oFont

   @ 20,12 SAY oSAY1 CAPTION "Escolha:" SIZE 260, 24 ;
         FONT oFontSay COLOR 8404992 //esqueceu de colocar o nome dos objetos! oSAY1

   @ 20,50 BUTTON "Iniciar contagem" SIZE 180,28 ;
      ON CLICK {||iniciacontagem()}

   @ 20,100 BUTTON "Ver contagem" SIZE 180,28 ;
      ON CLICK {||vercontagem()}
     
   nTp=seconds()-nInicio

   @ 20,150 SAY oSAY2 CAPTION str(nTp) SIZE 180, 28 //esqueceu de colocar o nome dos objetos! o SAY2
   
   @ 20, 250 LINE LENGTH 300
   @ 120,258 BUTTON "Close" SIZE 100,30 ON CLICK {||oDlg:Close()}

   ACTIVATE DIALOG oDlg
 
Return Nil
     
function iniciacontagem
         Local oDlg, oFont, oSAY1
         
         nInicio:=seconds()
       
         PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
       
         INIT DIALOG oDlg TITLE "Inicia contagem" AT 280, 210 SIZE 250, 250 FONT oFont
       
         @ 10,40 SAY oSAY1 CAPTION "Contagem iniciada" SIZE 360, 36 //Precisa do OBJETO oSAY1
       
         @  10,190  BUTTON "Ok" SIZE 100, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}
       
         ACTIVATE DIALOG oDlg

return Nil     

Function vercontagem()
         Local oDlg, oFont := HFont():Add( "MS Sans Serif",0,-13 ), oTimer, oSAY1, oSAY5
         Local oE5, e5 := 0

         INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Contagem" AT 250,20 SIZE 250,350 FONT oFont

         hwg_SetColorinFocus( oDlg,, 13172680 )
   
         @ 15,20 SAY oSAY1 CAPTION "Contagem:" SIZE 260, 22

         //e5=seconds()-nInicio
   
         @ 15,65 GET oE5 VAR e5 PICTURE "@e 999,999,999.9999" SIZE 150, 26 //Precisa do objeto GET oE5
         @ 15,115 SAY oSAY5 CAPTION str(e5) SIZE 150, 26

         @  15,250  BUTTON "Ok" SIZE 80, 32 ON CLICK {||oDlg:lResult:=.T.,hwg_EndDialog()}

         oDlg:bActivate:={||oDlg:Show(),CONTA(oSay5,e5)}

         ACTIVATE DIALOG oDlg

Return Nil

Function CONTA(oSay5,e5)
Local nX:=0
FOR nX := 1 to 50
  e5 := seconds() - nInicio
  oSay5:SetText(str(e5))
  inkey(.1)
NEXT
hwg_msginfo("Ok")
Return Nil


Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 23 Set 2020 09:22
por cjp
Entendido. Muito obrigado. Funcionou.
Quanto à minha segunda questão: seria possível fazer a contagem em questão aparecer em tempo real, já na tela inicial? Pensei em colocar um do while e ficar atualizando, mas daí não sei se o button funcionaria.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 23 Set 2020 10:07
por Itamar M. Lins Jr.
Ola!
Quanto à minha segunda questão:

Tá ai no exemplo.
Precisa desenha a janela PRIMEIRO.
Depois use o CodeBlock bActivate. Use oDlg:Show() para mostrar a janela com os componentes. O exemplo ensina.

Lembrando que DO WHILE pode travar a DIALOG se for muito longo, use:

IF ++nRecs == 100
hwg_processmessage() ; nRecs := 0
EndIf

Senão vai travar a tela!

Saudações,
Itamar M. Lins Jr.

Modo gráfico Tutor Plug and Play - Hwgui

MensagemEnviado: 23 Set 2020 23:46
por cjp
Desculpe, mas não te entendi.

Vc está dizendo que isso está no tutor? Não achei em nenhuma dos exemplos do tutor.

Ou está dizendo que está no código que vc postou antes? Também não achei lá.

Não sei o que é CodeBlock bActivate.

Poderia me ajudar, por favor?