Página 1 de 2

pipininhos na rotina devido aos CHs

Enviado: 15 Mai 2025 18:52
por JoséQuintas
Gostei da rotina, o mérito é do Valteçom.
Eu modifiquei tudo pra simplificar, mas a criação da idéia é dele.
Apenas simplifiquei, dependendo do ponto de vista...
mesas.png

Código: Selecionar todos

/*
test codeblock
*/

#include "minigui.ch"

// don't initialize values here
STATIC  nRowPos, nColPos

FUNCTION Main()

   LOCAL aList := {}, nCont, nMesa, cName, bCode

   nColPos := -1
   nRowPos := -1

   FOR nCont = 1 TO 35
      AAdd( aList, nCont + 50 )
   NEXT
	DEFINE WINDOW ( "Form_1" ) ;
		AT 0,0 ;
		WIDTH 1000 ;
		HEIGHT 500 ;
		MAIN;
		TITLE 'Teste de Mesa' ;
		NOSIZE ;
		NOMAXIMIZE

		DEFINE MAIN MENU

        FOR nCont := 1 TO Len( aList )

           // two variables uniques
           FOR EACH nMesa, cName IN ;
              { aList[ nCont ] }, ;
              { "Mesa" + StrZero( nCont,2 ) }

              RowPos()
	           @ nRowPos, nColPos BUTTONEX ( cName ) ;
			        CAPTION "Mesa Nº" + CRLF + StrZero( nMesa, 2 ) ;
			        PICTURE "button.bmp" ;
			        BACKCOLOR GREEN GRADIENTFILL { { 1, GREEN,GREEN } } ;
			        WIDTH 120 ;
			        HEIGHT 60

              bCode := { || MostraMesa( nMesa, cName ) }
              SetProperty( "FORM_1", cName, "ACTION", bCode )
            NEXT
        NEXT

   END WINDOW

   CENTER WINDOW ( "Form_1" )

   ACTIVATE WINDOW ( "Form_1" )

RETURN Nil

STATIC FUNCTION RowPos()

   IF nColPos == -1
      nRowPos := 5
      nColPos := 5
   ELSE
      nColPos += 125
      IF nColPos > GetProperty( "form_1", "width" ) - 200
         nRowPos += 65
         nColPos := 5
      ENDIF
   ENDIF

   RETURN nRowPos

STATIC FUNCTION MostraMesa( nMesa, cName )

   MsgInfo( "Mesa " + StrZero( nMesa, 2 ) + " selecionada" )
   SetProperty( "FORM_1", cName, "BACKCOLOR", RED )
   SetProperty( "FORM_1", cName, "GRADIENTFILL", { { 1, RED, RED } } )

RETURN Nil
Problemas encontrados/solucionados:

1) Codeblock, tem que isolar as variáveis
Usei um FOR/EACH de dois elementos

Código: Selecionar todos

           // two variables uniques
           FOR EACH nMesa, cName IN ;
              { aList[ nCont ] }, ;
              { "Mesa" + StrZero( nCont,2 ) }
2) ACTION transforma em codeblock, não dá pra usar direto
Usei SetProperty( "form_1", cName, "ACTION", bCode )

Código: Selecionar todos

              bCode := { || MostraMesa( nMesa, cName ) }
              SetProperty( "FORM_1", cName, "ACTION", bCode )
3) @ RowPos() interpretado errado devido ao uso de CH
Movi pra linha anterior

Código: Selecionar todos

              RowPos()
	           @ nRowPos, nColPos BUTTONEX ( cName ) ;
			        CAPTION "Mesa Nº" + CRLF + StrZero( nMesa, 2 ) ;
E essa forma de calcular posição, eu usei no DEMOALL da HWGUI, mas lá usei ColPos() porque a coluna vém primeiro
No final tanto faz pra minigui, passou a ser chamada na linha anterior.

Código: Selecionar todos

STATIC FUNCTION RowPos()

   IF nColPos == -1
      nRowPos := 5
      nColPos := 5
   ELSE
      nColPos += 125
      IF nColPos > GetProperty( "form_1", "width" ) - 200
         nRowPos += 65
         nColPos := 5
      ENDIF
   ENDIF

   RETURN nRowPos

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 13:54
por malcarli
Boa tarde Mestre, analisando a sua rotina, seria possível fazer uma função para carregar os menuitem, a partir de um array?


Exemplo: aItens:= {["&1. Cadastro de Empresas"] , [Cmt01()], {[cadastro de clientes], [cmt02()]}}

