Página 1 de 1

MENUITEM - CODEBLOCK

Enviado: 27 Jan 2021 00:14
por tchadrack
Estou tentando criar um menu usando o harbour 3.2 com base em uma tabela que contém nomes dos itens do menu e os métodos que serão chamados ao clicar no item correspondente.
Após ler os dados da tabela tenho dois arrays, digamos, menu1[] e prog1[] sendo que menu1 contém os nomes dos menus e prog1 os nomes dos métodos que serão chamados.
Então estou tentando montar os menus com o código abaixo,

Código: Selecionar todos

for k := 1 to len(menu1)
oItem := MenuItem( menu1[k] ,{|prog1,k|prog1[k]}, , ,) //aqui está o meu problema.
oPopUp:AddItem( oItem )
NEXT
Qual é a maneira correta de fazer isso no clipper / harbour?

Grato,

MENUITEM - CODEBLOCK

Enviado: 27 Jan 2021 02:03
por alxsts
Olá!

Use a função MakeBlock () abaixo:

Código: Selecionar todos


oItem := MenuItem ( menu1 [k], MakeBlock ( prog1 [k] + "()"))
//------------------------------------------------------------------------------
Function MakeBlock( cExpr )

  // Alexandre Santos - 04/06/2007 - 16:11
  // Retornar um code block a partir de uma string fornecida

  Return  &( "{ || " + cExpr + "}" )
//------------------------------------------------------------------------------
  
Como vai fazer de a função do menu exigir parâmetros?

MENUITEM - CODEBLOCK

Enviado: 28 Jan 2021 00:03
por tchadrack
Olá alxsts
Como vai fazer de a função do menu exigir parâmetros?
É um programa antigo, que estou dando manutenção. O antigo programador fez o menu todo na unha mas achei que do jeito que ele fez ficou muito complexo, sendo que a solução usando o menu acima torna tudo muito mais simples e o código fica mais legível.

Tem o método principal que nada mais é que a montagem do menu, onde ele carrega os menus e nome dos métodos, e com base nas permissões do usuário monta o menu de acordo com o usuário.

Fiz usando a função makeblock() e funcionou perfeitamente.

Código: Selecionar todos

Function MakeBlock( cExpr )
 
  // Alexandre Santos - 04/06/2007 - 16:11
  // alxsts (https://pctoledo.org/forum/posting.php?mode=reply&f=4&t=25102 )
  // Retornar um code block a partir de uma string fornecida
 
  Return  &( "{ || " + cExpr + "}" )
O programa está funcionando perfeitamente, mas ao invés de usar o menu original, está usando este. Ainda vou fazer outros testes, mas a princípio parece que tudo está ok.

A título de curiosidade, não seria possível chamar métodos com parâmetros?