Página 1 de 1

Tecla de função (set key )para chamar uma rotina

Enviado: 07 Ago 2020 12:07
por Vlademiro
Pessoal, estou errando aqui desde cedo com um problema besta.


Eu quero passar 1 parâmetro usando SET KEY. Seria mais ou menos assim :

Código: Selecionar todos

SET KEY K_F3 TO FUNCAO( cIDDatabase, outros parametros )
Ocorre que SET KEY já passa 3 parâmetros automaticamente.

Alguém teeria uma solução para esse problema ??? Acho que é fácil, eu é que não consigo achar a resposta.
Se não der com set key tudo bem, o que eu quero é ter uma tecla que chame uma rotina e que possa passar parãmetros para ela porque ela vai mudar o comportamento de acordo com o contexto.

Tecla de função (set key )para chamar uma rotina

Enviado: 07 Ago 2020 12:36
por JoséQuintas
O que uso aqui, para GETS, é pegar o nome da variável: READVAR() e pelo nome do programa que forneço pelo menu.

Outra alternativa talvez seja usar o SET, e passar o codeblock

Uso a pesquisa de cadastros, seja ele qual for.

Código: Selecionar todos

SET KEY K_F9 TO PESQUISA
No menu principal

Código: Selecionar todos

FUNCTION ExecutePRG( cNomeFonte )
PRIVATE m_Prog
...
m_Prog := cNomeFonte
DO ( m_Prog )
E na rotina de pesquisa

Código: Selecionar todos

cVariable := Upper( ReadVar() )
DO CASE
CASE hb_ASCan( { "IDCADASTRO", "IDCADASTROINI", "IDCADASTROFIM" }, cVariable ) != 0
  jpcadastroClass():GridSelection()
CASE cVariable == "DOCINI" .AND. m_Prog == "PEDRECEBER"
   jpfinanceiroClass():GridSelection()
ENDCASE
Tanto faz se multithread ou não, cada módulo vai ter sua variável m_Prog
Em multithread uso PUBLIC, porque não deixo variável PUBLIC visível entre threads.

Tecla de função (set key )para chamar uma rotina

Enviado: 07 Ago 2020 15:18
por rossine
Olá Vlademiro,

Veja se este exemplo te ajuda, pois via código nativo do clipper/harbour acho que não tem como, pelo menos eu desconheço:

Código: Selecionar todos

#pragma /w2      //de 0 a 3
#pragma /es2     //de 0 a 2

memvar hSetKey
memvar GetList

/////////////
function main
/////////////

local cPar1 := "Ola", nPar2 := 10
local bBlocoF2, cNome

cls

bBlocoF2 := { ||
              KEY_PARAM( "MAIN_cPar1", cPar1 )
              KEY_PARAM( "MAIN_nPar2", nPar2 )
              KEY_PARAM( "MAIN_cNome", cNome )

              MOSTRA_VARIAVEIS()

              LIMPA_PARAM( "MAIN_cPar1" )
              LIMPA_PARAM( "MAIN_nPar2" )
              LIMPA_PARAM( "MAIN_cNome" )
              return NIL
          }

setkey( -1, bBlocoF2 )  // F2 

cNome := pad( "Teste", 20 )

@07, 01 say "Pressione F2 para mostrar o conteudo das variaveis"

@10, 01 say "Nome: " get cNome
read

setkey( -1, NIL )

return NIL

////////////////////////
function MOSTRA_VARIAVEIS
////////////////////////

   ? "cPar1=", hSetKey["MAIN_cPar1"]
   ? "nPar2=", hSetKey["MAIN_nPar2"]
   ? "cNome=", hSetKey["MAIN_cNome"]
   ? "time =", time()

return NIL

////////////////////////////
init procedure INICIA_SETKEY
////////////////////////////

   public hSetKey := hb_hash()

   hb_HCaseMatch( hSetKey, .F. )   // No case sensitive
   hb_HKeepOrder( hSetKey, .T. )  // alphabetical order

//////////////////////////////
exit procedure FINALIZA_SETKEY
//////////////////////////////

   release hSetKey

//////////////////
function KEY_PARAM( cParam, xPar )
//////////////////

   local p

   if ( p := hb_hPos( hSetKey, cParam ) ) > 0
      ? "Atencao a SETKEY [" + cParam + "] ja esta definida. O Sistema sera abortado !!!"
      quit
   else
      hSetKey[cParam] := xPar
   endif

return NIL

////////////////////
function LIMPA_PARAM( cParam )
////////////////////

   local p

   if ( p := hb_hPos( hSetKey, cParam ) ) > 0
       hb_hDelAt( hSetKey, p )
   endif

return NIL

// EOF //

Tecla de função (set key )para chamar uma rotina

Enviado: 07 Ago 2020 17:02
por Vlademiro
Obrigado Quintas e Rossine pela atenção.

Eu acabei resolvendo de outra forma. Parei um pouco, fui ver uns livros velhos que tenho aqui e vi que o
Get tem uma variável interna chamada "cargo", que serve para a gente colocar qualquer coisa lá.

Como o campo de pesquisa está dentro de um Get eu mando os parâmetros para a função através do cargo do get.

Fiz um pequeno exemplo

Código: Selecionar todos


REQUEST HB_CODEPAGE_PTISO
#include "inkey.ch"

PROCEDURE MAIN

    LOCAL GetList := {}
    LOCAL cNome := SPACE(40)
    LOCAL cCodigo := SPACE(3)
    LOCAL cObs := SPACE(40)
    
    hb_CdpSelect( "PTISO" )
    
    CLS
    #ifdef __PLATFORM__WINDOWS
        ? "Setmode : " , SetMode(50,150)
    #endif
  
        
    @ 05,03 SAY "Nome       : " GET cNome
    @ 07,03 SAY "Código     : " GET cCodigo MESSAGE "Pressione F3 para busca"
    @ 09,03 SAY "Observação : " GET cObs
    
    GetList[1]:cargo := "campo nome" // <<<-------- 
    
    SET KEY K_F3 TO JanelaBusca()
    READ MSG AT 20,00,79 MSG COLOR "W+/BG"
    SET KEY K_F3 TO


RETURN
    
FUNCTION JanelaBusca()
    
    //IF READVAR() == "CCODIGO"
        alert( hb_valtoexp( GetActive():cargo() ) )
        ALERT("ATIVANDO BUSCA")
    //ENDIF    

    RETURN .t.
Funciona assim :
(1) Quando o usuário tecla F3 a função JanelaBusca é chamada
(2) Lá eu vejo se o READVAR está ativo e pego o cargo assim : GetActive():cargo()
(3) Para preencher o cargo basta adicionar o valor no Getlist : GetList[1]:cargo := "campo nome"

É só um exemplo, no meu aplicativo o cargo tem um Json, daí consigo mandar muita coisa.

Quando voltei vi a resposta de vcs.
As duas soluções são parecidas e vou guardar aqui para usar quando precisar passar parâmetros através de set key e não estiver em um get.

Obrigado pelo tempo de vcs.