onde o 1. parametro seria o menuitem e o segundo o action

Obg

Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: marceloalcarli@gmail.com

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 14:17
por JoséQuintas
Olhe aí mesmo, a FIVELIBS.

Caso não saiba, a FIVELIBS que tem na minigui é o DLGAUTO.
O Grigory deu esse nome ao acrescentar na minigui.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 14:39
por JoséQuintas
Em todo caso, com dois níveis:

Código: Selecionar todos

STATIC FUNCTION gui_DlgMenu( xDlg, aMenuList, aAllSetup, cTitle )

   LOCAL aGroupList, cDBF

   gui_DialogCreate( Nil, @xDlg, 0, 0, APP_DLG_WIDTH, APP_DLG_HEIGHT, cTitle,,,.T. )

   DEFINE MAIN MENU OF ( xDlg )
      FOR EACH aGroupList IN aMenuList
         DEFINE POPUP "Data" + Ltrim( Str( aGroupList:__EnumIndex ) )
            FOR EACH cDBF IN aGroupList
               MENUITEM cDBF ACTION frm_funcMain( cDBF, aAllSetup ) ICON "ICOWINDOW"
            NEXT
         END POPUP
      NEXT
   END MENU

   gui_DialogActivate( xDlg )

   RETURN Nil

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 14:40
por malcarli
acho que só deva ter na versão pro, então

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 15:39
por JoséQuintas
Tem sim na normal.

https://github.com/JoseQuintas/hmge_for ... b_hmge.prg

ou no dlgauto

https://github.com/JoseQuintas/dlgauto/ ... b_hmge.prg

A diferença básica é que na hmge só tem esse lib_hmge.prg
No dlgauto tem pra todas as libs.

Ele mudou o nome pra fivelibs, 5 libs, mas deixou só uma kkkk

Tem pra hmg3, hmg extended, oohg, hwgui e originalmente gtwvg não funcional.
Depois entrou pra fivewin também.
É o mesmo aplicativo automático, só muda esse fonte, e compila pra qualquer biblioteca gráfica conhecida.
Executa automático cadastros pros dbfs existentes, com inclusão, alteração, exclusão, etc.
E justamente cria menu para todos os DBFs, usando mais de um se tiver muito dbf.

A função DlgMenu() pega o array com nome/action e gera menu.

Esse estilo de criação de menu é o que uso desde os tempos do Clipper.
Já passou por todas as LIBs conhecidas, e até pelo Visual Basic 6.

Nota: aí é a criação de menu, o array vém de um fonte comum a todas as libs.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 15:47
por JoséQuintas
Pra criar menu o que uso é no estilo daqui MenuOption(), MenuDrop(), MenuUnDrop()
Aqui na hwgui uso pra criar tabpages.
Mas seria igual pra qualquer coisa, menu também, pra qualquer coisa e qualquer lib.

https://github.com/JoseQuintas/hwgui_fo ... emoall.prg

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 16:59
por JoséQuintas
Então......
Pense em recursividade, no que precisa pro menu, e pode criar um de níveis ilimitados.
Não é tão difícil, é só pensar passo a passo, e na vida útil das variáveis.
Tem que pensar no tipo de variável que não vai causar confusão no entendimento do que ela representa.
Isso é importantíssimo, principalmente no codeblock.

Código: Selecionar todos

FOR nCont = 1 TO 10
   ? nCont
   bCode := { || nCont }
NEXT
? nCont
Supondo que o codeblock fosse uma ACTION de menu.
O valor vai ser 11.

Tá errado ?
Lógico que não.
O que está lá no codeblock ?
nCont
O codeblock vai usar a variável nCont

Coisas vão, coisas vém, até que chega o momento de executar o codeblock.
Na execução do codeblock, será usado o valor de nCont no momento da execução.
Quanto será o valor de nCont ?
Quando termina o FOR/NEXT, nCont contém 11, então esse será o retorno.

Supondo um array de programas:

Código: Selecionar todos

aList := { "prog1", "prog2", "prog3" }
FOR nCont = 1 TO 3
   bAction := { || aList[ nCont ] }
NEXT
Mesma coisa.
O codeblock é PRA VARIÁVEL aList[ nCont ]
Qual programa será executado ?
Nenhum, vai dar erro.

Porque ?
O codeblock é alist[ nCont ]
o conteúdo de nCont será 4
aList[ nCont ] vai dar erro porque não existe elemento 4.

