Criação de Forms Dinamicamente
24/08/2023
0
Tenho vários formulários de consulta que herdam da classe Tform_consulta_padrao, e também tenho vários formulários de cadastro que herdam da classe Tform_cadastro_padrao. A ideia é que, ao clicar em um botão "Inserir" no formulário de consulta, e um formulário de cadastro correspondente seja aberto.
Os nomes dos formulários de consulta e os respectivos formulários de cadastro têm um padrão em seus nomes, como "form_consulta_NOME" e "form_cadastro_NOME". Por exemplo, "form_consulta_paises" e "form_cadastro_paises".
A abordagem que tenho tentado é a seguinte:
No evento do botão "Inserir" no formulário de consulta (btn_inserirClick), eu pego o nome do formulário de consulta.
e armazeno em uma variavel. e renomeio ela:
NomeForm := Self.Name;
Delete(NomeForm, 1, Length('form_consulta_'));
NomeForm := 'form_cadastro_' + NomeForm;
gostaria de uma função que eu passe o nome do form e ele crie ele;
ex: CriaForm(NomeForm); -----> Cria o form_cadastro_paises.
Gostaria de saber se alguém já passou por algo semelhante ou se tem alguma ideia de como posso abordar essa situação de maneira mais eficaz e genérica. Agradeço qualquer ajuda ou sugestão que vocês possam fornecer.
Obrigado!
Qualquer código relevante que você já tentou e informações adicionais sobre as classes e os relacionamentos entre os formulários podem ser incluídos aqui.
Guilherme Lima
Curtir tópico
+ 0Post mais votado
25/08/2023
https://help.market.com.br/delphi/form_-_carregar_a_partir_de_st.htm
Emerson Nascimento
Gostei + 1
Mais Posts
25/08/2023
Arthur Heinrich
O que muitos sistemas fazem, ou podem fazer, é parametrizar o seu formulário, utilizando listas de campos, botões e eventos, que são interpretados, dinamicamente, e sua aplicação constrói o formulário, criando cada um dos componentes baseado nas informações.
Imagine que você quer criar um campo (TEdit) no seu Form1, na posição X = 20 e Y = 15, com largura = 80 e altura = 25. Você faria:
var E : TEdit;
...
E:=TEdit.Create(Form1);
E.Left:=20;
E.Top:=15;
E.Width:=80;
E.Height:=25;
E.Parent:=Form1;
E.Visible:=True;
Ao fazer: E:=TEdit.Create(Form1);
O Form1 passa a ser o "owner" do componente TEdit.
Por ser o owner, ao destruir o form com Form1.Free, ele se encarrega de destruir os componentes.
Já a linha: E.Parent:=Form1;
Indica que o componente TEdit deve ser exibido dentro do Form1. Você pode utilizar outros componentes, como um TPanel, para organizar os componentes, por exemplo.
Se você tiver apenas eventos simples, dá para associar a query que deve ser executada ao se pressionar um botão ou coisa do tipo.
Dá um pouco de trabalho, mas funciona.
Gostei + 0
28/08/2023
Guilherme Lima
https://help.market.com.br/delphi/form_-_carregar_a_partir_de_st.htm
Isso resolveu o meu problema, mas tem um detalhe...
Teria alguma maneira de registrar essas classes dinamicamente em tempo de execução? pois para funcionar do jeito que está agora é preciso registrar no form_cadastro_padrao todas as classes de cadastro a qual ele irá abrir.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)