Página 1 de 2

Dúvida com SetMode

Enviado: 09 Set 2017 08:18
por porter
Olá pessoal,
Em determinadas rotinas do sistema, uso o comando SETMODE(25,80) ou SETMODE(43,80),
como faço para verificar se determinadas rotinas está configurado com um com outro ?

Código: Selecionar todos

if configurado(25,80)
...
else
...
endif
Obrigado.

Harbour 3.2.0(dev)

Dúvida com SetMode

Enviado: 09 Set 2017 09:11
por Toledo
Amigo, não testei, mas acho que vai funcionar:

Código: Selecionar todos

Function configurado(nLin_,nCol_)
Local lRet_:=.F.
If nLin_==MaxRow()+1
   If nCol_==MaxCol()+1
      lRet_:=.T.
   Endif
Endif
Return (lRet_)
Abraços,

Dúvida com SetMode

Enviado: 09 Set 2017 09:24
por porter
Obrigado Toledo, perfeito, deu certo.

Dúvida com SetMode

Enviado: 10 Set 2017 11:11
por JoséQuintas
como faço para verificar se determinadas rotinas está configurado com um com outro ?
Ok, já foi respondido, mas explicando:

SetMode() configura quantidade de linhas e colunas.
Oras... só testar MaxRow() e MaxCol() pra saber as linhas e colunas máximas.


A minha pergunta é: porque precisa testar o SetMode() ? Basta usar MaxRow() e MaxCol().

Mas não é só isso.... tem sempre um lado ruim.....

WINDOWS 10 (DEZ)

NÃO EXISTE CONSOLE DE TAMANHO FIXO NO WINDOWS 10.

Talvez GTWVG, GTWVT ou GTWVW sejam obrigatórias no Windows 10, se não quiser ter problemas.

Dúvida com SetMode

Enviado: 10 Set 2017 11:16
por JoséQuintas
Teste prático:

Código: Selecionar todos

PROCEDURE Main

   LOCAL nMaxRow, nMaxCol

   SetMode( 25, 80 )
   CLS
   nMaxRow    := MaxRow()
   nMaxCol    := MaxCol()
   DO WHILE Inkey(1) != 27
      IF nMaxRow != MaxRow() .OR. nMaxCol != MaxCol()
         ? MaxRow(), MaxCol()
         nMaxRow := MaxRow()
         nMaxCol := MaxCol()
      ENDIF
   ENDDO

   RETURN

24 94
31 94
31 103
34 103
34 136
47 136
47 135
47 46
47 63
47 65
52 66
d:\temp>

Dúvida com SetMode

Enviado: 06 Abr 2023 11:14
por carlaoonline
Bom dia!

Estou com o seguinte BUG no código abaixo Harbour 3.2 modo Console:

Se habilitar as duas linhas com o SetColor dai não consigo chegar a 10 voltas no loop que fecha o CMD e fica em segundo plano no gerenciador de tarefas do Windows.

Se desabilitar as linhas SetColor dai roda bem mais MAS mesmo assim se ficar clicando qualquer tecla para sair dos Inkey(2), ele fecha acontece a mesma coisa.


Se alguém puder dar uma luz.... coisa muito estranha

O BUG acontece bem na linha do SetMode.

Código: Selecionar todos

//----------------------------------------------------------------
Function Main()
//----------------------------------------------------------------
// Salva as dimensoes atuais da tela
PUBLIC nLarguraOriginal := MaxCol()  
PUBLIC nAlturaOriginal  := MaxRow()

// Determina novas dimensoes
PUBLIC nLarguraDaTela   := 30    // Largura da tela do app
PUBLIC nAlturaDaTela    := 5     // Altura da tela do app

PUBLIC COR_PADRAO    := "W+/BG,W/R,,,N/W"
PUBLIC COR_RESULTADO := "R+/BG"


nVoltas:=1

Do while .t.
   //SetColor(COR_PADRAO)
   SetMode(nAlturaDaTela, nLarguraDaTela) // Aplica as novas dimensoes
   Cls
   @ 02,02 SAY "nVoltas=" +Alltrim(Str(nVoltas))
   @ 04,02 SAY "<Esc> para Sair"      
   If Inkey(2)=27 
      Exit
   Endif

   //SetColor(COR_RESULTADO)
   SetMode(nAlturaOriginal, nLarguraOriginal) // Volta para as originais
   X=GeraNumero(99999, 1)  
   @ 02, 02 SAY StrZero ( X, 5)  // ... ele mostra um numero aleatorio a cada vez.   
   nVoltas++
   If Inkey(2)=27 
      Exit
   Endif
EndDo

Return Nil

//----------------------------------------------------------------
// Gera numero aleatorio entre o SEGUNDO parametro e o PRIMEIRO 
Function GeraNumero(nLimite, nInicio) 
//----------------------------------------------------------------
    Local nNumeroGerado, nPausa, nSegundoAtual
    nInicio:=iif(nInicio==Nil, 1, nInicio)
    nNumeroGerado := Int( rand()* nLimite ) +nInicio
    RETURN nNumeroGerado
//----------------------------------------------------------------


Dúvida com SetMode

Enviado: 06 Abr 2023 12:35
por JoséQuintas
Sei lá se entendi seu problema....

terminou o programa, ele fecha, isso é normal.

Coloque alguma coisa no final pra ele parar.
Talvez Alert( "terminou" )

Dúvida com SetMode

Enviado: 06 Abr 2023 12:38
por JoséQuintas
Adicional:

Coloque na primeira linha Altd()
E compile com -b
Vai poder acompanhar linha a linha pelo debug.

Dúvida com SetMode

Enviado: 06 Abr 2023 14:36
por carlaoonline
JoséQuintas escreveu:terminou o programa, ele fecha, isso é normal.
Não.