Entendeu a dificuldade ?
O codeblock é o que ele contém, NÃO É o que VOCÊ PENSA que ele contém

O codeblock é um pedaço de fonte.
esse pedaço de fonte contém aList[ nCont ]
esse pedaço de fonte NÃO contém alist[1], nem aList[2], nem aList[3]

É só essa a dificuldade de criar menu, ou coisas parecidas.

Mas tem outra coisa que atrapalha, que não dá pra perceber, na MINIGUI.

Código: Selecionar todos

ACTION Eval( bCode )
O arquivo CH da minigui transforma isso em codeblock.
Isso é transformado em { || Eval( bCode ) }
Entendeu ? voltamos ao mesmo problema anterior.
vai ser executada a variável bCODE.
Qual o valor de BCODE?
Ainda não se sabe, com certeza não é o que você acabou de colocar.
Vai ser o valor da variável BCODE de quando for feita a execução.

ACTION é uma coisa do futuro, vai ser executada no futuro.
Você precisa tomar todas as precauções para que quando chegue o futuro, esse conteúdo seja o mesmo.

E na minigui isso se multiplica, porque mesmo tomando todo cuidado com a variável, tem esse detalhe do CH não deixar ver essa transformação em codeblock.

Em último caso, o mais prático seria uma função:

Código: Selecionar todos

CriaOpcaoMenu( cTexto, cCodeBlock )
  MENUITEM cTexto ACTION Eval( cCodeBlock )
  RETURN Nil
O que acontece criando função assim ?
A variável é única, interna da função, o conteúdo dela nunca vai mudar.

Outro jeito que inventei de fazer, e deu certo, é usando FOR/EACH
A variável do FOR/EACH também é única.
Pode usar uma ou mais.
Note que o que o valor pro FOR/EACH será um array, um pra cada variável.

Código: Selecionar todos

FOR nCont = 1 TO 10 // esta variável muda
   FOR EACH A IN { nCont }
      bCode := { || A } // como a variável A é do FOR/EACH, o valor está garantido
   NEXT
NEXT
Desse jeito criamos uma variável A, cujo conteúdo está garantido de ser único a cada passagem for FOR/EACH.

Precisa mais de uma ? Tudo bem....

Código: Selecionar todos

FOR EACH A, B, C, D IN { Nil }, { Nil }, { Nil }, { Nil }
NEXT
Desse jeito criamos 4 variáveis únicas A, B, C, D.

Apenas simbólico, seria parecido com isto, SE ISTO FOSSE POSSÍVEL FAZER:
É APENAS SIMBÓLICO. O FOR/EACH é como criar uma variável local dentro dele.

Código: Selecionar todos

FOR EACH A, B, C, D IN ...
   LOCAL A
   LOCAL B
   LOCAL C
   LOCAL D
NEXT
Pro codeblock isso é o que precisa, isolar o conteúdo do codeblock eternamente.
Tem horas que é mais prático fazer isso do que criar milhares de funções pra resolver todas as situações do aplicativo.

E interessante isso tudo acima.
Apesar de situações específicas, voltamos ao básico da programação: VARIÁVEIS, TIPOS DE VARIÁVEIS, etc.
É usar uma variável, e não deixar que o valor dela seja diferente.

Isso resolve problemas pra ACTION de menus, buttons, e tudo que puder ser clicado ou ter ACTION, ou coisa parecida.
E o que é melhor: sem precisar ficar inventando uma infinidade de nomes diferentes, e complicar tudo ainda mais.

Como é que se cria o menu ? é parecido em todas as LIBs.
Um título principal e as subopções

Código: Selecionar todos

MENUITEM TituloPrincipal
FOR nCont = 1 TO 10
   Subopcao x
NEXT
ENDMENU
Uma rotina simples resolve o menu.
E se tem vários níveis ?
Talvez intessante recursividade, se for um array com sub-elementos.
O que eu uso:

Código: Selecionar todos

{ "NOME", {}, CODEBLOCK }
Se tem subopções, um array no segundo elemento, com mesma estrutura.
Só pensar.... se tem array cheio é um conjunto, senão é opção normal.
O que mudou pra função anterior ? Testar se tem array, e fazer a mesma coisa pra esse nível.
Vai fazer a mesma coisa que a função já faz ? Então só chamar ela mesma.

Código: Selecionar todos

FUNCTION CriaMenu( aOpcao )

   BEGIN MENU
   FOR EACH aItem IN aOpcao
       IF Len( aItem[ 2 ] ) > 0 // segundo elemento é o array de sub-opções, tem subopção?
          MENUITEM aItem[ 1 ] // primeiro elemento é o nome do conjunto
         CriaMenu( aItem[ 2 ] ) // vai fazer tudo de novo pro sub-array
         ENDMENU
      ELSE
         MenuItem aItem[1] ACTION aItem[3] // se é opção sem nível, tem ACTION
      ENDIF
   NEXT
   MENUEND
   RETURN Nil
Fica simples.
aItem é um array interno do FOR/EACH, é único, não vai ter problema de valor alterado no futuro ou na recursividade.
Só trocar a criação de cada item/conjunto pelo jeito de fazer em cada lib gráfica.

Se for tab com tabpages, mesma coisa.
É praticamente o jeito de fazer manual, mas automático.
A atenção principal é sobre ter a variável única em cada execução.

O menu não saiu do jeito que queria ?
Altere a rotina pra mostrar em formato de fonte, algo como gerador de fontes.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 17:14
por JoséQuintas
Como assim gerar fontes ?
Vai ser mais complicado ainda ?
Não.
Como é que faz o fonte manualmente, coloque aí no programa

Código: Selecionar todos

FUNCTION CriaMenu( aOpcao )

   ? [BEGIN MENU]
   FOR EACH aItem IN aOpcao
       IF Len( aItem[ 2 ] ) > 0 // segundo elemento é o array de sub-opções, tem subopção?
          ? [MENU ITEM "] +  aItem[ 1 ] + ["]
          //MENUITEM aItem[ 1 ] // primeiro elemento é o nome do conjunto
         CriaMenu( aItem[ 2 ] ) // vai fazer tudo de novo pro sub-array
         ? [ENDMENU]
      ELSE
         ? [MENUITEM "] + aItem[1] + [" ACTION { || codeblock que não dá pra traduzir }]
         //MenuItem aItem[1] ACTION aItem[3] // se é opção sem nível, tem ACTION
      ENDIF
   NEXT
? [ENDMENU]
   RETURN Nil
Isso acima vai mostrar o texto que seria equivalente ao fonte.
Pode conferir se esqueceu de alguma coisa.
Depois altera pros comandos equivalentes.

Sim, incrível, também criou um gerador de fontes de menu.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 17:46
por JoséQuintas
Teste prático:

rotina pra criar o array, peguei o que fiz pra hwgui

Código: Selecionar todos

STATIC aMenuOptions := {}, nMenuLevel := 0

