Eval no Clipper 5.3 roda, no Harbour não

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

Moderador: Moderadores

microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por microvolution »

ah!
se eu apenas mudar uma das linhas para:

Código: Selecionar todos

oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )
aí o erro encerra.
Mas, o clique no mouse nada faz!
??? :%
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

Aff

Como dizia o gerente do shopping Eldorado de Santos... Porr... Caralh... essa merd... tá fod....

De novo....

seu menu tem isto: "PCI10001()"

Código: Selecionar todos

Eval( "PCI10001()" )
Não adianta postar quilômetros de fonte aqui, não adianta falar que copiou rotina, não adianta falar que é WVG...

O resultado de tudo é isto, e isto não funciona:

Código: Selecionar todos

Eval( "PCI10001()" )
Porque não funciona? porque Eval() é pra codeblock e isso não é codeblock.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

Vamos simplificar?

Já não tem seu menu original que funciona?
Porque não copia dele o que já funciona?
Porque insiste em copiar outra rotina feita pra outro menu?

Como faz no menu velho?

usa &( nome ) no velho?
Então usa &( nome ) no novo

usa Do( nome ) no velho?
Então usa do( nome ) no novo

usa Eval( nome ) no velho?
Então usa Eval( nome ) no novo.

usa &( nome + "()" ) no velho?
Então usa &( nome + "()" ) no novo

usa &( [ { || Executa_Prog( "] + nome + [" ) }] ) no velho?
então usa &( [ { || Executa_Prog( "] + nome + [" ) }] ) no novo.


Cada um funciona de um jeito, cada um funciona conforme o parâmetro recebido, UM NÃO FUNCIONA PARA O PARÂMETRO NO FORMATO DO OUTRO.
Qual a dúvida?

É igual somar 1 + "A", isso não funciona, os parâmetros são diferentes. Como corrigir?
Sei lá... quem fez o fonte deveria saber. Pode ser 1 errado, pode ser "A" errado, pode ser que era pra somar números, pode ser que era pra somar letras, pode ser que era pra somar o ASCII, como é que eu vou saber? Fazer funcionar é uma coisa, corrigir é outra.
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/
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por MSDN »

Só para lembrar, o Fórum é para quem sabe programar, portanto, tirar dúvidas de programadores, e não ensinar alguém a programar !
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

Ou vamos simplificar:
Porque não adiciona um item de cada vez?

Código: Selecionar todos

AddItem( texto, codeblock )
AddItem( texto, codeblock )
AddItem( texto, codeblock )
AddItem( texto, codeblock )
AddItem( texto, codeblock )
AddItem( texto, codeblock )
Que eu saiba, vai apenas testar, então apenas faça o teste, nem precisa do menu inteiro pra testar.

O pior de tudo:
quando o menu funcionar é que vão começar as perguntas, porque nada mais do aplicativo vai funcionar.
Eu já sei disso, e já avisei, mas parece que não adianta escrever....
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

menuwvg.png

Código: Selecionar todos

PROCEDURE Main

   LOCAL oMenu, oSubMenu, oSubMenu2

   SetMode( 30, 90 )
   CLS
   oMenu := wvgSetAppWindow():MenuBar()

   oMenu:AddItem( "teste 1", { || Teste() } )
   oMenu:AddItem( "teste 2", { || Teste() } )
      // cria submenu de oMenu
      oSubMenu := wvgMenu():New( oMenu, , .T. ):Create()
      oSubMenu:AddItem( "teste 3, 1 ", { || Teste() } )
      oSubMenu:AddItem( "teste 3, 2 ", { || Teste() } )
         // cria submenu de oSubMenu
         oSubMenu2 := wvgMenu():New( oSubMenu, , .T. ):Create()
         oSubMenu2:AddItem( "teste 3, 3, 1 ", { || Teste() } )
         oSubMenu2:AddItem( "teste 3, 3, 2 ", { || Teste() } )
         oSubMenu2:AddItem( "teste 3, 3, 3 ", { || Teste() } )
         // criou, agora adiciona
         oSubMenu:AddItem( oSubMenu2, "teste 3, 3" )
      // continua adicionando
      oSubMenu:AddItem( "teste 3, 4 ", { || Teste() } )
      oSubMenu:AddItem( "teste 3, 5 ", { || Teste() } )
      // criou, agora adiciona
      oMenu:AddItem( oSubMenu, "teste 3" )
   // continua adicionando
   oMenu:AddItem( "teste 4", { || Teste() } )
   oMenu:AddItem( "teste 5", { || Teste() } )
   oMenu:AddItem( "teste 6", { || Teste() } )
   DO WHILE Inkey(0) != 27
   ENDDO

   RETURN

