Ajuda com Browse ou DbEdit()...

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

fabiomacarrao
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 14 Jun 2010 21:28
Localização: Sao Paulo

Ajuda com Browse ou DbEdit()...

Mensagem por fabiomacarrao »

Boa noite, colegas!
Tenho o seguinte caso: Gostaria de uma funçäo onde, em um browse, ao teclar uma letra a barra se desloque até o primeiro ítem da letra, por exemplo, ao teclar "P" a barra vá até o primeiro ítem começando com a letra "P", mais expecíficamente:
Montei um programa para gerenciar minhas músicas de videokê e o arquivo "lista.dbf" tem a sequinte estrututra:
numero C 4
musica C 50
na janela browse, lista-se o código da música (cantor - musica). Está indexado por cantor, entäo, ao se teclar "D", por exemplo, gostaria que fosse até o primeiro ítem da música começando com"D". Já fiz isso com vetores, mas faz tanto tempo que já nem me lembro mais...hehe
Como queria um visual mais legal, fiz em FoxPro, versão For Windows 2.6, já que aceita os mesmos comandos do clipper (programava em Summer'87).
Para vocês que são fera, deve ser moleza... entäo, se puderem ajudar o véio esquecido aqui, agradeço!!!

Abraços!

Bom dia a todos!

ontem, "fuçando" os arquivos de ajuda do FoxPro, montei essa procedure para busca, mas tá acontecendo o seguinte:
quando o resultado do "set filter" resulta entre 1 e 3 (Acha só uma ou duas ou três músicas)dá a mensagem da procedure errhand, e logo em seguida lista os resultados normalmente. Resultados com mais de quatro músicas, roda normal. Achei que era erro na estrutura, como falta de endif ou outros, então usei o DFlow, que não achou erros...
Antecipadamente, agradeço a quem puder dar uma olhada.
Abraços!

Código: Selecionar todos

procedure busca
clear
use lista
set safety off
index on musica to musica
set index to musica
buscar=space(30)
@ 1,2 say "Buscar :" font "arial",18 get buscar pict "@!" font "arial",18
read
buscar=alltrim(buscar)
if lastkey()=27 .or. lastkey()=13 .and. empty(buscar)
    return
endif
set exact off
set filter to buscar$musica
COUNT TO m.count
if m.count=0
    waint window "Nao achei nada contendo &buscar ... Desculpe..." timeout 2
    return
endif
DIMENSION musicas[m.count,1]
COPY TO ARRAY musicas FIELD musica
= ASORT(musicas, AELEMENT(musicas,4))
WAIT WINDOW 'Listando todos com conteudo &buscar . Escolha a Musica e tecle ENTER' NOWAIT
@ 0,0 GET m.choice FROM musicas RANGE 1 SIZE 22,95 DEFAULT 1 font "arial",20
READ		
clear
xmusica=alltrim(musicas[m.choice])
loca all for alltrim(musica)==alltrim(xmusica)
if eof()
    wait window "Musica nao encontrada..." timeout 5
else
    @ 2,3 say musica font "arial",20
    @ 3,3 say numero font "arial",20
    @ 5,3 say 'Tocar essa musica ? ENTER - Toca    ESC - Cancela' font "arial",20
    toca='S'
    read
    if lastkey()=27
        return
    endif
    if lastkey()==13
        wcod=numero
        xcod=wcod+"M"
        wcod=wcod+".dat"
        if .not. file(wcod)
            wcod=xcod+".dat"
            endif
        if .not. file(wcod)
            wait window "Musica nao encontrada..." timeout 2
            return
        endif

set filter to
set exact on
if len(wcod)<=8
! /N mplayer.exe -stereo 0 -fs -quiet -msglevel all=-1 &wcod
else
! /N mplayer.exe -af channels=1 -fs -quiet -msglevel all=-1 &wcod
endif
endif
endif

PROCEDURE errhand
PARAMETER merror, mess, mess1, mprog, mlineno
WAIT WINDOW "Nao achei nada com esse texto..."   timeout 2
Editado pela última vez por Maligno em 16 Jun 2010 08:29, em um total de 2 vezes.
Razão: Mensagem editada para colocar a tag [ quote ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r0
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Ajuda com Browse ou DbEdit()...

Mensagem por ANDRIL »

Não programo em FoxPro, mais em clipper fica mais ou menos assim:

Código: Selecionar todos

cls
*--abre seu dbf e cria os indices
use musica
index on numero to numero
index on musica to musica
set index to numero,musica

procura=space(30)
do while .t.
@01,00 clea to 24,79
@23,00 say padc("Para uma palavra no nome da musica use * antes da palavra desejada",79)
@24,00 say padc("[ESC]=Encerrar",79)
@01,00 say"Buscar por:" get procura pict"@!"
read

if lastkey()=27.or.empty(procura)=.t.
exit
endif

//--aqui se for indicado *, faz a filtragem.
if left(procura,1)="*"
   set orde to 2
   set filter to alltrim(substr(procura,2,30))$musica
   go top

elseif isDigit(procura)=.t.
//--aqui procura pelo codigo da musica
   set orde to 1
   seek left(procura,4)

else
//--aqui usa a procura normal pelo nome inicial da musica
   set orde to 2
   seek alltrim(procura)
endif
 
if eof().or.bof()
@24,00 say padc("Nenhuma musica encontrada com esses parametros!",79)
inkey(2)
loop
endif

priv ar1[2],ar2[2]
ar1[1]="numero";ar2[1]="Código"
ar1[2]="musica";ar2[2]="Música"

@03,02 clea to 22,79
@03,02 to 22,79

@24,02 say padc("[F2]=Ordem Numerica  [F3]=Ordem por Musica  [Enter]=Escolher  [Esc]=Voltar",79)

//--esse keyb impede que ja entre com ENTER apertado no DBEDIT
keyb chr(1)
DbEdit(04,03,21,78,ar1,"myfuncao")
//--caso tenha usado opcao do filtro, limpa aqui
set filter to
enddo
quit
Aqui esta a funcao de controle do DbEdit

Código: Selecionar todos

**************
function myfuncao
**************
parameters modo, campo
posicao=recno()

if lastkey()=27
  keyb chr(255)
  inkey(0)
  return 0
elseif lastkey()=13
  //--nessa parte nao alterei seu codigo
  wcod=numero
  xcod=wcod+"M"
  wcod=wcod+".dat"
  if .not. file(wcod)
  wcod=xcod+".dat"
  endif
  if .not. file(wcod)
   @24,00 say padc("Musica nao encontrada...",79)
  return 1
  endif

  if len(wcod)<=8
     ! /N mplayer.exe -stereo 0 -fs -quiet -msglevel all=-1 &wcod
  else
     ! /N mplayer.exe -af channels=1 -fs -quiet -msglevel all=-1 &wcod
  endif
  return 1

elseif lastkey()=-1
  //--muda o indice para numero
  set orde to 1
  go posicao
  keyb chr(255)
  return 2

elseif lastkey()=-2
  set orde to 2
  go posicao
  keyb chr(255)
  return 2

else
  return 1
endif
Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
fabiomacarrao
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 14 Jun 2010 21:28
Localização: Sao Paulo

Re: Ajuda com Browse ou DbEdit()...

Mensagem por fabiomacarrao »

Bom dia, Andril!

Muito grato por você dedicar parte de seu tempo para ma ajudar. Não me lembrava de como inserir função de usuário dentro do DbEdit, tinha me esquecido das aspas...
Mas é isso aí, com essa função, pode-se tratar os erros de EOF, BOF e lidar com as teclas ESC e ENTER. Acho que programar em clipper é igual andar de bicicleta, hehe! lembrei-me também dos valores de retorno para a DbEdit: 0-abandona, 1-continua e 2-Lê os dados e exibe a tela de novo... Brigadäo!!!

PS:Como você faz para inserir o código nessa telinha azul? o PRG perdeu a formataçäo quando colei na minha pergunta...
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Ajuda com Browse ou DbEdit()...

Mensagem por ANDRIL »

Para colocar código fonte, use as tags (code) seu codigo aqui (/code). Substitua os () por [] para que funcione.

Quanto ao exemplo postado, tem outras formas até mais rápidas de se fazer o que vc deseja, porem pensei na compatibilidade do código. Eu particulamente, prefiro escrever um pouco mais, do que, sintetizar e acabar ficando menos compreencível o código.

Quanto a esta tela azul, onde fica o codigo fonte, pensei até em reiniciar minha maquina, pensando que era problema aqui, alguem mudou.

Em tempo, antes de programar em clipper 5, já arranhava algo em Clipper Summer e acabei ganhando um livro de FOXPRO 2.alguma coisa em DOS, dei uma lida superficial mais não segui em frente. Vendo seu codigo, achei o uso de font arial no get e outras caracteristicas como uso de array bem interessante nessa linguagem.


Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Ajuda com Browse ou DbEdit()...

Mensagem por sygecom »

Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
fabiomacarrao
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 14 Jun 2010 21:28
Localização: Sao Paulo

Re: Ajuda com Browse ou DbEdit()...

Mensagem por fabiomacarrao »

Pois é... O legal e que no FoxPro for windows 2.6 uso praticamente os mesmos comandos do clipper e o arquivo de help dele é muito legal. achei essa função em um dos exemplos e trabalhando com vetores a busca fica mais rápida (cerca de 1970 músicas), ficou bem legal. Agora meu karaoke tá ficando bom, ontem fiz um receptor infravermelho para operá-lo com controle remoto, ficou muito bom. Agora digito os códigos das músicas pelo controle remoto (usei um de um DVD gradiente) e as funções como play, pause, volume, etc estão funcionando 100%. As músicas estão no formato mp3+G, convertidas em MPEG, uso o o comando RUN/N (roda o programa e o libera em seguida) para executar o Mplayer, que o toca em FullScreen. Sugiro que dê uma "fuçada" no FoxPro 2.6 for windows, você que entende bem de clipper não terá dificuldade alguma. E usando o Distribution kit, você cria executáveis para rodar em máquinas sem o foxpro instalado, bastando copiar o runtime (cerca de 2 megas). Abraços e obrigado novamente!
Responder