FUNCTION CreateMenu()

   MenuOption( "Browse" )
      MenuDrop()
      MenuOption( "1.Brw.ADO",                      { || Nil } )
      MenuOption( "2.Brw.Array",                    { || Nil } )
      MenuOption( "3.Brw.DBF",                      { || Nil } )
      MenuOption( "4.Brw.Array Edit",               { || Nil } )
      MenuOption( "5.Brw.BMP",                      { || Nil } )
      MenuOption( "6.Brw.Color",                    { || Nil } )
      MenuOption( "7.Brw.TwoSub",                   { || Nil } )
      MenuOption( "8.Grid1",                        { || Nil } )
      MenuOption( "9.Grid4",                        { || Nil } )
      MenuOption( "10.Grid5",                       { || Nil } )
      MenuUndrop()
   MenuOption( "Button" )
      MenuDrop()
      MenuOption( "1.OwnerButton",                  { || Nil } )
      MenuOption( "2.ShadeButton",                  { || Nil } )
      MenuOption( "3.NiceButton",                   { || Nil } )
      MenuOption( "4.demofunc",                     { || Nil } )
      MenuUnDrop()
   MenuOption( "Choice" )
      MenuDrop()
      MenuOption( "1.Checkbox",                     { || Nil } )
      MenuOption( "2.Combobox",                     { || Nil } )
      MenuOption( "3.Listbox Alt",                  { || Nil } )
      MenuOption( "4.Radiobutton",                  { || Nil } )
      MenuOption( "5.UpDown",                       { || Nil } )
      MenuOption( "6.Two Listbox",                  { || Nil } )
      MenuUnDrop()
   MenuOption( "Dialog" )
      MenuDrop()
      MenuOption( "1.General",                      { || Nil } )
      MenuOption( "2.Night",                        { || Nil } )
      MenuOption( "3.Back image",                   { || Nil } )
      MenuUnDrop()
   MenuOption( "Get/Say" )
      MenuDrop()
      MenuOption( "1.DemoGet2",                     { || Nil } )
      MenuOption( "2.Editbox",                      { || Nil } )
      MenuOption( "3.DateSelect",                   { || Nil } )
      MenuOption( "4.Datepicker",                   { || Nil } )
      MenuUnDrop()
   MenuOption( "Image" )
      MenuDrop()
      MenuOption( "1.DemoImage2",                   { || Nil } )
      MenuOption( "2.demobitmap",                   { || Nil } )
      MenuOption( "3.DemoImage1",                   { || Nil } )
      MenuOption( "4.Image view",                   { || Nil } )
      MenuUnDrop()
   MenuOption( "Menu" )
      MenuDrop()
      MenuOption( "1.menu",                         { || Nil } )
      MenuOption( "2.menuxml",                      { || Nil } )
      MenuOption( "3.modify",                       { || Nil } )
      MenuOption( "4.menubitmap",                   { || Nil } )
      MenuUnDrop()
   MenuOption( "Progbar",                           { || Nil } )
   MenuOption( "Splitter" )
      MenuDrop()
      MenuOption( "1.Split",                        { || Nil } )
      MenuOption( "2.Splitter",                     { || Nil } )
      MenuOption( "3.Tree",                         { || Nil } )
      MenuOption( "4.XML Tree",                     { || Nil } )
      MenuUnDrop()
   MenuOption( "Tab" )
      MenuDrop()
      MenuOption( "1.Lenta",                        { || Nil } )
      MenuOption( "2.Tab",                          { || Nil } )
      MenuOption( "3.Tab/Tooltip",                  { || Nil } )
      MenuOption( "4.Lenta2",                       { || Nil } )
      MenuUnDrop()
   MenuOption( "Trackbar" )
      MenuDrop()
      MenuOption( "1.HTrack",                       { || Nil } )
      MenuOption( "2.Trackbar",                     { || Nil } )
      MenuUnDrop()
   MenuOption( "Tree" )
      MenuDrop()
      MenuOption( "1.Tree",                         { || Nil } )
      MenuOption( "2.Splitter1",                    { || Nil } )
      MenuOption( "3.Splitter2",                    { || Nil } )
      MenuOption( "4.XML Tree",                     { || Nil } )
      MenuUnDrop()
   MenuOption( "Others" )
      MenuDrop()
      MenuOption( "1.AppData",                      { || Nil } )
      MenuOption( "2.Ini Files",                    { || Nil } )
      MenuOption( "3.Dlgbox",                       { || Nil } )
      MenuOption( "4.MonthCal",                     { || Nil } )
      MenuOption( "5.Timer",                        { || Nil } )
      MenuOption( "6.String Rev",                   { || Nil } )
      MenuOption( "7.Functions",                    { || Nil } )
      MenuOption( "8. Compare memo",                { || Nil } )
      MenuUnDrop()
   MenuOption( "NOTES",                             { || Nil } )

    Return aMenuOptions

STATIC FUNCTION MenuOption( cCaption, bCode )

   LOCAL nCont, aLastMenu

   aLastMenu := aMenuOptions
   FOR nCont = 1 TO nMenuLevel
      aLastMenu := aLastMenu[ Len( aLastMenu ) ]
      aLastMenu := aLastMenu[ 2 ]
   NEXT
   AAdd( aLastMenu, { ccaption, {}, bCode } )

   RETURN Nil

STATIC FUNCTION MenuDrop()

   nMenuLevel++

   RETURN Nil

STATIC FUNCTION MenuUndrop()

   nMenuLevel--

   RETURN Nil
fonte pra criar o menu

Código: Selecionar todos

PROCEDURE Main

   LOCAL aOptions

   SetMode(25,80)
   CLS
   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   aOptions := CreateMenu()
   CriaMenu( aOptions )
   SET ALTERNATE OFF
   SET ALTERNATE TO
   Inkey(0)

   RETURN

FUNCTION CriaMenu( aOpcao )

   LOCAL aItem

   ? [BEGIN MENU]
   FOR EACH aItem IN aOpcao
       IF Len( aItem[ 2 ] ) > 0 // segundo elemento é o array de sub-opções, tem subopção?
          ? [MENU ITEM "] +  aItem[ 1 ] + ["]
          //MENUITEM aItem[ 1 ] // primeiro elemento é o nome do conjunto
         CriaMenu( aItem[ 2 ] ) // vai fazer tudo de novo pro sub-array
         ? [ENDMENU]
      ELSE
         ? [MENUITEM "] + aItem[1] + [" ACTION { || codeblock que não dá pra traduzir }]
         //MenuItem aItem[1] ACTION aItem[3] // se é opção sem nível, tem ACTION
      ENDIF
   NEXT
? [ENDMENU]
   RETURN Nil
Pra conferir, o que foi gerado:

Código: Selecionar todos


BEGIN MENU
MENU ITEM "Browse"
BEGIN MENU
MENUITEM "1.Brw.ADO" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Brw.Array" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Brw.DBF" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Brw.Array Edit" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.Brw.BMP" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.Brw.Color" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "7.Brw.TwoSub" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "8.Grid1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "9.Grid4" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "10.Grid5" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Button"
BEGIN MENU
MENUITEM "1.OwnerButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.ShadeButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.NiceButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.demofunc" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Choice"
BEGIN MENU
MENUITEM "1.Checkbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Combobox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Listbox Alt" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Radiobutton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.UpDown" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.Two Listbox" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Dialog"
BEGIN MENU
MENUITEM "1.General" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Night" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Back image" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Get/Say"
BEGIN MENU
MENUITEM "1.DemoGet2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Editbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.DateSelect" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Datepicker" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Image"
BEGIN MENU
MENUITEM "1.DemoImage2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.demobitmap" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.DemoImage1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Image view" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Menu"
BEGIN MENU
MENUITEM "1.menu" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.menuxml" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.modify" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.menubitmap" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENUITEM "Progbar" ACTION { || codeblock que não dá pra traduzir }
MENU ITEM "Splitter"
BEGIN MENU
MENUITEM "1.Split" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Splitter" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Tree" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.XML Tree" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Tab"
BEGIN MENU
MENUITEM "1.Lenta" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Tab" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Tab/Tooltip" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Lenta2" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Trackbar"
BEGIN MENU
MENUITEM "1.HTrack" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Trackbar" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Tree"
BEGIN MENU
MENUITEM "1.Tree" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Splitter1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Splitter2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.XML Tree" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENU ITEM "Others"
BEGIN MENU
MENUITEM "1.AppData" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Ini Files" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Dlgbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.MonthCal" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.Timer" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.String Rev" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "7.Functions" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "8. Compare memo" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
ENDMENU
MENUITEM "NOTES" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
Acho que o BEGIN MENU e ENDMENU precisam sair fora da funçào, e transferir pra principal.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 17:55
por JoséQuintas

Código: Selecionar todos

PROCEDURE Main

   LOCAL aOptions

   SetMode(25,80)
   CLS
   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   aOptions := CreateMenu()

   ? [BEGINMENU]
   CriaMenu( aOptions )
   ? [ENDMENU]
   SET ALTERNATE OFF
   SET ALTERNATE TO
   Inkey(0)

   RETURN

FUNCTION CriaMenu( aOpcao )

   LOCAL aItem

   FOR EACH aItem IN aOpcao
       IF Len( aItem[ 2 ] ) > 0 // segundo elemento é o array de sub-opções, tem subopção?
          ? [MENU ITEM "] +  aItem[ 1 ] + ["]
          //MENUITEM aItem[ 1 ] // primeiro elemento é o nome do conjunto
         ? [BEGINMENU]
         CriaMenu( aItem[ 2 ] ) // vai fazer tudo de novo pro sub-array
         ? [ENDMENU]
      ELSE
         ? [MENUITEM "] + aItem[1] + [" ACTION { || codeblock que não dá pra traduzir }]
         //MenuItem aItem[1] ACTION aItem[3] // se é opção sem nível, tem ACTION
      ENDIF
   NEXT
   RETURN Nil
Acho que agora sim

Código: Selecionar todos


BEGINMENU
MENU ITEM "Browse"
BEGINMENU
MENUITEM "1.Brw.ADO" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Brw.Array" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Brw.DBF" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Brw.Array Edit" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.Brw.BMP" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.Brw.Color" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "7.Brw.TwoSub" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "8.Grid1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "9.Grid4" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "10.Grid5" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Button"
BEGINMENU
MENUITEM "1.OwnerButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.ShadeButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.NiceButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.demofunc" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Choice"
BEGINMENU
MENUITEM "1.Checkbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Combobox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Listbox Alt" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Radiobutton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.UpDown" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.Two Listbox" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Dialog"
BEGINMENU
MENUITEM "1.General" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Night" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Back image" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Get/Say"
BEGINMENU
MENUITEM "1.DemoGet2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Editbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.DateSelect" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Datepicker" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Image"
BEGINMENU
MENUITEM "1.DemoImage2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.demobitmap" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.DemoImage1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Image view" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Menu"
BEGINMENU
MENUITEM "1.menu" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.menuxml" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.modify" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.menubitmap" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENUITEM "Progbar" ACTION { || codeblock que não dá pra traduzir }
MENU ITEM "Splitter"
BEGINMENU
MENUITEM "1.Split" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Splitter" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Tree" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.XML Tree" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Tab"
BEGINMENU
MENUITEM "1.Lenta" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Tab" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Tab/Tooltip" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Lenta2" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Trackbar"
BEGINMENU
MENUITEM "1.HTrack" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Trackbar" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Tree"
BEGINMENU
MENUITEM "1.Tree" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Splitter1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Splitter2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.XML Tree" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENU ITEM "Others"
BEGINMENU
MENUITEM "1.AppData" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Ini Files" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Dlgbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.MonthCal" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.Timer" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.String Rev" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "7.Functions" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "8. Compare memo" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
MENUITEM "NOTES" ACTION { || codeblock que não dá pra traduzir }
ENDMENU
É conferir os comandos.
HWGUI, FIVEWIN, MINIGUI, tem horas que confundo tudo....
É confirmar se bate com o que a LIB exige.
Bateu... ao invés de fazer ? texto, troca pelo comando.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 18:05
por JoséQuintas
Conferi pra minigui.

Código: Selecionar todos

PROCEDURE Main

   LOCAL aOptions

   SetMode(25,80)
   CLS
   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   aOptions := CreateMenu()

   ? [BEGIN MAIN MENU OF xDlg]
   CriaMenu( aOptions )
   ? [END MENU]
   SET ALTERNATE OFF
   SET ALTERNATE TO
   Inkey(0)

   RETURN

FUNCTION CriaMenu( aOpcao )

   LOCAL aItem

   FOR EACH aItem IN aOpcao
       IF Len( aItem[ 2 ] ) > 0 // segundo elemento é o array de sub-opções, tem subopção?

          ? [DEFINE POPUP "] +  aItem[ 1 ] + ["]

         CriaMenu( aItem[ 2 ] ) // vai fazer tudo de novo pro sub-array

         ? [END POPUP]

      ELSE

         ? [MENUITEM "] + aItem[1] + [" ACTION { || codeblock que não dá pra traduzir }]

      ENDIF
   NEXT

   RETURN Nil
resultado

Código: Selecionar todos


BEGIN MAIN MENU OF xDlg
DEFINE POPUP "Browse"
MENUITEM "1.Brw.ADO" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Brw.Array" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Brw.DBF" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Brw.Array Edit" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.Brw.BMP" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.Brw.Color" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "7.Brw.TwoSub" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "8.Grid1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "9.Grid4" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "10.Grid5" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Button"
MENUITEM "1.OwnerButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.ShadeButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.NiceButton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.demofunc" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Choice"
MENUITEM "1.Checkbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Combobox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Listbox Alt" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Radiobutton" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.UpDown" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.Two Listbox" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Dialog"
MENUITEM "1.General" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Night" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Back image" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Get/Say"
MENUITEM "1.DemoGet2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Editbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.DateSelect" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Datepicker" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Image"
MENUITEM "1.DemoImage2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.demobitmap" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.DemoImage1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Image view" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Menu"
MENUITEM "1.menu" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.menuxml" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.modify" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.menubitmap" ACTION { || codeblock que não dá pra traduzir }
END POPUP
MENUITEM "Progbar" ACTION { || codeblock que não dá pra traduzir }
DEFINE POPUP "Splitter"
MENUITEM "1.Split" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Splitter" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Tree" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.XML Tree" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Tab"
MENUITEM "1.Lenta" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Tab" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Tab/Tooltip" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.Lenta2" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Trackbar"
MENUITEM "1.HTrack" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Trackbar" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Tree"
MENUITEM "1.Tree" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Splitter1" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Splitter2" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.XML Tree" ACTION { || codeblock que não dá pra traduzir }
END POPUP
DEFINE POPUP "Others"
MENUITEM "1.AppData" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "2.Ini Files" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "3.Dlgbox" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "4.MonthCal" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "5.Timer" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "6.String Rev" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "7.Functions" ACTION { || codeblock que não dá pra traduzir }
MENUITEM "8. Compare memo" ACTION { || codeblock que não dá pra traduzir }
END POPUP
MENUITEM "NOTES" ACTION { || codeblock que não dá pra traduzir }
END MENU
Agora é criar uma dialog e alterar pra comandos pra ver o que dá.

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 18:44
por JoséQuintas
kkkkkkkkkkkkk

