Página 1 de 2

elaborar um help pratico?

Enviado: 07 Abr 2008 20:07
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?

Enviado: 07 Abr 2008 22:15
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.

Enviado: 08 Abr 2008 06:48
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!!

Enviado: 08 Abr 2008 07:54
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

Enviado: 08 Abr 2008 14:21
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,

Enviado: 08 Abr 2008 16:23
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().

Enviado: 08 Abr 2008 16:50
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,

Enviado: 08 Abr 2008 19:23
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

Enviado: 09 Abr 2008 15:42
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

Enviado: 10 Abr 2008 07:05
por juniorcamilo
variavel corrente vc quer dizer a que esta em foco no read? c for o comando é o getactivate()

Enviado: 10 Abr 2008 10:58
por frazato
Ok... deu certo muito obrigado.!

Enviado: 13 Abr 2008 12:46
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é?

Enviado: 13 Abr 2008 13:00
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.

Enviado: 13 Abr 2008 13:56
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. :)

Enviado: 13 Abr 2008 16:47
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.