elaborar um help pratico?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

elaborar um help pratico?

Mensagem por juniorcamilo »

amigos estava eu aqui pensando em um help pratico para nos programadores, tem como fazer? tipo: quando eu (o usuario) estou em qualquer parte do programa e, teclar F1 'da vida', ele me abreria uma tela onde mostraria um help da tela atual ou posicao do get atual etc.. c nao houver uma anotacao da mesma ele da acesso para nos gravarmos uma anotacao em um arquivo, a posicao do get e funcao ou procedure(obtida) que esta sendo executada (sendo chave primaria) e um campo memo, nos salvariamos o help.. ai quando eu chamar novamete o F1 ele abrira e mostrara o help antes gravado... alguem ja fez?
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Já fiz. Mas é uma coisa complicada até pra explicar. Basicamente, tenho dois tipos de help. O rápido, que aparece na barra de auxílio (última linha) e o de contexto, que é acionado pelo F1. Em ambos os casos, meu GET (GET é só um exemplo) tem duas cláusulas para configurar esses dados. No caso da barra de auxílio é até fácil. Como é um texto pequeno, fica no programa mesmo. Mas quando se trata de um help pelo F1, que é bem mais detalhado, e pelo tamanho do texto, uso um arquivo com formato proprietário. Mas o sistema já está preparado para fazer tudo. Ao pressionar F1, ele obtém o código da entrada no arquivo de help (previamente aberto na execução do programa), faz uma busca binária no arquivo de help, que é indexado, obtém o texto, que não é formatado, joga pra uma rotina que gera uma janela de formato automático, hifeniza e mostra o texto. Sendo um texto muito grande, o sistema já conta com as teclas de navegação. Mas isso funciona pra qualquer coisa no sistema, não apenas nos GETs.

Pra montar o arquivo de help, desenvolvi um compilador próprio. Se não fosse por ele não seria viável, já que a estrutura é muito complexa. Tenho então os fontes dos helps (HLS). Após compilados eles são "linkados" num arquivo HLP, que é manipulado pelo programa.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

Maligno , = vc falou realmente é ate dificil de explicar,rsrsrsr. tem em clipper algum comando que mostre em que 'Function ou Procedure' que estamos no exat momento? pois o get sei que tem este comando!!
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Oi amiguinho,
o recurso não é difícil de implementar não.
Veja no NG do Clipper a explicação sobre o comando SET KEY.
Ele associa uma tecla a uma função, passando para ela o nome da function/procedure onde a tecla (HOTKEY) foi acionada, bem como o nº da linha atual e o nome da variável ativa.
Então fica fácil definir o que fazer com base nestas informações né.
Quando usava este tipo de help, tinha um arquivo indexado com o nome das procedures e variáveis, com um campo memo onde as explicações estavam registradas.
Aí, era só salvar a tela no local onde eu exibia um memoedit com as explicações, exibí-lo e, depois restaurar a tela.

MarceloG
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Junior, veja um exemplo:

Código: Selecionar todos

PROCEDURE HELP(vProg, vLinha, vVar)
LOCAL vTela:=SAVESCREEN(0,0,24,79), vQArq:=ALIAS(), vArea:=SELECT()
vProg:=LEFT(vProg+SPAC(10),10) 
vVar:=LEFT(vVar+SPAC(10),10)
IF vProg="HELP"
  RETU
ENDIF
IF !FILE("HELP.DBF")
  PRIVATE aStru
  aStru := {;
               {"PROG","C",10,00},;
               {"LINHA","C",6,00},;
               {"VARIAVEL","C",10,00},;
               {"TEXTO","M",10,00}}
          DBCREATE("HELP.DBF",aStru)
ENDIF
USE HELP NEW
IF !FILE("HELP.NTX")
 INDEX ON PROG+LINHA+VARIAVEL TO HELP
ENDIF
SET INDEX TO HELP
GO TOP
SEEK vProg+STRZERO(vLinha,6)+vVar
IF !FOUND()
 v_esc:=Alert("Sem Help. Deseja inserir um texto?",{"Sim","Nao"},"w/b")
 IF v_esc=1
   @ 4,9 TO 23,70
   @ 23, 30 SAY "[ CTRL+W = Grava ]"
   vTexto:=SPAC(10)
   vTexto:=MEMOEDIT(vTexto,5,10,22,69,.T.)
   APPEND BLANK
   REPL PROG WITH vProg, LINHA WITH STRZERO(vLinha,6), VARIAVEL WITH vVar,;
           TEXTO WITH vTexto
 ENDIF
ELSE
 vTexto:=TEXTO
 @ 4,9 TO 23,70
 MEMOEDIT(vTexto,5,10,22,69,.F.)
ENDIF
CLOSE HELP
IF !EMPT(vQArq)
 SELE vArea
ENDIF
RESTSCREEN(0,0,24,79,vTela)
RETU
Só que um Help assim, indexado pela rotina, linha e variável vai ser bem detalhado, então em cada estado de espera do seu programa, você terá que editar um texto para o help.

