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