FUNCTION Teste()

   wapi_MessageBox( ,"teste", "teste" )

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

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

Agora pentelhar com um menu mais simples....
imagemmenu.jpg
Quem quer apostar que ele vai perguntar como faz?
Seria normal ele perguntar, mas não quando ele já sabe fazer.... kkkk
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por microvolution »

JQuintas, funcionou assim:

Código: Selecionar todos

MenuOption(HB_AnsiToOem("Orçamento ~Simplificado"),{||PCI10001()})
Mas, no caso, já executa o codbloque dentro desta linha:

Código: Selecionar todos

oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )
Ou seja, já executa automatimente sem o EVAL ou sem a minha função EXECUTA_PROGRAMA_WVG.
Aí assim funciona e ao retornar ao menu principal, tenta executar novamente:

Código: Selecionar todos

MenuOption(HB_AnsiToOem("Orçamentos"),{|| EXECUTA_PROGRAMA_WVG (PCI10001())})
Antes de abrir o PCI10001() preciso executar algumas funções tipo: CLOSE ALL e desta forma:

Código: Selecionar todos

oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )
não é possível, pois o additem("prompt","ação") já executa automaticamente ao clique do mouse.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

microvolution escreveu:Mas, no caso, já executa o codbloque dentro desta linha:

oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )

Ou seja, já executa automatimente sem o EVAL ou sem a minha função EXECUTA_PROGRAMA_WVG.
Impossível.
Antes de abrir o PCI10001() preciso executar algumas funções tipo: CLOSE ALL e desta forma:

oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )

não é possível, pois o additem("prompt","ação") já executa automaticamente ao clique do mouse.
Já conseguiu executar um módulo? não? então primeiro faça funcionar.
Precisa executar algumas coisas? coloque dentro do PCI10001() ExecutarAlgumasCoisas()

Só depois de fazer funcionar uma opção do menu é que vai pensar nas outras opções.
Este deveria ter sido o primeiro teste de todos.
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/
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por MSDN »

A questão é que nosso amigo não quer tirar uma dúvida, ele quer que alguém faça por ele.
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por microvolution »

JoséQuintas escreveu:oMenu:AddItem( acMenu[ nCont, 1 ] , bCode )
está executando sim. basta clicar no mouse sobre a sub-opção desejada que executa sem o EVAL. Como está lá no exemplo da pasta contrib\gwvg\tests\demowvg.PRG/EXE e comparando com o q vc gentilmente me ajudou como sempre.
JoséQuintas escreveu:Já conseguiu executar um módulo? não? então primeiro faça funcionar.
sim. já funciona. Mas, para funcionar corretamente tenho que colocar um CLOSE ALL e HIDE nos pusbhuttons.
Como é uma coisa que precisa ser genérica pra todos, se eu entrar em todos os PCIxxxx(s) além de dar muito trabalho desnecessário, não funcionará mais o menu clipper antigo.
JoséQuintas escreveu:Este deveria ter sido o primeiro teste de todos.
posso não ter compreendido a métrica correta, mas, este sempre foi e é o desejo: testar um, pra depois ir para o próximo passo.
Por favor, veja as 2 telas. uma antes de clicar e outra depois de clicado:
19-0305 - teste de funcionalidade 1.png
19-0305 - teste de funcionalidade 2.png
Está funcionando. as linhas do seu exemplo que alterei e entendi que fazem o funcionamento são:

Código: Selecionar todos

MenuOption(HB_AnsiToOem("Orçamento")               ,{||PCI10001()})

Código: Selecionar todos