Obs.: não testei, mas acho que não tem erros não.

Abraços,
Editado pela última vez por Toledo em 08 Abr 2008 16:42, em um total de 1 vez.
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

juniorcamilo escreveu:Maligno , = vc falou realmente é ate dificil de explicar,rsrsrsr.
A minha implementação é realmente difícil até de explicar por quê eu fui atrás de fazer algo realmente bem completo. Mas isso não significa que você não possa fazer algo mais simples, que não envolva tantos recursos.
tem em clipper algum comando que mostre em que 'Function ou Procedure' que estamos no exat momento? pois o get sei que tem este comando!!
Veja no NG as funções ProcName() e ProcLine().
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Junior, fiz uma pequena alteração no meu exemplo acima para que a indexação/busca fique correta.

Neste meu exemplo, basta você compilar esta procedure junto com os arquivos do seu programa, ai quando o usuário pressionar a tecla F1, automaticamente a procedure HELP() será chamada, passando o nome da rotina (programa), a linha e a variável onde o programa está parado.

Faça um teste e depois olhe o arquivo HELP.DBF.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

vou desenvolver um funcao,, e espero que seje simples e 'dobaracubaco' ,,, e post aqui para analise ..... realmente as opcoes procname() e procline() sao funcoes que ja tinha vistos a muitos e muitos anos artras, nosso amigo maligno refresco minha memoria obrigado ,, volta a postar a funcao aqui mais tarde,, valeu galera... vou trabalhar ......faloww
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Mensagem por frazato »

Boa tarde.!
Como faço para saber qual a variavel corrente, para fazer uso desta rotina, tipo.

ProcName()+Str(ProcLine(),6)+vVar( como consigo isso ).

Obrigado.

Frazato
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

variavel corrente vc quer dizer a que esta em foco no read? c for o comando é o getactivate()
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Mensagem por frazato »

Ok... deu certo muito obrigado.!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos,

Não usem ProcName()+Str(ProcLine(),6)+vVar.

Usem somente ProcName()+vVar pois ao fazer qualquer alteração de um .PRG como acrescimo de linhas ou exclusão de linhas o ProcLine() ira mudar fazendo com que a pesquisa não encontre o topico cadastrado.

Fiz uma adaptação do código do Toledo para Fivewin neste topico.

Talvez a idéia fique melhor se ao invés de usarmos F1 para chamar um Help no campo, que F1 acionasse um interruptor:

O interruptor fica desligado, portanto o help não aparece.
Caso o interruptor for ligado o help passa a ser apresentado variando o conteudo a cada GET que o usuario estiver posicionado, talvez até usando a clausula WHEN para mudar o conteudo.
Quando o interruptor for desligado o help desaparece.

Legau né?
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

rochinha escreveu:Usem somente ProcName()+vVar pois ao fazer qualquer alteração de um .PRG
Isso mesmo, eu também concordo com você Rochinha. Inclusive eu vou tentar aperfeiçoar o meu sistema de help também e estou tentando adicionar ProcName()+vVar no arquivo para que ao abrir com MEMOEDIT posicione-se na linha após dentro do arquivo onde consta tal instrução.

Vou analisar melhor seu código exemplo de help, mas pelo que eu vi a diferença do meu, é que eu não uso arquivo DBF para guardar o HELP e sim arquivo TEXTO. Os campos tipo MEMO não são seguros ao meu conceito.

Só não entendí você Rochinha desenconraja o uso do ProcLine() mas naquele exemplo você o utiliza. Também pelo que me pareceu você estaria usando este procedimento para mostrar um pequeno help de cada GET, sendo que este ocupa pouco espaço. Daí eu faria como o Maligno falou de por ser pequeno colocava no mesmo código-fonte.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Daí eu faria como o Maligno falou de por ser pequeno colocava no mesmo código-fonte.
Não é bem um help, mas um lembrete que fica na última linha da tela, pro usuário saber do que se trata aquele campo com nome estranho. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho Pablo

Eu usei e como dei vários problemas desabilitei, veja que o codigo esta assim:

Código: Selecionar todos

   local nProcLine := 0 // ProcLine( 0 ) 
Eu uso a variavel nProcLine mas mando com valor zera só por compatibilidade do codigo anterior postado pelo Toledo.

Em meu antigo sistema em DOS eu usava a ultima linha para apresentar uma ajuda sobre o campo mas o conteudo ficava internamente compilado.

A dica seria que uma pequena janelinha pudesse ser apresentada ou não conforme o estado do interruptor dando maiores informações.

A implementação para Fivewin ficou show e será facilmente portada para outas GUIs, e para Clipper o pulo do gato é pegar a variavel do GET.

No caso de usar memo é porque podemos colocar uma ajuda muito mais extensa, mas estarei mudando para campo com 255 caracteres, pois não preciso colocar tanta coisa para não cansar o usuário.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder