Jump to content
Fivewin Brasil

Saberue nome da rotina


Luiz Fernando

Recommended Posts

Colegas é possivel eu colocar uma tecla de atalho no meu prg principal para chamar uma função que me traga o nome da rotina em que o usuario esta executando.

funciona main()

MENUITEM "Vendas X Fiscal" action opcao1()
SEPARATOR
MENUITEM "Associar Pedido 2" action opcao2()
SEPARATOR
MENUITEM "Desassociar Pedido 2" action opcao3()

return .t.

function opcao1()

// ao chamar a função pela tecla de atalho definido no prg principal ira me trazer o nome OPCAO1()

return .t.

function opcao2()
// ao chamar a função pela tecla de atalho definido no prg principal ira me trazer o nome OPCAO2()

return .t.

function opcao3()

// ao chamar a função pela tecla de atalho definido no prg principal ira me trazer o nome OPCAO3()
return .t.

Obrigado

Link to comment
Share on other sites

Se eu entendi, você quer um comando para ser chamado na tela principal, para identificar qual o comando já chamado pelo cliente?

Se for o caso basta você criar um array bidimensional com o nome das funções e uma flag lógica, ao abrir/fechar cada uma delas marcar inverter essa flag

Exemplo:

aStatus := { {"Vendas X Fiscal", .F.}, {"Associar Pedido 2",.F.}, {"Desassociar Pedido 2",.F.} }


function opcao1(nOpcao)

   //-- Inicio
   aStatus[nOpcao,1] := !aStatus[nOpcao,1]

   //-- Fim
   aStatus[nOpcao,1] := !aStatus[nOpcao,1]

return .t.
 

Link to comment
Share on other sites

  • 5 weeks later...

Obrigado pelo resposta Everton e Samir, o que precisava era colocar uma chamada no inicio do sistema tipo assim:

SETKEY( VK_F12,{|| msgalert(PROCNAME()) } )

e qdo tiver dentro de alguma rotina o usuario pressionar um F12 e mostrar o nome daquela função, mais neste caso sempre parece main() de onde é feito a chamada.

Obrigado

Link to comment
Share on other sites

// This test will show the functions and procedures in stack.
// before executing it.
 
#include "FiveWin.ch"
 
PROCEDURE Main()
 
   LOCAL n := 1
 
   ? ProcName()
 
   DO WHILE ! Empty( ProcName( n ) )
 
      ? ProcName( n++ )
 
 
   ENDDO
 
RETURN

Ola Kapiaba , colocando assim dentro da rotina da certo, mais não tenho como editar todos modulos, por isto queria saber se não existe uma forma de fazer a chamada dentro do prg principal conforme citei acima.

Obrigado

Link to comment
Share on other sites

Pelo que entendi, veja se é isso:

func main()

Private rotina := ProcName()

