Notícias:

SMF - Just Installed!

Menu principal

Postagens recentes

#71
Materiais / Estados e Cidades .json
Última postagem por adalberto - Setembro 09, 2017, 01:49:01 PM
Você já deve ter entrado em um site onde tinha a opção de escolher o estado em um combo box e em seguida é carregada uma lista de cidades daquele estado em outro combo box.

É preciso ter a lista de estados e cidades prontas para isso, e pesquisando pela net eu encontrei uma em json que permite carregar em prisma usando a biblioteca json que está presente desde Prisma-1.0.102.

Em anexo segue o zip contendo a listagem e o exemplo completo.

PS. já estava me esquecendo de citar a fonte:  https://gist.github.com/letanure/3012978

Veja o código de exemplo:



local json = inclua'json';  //incluindo a biblioteca json.

//Basta usar a criatividade para criar funções de busca de cidades, estados etc.

local procure_estado_por_sigla;

funcao principal(ARG)
  local tab_uf = json.decod_arquivo("uf_cidades.json");
   
   local ret,err = procure_estado_por_sigla(tab_uf, "DF");//criei uma função para procurar mais facilmente por estado.
   se ret entao
     poe(ret.nome); //nome do estado
     poe(ret.cidades[1]);//primeira cidade
   senao
     poe(err);
   fim 
   
   retorne 0; //retorna sucesso (0); 
fim


funcao procure_estado_por_sigla(tab,sigla)
  local estados = tab.estados;
  para i=1,#estados inicio
    se estados[i].sigla == sigla entao
      retorne estados[i];
    fim
  fim
  retorne nulo, ("estado não encontrado: " .. sigla);
fim



Valeu gente, até mais.

Segue anexo para baixar:
#72
Lista de Bugs / Re:erro no json.decod
Última postagem por rafael - Setembro 05, 2017, 12:32:31 PM
Oi Adalberto, obrigado pelo retorno.

Fiz vários testes aqui, inclusive este que citou, e cheguei a conclusão que é a seguinte linha:


sis.deflocal("pt_BR.UTF-8")


Eu sempre uso essa linha nos meus programas para interpretar os erros em português e também porque só uso UTF8

quando tirei essa função, o json funcionou.
#73
Publique aqui / O estoque de imagens igbr
Última postagem por adalberto - Setembro 03, 2017, 05:33:06 PM
Necessário biblioteca igbr instalada.  (Prisma-1.0.100 ou superior);

Vou postar abaixo um simples programa que lista as opções de imagens do estoque igbr.

Segue o código:


//exemplo de imagens de estoque.
inclua'igbr'

funcao principal()   
  jan = crie_janela();
  rol = crie_rolagem(jan);
  poe_estoque(rol, func_bt);
  ig.botao_mostre_imagem();   
  mostre(jan); 
fim //fim principal

//================================= funcoes abaixo =====================//

funcao crie_janela()
     local ret = ig.janela("Exemplo de Estoque", 500 , 400);
     ig.caixa_def_borda_largura(ret,6);
     ig.conecte_permutado(ret,ig['destruido'], sis.saia, 0 );
     ig.janela_def_posicao(ret,ig.JANELA_POS_CENTRO);     
     retorne ret;
fim

funcao mostre(jan)
     ig.componente_mostre_todos(jan);
     ig.loop();
fim

funcao crie_rolagem(jan)
       local rol = ig.janela_rolagem();
       ig.ad(jan,rol);
       local caixav = ig.caixavertical();
       ig.janela_rolagem_ad( rol, caixav);
       retorne caixav;
fim

funcao poe_estoque(rol, func_bt)
                   
                   local horiz = ig.caixahorizontal();
                   ig.caixa_ad(horiz, ig.rotulo("  imagem      "),falso,falso,0  );
                   ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0  );
                   ig.caixa_ad(horiz, ig.rotulo("            rótulo                 "),falso,falso,0  );
                   ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0  );
                   ig.caixa_ad(horiz, ig.rotulo("                     código"),falso,falso,0  );
                   
                   ig.caixa_ad(rol,horiz,falso,falso, 2);
                   ig.ad( rol, ig.separadorhorizontal() );
                   
       para i , v em pares(ig) inicio
              se string.procure( i , 'estoque_') entao             
                   
                   local horiz = ig.caixahorizontal();
                                     
                   local img = ig.imagem_estoque( ig[i], 5 );
                   ig.caixa_ad(horiz, img, falso, falso, 4 );
                   ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0  );
                   
                   local bt = ig.botao_estoque(ig[i]);
                   ig.componente_def_tamanho(bt, 200 , 40 );
                   ig.botao_def_relevo( bt, ig.RELEVO_NULO);
                   ig.caixa_ad( horiz, bt,falso,falso,2);
                   ig.caixa_ad(horiz, ig.separadorvertical(),falso,falso,0  );
                   ig.conecte_funcao( bt , ig.clique, func_bt,i);
               
                   ig.caixa_ad(horiz, ig.rotulo( 'ig.' .. string.maiuscula(i) ) ,falso,falso,2);
                   
                   ig.caixa_ad( rol,horiz, falso , falso , 2);
                  // imprima(i);
              fim
       
       fim
fim

funcao func_bt(comp,dado)
      // ig.msg(jan,'', dado );
       local img = ig.imagem_estoque(ig[dado],6);
       local jan = ig.janela'';
       ig.caixa_def_borda_largura(jan,6);
       ig.janela_def_posicao(jan, 2); //2 = mouse
       caixah = ig.caixahorizontal();
       ig.ad(jan,caixah);
       ig.ad(caixah,img);
       ig.ad(caixah,ig.rotulo('   '.. string.troque(dado,'_' , ' ') ) );
       ig.componente_mostre_todos(jan);
