Praticamente em qualquer aplicação precisaremos de um MENU DE OPÇÕES.


Como sugestão de uso, o RadCORE traz um menu que é preenchido dinamicamente e que a chamada de cada opção também é feita de forma dinâmica, ou seja, você não precisa codificar nada, apenas informar como será o conteúdo do menu.


Há muitos anos utilizo um "padrão" de nomenclatura que se aplica a praticamente qualquer situação, então, apliquei isso no RadCORE.


- MENU BÁSICOS

- MENU MOVIMENTO

- MENU RELATÓRIOS

- MENU FERRAMENTAS

- MENU OUTROS( ou OPÇÕES )


Para cada opção classificamos mais níveis então, no meu humilde ponto de vista, o 1o. nível do MENU fica mais simples e fácil para o usuário.


Claro que você poderá mudar isso, basta compreender o fluxo da execução.


Entendendo o Processo


No evento Create  do main.pas haverão diversas functions/procedures para configurar toda a tela( estude o código ).


A montagem dinâmica do menu é feita com rc_BuildMainMenu

 que por sua vez executará a montagem individual do menu por categoria:


Como dito anteriormente, esse é o padrão escolhido por mim, estude o código e poderá alterar de acordo com seu necessidade. 


Para cada grupo de opções foi criada uma unit contendo o seu respectivo conteúdo.



> alguns usuários modificaram e transportaram para isso para tabelas mas eu consigo parametrizar melhor e definir "exclusões" usando da forma padrão.



Adicionando ítens 



Importante: a partir da versão 5.0 foi simplificado a criação dos menus mas, toda a estrutura anterior permanece ativa, ou seja,

            você pode continuar usando a função anterior.


procedure rc_BuildMenuItem( pMenuGroup        : string; 

                            pLevel            : integer;

                            pItem             : string

                            ); 


pMenuGroup        : Grupo do menu a ser criado( '' or 'B'asic, 'M'ovement, 'R'eport, 'T'ools, 'O'thers )

pLevel            : Nível do menu a ser criado.

pItem             : Definição da opção do menu a ser criada no seguinte formato: 

                  > rc_BuildMenuItem( 'Descrição da opção param1:aaa param2:aaa' );


Exemplos de definições: 


tbl:              > Tabela no banco de dados que será vinculada a esse ítem.

fld:              > Nome do campo na tabela de restrições( USUARIOS_RESTRICOES ) para controle de permissionamento.

frm:              > Nome do formulário/frame( sem o prefixo padrão ).

ico:              > Ícone fontawesome para ser exibido do lado do ítem.

modal:            > Se este ítem for um FORM, e este precisar ser exibido de forma MODAL.

hide:             > Este ítem ficará oculto se o usuário não for MASTER.

asknew:           > Este ítem perguntará se quer cadastrar outro registro logo após SALVAR um registro anterior.

genid:            > Gerar ou não um novo sequencial ao cadastrar um novo registro.

genid-off:        > Não gerar um novo sequencial ao cadastrar um novo registro. Informar "getpk:" se "genid-off:" for informado.

closebtn:         > Exibir ou não o "( x )" para fechar a aba.

notshow:          > Efetivamente não exibir no menu. Mesmo que o usuário seja MASTER.

master:           > Não exibe no menu se não for MASTER e ao ser clicado, vai exigir senha MASTER.

tag-form:         > Passa uma "tag string" que poderá ser lida pelo formulário para disparar alguma ação.

getpk:            > Informa o campo de sequência da tabela vinculada( tbl: ) pois por padrão, o primeiro campo da chave primária é usado pelo RC como sendo a sequência da tabela vinculada( tbl: ). 

expand:           > Inicia a opção do menu já aberta.

                   



Verifique seus respectivos parâmetros para indicar ao RadCORE a estrutura de cada opção que será criada. Estude o código fonte para ver o que cada opção faz e assim compreender melhor o recurso.





O resultado final ficará da seguin forma:




Vejamos a configuração de algumas opções( de acordo com a lista de parâmetros de "rc_BuildMenuItem" e o padrão de prefixos visto em "Padrões e Convenções" ):


Prefixos padrões:

   FRM_CLASS_PREFIX: Será usado quando o parâmetro "table" não for informado( Padrão: TFrm )

   FRM_CLASS_CRUD_PREFIX: Será usado sempre que o parâmetro "table" for informado( Padrão: TFrmCad )


      Chamada CRUD padrao. O nome do FORM é igual ao da sua tabela respectiva( com prefixo padrão TFrmCad )

 

rc_BuildMenuItem( '',  0, 'Cidades tbl:cidades' );


nota: 

Quando informado o parâmetro "table( tbl: )", o RadCORE compõe o nome da classe do formulário com o prefixo padrão

( Ex: TFrmCadCIDADES )


      Chamada CRUD herdado mas o nome do FORM é diferente do nome da tabela.


rc_BuildMenuItem( 'M', 0, 'PDV tbl:oses frm:PDV' );


nota: 

Quando informado o parâmetro "table( tbl: )" e o parâmetro "form( frm: )", o RadCORE compõe o nome da classe do formulário com o prefixo padrão

( Ex: TFrmCadPDV )


      Chamada CRUD herdado mas o nome do FORM é diferente do nome da tabela e os prefixos padrões estão branco.


rc_BuildMenuItem( 'M', 0, 'PDV tbl:oses frm:TFrmPDV' );


nota: 

Você deve preencher o parâmetro "form ( frm: )" com o nome completo da sua classe.

( Ex: TFrmPDV )


      Chamada SEM CRUD herdado. Não herda de frmBaseCRUD( com prefixo padrão TFrm )


     rc_BuildMenuItem( '',  0, 'Buttons frm:Demo_Buttons ico:fas-dot-circle' );


nota: 

Quando não informado o parâmetro "table( tbl: )", o RadCORE compõe o nome da classe do formulário com o prefixo padrão

( Ex: TFrmDemo_Buttons )


      Chamada de opção de RELATÓRIO( herdado de frmBaseMENUREL )


      rc_BuildMenuItem( 'R', 0, 'Rel. Clientes frm:reportMenuClientes' );


      Chamada de opção com cadastro contínuo e geração direta de sequencial


      rc_BuildMenuItem( 'T', 0, mm.MNU_TOOLS_USERS + ' tbl:usuarios ico:fas-user-cog asknew: ' );


      Chamada de opção sendo FORMULÁRIO MODAL


      rc_BuildMenuItem( '',  0, 'Form ( open MODAL ) frm:DEMOWITHFORMModal ico:fas-dot-circle modal:'  );



Exibindo formulários dinamicamente


Outro recurso útils do sistema de menus do RadCORE é a possibilidade de exibir ou até mesmo iniciar um novo cadastro chamando o formulário de qualquer ponto da sua aplicação.


No demo geral( versão BRASIL/GLOBAL) você encontrará o "frmDEMO_FORMS" e nele exemplos de uso das opções abaixo.




1. Exibindo o formulário:


2. Exibindo o formulário e mostrando o conteúdo de um determinado registro:


3. Exibindo o formulário e mostrando o conteúdo de um determinado registro e iniciando sua edição:


4. Exibindo o formulário e iniciando um novo cadastro:


5. Exibindo o formulário dentro de um Container:


6. Exibindo o formulário com passagem de parâmetro( "tag-form:" ) :


7. Exibindo um FRAME como MODAL:




Assita esse vídeo:

https://youtu.be/EDenS2IdSSI


Estude o evento click do Menu Principal e debug para acompanhar o fluxo de execução e compreender melhor todo o processo.



Fechando um Frame

 

Você pode observar que quando você aciona( abre ) um frame/form( sem ser modal ) ele vai sendo adicionado no controle de abas superior. 


Neste tópico( bsTABS e bsPILL ) foi comentado como funciona essa renderização das abas.


Em alguma situação, você pode escolhe em passar o parâmetro "closebtn:" pra esconder o "X" que fecha o frame diretamente na aba e desejar por um botão dentro desse frame para fechar manualmente. Insira o código abaixo para isso.


if mm.oPgGeneral <> nil then

   mm.oPgGeneral.ActivePage.Close;


Created with the Personal Edition of HelpNDoc: Easily create Qt Help files