Quick Tip : Criar Form a partir de uma String - Parte 2
Veja nesta Quick como chamar um form a partir de uma String.
Olá galera, nesta Quick Tips irei mostrar a criação dos métodos que iremos fazer para carregar menu dinamicamente.
Vamos abrir o FrmPrincipal
Iremos dar Uses em uFrmCadastro, para podermos visualizar o CDSForms, e assim fazermos nossa rotina
Adicionaremos as procedures abaixo e o nosso menu, que também será criado dinamicamente.
Private
MenuPrincipal : TMainMenu;
procedure CreateFormByName(const FrmNome: string);
procedure MenuClick(Sender: TObject);
procedure LoadMenu;
onCreate
procedure TFrmPrincipal.FormCreate(Sender: TObject);
begin
{Finalidade : Cria o Menu Principal}
MenuPrincipal := TMainMenu.Create(Self);
{Finalidade : Método para Carregar o Menu}
LoadMenu;
{Finalidade : Alterar o Título da aplicação}
Application.Title := 'DevMedia - Quick Tips';
end;
MenuClick
procedure TFrmPrincipal.MenuClick(Sender: TObject);
Var
strN : String;
begin
{Finalidade : Obtermos um acesso comum para todo os Itens do menu}
try
strN := 'T'+Copy(TMenuItem(Sender).Name,5,Length(TMenuItem(Sender).Name));
CreateFormByName(strN);
except
on E : Exception do
begin
ShowMessage('Erro ao Abrir formulário ' + strN +#13 +
'Erro Original : ' + E.Message +#13+
'Classe Original : ' + E.ClassName);
end;
end;
end;
CreateFormByName
procedure TFrmPrincipal.CreateFormByName(const FrmNome : string);
var
FrmClass : TFormClass;
Frm : TForm;
begin
{Finalidade : Criar o Formulário pelo Nome}
try
FrmClass := TFormClass(FindClass(FrmNome));
Frm:= FrmClass.Create(Application);
Frm.ShowModal;
except
on E: EClassNotFound do
begin
ShowMessage('Classe não encontrada. ' +#13+
'- Possivelmente a mesma não foi registrada.'+#13+
'- Possivelmente a mesma não existe no projeto');
end;
end;
end;
LoadMenu
procedure TFrmPrincipal.LoadMenu;
var
Main, SubM: TMenuItem;
I: Integer;
begin
{Finalidade : Método para Montar o Menu}
I := 0;
FrmCadastro.CDSForms.First;
while not FrmCadastro.CDSForms.Eof do
begin
with MenuPrincipal do
begin
{Verifica se exite a Categoria }
if Items.Find(CDSForms.FieldByName('Categoria').AsString) = nil then
begin
Main := TMenuItem.Create(MenuPrincipal);
Main.Caption := CDSForms.FieldByName('Categoria').AsString;
Main.Name := 'Menu' + CDSForms.FieldByName('Nome').AsString;
Items.Add(Main);
I := Items.IndexOf(Main);
end
else
Main := Items.Find(CDSForms.FieldByName('Categoria').AsString);
{Adiciona o SubItem de uma categoria}
SubM := TMenuItem.Create(Main);
SubM.Name := 'Menu' + CDSForms.FieldByName('Nome').AsString;
SubM.Caption := CDSForms.FieldByName('Descricao').AsString;
Items[I].Add(SubM);
SubM.OnClick := MenuClick;
end;
FrmCadastro.CDSForms.Next;
end;
end;
O exemplo praticamente esta pronto, porém teremos que registrar as classes dos forms, senão termos um erro ao criar nosso formulário, como o seguinte errro abaixo
---------------------------
Debugger Exception Notification
---------------------------
Project Prj_Form_String.exe raised exception class EClassNotFound with message 'Class TFrmAjuda not found'.
---------------------------
Break Continue Help
---------------------------
Para que este erro não aconteça precisamos registrar a classe do form, e faremos isso em cada formulário que quisermos carregar diretamente do menu.
Mas como registrar a classe do meu formulário? Muito simples!!!!
Vou mostrar como registrar nossa classe do FrmFornecedor
unit uFrmFornecedor;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TFrmFornecedor = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmFornecedor: TFrmFornecedor;
implementation
{$R *.dfm}
{Registrarmos a class no próprio formulário}
initialization
RegisterClass(TFrmFornecedor);
end.
Obs : Caso o programador esqueça de registrar a classe temos um tratamento de exceção no código que irá lembrar o mesmo de registrar a classe veja a procedure CreateFormByName
Será exibido a seguinte mensagem
Classe não encontrada.
- Possivelmente a mesma não foi registrada.
- Possivelmente a mesma não existe no projeto
Conclusão, aprendemos como montar um menu dinamicamente, e reaproveitar o mesmo em outros projetos, apensar com este arquivo de XML, nosso menu já esta montado e chamando os forms. Um outro ponto interessante, é que não demos uses em nenhum momento nas units, no caso no FrmPrincipal, a não ser em uFrmCadastro para podermos usar o CDSForms, tendo assim menos acoplamento no nosso projeto.
Fico por aqui e na próxima Quick Tips. Aguardo novos temas, e para os que já me mandaram os temas, estarei preparando as Quicks até o final de Janeiro.
Um abraço
Wesley Y
wyamazack@rwsolution.com.br
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo