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