Ali no pequeno trecho que postei é um loop eterno até receber ESC.

Teclando qualquer outra coisa vai incrementando e mostrando a variável 'nVoltas'.


O problema é que se ativar as duas linhas do SetColor e for teclar rápido para passar a diante várias vezes, dai não chaga a dar 10 voltar que o programa fecha sozinho (sem estar programado isso) e fica rodando em segundo plano sempre.

JoséQuintas escreveu:Vai poder acompanhar linha a linha pelo debug.
Ja fiz isso:
carlaoonline escreveu:O BUG acontece bem na linha do SetMode
JoséQuintas escreveu:Coloque alguma coisa no final pra ele parar.
Talvez Alert( "terminou" )
Aí é que está....kkkkkk naquele simples código, quando chaga na linha do SetMode ele fecha a tela visível (o CMD que estava aberto) e para de funcionar, ficando apenas o aplicativo no gerenciador de tarefas MAS sei lá onde foi a tela e o funcionamento dele após o SetMode.

Trava depois de algumas voltas no loop quando teclo rápido qualquer tecla.

Dúvida com SetMode

Enviado: 06 Abr 2023 16:05
por JoséQuintas
carlaoonline escreveu:uando chaga na linha do SetMode ele fecha a tela visível
O que chama de tela visível ?
Tá chamando isso de dentro de uma LIB GUI ?

Dúvida com SetMode

Enviado: 06 Abr 2023 16:09
por JoséQuintas
Aproveitando....

Cuidado com esse tipo de uso.
SetMode() parece não ter sido feito pra ser usado toda hora.
É usar no início e nada mais.

Dúvida com SetMode

Enviado: 06 Abr 2023 19:38
por carlaoonline
JoséQuintas escreveu:Tá chamando isso de dentro de uma LIB GUI ?
Abro o CMD e digito hbmk2.exe teste.prg hbct.hbc e pronto

O programa conforme descrito nas linhas do PRG não executa o que lhe foi dito, na terceira, quarta ou quinta volta é como se alguém clicasse com o botão no X do CMD e fechasse a janela com o executável junto, porém se fizermos isso ele é apagado da memória e nesse caso fecha o CMD que, como não é GUI nem MT, é o proprio executável.

JoséQuintas escreveu:O que chama de tela visível ?
Aquilo que exergamos rodando, o aplicativo, o resultado das linhas que são bem simples e dizem para mostrar o valor de nVoltas na tela a cada volta do loop

JoséQuintas escreveu:Cuidado com esse tipo de uso.
SetMode() parece não ter sido feito pra ser usado toda hora.
É usar no início e nada mais.
Sim, entendi que realmente o problema é esse, trava justamente no SetMode ao ser executado recorrentemente, se colocar no início e no final roda beleza.

MAS TB VERIFIQUEI que somente quando o comando RAND() está presente no código. Se tirar o RAND() posso usar o SetMode CENTENAS DE VEZES DE FORMA BEM RÁPIDA e o aplicativo faz o que deve fazer, acho que isso é o chamado "BUG", sei lá

Dúvida com SetMode

Enviado: 06 Abr 2023 20:05
por JoséQuintas
teste.png
Aqui deve ter entrado WVG.
Fica parecendo que tem duas janelas.

Dúvida com SetMode

Enviado: 06 Abr 2023 20:25
por JoséQuintas
teste.png
Uma alternativa, de qualquer jeito fecha a thread quando fechar a principal.
compile hbmk2 test gtwvg.hbc

Código: Selecionar todos

FUNCTION Main()

   LOCAL nVoltas := 0, nKey := 0, nNumero

   SetMode(25,80)
   SetColor( "W/B" )
   CLS
   hb_ThreadStart( { || Mostra( @nNumero ) } )
   DO WHILE nKey != 27
      @ 2, 2 SAY "nVoltas=" + Ltrim( Str( nVoltas ) )
      @ 4, 2 SAY "ESC pra sair"
      nNumero := GeraNumero( 99999, 1 )
      nKey := Inkey(2)
      nVoltas += 1
   ENDDO
   RETURN Nil

FUNCTION Mostra( nNumero )

   hb_gtReload( "WVG" )
   SetMode( 5, 30 )
   SetColor( "W/R" )
   CLS
   DO WHILE .T.
      @ 2, 2 SAY StrZero( nNumero, 5 )
      Inkey(1)
   ENDDO
   RETURN Nil


//----------------------------------------------------------------
// Gera numero aleatorio entre o SEGUNDO parametro e o PRIMEIRO
Function GeraNumero(nLimite, nInicio)
//----------------------------------------------------------------
    Local nNumeroGerado

    nInicio:=iif(nInicio==Nil, 1, nInicio)
    nNumeroGerado := Int( rand()* nLimite ) +nInicio

    RETURN nNumeroGerado
//----------------------------------------------------------------
Se precisar usar pra valer, melhor de outro jeito.

Dúvida com SetMode

Enviado: 30 Abr 2023 00:37
por cjp
Pessoal, alguém pode me ajudar com um problema com SetMode, por favor?
Uso em um programa feito em Harbour, modo console, setmode( 41, 125 ). Funciona bem com todos os usuários.
Entretanto, no computador de uma usuária nova, que tem Windows 11 rodando, está dando um problema: a tela não se acerta, fica com uma barra de rolagem lateral.
Já testei ajustar o setmode de várias formas, sem sucesso.
Também já testei ajustar a janela de execução do meu programa de várias formas, também sem sucesso.
Será que o Windows 11 tem alguma especificidade com isso? Não sei se algum outro usuário meu tem Windows 11, mas nunca tive problema semelhante com nenhum usuário.
Alguém poderia me ajudar com isso?