fim



Veja o recorte de tela em anexo.

#74
Materiais / Re:Biblioteca Terminal
Última postagem por rafael - Setembro 02, 2017, 08:48:26 PM
Muito, bom.

é bem útil para montar ferramentas de trabalho rapidamente e visualmente intuitiva.
#75
Publique aqui / Re:Controle de clientes em SQL...
Última postagem por adalberto - Setembro 02, 2017, 08:46:06 PM
Pessoal, agora que eu vi, o programa Clientes.prisma no anexo anterior está incompleto, devo ter upado o errado,

este é o completo com todas as funções de sqlite3:



//Controle de clientes em Prisma com ig
/**programa livre, open-source, para qualquer fim a qualquer um que
o queira usar, para modificar, usar em outros programas, comercial,
sem precisar pagar ou mencionar o autor aqui presente: Adalberto.
O programa é dado como está, gratuito, mas sem garantias, o autor
não poderá ser responsabilizado por qualquer uso.
**///

local ig = inclua'ig' //biblioteca gráfica (janela, botoes etc.)
local sql = inclua'psqlite3' //biblioteca de banco de dados SQlite3
local nomebd = 'Clientes.bd'

funcao principal(Args) //funcao main do programa 
//criando a janela
  local jan = ig.janela('Controle de Clientes', 700,400);
  ig.conecte_funcao(jan,ig.destruido,ig.fimjanela); 
  cria_bd_e_tabelas(jan);   
  //criando o painel fixo para colocar os componentes:
  local fixo = ig.fixo();
  ig.ad(jan,fixo);
  //criando os componentes:
  local cabecalho = ig.rotulo'Controle de Clientes:';
  ig.fixo_ad(fixo,cabecalho,10,10);
  ig.componente_modifique_fonte(cabecalho,'Times New Roman',ig.NEGRITO,16);
 
  local rot_nome = ig.rotulo'Nome:';
  ig.fixo_ad(fixo,rot_nome,10,40);
  local txt_nome = ig.texto();
  ig.componente_def_tamanho(txt_nome,550,28);
  ig.fixo_ad(fixo,txt_nome,10,55);//col:10 x lin:80;

  local rot_endereco = ig.rotulo'Endereço:';
  ig.fixo_ad(fixo,rot_endereco,10,85);
  local txt_endereco = ig.texto();
  ig.componente_def_tamanho(txt_endereco,550,28);
  ig.fixo_ad(fixo,txt_endereco,10,100);
 
  local rot_tel = ig.rotulo'Telefone:';
  ig.fixo_ad(fixo,rot_tel,10,130);
  local txt_tel = ig.texto();
  ig.componente_def_tamanho(txt_tel,220,28);
  ig.fixo_ad(fixo,txt_tel,10,145);
 
  local rot_nasc = ig.rotulo'Data de nasc.:';
  ig.fixo_ad(fixo,rot_nasc,10,175);
  local txt_nasc = ig.texto();
  ig.fixo_ad(fixo,txt_nasc,10,190);
 
//criando o botao incluir
//é bastante código, mas isso te dá mais domínio sobre o componente!
  local bt_incluir = ig.botao();
  local caxh = ig.caixahorizontal();
  local img = ig.imagem_estoque(ig.ESTOQUE_OK,2);
  local rot = ig.rotulo(' Incluir');
  ig.ad(caxh,img);
  ig.ad(caxh,rot);
  ig.ad(bt_incluir,caxh);
  ig.fixo_ad(fixo,bt_incluir,10,220);
 
//criando o botao Alterar
  local bt_alterar = ig.botao();
  caxh = ig.caixahorizontal();//reaproveitamos as variaveis caxh,img e rot
  img = ig.imagem_estoque(ig.ESTOQUE_DISQUETE,2);
  rot = ig.rotulo(' Alterar');
  ig.ad(caxh,img);
  ig.ad(caxh,rot);
  ig.ad(bt_alterar,caxh);
  ig.fixo_ad(fixo,bt_alterar,100,220);
 
//criando o botao Excluir
  local bt_excluir = ig.botao();
  caxh = ig.caixahorizontal();//reaproveitamos as variaveis caxh,img e rot
  img = ig.imagem_estoque(ig.ESTOQUE_DELETAR,2);
  rot = ig.rotulo(' Excluir');
  ig.ad(caxh,img);
  ig.ad(caxh,rot);
  ig.ad(bt_excluir,caxh);
  ig.fixo_ad(fixo,bt_excluir,190,220);
 
//criando o botao Sair
  local bt_sair = ig.botao();
  caxh = ig.caixahorizontal();//reaproveitamos as variaveis caxh,img e rot
  img = ig.imagem_estoque(ig.ESTOQUE_SAIR,2);
  rot = ig.rotulo(' Sair');
  ig.ad(caxh,img);
  ig.ad(caxh,rot);
  ig.ad(bt_sair,caxh);
  ig.fixo_ad(fixo,bt_sair,280,220);
 
//criando botao Limpar banco de dados:
  local bt_limparbd = ig.botao(' Apagar todos os registros do bd ');
  ig.fixo_ad(fixo,bt_limparbd,360,220);
 
//criando uma janela de rolagem:
  local jan_rol = ig.janela_rolagem();
  ig.fixo_ad(fixo,jan_rol,10,250);
  ig.componente_def_tamanho(jan_rol,700,300);

