Criação de Forms Dinamicamente
24/08/2023
0
Estou tentando criar uma padronização de criação de formulários no Delphi e gostaria de pedir ajuda para entender como posso criar alguns forms de cadastro a partir de formulários de consulta de uma maneira mais genérica. Vou explicar o que estou tentando fazer e como tenho abordado o problema até agora.
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.
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
+ 0
Responder
Post mais votado
25/08/2023
veja se isto te ajuda:
https://help.market.com.br/delphi/form_-_carregar_a_partir_de_st.htm
https://help.market.com.br/delphi/form_-_carregar_a_partir_de_st.htm
Emerson Nascimento
Responder
Mais Posts
25/08/2023
Arthur Heinrich
Uma coisa é criar os arquivos .PAS e .DFM de um formulário, utilizando um modelo que é copiado. Outra coisa é fazer isso e incorporar o formulário ao seu programa, sem a necessidade de compilação.
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.
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.
Responder
28/08/2023
Guilherme Lima
veja se isto te ajuda:
https://help.market.com.br/delphi/form_-_carregar_a_partir_de_st.htm
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.
Responder
Clique aqui para fazer login e interagir na Comunidade :)