Demorei pra descobrir que faltou END WINDOW depois do DEFINE WINDOW kkkkk

Acusava estrutura incompleta.... e eu pensando que era erro na rotina de menu kkkkkk

Ok, precisei fazer alguns ajustes nos comandos. Aqueles gerados em TXT não estavam corretos.

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO

#include "minigui.ch"

PROCEDURE Main

   LOCAL aOptions, xDlg := "TEST"

   Set( _SET_CODEPAGE, "PTISO" )

   DEFINE WINDOW (xDlg) ;
      AT 0, 0 ;
      WIDTH 1024 ;
      HEIGHT 768 ;
      TITLE "test" ;
      MAIN

   END WINDOW

   aOptions := ze_CreateMenu()

   DEFINE MAIN MENU OF ( xDlg )
   CriaMenu( aOptions )
   END MENU

   DoMethod( xDlg, "CENTER" )
   DoMethod( xDlg, "ACTIVATE" )

   RETURN

FUNCTION CriaMenu( aOpcao )

   LOCAL aItem

   FOR EACH aItem IN aOpcao
       IF Len( aItem[ 2 ] ) > 0 // segundo elemento é o array de sub-opções, tem subopção?

         DEFINE POPUP aItem[ 1 ]

         CriaMenu( aItem[ 2 ] ) // vai fazer tudo de novo pro sub-array

         END POPUP

      ELSE

         MENUITEM aItem[1] ACTION { || Nil }

      ENDIF
   NEXT

   RETURN Nil
menuhmg.png
Lembrando:
São os dois fontes, este e o anterior.

DETALHE INESPERADO:
A HMG já tem uma função CreateMenu()
Mudei o nome pra ze_CreateMenu()

Aliás... está aí uma coisa muuuuuuito interessante....
BLINKER não iria avisar sobre isso.

No que cria o array, alterar o nome:

Código: Selecionar todos

STATIC aMenuOptions := {}, nMenuLevel := 0

FUNCTION Ze_CreateMenu()

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 18:52
por JoséQuintas
A resolver:
Quando o principal não tem divisões
Deve ter um jeito diferente de fazer... ou não existe a opção

Código: Selecionar todos

   MenuOption( "teste", { || Nil } )

pipininhos na rotina devido aos CHs

Enviado: 16 Mai 2025 18:55
por JoséQuintas
Teste adicional: mais níveis.
Usei copiar/colar no array

Código: Selecionar todos


FUNCTION Ze_CreateMenu()

   MenuOption( "Browse" )
      MenuDrop()
      MenuOption( "1.Brw.ADO",                      { || Nil } )
      MenuOption( "2.Brw.Array",                    { || Nil } )
      MenuOption( "3.Brw.DBF",                      { || Nil } )
      MenuOption( "4.Brw.Array Edit",               { || Nil } )
      MenuOption( "5.Brw.BMP",                      { || Nil } )
         MenuDrop()
         MenuOption( "1.OwnerButton",                  { || Nil } )
         MenuOption( "2.ShadeButton",                  { || Nil } )
            MenuDrop()
            MenuOption( "1.OwnerButton",                  { || Nil } )
            MenuOption( "2.ShadeButton",                  { || Nil } )
            MenuOption( "3.NiceButton",                   { || Nil } )
            MenuOption( "4.demofunc",                     { || Nil } )
            MenuUnDrop()
         MenuOption( "3.NiceButton",                   { || Nil } )
         MenuOption( "4.demofunc",                     { || Nil } )
         MenuUnDrop()
      MenuOption( "6.Brw.Color",                    { || Nil } )
      MenuOption( "7.Brw.TwoSub",                   { || Nil } )
      MenuOption( "8.Grid1",                        { || Nil } )
      MenuOption( "9.Grid4",                        { || Nil } )
      MenuOption( "10.Grid5",                       { || Nil } )
      MenuUndrop()
   MenuOption( "Button" )
maisopc.png