//criando a caixa de listagem
  local list = ig.listagem(' Id ',' Nome ',' Endereço ',' Telefone ',' Data de nasc. ');
  ig.janela_rolagem_ad(jan_rol,list);
  para i=1,5 inicio
    ig.listagem_def_col_auto_ajuste(list,i,verdadeiro);//definido auto ajuste da col 1 ate 5
  fim
  ig.componente_modifique_fonte(list,'Arial',11);
  ig.componente_modifique_corletra(list,ig.cor_analise(ig.azul,'*t'));
 

 
//Terminamos a parte gráfica agora vamos às funções callbacks:
//criando tabela com todos os componentes criados para as callbacks:
local tab = {
  jan = jan,
  list = list,
  txt_nome = txt_nome,
  txt_endereco = txt_endereco;
  txt_tel = txt_tel;
  txt_nasc = txt_nasc
}

  //atualizando a listagem com dados do bd se houver.
  atualiza_listagem(tab);
  //conectando a listagem:
  ig.conecte_funcao(
    list,ig.clique_linha,
    list_clique, tab //passando tabela como dado extra.
    );
 
//conectando botao incluir
  ig.conecte_funcao(bt_incluir,ig.clique,incluir,tab);
  ig.conecte_funcao(bt_alterar,ig.clique,alterar,tab);
  ig.conecte_funcao(bt_excluir,ig.clique,excluir,tab);
  ig.conecte_funcao(bt_sair,ig.clique,sair,tab);
  ig.conecte_funcao(bt_limparbd,ig.clique,limpar_bd,tab);
  ig.conecte_funcao(jan,ig.evento_delete, sair,tab);
  ig.componente_mostre_todos(jan);
  ig.fimprograma();
  retorne 0;
fim


/*==========================================  Call backs ========================*/

funcao sair(comp,evento,dado)
  se nao dado entao dado = evento fim;
  local dialog = ig.dialogo_mensagem(dado.jan,'Atenção','Sair do programa?',
                                     ig.MSG_QUESTAO , //tipo de mensagem
                                     ig.BOTAO_SIM_NAO //tipos de botões
);   
  ig.botao_mostre_imagem(verdadeiro);   
  local ret = ig.dialogo_execute( dialog );
  ig.componente_destrua( dialog );   
  se ret == ig.RET_SIM entao
    ig.componente_destrua(dado.jan);
    ig.fimjanela();
  senao
    retorne verdadeiro;//para não fechar é necessário retornar verd.
  fim
fim


//=====================================================
funcao obt_valores_listagem(list,lin)
  local id = string.apare( ig.listagem_obt_texto(list, lin,1) );
  local Nome = string.apare(ig.listagem_obt_texto(list, lin,2));
  local End = string.apare(ig.listagem_obt_texto(list,lin,3));
  local Tel = string.apare(ig.listagem_obt_texto(list,lin,4));
  local Nasc = string.apare(ig.listagem_obt_texto(list,lin,5));
  retorne{id=id,Nome=Nome,End=End,Tel=Tel,Nasc=Nasc};
fim

//define os campos Nome, Endereço, Telefone etc.
funcao def_valores_campos(tab,Nome,End,Tel,Nasc)   
  ig.texto_def_texto(tab.txt_nome,Nome);
  ig.texto_def_texto(tab.txt_endereco,End);
  ig.texto_def_texto(tab.txt_tel,Tel);
  ig.texto_def_texto(tab.txt_nasc,Nasc);
fim

//limpa valores dos campos:
funcao limpe_campos(dado)
  ig.texto_def_texto(dado.txt_nome,'');
  ig.texto_def_texto(dado.txt_endereco,'');
  ig.texto_def_texto(dado.txt_tel,'');
  ig.texto_def_texto(dado.txt_nasc,'');
fim
//obtém valores dos campos:
funcao obt_valores_campos(dado)
  local Nome =string.apare( ig.texto_obt_texto(dado.txt_nome));
  local End = string.apare(ig.texto_obt_texto(dado.txt_endereco));
  local Tel = string.apare(ig.texto_obt_texto(dado.txt_tel));
  local Nasc = string.apare(ig.texto_obt_texto(dado.txt_nasc));
  retorne{ Nome=Nome,End=End,Tel=Tel,Nasc=Nasc};
  //retorna uma tabela com campos iguais aos nomes das variáveis
fim

funcao algum_campo_vazio(cmp)
  se cmp.Nome=='' ou cmp.End == '' ou cmp.Tel=='' ou cmp.Nasc=='' entao
    retorne verdadeiro;
  senao
    retorne falso;
  fim
fim

//======================================================


//ao clicar na listagem:
funcao list_clique(list,lin,col,evento,tab) 
  local lcmp = obt_valores_listagem(list,lin);// lcmp = listagem campos.
  def_valores_campos(tab,lcmp.Nome,lcmp.End,lcmp.Tel,lcmp.Nasc);
  tab.id_atual = lcmp.id; //este campo da tabela é adicionado para alterar ou excluir.
  //ao modificar a tabela aqui ela é modificada fora da função também 
fim