bCode := acMenu[ nCont, 3 ] // LINHA QUE REALMENTE FUNCIONA ATÉ AGORA 5/3/19w
oMenu:AddItem( acMenu[ nCont, 1 ] , bCode)
Só q os botões não poderiam continuar no PCI10001. Se fosse só nele, fácil, vou lá bem no início - após as declarações LOCALs e encerrava os botões.
Mas, daí a necessidade de uma função. a função EXECUTA_PROGRAMA_WVG() que faz o que tem que ser feito.
Por hora, pra não haver erro de abertura duplicada dos arquivos DBF/NTX colquei bem abaixo da linha acima, a seguinte linha:

Código: Selecionar todos

close all // acrescentado para fechar todos os arquivos e não dar erro DBF já aberto.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por JoséQuintas »

Precisa então de executar antes, e executar depois.

Ok.

Pra não precisar mexer em muita coisa, criar um novo codeblock, com as duas rotinas antes/depois.

Código: Selecionar todos

cDescricao := acMenu[ nCont, 1 ]
bCode       := acMenu[ nCont, 3 ]
bCode := { || ExecutaAntes(), Eval( bCode ), ExecutaDepois() }
oMenu:AddItem( cDescricao, bCode )
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por microvolution »

JoséQuintas escreveu:Precisa então de executar antes, e executar depois.
prezado fiz como sugerido e o conteúdo das 2 funções novas ficou assim:

Código: Selecionar todos

function EXECUTAANTES()
     fDESTROI_BOTOES()
     set key TECLA_UTIL to UTIL_PROG
     close all
return nil
function EXECUTADEPOIS ()
     ABRE_ARQ_ACESSO ()
     set key TECLA_HELP to
     set key TECLA_UTIL to
     fCRIA_BOTOES('PCI10000')
return nil
infelizmente ambas as funções no novo codeblock travam o sistema por alguns segundos que fecha em seguida. Mas, abrir o módulo, isso não acontece.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por microvolution »

desta forma funcionou:

Código: Selecionar todos

         cDescricao  := acMenu[ nCont, 1 ]
         bCode       := acMenu[ nCont, 3 ]
         // bCode := { || Executa_Antes_wvg(),  eval(bCode) , Executa_Depois_wvg() }
         oMenu:AddItem( cDescricao, bCode )
eliminei o novo bcode e alterei a linha abaixo:

Código: Selecionar todos

// MenuOption(HB_AnsiToOem("Orçamento")               ,{||PCI10001()})
para a seguinte linha:

Código: Selecionar todos

MenuOption(HB_AnsiToOem("Orçamentos")              ,{|| ExecutePrg_wvg({||PCI10001()})})
a função executePrg_wvg() ficou assim:

Código: Selecionar todos

static FUNCTION ExecutePrg_wvg( PROGRAMA )
     fDESTROI_BOTOES()
     set key TECLA_UTIL to UTIL_PROG
     close all // não funcionou 17/12/15w
     WvgSetAppWindow():oMenu := nil // linhas oferecidas pelo JQuintas para remover o menu.

     eval (PROGRAMA)

     ABRE_ARQ_ACESSO ()
     set key TECLA_HELP to
     set key TECLA_UTIL to
     fCRIA_BOTOES('PCI10000')
RETURN NIL // ExecutePrg_wvg
funcionando beleza. Coloquei temporariamente a função WvgSetAppWindow():oMenu := nil até entender ou encontrar uma que seja do tipo HIDE para que o usuário não clique no menu e gere erros.
Como no modo console o usuário não consegue abrir várias telas/janelas, se o menu continuar habilitado gerará os tais erros que o nobre JoséQuintas já havia pre-dito.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Eval no Clipper 5.3 roda, no Harbour não

Mensagem por microvolution »

obs.: apesar de se clicar no menu em qualquer opção, abre sem erro. Fica uma atrás da outra.
à medida que vai se dando ESC vai se retornando uma a uma.
Mas, mesmo assim, prefiro um HIDE ou ENABLED .f. ou DESABLED. no WvgSetAppWindow():oMenu - se houver.
vou estudar aqui nos fontes da pasta contrib\gtwvg\tests\demowvg.prg pra ver se encontro alguma coisa.
Poucos exemplos da wvg.
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Responder