Fórum Otimização de chamadas a formularios #348565
06/11/2007
0
Estou testando o seguinte arqtigo do Cristiano Testaí:
Otimizando chamadas a formulários
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 dinamicamente 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 no 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 propriedade 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 (cinqüenta) 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 método é necessário sem a necessidade de referenciar qualquer formulário na unidade principal.
Só que não funciona.
O que está errado?
Atenciosamente
Rogério Barbosa
Rozelo
Curtir tópico
+ 0Posts
06/11/2007
Comodelphi
método: RegisterClass. Os forms que vc pretende criar por esse método devem ser registrados com esse método. Pode tentar colocar na seção Initialization da unit dos forms. boa sorte.
Gostei + 0
08/11/2007
Rozelo
Voce estava com a razão. Coloque na initialization do formulário chamado
o registro da classe do mesmo (RegisterClasse(TFrmFormulario); e funcionou corretamente.
Abraços
Rogerio
Gostei + 0
10/11/2007
Storm_x
http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=418&mode=thread&order=0&thold=0
Até.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)