funcao incluir(comp,dado)
  cria_bd_e_tabelas(dado.jan); //criando o banco de dados e tabelas caso não existam.
  local ret , base = sql.abra( nomebd );//abre o banco de dados sqlite3
  se ret <> sql.SQLITE_OK entao //testando se base é o retorno é de sucesso
    ig.msg(dado.jan,'ERRO',  " ERRO, NAO FOI POSSIVEL ABRIR O BANCO DE DADOS " ..
       sql.mensagem_erro(base) //pega o ultimo erro contido em base.
    );
  fim   
                                                                      //(Nome,End,Tel,Nasc);   
  local str_sql = "INSERT INTO clientes(Nome,Endereco,Tel,Nasc) VALUES ('%s','%s','%s','%s');";//os `%s' serão substituídos depois:
  local cmp = obt_valores_campos(dado);//ret: cmp = campos (tabela);
  se algum_campo_vazio(cmp) entao//Campos vazios?
    ig.msg(dado.jan,'Atenção','Preencha todos os campos!');
  senao
    str_sql = string.formate(str_sql,cmp.Nome,cmp.End,cmp.Tel,cmp.Nasc);//formatando a string, poderia concatenar
                                                      //também se preferisse, mas eu acho bem mais fácil assim.
    ret = sql.exec(base, str_sql,funcao()es.escreva'*'fim);//funcao vazia para evitar erros.
   
    se ret == sql.SQLITE_OK entao
      ig.msg(dado.jan,'','Dados gravados com sucesso!');
      limpe_campos(dado);     
    senao
      ig.msg(dado.jan,'', sql.mensagem_erro(base));
    fim
 
  //finalmente, não se esqueça de fechar o bd aberto
    sql.feche(base);
    atualiza_listagem(dado);
  fim
fim


//cria banco de dados e tabelas se já não existirem:
funcao cria_bd_e_tabelas(jan)

  local ret , base = sql.abra(nomebd);

  se ret <> sql.SQLITE_OK entao
    ig.msg(jan,'Erro',sql.mensagem_erro(base)); 
  fim
  //
  local str_sql = [[CREATE TABLE IF NOT EXISTS clientes(
               id INTEGER PRIMARY KEY AUTOINCREMENT,
               Nome TEXT,
               Endereco TEXT,
               Tel TEXT,
               Nasc TEXT);]];
         
               
    local ret , erro_msg = sql.exec(base, str_sql,funcao()fim);
 
    se ret <> sql.SQLITE_OK entao
        ig.msg(jan,'Erro', erro_msg);
    fim
   
    sql.feche(base); //fechado a base de dados.
fim

//atualizando a caixa de listagem:
funcao atualiza_listagem(tab)//lendo o banco de dados novamente e inserindo na listagem. 
  ig.listagem_limpe(tab.list);//limpando a listagem;
  local ret , base = sql.abra(nomebd);
   
  se ret <> sql.SQLITE_OK entao//tratamento de erro
    ig.msg(tab.jan,"Erro: ", sql.mensagem_erro(base));
    sql.feche(base);
    retorne;
  fim //fim se ret <>
 
  local str_sql = "SELECT * FROM clientes;";//seleciona tudo de carros;
 
  local ret , res = sql.prepare_v2( base , str_sql ); //ret é o retorno de erro, res é o retorno da instancia da string compilada
  se ret == sql.SQLITE_OK entao
    local cont = 1;
    enquanto 1 inicio
      local pas = sql.passe(res); //executa a string compilada res.
      se (pas == sql.SQLITE_LIN) entao       
        //imprima (cont, sql.coluna_texto( res , 2),sql.coluna_texto( res , 3),sql.coluna_texto( res , 4) ,sql.coluna_texto( res , 5));       
        local id,Nome,End,Tel,Nasc = sql.coluna_texto(res,1), sql.coluna_texto( res , 2),sql.coluna_texto( res , 3),sql.coluna_texto( res , 4),sql.coluna_texto( res , 5);
       
        ig.listagem_anexe(tab.list,id, '  ' ..Nome..'  ','  '..End..'  ','  '..Tel,Nasc..'  ');
        se cont % 2 == 0 entao //se cont for par
          local Cor = ig.cor_analise(  ig.cinza,'*t' );  //definindo uma cor para letra
          ig.listagem_def_cor_fundo( tab.list , cont , Cor );
        fim //se i % 2
        cont = cont + 1;//contador para enumerar a sequencia da listagem
      senao
        quebre;
      fim 
    fim
    tab.id_atual = nulo;//reseta o valor do id atual para nao ser repetido em outra operação
    sql.finalize(res); /**finaliza o objeto sql**/
    sql.feche(base); 
  senao       
    ig.msg(tab.jan,'Erro', "Falha na execucao: " .. sql.mensagem_erro(base) );
    sql.feche(base); 
  fim
fim

//====================  ALTERAR DADOS =========================== //

funcao alterar(comp,dado)
  local cmp = obt_valores_campos(dado);
  se algum_campo_vazio(cmp) ou nao dado.id_atual entao
    ig.msg(dado.jan,'','Clique em um nome da lista abaixo para alterar');
  senao
    local str_sql =  "UPDATE clientes set Nome = '%s',Endereco = '%s',Tel = '%s',Nasc = '%s'  where Id = %s;"
    str_sql = string.formate(str_sql,cmp.Nome,cmp.End,cmp.Tel,cmp.Nasc, dado.id_atual); //troca os `%s' pelos valores dos campos
   
    //abrindo o bd
    local ret,bd = sql.abra(nomebd);//nomebd está definido no comeco do fonte principal();
    se ret <> sql.SQLITE_OK entao
      ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
      sql.feche(bd);
      retorne;
    fim
   
    //executando a string sql:
    ret = sql.exec(bd, str_sql, funcao()fim);
    se ret <> sql.SQLITE_OK entao
      ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
      sql.feche(bd);
       ig.msg(nulo,'', str_sql);
      retorne;
    senao
      ig.msg(dado.jan,'', 'Dados alterados com sucesso!' );
      sql.feche(bd);
      atualiza_listagem(dado);
      limpe_campos(dado);
    fim//fim se ret <> sql.
  fim//fim se algum_campo_vazio();
 
fim//fim função


//=================== EXCLUIR:

