Neste artigo será mostrada uma forma para otimizar as chamadas aos formulários de uma aplicação, realizada geralmente por itens de menu. É comum perceber em sistemas tradicionais chamadas estáticas a determinado formulário da aplicação relacionado ao evento onclick do item de menu, como segue:
procedure TForm1.Item1Click(Sender: TObject);
begin
if Form2 = nil then
Form2 := TForm2.Create(Application);
Form2.Show;
end;
procedure TForm1.Item2Click(Sender: TObject);
begin
if Form3 = nil then
Form3 := TForm3.Create(Application);
Form3.Show;
end;
A forma de chamada acima está correta, mas atente aos seguintes fatos:
- Código repetitivo nas chamadas aos formulários (só muda a variável FormX);
- Quanto maior o número de formulários maior a extensão e codificação da unit;
Para que os fatos descritos acima não existam utilizaremos 2(dois) recursos para a sua otimização:
- Criação de um único método nas chamadas a formulários para o evento OnClick dos itens de menu;
- Utilização da função GetClass para buscar a referência a classe desejada.
Criando o método para o TMenuItem
Iremos criar a definição do método LoadForm, do tipo TNotifyEvent, na seção protected do formulário principal,como segue:
protected
LoadForm(Sender: TObject);
Antes de implementar o código para o método LoadForm, iremos referenciar o método ao evento OnClick dos itens de menu existentes na aplicação, para que seja carregado dinamicmente o formulário desejado. Como podem existir itens de menu que não fazem a chamada a formulários, indicaremos através da propriedade Tag o valor correspondente para atribuir o método ao evento OnClick do item de menu. Para isso no evento OnCreate do formulário principal adicionaremos as seguintes linhas de código:
procedure TForm1.OnCreate(Sender:TObject)
var
vI, vJ: integer;
begin
for vI:= 0 to MainMenu1.Items.Count - 1 do
for vJ := 0 to TMenuItem(MainMenu1.Items[vI]).Count - 1 do
begin
if TMenuItem(MainMenu1.Items[vI]).Items[vJ].Tag = 1 then
TMenuItem(MainMenu1.Items[vI]).Items[vJ].OnClick := LoadForm;
end
end;
No código acima, estamos percorrendo todos os itens de menu existente o objeto TMainMenu da aplicação e verificamos o valor da propriedade Tag(= 1), e atribuímos ao evento o procedimento LoadForm. Com isto já estamos ganhando a vantagem de termos um único método para realizar a chamada aos formulários sem precisar codificar o evento OnClick de cada item de menu necessário.
Agora iremos implementar o método LoadForm, que servirá para carregar o formulário de acordo com o item de menu corrente. Será um método único para realizar a chamada para todos os formulários necessários dispostos no menu principal da aplicação. Para isso utilizaremos a função GetClass da unit Classes para obter a referência da classe passada através da string ‘T’(Padrão para iniciar nome de classe) + a proprieade name do item de menu atual. Após obter a referência é verificada se a classe já está instanciada ou não, para apenas realizar a sua visualização(Show) ou também realizar a sua criação(Create).
Segue abaixo a codificação do método após ter sido ativado a sua implementação com Ctrl+Shift+C.
procedure TForm1.LoadForm(Sender:TObject)
var
vClass: TPersistentClass;
vForm: TForm;
begin
vClass := GetClass(‘T’ + TMenuItem(Sender).Name);
if vClass <> nil then
begin
vForm := TForm(FindGlobalComponent(TMenuItem(Sender).Name));
if vForm = nil then
vForm := TFormClass(vClass).Create(nil);
vForm.Show;
end;
end;
Imaginem agora uma aplicação com 50(cinquenta) chamadas a formulários no menu principal realizada no modo tradicional! Haveria uma imensa codificação na unit além da referência a cada unidade de cada formulário na seção uses. Com o exemplo exposto apenas um único metodo é necessário sem a necessidade de referenciar qualquer formulário na unidade principal.
sexta-feira, 27 de novembro de 2009
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário