Chamando forms a partir de uma String previamente criados

23/04/2020

0

Boa noite,

Tenho uma aplicação com vários Forms previamente criados pela plataforma do deplhi 2010 e são chamados pelo Delphi atraves de um Menu.
Ex:
Cadastro de Clientes:
CadastroCliente:=TcadastroCliente.Create(Self);
CadastroCliente.Showmodal;
CadastroCliente.Release;

Cadastro de Produtos:
CadastroProduto:=TcadastroProduto.Create(Self);
CadastroProduto.Showmodal;
CadastroProduto.Release;

É assim que eu chamo eles na minha aplicação. Agora quero ter um cadastro de opções onde eu vou cadastrar o programa e o Form que deve
ser chamado e criado dinamicamente. Nesta tabela vou ter um titulo e o nome do Form Ex:
Titulo: Cadastro geral de produtos
Form: CadastroProduto
Titulo: Cadastro geral de Clientes
Form: CadastroCliente

Como devo proceder para criar e mostrar estes Forms dinamicamente em tempo de execução.

Obr.
Paulo

Paulo

Responder

Posts

26/04/2020

Emerson Nascimento

tente assim:
procedure TFormPrincipal.CriaFormPeloNome(const FrmNome: string);
var
  FrmClass: TFormClass;
  Frm: TForm;
begin
  try
    FrmClass := TFormClass(FindClass('T'+FrmNome));
    Frm := FrmClass.Create(Application);
    Frm.ShowModal;
    Frm.Release;
  except
    on E:EClassNotFound do
    begin
      ShowMessage('Classe não encontrada.'+Chr(13)+
                  'Para utilização de CriaFormPeloNome() é necessário registrar a classe.');
    end;
  end;
end;

a sintaxe é:
CriaFormPeloNome('CadastroProduto');

para funcionar você precisa registrar a classe. isso é possível adicionando
initialization
  RegisterClass(ClasseDoForm);
em cada formulário, no final do código, imediatamente antes do end.
por exemplo:
no form CadastroProduto:
initialization
  RegisterClass(TCadastroProduto);
no form CadastroCliente:
initialization
  RegisterClass(TCadastroCliente);
e assim por diante, em todos os forms que deseja chamar a partir da função CriaFormPeloNome().
ou, de forma mais simples, registrando os formulários no evento OnCreate do teu form principal. assim você pode registrar todos de uma vez.
procedure TFormPrincipal.FormCreate(Sender: TObject);
begin
  RegisterClass(TCadastroCliente);
  RegisterClass(TCadastroProduto);
  [...]
end;

note que uma forma elimina a outra. se optar por registrar pelo OnCreate do form principal, não é necessário registrar em cada form.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar