Luiz Fernando Posted April 11, 2016 Report Share Posted April 11, 2016 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 Quote Link to comment Share on other sites More sharing options...
evertonlb Posted April 11, 2016 Report Share Posted April 11, 2016 Não sei se entendi.. mas acho que o PROCNAME() pode lhe ajudar nisso. Att. Everton Theotokos 1 Quote Link to comment Share on other sites More sharing options...
sambomb Posted April 12, 2016 Report Share Posted April 12, 2016 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 flagExemplo: 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. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted May 11, 2016 Author Report Share Posted May 11, 2016 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 11, 2016 Report Share Posted May 11, 2016 #include "FiveWin.ch" PROCEDURE Main() ? ProcFile() ? ProcFile( NIL ) ? ProcFile( 2 ) RETURN Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 11, 2016 Report Share Posted May 11, 2016 #include "FiveWin.ch" PROCEDURE Main() ? ProcLine( 0 ) ? ProcName( 2 ) RETURN Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 11, 2016 Report Share Posted May 11, 2016 // 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 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted May 11, 2016 Author Report Share Posted May 11, 2016 // 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 11, 2016 Report Share Posted May 11, 2016 Desconheço. Que eu sepa, você pode chamar o nome da funcão. SETKEY( VK_F12,{ || msgalert( HELP() ) } Sorry() Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted May 12, 2016 Report Share Posted May 12, 2016 Pelo que entendi, veja se é isso: func main()Private rotina := ProcName()SETKEY( VK_F12,{ || msgalert( rotina } )teste()returnfunc teste()rotina = ProcName()inkey(0)return nil Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted May 12, 2016 Author Report Share Posted May 12, 2016 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 Quote Link to comment Share on other sites More sharing options...
leo@lhsistemas.com Posted May 12, 2016 Report Share Posted May 12, 2016 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 ? Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted May 12, 2016 Author Report Share Posted May 12, 2016 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 Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted May 14, 2016 Report Share Posted May 14, 2016 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 Quote Link to comment Share on other sites More sharing options...
leo@lhsistemas.com Posted May 16, 2016 Report Share Posted May 16, 2016 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 ++EnddoIf ! Empty(cTexto) Msginfo(cTexto)EndIfReturn(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. Quote Link to comment Share on other sites More sharing options...
aferra Posted May 18, 2016 Report Share Posted May 18, 2016 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 Quote Link to comment Share on other sites More sharing options...
rochinha Posted May 18, 2016 Report Share Posted May 18, 2016 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. Quote Link to comment Share on other sites More sharing options...
Theotokos Posted May 18, 2016 Report Share Posted May 18, 2016 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 Quote Link to comment Share on other sites More sharing options...
sambomb Posted May 24, 2016 Report Share Posted May 24, 2016 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 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 2, 2016 Author Report Share Posted June 2, 2016 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 Quote Link to comment Share on other sites More sharing options...
emotta Posted June 2, 2016 Report Share Posted June 2, 2016 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.