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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

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

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

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

Mensagem 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 //
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

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

Mensagem 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.
Responder