funcao excluir(comp,dado)
  local cmp = obt_valores_campos(dado);
  se algum_campo_vazio(cmp) ou nao dado.id_atual entao
    ig.msg(dado.jan,'','Clique em um nome da lista abaixo para excluir');
  senao
    local str_sql = 'DELETE from clientes where Id = %s;'//deleta da tabela Carros onde o Id for igual a 2;

    str_sql = string.formate(str_sql, dado.id_atual); //troca os `%s' pelos valores dos campos
   
    //abrindo o bd
    local ret,bd = sql.abra(nomebd);//nomebd está definido no comeco do fonte principal();
    se ret <> sql.SQLITE_OK entao
      ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
      sql.feche(bd);
      retorne;
    fim
   
    //executando a string sql:
    ret = sql.exec(bd, str_sql, funcao()fim);
    se ret <> sql.SQLITE_OK entao
      ig.msg(dado.jan,'Erro', sql.mensagem_erro(bd) );
      sql.feche(bd);
       ig.msg(nulo,'', str_sql);
      retorne;
    senao
      ig.msg(dado.jan,'', 'Dado excluído com sucesso!' );
      sql.feche(bd);
      atualiza_listagem(dado);
    fim//fim se ret <> sql.
  fim//fim se algum_campo_vazio();
  limpe_campos(dado);
fim//fim função


funcao limpar_bd(comp,dado)
  se sis.remova(nomebd) entao//apaga/deleta o arquivo de dados.
    ig.msg(dado.jan,'','Banco de dados excluído com sucesso!');
    atualiza_listagem(dado);
  fim
fim


#76
Materiais / Biblioteca Terminal
Última postagem por adalberto - Setembro 02, 2017, 08:09:52 PM
Este é um módulo prisma em C com funções básicas para o terminal (ou cmd do Win);


Funções como mudança de título, de cor, coordenada do cursor, captura de tecla sem precisar pressionar o Enter etc.

Está incluso em Prisma-1.0.102 ou superior (Linux e Win)

Caso queira baixar os fontes clique aqui:  http://www.mediafire.com/file/fzzp1em3pzk902b/terminal.7z

Obs. Se já baixou Prisma-1.0.102 ou superior para Windows não precisará compilar pois já está disponível terminal.dll, em Linux é preciso, visto que só está disponível os fontes da versão 1.0.104.

Para compilar em Linux, descompacte o arquivo terminal.7z entre na pasta terminal e execute compila.sh. Necessita ter instalado a lib em C Readline para as funções term.leia() e term.ad_historico(). Caso não queira compilar usando o Readline, abra o arquivo terminal.c, na linha 37 apague as duas barras // em //#define _NO_READLINE. Abra também o script compila.sh e apague  -lreadline   em libs=" -lreadline "; deixando assim: libs=" ";

Vamos aos exemplos:

Para incluir use:  local term = inclua'terminal';

1 - Imprimindo a versão da lib:

imprima(term.versao) //--> lib terminal-1.0.2

2 - Mudando o título da janela do terminal:

term.defTitulo('Mudei o Título');

Observe que mudou o título do terminal.

3 - Mudando a cor de fundo e da letra:

local term = inclua'terminal'
term.defCorfundo(term.branco);
term.defCorletra(term.preto);
imprima('Cor de fundo branco');
term.defCorletra(term.verde);
imprima('Letra em cor verde');


Obs.: veja as cores disponíveis no final no item 11.

4 - Voltando ao padrão - cor da letra e cor de fundo default:

local term = inclua'terminal';
term.defPadrao();



5 - Limpando a tela (cls no Win e clear no Linux):

local term = inclua'terminal';
term.limpeTela();



6 - Definindo uma nova posição para o cursor do terminal (cursor de escrita, não o do mouse):

local term = inclua'terminal';
term.cursorPos(1,2); //posiciona o cursor em 1x2


Coloca o cursor na linha: 1 e na segunda letra.

7 - Colocando o cursor no início: (o mesmo que term.cursorPos(1,1) );

local term = inclua'terminal';
term.cursorInicio();


8 - Obtendo o tamanho do terminal:

local term = inclua'terminal';
alt, larg = term.tamanho();
imprima("Altura:",alt, "Largura:",larg);
leia();


Obs.: Alt = número de linhas na escrita. Larg = número de letras na horizontal. Portanto não é o tamanho da janela, mas do espaço de escrita.

9 - Obtendo uma tecla pressionada (semelhante ao leia() ) sem precisar pressionar ENTER, a tecla aparece digitada no terminal:

local term = inclua'terminal';
s = term.obtCari(); //obtem a tecla
imprima('-->',car(s));


Esta função deixa visível a tecla pressionada.

10 - Obtendo uma tecla pressionada sem precisar pressionar ENTER, a tecla não aparece no terminal:


local term = inclua'terminal';
s = term.obtCar(); //obtem a tecla
imprima('-->',car(s));


Detalhe: o retorno é um número da tecla, portanto use a função car(s) para converter para caractere.


Caso você tenha compilado com a lib Readline estará disponível (somente em Linux) duas funções extras:



Extra 1:  função term.leia(); igual a função leia() mas permite passar um texto como prompt e além disso torna possível buscar um histórico de comandos digitados usando as teclas: cima / baixo. (up, down) do teclado.



x = term.leia('Digite seu nome:>>> ');
//--> Digite seu nome: >>>|


Extra 2: função para criar um histórico dos textos digitados anteriormente, sem ele não é possível usar as teclas cima/baixo para buscar o histórico.

term.ad_historico("comando string a ser gravado");

Exemplo de histórico:


local term = inclua'term'

local imprima=imprima;
se sis.nome:procure'win' entao
  local win=inclua'win';
  //win.poe'dentro';
  local conv_c = conv_c;
  imprima=funcao(...)
    //poe'dentro';
    local t = {...};
    para i,v em ipares(t) inicio
      es.escreva(conv_c(v),'\t');
    fim
    poe'';
  fim