SETKEY( VK_F12,{ || msgalert( rotina } )

teste()

return

func teste()

rotina = ProcName()

inkey(0)

return nil

JMSILVA obrigado pelo resposta, colega eu estava atras de uma solução aonde não precisava mexer dentro dos modulo, conforme seu exemplo acima a function teste(), pq são mais de 250 modulo e de momento não teria como fazer isto.

Obrigado

Link to comment
Share on other sites

Creio que sim.

Exemplo:

PRINCIPAL = habilita o setkey(VK_F12)

CADCLI = teclar F12

Você quer que exiba em qual código-fonte está o usuário(tipo: CADCLI, CADFOR, CADVEN, etc...)

É isto ?

Colega seria isto, sem que eu tenha que mexer nos código fonte (tipo: CADCLI, CADFOR, CADVEN, etc...)

Obrigado

Link to comment
Share on other sites

Luiz, nos módulos normalmente possui uma função padrão para exibir mensagens ou outro processamento qq, identificando esta função, vc colocaria nela a atribuição da variável, Procname(N) (n=0,1,2,3) provavelmente seria 1 ou 2, já que 0 é da função. Desta forma uma única linha de código resolve o seu problema, acredito eu.

JMSilva

Link to comment
Share on other sites

EMPRESOFT, boa tarde.

No seu fonte principal, insira o setkey, exemplo: SETKEY(VK_V12,{|| _QualRotina("SCL")})

Segue abaixo a função para estudos:

Function _QualRotina(Nomenclatura)

Local cTexto:="",nI:=0

/*

Nomenclatura => O padrão dos seus códigos-fontes, se houver

*/

Do While .T.

If Empty(Procname(nI))

Exit

EndIf

If At(Nomenclatura,Procname(nI)) > 0 .and. Upper(Left(Procname(nI),3)) != "(B)"
cTexto += StrZero(nI,2)+" "+Procname(nI) + CRLF
EndIf

nI ++
Enddo

If ! Empty(cTexto)
Msginfo(cTexto)
EndIf

Return(NIL)

Percebi aqui nos meus testes, de que sempre o PROCNAME(11) é o código atual sendo executado.

Espero ter ajudado.

Abraços,

Leonardo Guimarães.

Link to comment
Share on other sites

Luiz, tente esse

 
#include "FiveWin.ch"  
 
function Main()
 
   SetKey( VK_F2, { || WhereAmI() } ) 
 
   Another()
   
return nil    
 
function Another()        
 
   local oDlg, cTest := Space( 20 )        
 
   DEFINE DIALOG oDlg TITLE "Test"        
 
   @ 1.5, 5 GET cTest
 
   @ 3, 10 BUTTON "Ok"
 
   ACTIVATE DIALOG oDlg CENTERED  
 
return nil 
 
function WhereAmI()
 
   local oCtrl := oWndFromHwnd( GetFocus() )
 
   MsgInfo( "ProcName: " + ProcName( 11 ) + CRLF + ;
            "ProcLine: " + Str( ProcLine( 11 ) ) + CRLF + ;
            "Focused object: " + oCtrl:ClassName() + CRLF + ;
            "Dialog title: " + oCtrl:oWnd:GetText() )
   
return nil   
 
Link to comment
Share on other sites

Amiguinhos,

ProcName() é uma função de debug, que nos ajuda a saber o nome da rotina, procedure ou função num momento em que o runtime está executando o código.

O seu intuito só surtirá efeito se você usar macro substituição.

nOpcao := 2
...
aRotina := { "CADCLI", "CADFOR", "CADVEN" }
...
SETKEY(VK_V12, { || &( aRotina[ nOpcao ] ) } )
...

Analise e implemente.

Link to comment
Share on other sites

Tente isto, vai retornar as posição, ai vc verifica em qual posição (n) aparece a sua rotina




SetKey( VK_F12, {|| VerRotina() } )
Procedure VerRotina()
Local n
Local aDd := { }

For n := 1 To 74
if ! Empty(ProcName( n ) )
AAdd( aDD , StrZero(n,2) + " : " + Trim( ProcName( n ) ) )
endif
Next n

Msglist( aDd )

REturn

Link to comment
Share on other sites


Procedure DebugarMensagem

Local nDebugMsg := 20, i := 0, cDebug := ""

For i := 1 to nDebugMsg

If Empty(AllTrim( ProcName( i ) ))

exit

end

cDebug += Trim( ProcName( i ) ) + " (" + StrTrim( ProcLine( i )) + ")" + Chr(13) + Chr(10)

end

MsgInfo(cDebug)

Return Nil

Link to comment
Share on other sites

  • 2 weeks later...

Pessoal queria agradecer a todos pela ajuda, a dica do Theotokos é a que chegou mais próximo do que preciso, o retorno é uma array, ate tem a informação que preciso, o duro que em cada modulo ele vem num numero de elemento diferente, vou usar uma outra logica para fazer o que preciso aqui.

Obrigado a todos

Link to comment
Share on other sites

Faz o seguinte, crie uma funcao nas suas rotinas com o nome do prg + _ + titulo e ela retorna qual o nome do cadastro.

ex:

Cadastro de clientes => está no PRG cadcli.prg e a funcao chamada no menu é CadCli() dentro deste prg crie uma funcao

FUNCTION CADCLI_TITULO()

Return "Cadastro de Clientes"

Então usando a sugestao do Theotoks vc faz o seguinte:

Procedure VerRotina()
Local n
Local cProc
Local cDesPro := ""
Local cFunc
 
   For n := 1 To 74
       cProc := ProcName( n )
       if ! Empty(cProc)
          cFunc := AllTrim(cProc)+"_TITULO()"
          Try
             cDesPro := &cFunc
          Catch
          End
          If !Empty(cDesPro)
             Exit
          EndIf
          
       endif
   Next n
   
 
REturn cDesPro

Pessoal queria agradecer a todos pela ajuda, a dica do Theotokos é a que chegou mais próximo do que preciso, o retorno é uma array, ate tem a informação que preciso, o duro que em cada modulo ele vem num numero de elemento diferente, vou usar uma outra logica para fazer o que preciso aqui.

Obrigado a todos

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...