fim

//essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux

//vou tentar fazer para windows no futuro.

//uma funcao interessante é obter um caractere digitado sem precisar pressionar enter.
//essas funções não surtem efeito no windows, apenas para compatibilidade;
enquanto c <> 's' e c <> 'S' inicio
  c = term.leia('digite algo: ');
  term.ad_historico(c);//com as teclas seta acima e seta abaixo é possivel pegar os ultimos comandos digitados.
  imprima('\nuse seta acima ou abaixo para ver o histórico\n');
  imprima('Você digitou:', c);
fim






11 - Cores disponíveis:
term.preto.
term.azulclaro
term.verdeclaro
term.cianoclaro
term.vermelhoclaro
term.magentaclaro
term.amareloclaro
term.cinzaclaro
term.cinza
term.azul
term.verde
term.ciano
term.vermelho
term.magenta
term.amarelo
term.branco



Exemplo de código:


//teste da biblioteca
inclua'terminal'; //esta biblioteca inclui também a terminal
local imprima=imprima;
se sis.nome:procure('win') entao
  local win=inclua'win';
  //win.poe'dentro';
  local conv_c = conv_c;
  imprima=funcao(...)
    //poe'dentro';
    local t = {...};
    para i,v em ipares(t) inicio
      es.escreva(conv_c(v),'\t');
    fim
    poe'';
  fim
fim
//poe(conv_c('olá'));
//leia();

term.defCorfundo(term.branco);
term.defCorletra(term.preto);
imprima('Cor de fundo branco');
term.defCorletra(term.verde);
imprima('Letra em cor verde');
term.defCorletra(term.vermelho);
imprima("Letra em cor Vermelha");

term.defPadrao(); //volta a cor padrao

imprima('Cmd voltou ao padrão');

term.cursorPos(1,2); //posiciona o cursor em 1x2

leia(); //pressione enter para sair;




Recorte de tela:





Mesmo sem ter o readline é possível simular o histórico usando apenas as funções básicas do terminal, veja:


local term = inclua'terminal'

local index=1;
local tab={};
funcao AdHistorico(s)
  tab[#tab+1]=s;
  index = #tab;
fim

funcao Prompt(s)
  es.escreva(s);
  local tam = #s;
  local ret, x = '';
  enquanto 1 inicio
    x = term.obtCar();
    se x == 27 entao
      x = term.obtCar();
      se x == 91 entao
        x = term.obtCar();
        se car(x) == 'A' entao
          se index < 1 entao index = 1; fim
          se index > #tab entao index = #tab; fim
          local ss = string.nconcat(' ',tam);
          es.escreva('\r' .. ss);
          es.esvazie();
          es.escreva(string.formate("\r%s%s",s,tab[index]));
          es.esvazie();
          tam = #s + #tab[index];
          index = index + 1;
        senaose car(x) =='B' entao
          se index < 1 entao index = 1; fim
          se index > #tab entao index = #tab; fim
          local ss = string.nconcat(' ',tam);
          es.escreva('\r' .. ss);
          es.esvazie();
          es.escreva(string.formate("\r%s%s",s,tab[index]));
          es.esvazie();
          tam = #s + #tab[index];
          index = index - 1;
        fim
      fim
    senaose car(x) == '\n' ou x == '\r' entao
      poe'';
      retorne ret;
    senaose x == 127 entao
      ret = string.corte(ret,1,#ret -1);
      local ss = string.nconcat(' ',tam);
      es.escreva('\r' .. ss);
      es.esvazie();
      es.escreva(string.formate("\r%s%s",s,ret));
      es.esvazie();
      tam = #s + #ret;
    senao
      es.escreva(car(x));
      ret = ret .. car(x);
      tam = #s + #ret;
    fim
   
  fim
fim

enquanto 1 inicio
  a = Prompt("Digite algo: ");
  AdHistorico(a);//guarda no histórico
  poe(a);
fim


Usamos uma tabela prisma para formar o histórico.

Use as teclas cima/baixo do teclado para ver o histórico digitado anteriormente.

Criando uma função que lê senhas:


local term = inclua'term';

//a lib term.pris é uma biblioteca feita em prisma com funções para mudar cor do terminal.
//quando ela é incluída, inclui automaticamente a lib terminal.so

//essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux

//vou tentar fazer para windows no futuro.

//uma funcao interessante é obter um caractere digitado sem precisar pressionar enter.

funcao leia_senha(s,dig)
  local dig = dig ou '*';
  local tam = #s;

  local novalin = 10;
  se sis.nome=='win32' entao novalin=13; fim
  es.escreva(s);
  local senha = '';
  enquanto 1 inicio
    local x = term.obtcar();//não aparece a letra quando você digita no terminal
    //imprima(x);
    se (x >= 97 e x <= 122 ) ou (x>=32 e x<=90) entao
       //poe'dentro';
        senha = senha .. car(x);
        tam = #s + #senha;
        es.escreva(dig);
    senaose x == 127 entao //backspace
        senha = string.corte(senha,1,#senha -1);
        local ss = string.nconcat(' ',tam);
        local sss = string.nconcat(dig,#senha);
        es.escreva('\r' .. ss);
        es.esvazie();
        es.escreva(string.formate("\r%s%s",s,sss));
        es.esvazie();
        tam = #s + #senha;
    senaose x == novalin entao
        retorne senha;
    fim 
  fim
 
fim //fim função

imprima('\n\nSua senha é:', leia_senha("Digite sua senha: ",'*') );







Por enquanto é isso.

Falou, pessoal, até a próxima.
#77
Lista de Bugs / Re:erro no json.decod
Última postagem por adalberto - Setembro 02, 2017, 04:48:09 PM
Rafael, acho que já encontrei o erro.

No terminal use o seguinte comando:

prisma  teste.prisma    no lugar de :  ./teste.prisma

ou caso queira usar o comando "./teste.prisma" então insira na primeira linha do script prisma:

#!/usr/local/bin/prisma

Tenta aí e me retorna, até mais.

PS.: isso ocorre pelo fato de chamar um script como executável sem colocar o caminho do interpretador na primeira linha do script, ok.
#78
Lista de Bugs / Re:erro no json.decod
Última postagem por rafael - Agosto 29, 2017, 03:35:10 PM
Eu não modifiquei nada na json.pris porque estava meio apressado.

Ainda não testei com imprimaf

Mas seria bom corrigir na biblioteca, pelo que vi tem um mini manual dizendo alguma coisa sobre isso logo acima da função separadora.

Estou achando que é a versão do prisma.

Quando executo o código abaixo no meu computador com ubuntu16 funciona, mas quando executo no servidor centos7 já não funciona e dá o erro logo abaixo.


s = [[ [
{
"mac": "58:10:8C:0D:73:07",
"name": "ELCIONE PEREIR",
"lastip": "0.0.0.0",
"associd": 10,
"aprepeater": 0,
"tx": 26.0,
"rx": 78.0,
"signal": -64,
"rssi": 32,
"chainrssi": [ 30 , 27 , 0 ],
"rx_chainmask": 3,
"ccq": 86,
"idle": 0,
"tx_latency": 18,
"uptime": 171272,
"ack": 32,
"distance": 1500,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[3654,83042,607651,1477318,510535,348901,507585,264507,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 955312,
"rx_bytes": 142819636,
"rx_pps": 55,
"tx_data": 1507368,
"tx_bytes": 1891154263,
"tx_pps": 102
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ -64, -64, -64, -64, -65, -65, 0, 0, 0, 0, 0, 0, -65, -66, -67, -69 ]
},
{
"mac": "58:10:8C:05:19:54",
"name": "ROSELIA LIMA",
"lastip": "0.0.0.0",
"associd": 5,
"aprepeater": 0,
"tx": 117.0,
"rx": 78.0,
"signal": -69,
"rssi": 27,
"chainrssi": [ 24 , 24 , 0 ],
"rx_chainmask": 3,
"ccq": 94,
"idle": 0,
"tx_latency": 20,
"uptime": 874192,
"ack": 28,
"distance": 900,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[29,13,59,19297,131642,1165526,8662417,2857366,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 16272039,
"rx_bytes": 3282813633,
"rx_pps": 28,
"tx_data": 23553807,
"tx_bytes": 27574610883,
"tx_pps": 100
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ 0, -69, -69, -69, -69, -69, 0, 0, 0, 0, 0, 0, -70, -70, -72, 0 ]
},
{
"mac": "00:27:22:B2:3B:84",
"name": "LEIDE",
"lastip": "192.168.10.1",
"associd": 3,
"aprepeater": 0,
"tx": 65.0,
"rx": 19.500,
"signal": -61,
"rssi": 35,
"chainrssi": [ 20 , 35 , 0 ],
"rx_chainmask": 3,
"ccq": 96,
"idle": 0,
"tx_latency": 5,
"uptime": 874163,
"ack": 30,
"distance": 1200,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[0,2,23,394,1047,18092,817019,1673225,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 2899294,
"rx_bytes": 459771501,
"rx_pps": 1,
"tx_data": 3831484,
"tx_bytes": 4017321527,
"tx_pps": 0
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7" ],
"signals": [ 0, -61, -61, -61, 0, 0, 0, -61 ],
"remote": {
"uptime": 874194,
"hostname": "LEIDE",
"platform": "AirGrid M5 HP",
"version": "XM.ar7240.v6.0.3.30600.170329.1831",
"signal": -50,
"tx_power": 16,
"rssi": 46,
"chainrssi": [ 47 , 0 , 0 ],
"rx_chainmask": 1,
"tx_latency": 2,
"noisefloor": -91,
"distance": 450,
"time": "2017-04-08 21:20:47",
"cpuload": 0,
"totalram": 29508,
"freeram": 9788,
"netrole": "router",
"tx_bytes": 460237568,
"rx_bytes": 4167485529,
"tx_ratedata":[7530,13616,28940,74290,269840,731283,1179656,329248,0,0]
}
},
{
"mac": "58:10:8C:0C:9A:42",
"name": "ANNA CAROLINA",
"lastip": "0.0.0.0",
"associd": 12,
"aprepeater": 0,
"tx": 6.500,
"rx": 26.0,
"signal": -57,
"rssi": 39,
"chainrssi": [ 38 , 31 , 0 ],
"rx_chainmask": 3,
"ccq": 79,
"idle": 0,
"tx_latency": 17,
"uptime": 32131,
"ack": 34,
"distance": 1800,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[1327264,460254,267086,217583,118507,196798,482899,169262,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 341968,
"rx_bytes": 81551275,
"rx_pps": 68,
"tx_data": 461878,
"tx_bytes": 531390721,
"tx_pps": 106
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ -57, -57, -57, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
},
{
"mac": "00:1A:3F:69:75:DD",
"name": "Jorge Cunha",
"lastip": "0.0.0.0",
"associd": 15,
"aprepeater": 0,
"tx": 130.0,
"rx": 39.0,
"signal": -66,
"rssi": 30,
"chainrssi": [ 27 , 26 , 0 ],
"rx_chainmask": 3,
"ccq": 91,
"idle": 0,
"tx_latency": 9,
"uptime": 420645,
"ack": 27,
"distance": 750,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[0,0,0,5106,83699,517215,1119450,256071,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 2407008,
"rx_bytes": 352079430,
"rx_pps": 2,
"tx_data": 3667035,
"tx_bytes": 4378262254,
"tx_pps": 3
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7", "MCS8", "MCS9", "MCS10", "MCS11", "MCS12", "MCS13", "MCS14", "MCS15" ],
"signals": [ -65, -66, -66, -66, -67, -66, 0, 0, 0, 0, 0, 0, -67, -67, -68, -69 ]
},
{
"mac": "24:A4:3C:A6:E4:18",
"name": "Posto Policial",
"lastip": "192.168.10.1",
"associd": 4,
"aprepeater": 0,
"tx": 58.500,
"rx": 19.500,
"signal": -60,
"rssi": 36,
"chainrssi": [ 15 , 36 , 0 ],
"rx_chainmask": 3,
"ccq": 80,
"idle": 0,
"tx_latency": 9,
"uptime": 259832,
"ack": 36,
"distance": 2100,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[49401,6961,2256,2590,4129,11790,35030,74925,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 193407,
"rx_bytes": 31274300,
"rx_pps": 2,
"tx_data": 185872,
"tx_bytes": 32258333,
"tx_pps": 1
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7" ],
"signals": [ 0, 0, -60, -59, 0, -61, -63, -64 ],
"remote": {
"uptime": 543018,
"hostname": "Posto Policial",
"platform": "AirGrid M5 HP",
"version": "XM.ar7240.v6.0.4.30805.170505.1525",
"signal": -59,
"tx_power": 23,
"rssi": 37,
"chainrssi": [ 38 , 0 , 0 ],
"rx_chainmask": 1,
"tx_latency": 3,
"noisefloor": -88,
"distance": 1200,
"time": "2017-05-11 22:15:11",
"cpuload": 1,
"totalram": 29508,
"freeram": 10508,
"netrole": "router",
"tx_bytes": 63926545,
"rx_bytes": 125557017,
"tx_ratedata":[6367,7871,10452,14094,18493,27038,41603,67703,0,0]
}
},
{
"mac": "00:1A:3F:D0:4F:62",
"name": "Isaias Fernand",
"lastip": "0.0.0.0",
"associd": 17,
"aprepeater": 0,
"tx": 65.0,
"rx": 52.0,
"signal": -65,
"rssi": 31,
"chainrssi": [ 20 , 31 , 0 ],
"rx_chainmask": 3,
"ccq": 92,
"idle": 0,
"tx_latency": 15,
"uptime": 253064,
"ack": 26,
"distance": 600,
"txpower": 23,
"noisefloor": -88,
"tx_ratedata":[2,31,1187,7228,70392,522788,985949,113147,0,0],
"airmax": {
"priority": 0,
"quality": 0,
"beam": -1,
"signal": 0,
"capacity": 0
},
"stats": {
"rx_data": 2105908,
"rx_bytes": 258755944,
"rx_pps": 1,
"tx_data": 3210887,
"tx_bytes": 4017773431,
"tx_pps": 2
},
"rates": [ "MCS0", "MCS1", "MCS2", "MCS3", "MCS4", "MCS5", "MCS6", "MCS7" ],
"signals": [ -66, -66, -65, -66, -68, -68, -69, -71 ]
}

]

]]



local json = inclua'json'

tab, err = json.decod(s);

se nao tab entao erro(err) fim;

para r,f em pares(tab) inicio
imprima(r,tab[r].mac,tab[r].name,tab[r].signal,tab[r].stats.tx_bytes)

MAC = tab[r].mac
Nome = tab[r].name
Sinal = tab[r].signal
Qualidade = tab[r].ccq
Latencia = tab[r].tx_latency
TXMbps = tab[r].tx
RXMbps = tab[r].rx
TXBytes = tab[r].stats.tx_bytes
RXBytes = tab[r].stats.rx_bytes

TempoLigado = tab[r].uptime


fim




Erro do Centos7:


[root@aurora ~]# ./teste.prisma
./teste.prisma: line 1: s: comando não encontrado
./teste.prisma: line 816: erro de sintaxe próximo do `token' não esperado `]]'
./teste.prisma: line 816: `]]'
[root@aurora ~]# ./teste.prisma
./teste.prisma: line 1: s: comando não encontrado
./teste.prisma: line 816: erro de sintaxe próximo do `token' não esperado `]]'
./teste.prisma: line 816: `]]'



Estou usando a versão 1.0.100 em ambos, vou atualizar pra ver se resolve.
#79
Lista de Bugs / Re:erro no json.decod
Última postagem por adalberto - Agosto 29, 2017, 03:24:53 PM
Valeu vou dar uma olhada.

Vc fez alguma modificação nesta lib?

No código acima funcionou p mim.
#80
Lista de Bugs / Re:erro no json.decod
Última postagem por rafael - Agosto 29, 2017, 02:49:00 PM
O erro é este:



/usr/local/bin/prisma: /usr/local/share/prisma/1.0/plib/json.pris:29: argumento incorreto #3 to 'separe' (espera-se numero, ao inves de string)
Rastro da pilha:
[C]: em funcao 'separe'
/usr/local/share/prisma/1.0/plib/json.pris:29: em funcao 'skip_delim'
/usr/local/share/prisma/1.0/plib/json.pris:118: em funcao 'decod'
/usr/local/share/prisma/1.0/plib/json.pris:124: em funcao 'decod'
./teste.prisma:278: em trecho principal
[C]: em ?