Função FindClass
Olá,
estou seguindo o artigo ´Função FindClass´ publicado por Everson Borges Volaco para fazer a chamada dos formulários de minha aplicação. Fiz todos os passos no fomato SDI e funcionou perfeitamente. Agora estou mudando para o formato MDI, colocando meu formulário principal como MDIForm e os demais como MDIChild.
Alterei a função CriarForm para a seguinte maneira:
procedure TfrmPrincipal.CriarForm(const ClasseForm : String);
var
Classe : TFormClass;
Objeto : TObject;
begin
Objeto := nil;
Classe := TFormClass(FindClass(ClasseForm));
if not Assigned(Objeto) then
Objeto := Classe.Create(nil);
try
if (Objeto is TForm) then
(Objeto as TForm).Show; //Ao invés do ShowModal conforme seu artigo coloquei somente Show.;
finally
FreeAndNil(Objeto);
end;
end;
Não sei o que estou fazendo de errado mais os meus formulários não abrem dessa maneira. Quando mando abri-los eles aparecem e fecham em seguida, tudo muito rapidamente, e nenhum erro é retornado;
Se alguém puder me ajudar.
Obrigado.
Marcelo. MSN: mascotepc@hotmail.com
estou seguindo o artigo ´Função FindClass´ publicado por Everson Borges Volaco para fazer a chamada dos formulários de minha aplicação. Fiz todos os passos no fomato SDI e funcionou perfeitamente. Agora estou mudando para o formato MDI, colocando meu formulário principal como MDIForm e os demais como MDIChild.
Alterei a função CriarForm para a seguinte maneira:
procedure TfrmPrincipal.CriarForm(const ClasseForm : String);
var
Classe : TFormClass;
Objeto : TObject;
begin
Objeto := nil;
Classe := TFormClass(FindClass(ClasseForm));
if not Assigned(Objeto) then
Objeto := Classe.Create(nil);
try
if (Objeto is TForm) then
(Objeto as TForm).Show; //Ao invés do ShowModal conforme seu artigo coloquei somente Show.;
finally
FreeAndNil(Objeto);
end;
end;
Não sei o que estou fazendo de errado mais os meus formulários não abrem dessa maneira. Quando mando abri-los eles aparecem e fecham em seguida, tudo muito rapidamente, e nenhum erro é retornado;
Se alguém puder me ajudar.
Obrigado.
Marcelo. MSN: mascotepc@hotmail.com
Mascotepc
Curtidas 0
Respostas
Massuda
21/06/2005
...Não sei o que estou fazendo de errado mais os meus formulários não abrem dessa maneira. Quando mando abri-los eles aparecem e fecham em seguida, tudo muito rapidamente, e nenhum erro é retornado;
Se seu aplicativo MDI foi feito corretamente, você não precisa destruir o form depois de exibí-lo (é por isso que eles piscam). Mude seu código para algo assim:procedure TfrmPrincipal.CriarForm(const ClasseForm : String); var Classe : TFormClass; Objeto : TForm; begin Classe := TFormClass(FindClass(ClasseForm)); Objeto := Classe.Create(Self); // use Self neste caso end;
Destrua o form MDI filho automaticamente no evento OnClose do form filho fazer Action = caFree.
GOSTEI 0
Mascotepc
21/06/2005
Obrigado pela ajuda.
Deixa eu perguntar mais um coisa, tem como fazer uma função desta (Utilizando a FindCalss) só que para destruir o Formulário ?
Deixa eu perguntar mais um coisa, tem como fazer uma função desta (Utilizando a FindCalss) só que para destruir o Formulário ?
GOSTEI 0
Massuda
21/06/2005
Deixa eu perguntar mais um coisa, tem como fazer uma função desta (Utilizando a FindCalss) só que para destruir o Formulário ?
Assumindo que você tem só um form de cada classe, poderia fazer algo assim:procedure TfrmPrincipal.DestruirForm(const ClasseForm : String); var Classe : TFormClass; Form: TForm; I: Integer; begin Classe := TFormClass(FindClass(ClasseForm)); if Assigned(Classe) then begin for I := MDIChildCount-1 downto 0 do begin if MDIChildren[I] is Classe then begin MDIChildren[I].Close; //MDIChild[I].Free; //não precisa se usar Action=caFree no OnClose Break; end; end; end; end;
GOSTEI 0
Mascotepc
21/06/2005
Cara valeu pela ajuda novamente ! Funcionou beleza !
Vou te enxer o saco mais um pouco !
Agora to tentando chamar uma tela de Login antes do Formulário Principal. O formulário de login aparece, eu autêntico, e o formulário principal aparce normalmente. Só que quando eu chamo outro formulário aparece a sequinte mensagem: ´Cannot Creat Form. No MDI Forms currently active´.
OBS: Em Auto-Create Forms coloco na sequinte Ordem: dmCAQ(DataModule), FrmLogin, FrmPrincipal.
Obrigado mais uma vez !
Vou te enxer o saco mais um pouco !
Agora to tentando chamar uma tela de Login antes do Formulário Principal. O formulário de login aparece, eu autêntico, e o formulário principal aparce normalmente. Só que quando eu chamo outro formulário aparece a sequinte mensagem: ´Cannot Creat Form. No MDI Forms currently active´.
OBS: Em Auto-Create Forms coloco na sequinte Ordem: dmCAQ(DataModule), FrmLogin, FrmPrincipal.
Obrigado mais uma vez !
GOSTEI 0
Massuda
21/06/2005
...´Cannot Creat Form. No MDI Forms currently active´.
OBS: Em Auto-Create Forms coloco na sequinte Ordem: dmCAQ(DataModule), FrmLogin, FrmPrincipal.
Esse é um erro meio comum... o primeiro form (auto)criado deve ser o form principal do aplicativo (no caso, FrmPrincipal).O form para pedir a senha nem precisa ser auto-criado. Veja [url=http://www.forumweb.com.br/foruns/index.php?showtopic=29730]este tópico[/url] para mais detalhes.
GOSTEI 0
Mascotepc
21/06/2005
Obrigado pela ajuda novmente, mais um probleminha com essa tela de login ainda acontece.
Coloquei o FrmPrincipal para ser o primeiro a ser criado, depois tirei o FrmLogin da Lista de ´Auto-Create Forms´ . Ai no OnCreate do FrmPrincipal fiz a seguinte código para chamar o FrmLogin:
with TfrmLogin.Create(Self) do
begin
try
ShowModal
finally
Free;
end;
end;
Até ai tudo legal, o FrmLogin abre normalmente e eu autentico o usuário(Todo o controle da autenticação é feito no FrmLogin).
O Problema ocorre quando o FrmLogin é fechado, ele some, o FrmPrincipal aparce mais uma Mensagem de Erro de Acesso a memória aparece.
Como devo Fechar o FrmLogin ?
OBS: O FrmLogin não está como MDIChild e sim como Normal.
Coloquei o FrmPrincipal para ser o primeiro a ser criado, depois tirei o FrmLogin da Lista de ´Auto-Create Forms´ . Ai no OnCreate do FrmPrincipal fiz a seguinte código para chamar o FrmLogin:
with TfrmLogin.Create(Self) do
begin
try
ShowModal
finally
Free;
end;
end;
Até ai tudo legal, o FrmLogin abre normalmente e eu autentico o usuário(Todo o controle da autenticação é feito no FrmLogin).
O Problema ocorre quando o FrmLogin é fechado, ele some, o FrmPrincipal aparce mais uma Mensagem de Erro de Acesso a memória aparece.
Como devo Fechar o FrmLogin ?
OBS: O FrmLogin não está como MDIChild e sim como Normal.
GOSTEI 0
Massuda
21/06/2005
OBS: O FrmLogin não está como MDIChild e sim como Normal.
Nesse caso, não precisa atribuir um valor para Action no OnClose do TfrmLogin (não mexa no valor dele).Outra coisa... a variável FrmLogin (declarada automaticamente pelo Delphi) não recebe valor algum nesse caso (melhor até nem utilizar essa variável). Se você quiser obter alguma informação do form depois que ele foi exibido, faça algo assim:
with TfrmLogin.Create(Self) do begin try if ShowModal = mrOK then begin // pega alguma informação do form end; finally Free; end; end;
GOSTEI 0
Neto
21/06/2005
Gostei muito das dicas.
Eu tamém testei o exemplo FindClass e me pegou no seguinte:
Como determinar quais tabelas serão abertas para determinado Form?
Abraços
Neto
Eu tamém testei o exemplo FindClass e me pegou no seguinte:
Como determinar quais tabelas serão abertas para determinado Form?
Abraços
Neto
GOSTEI 0
Massuda
21/06/2005
Como determinar quais tabelas serão abertas para determinado Form?
Não sei se entendi direito, mas você está se referindo a TTable´s/TQuery´s? Seriam tabelas que estão no form ou utilizadas pelo form (mas que estão em algum outro lugar)?GOSTEI 0
Neto
21/06/2005
Estão no DataModule
Podem ser Tables ou Query´s ou Banco de dados
Neto
Podem ser Tables ou Query´s ou Banco de dados
Neto
GOSTEI 0
Massuda
21/06/2005
Estão no DataModule...
Acho que entendi...A princípio, não tem jeito simples de saber quais tabelas um determinado form utiliza... o mais fácil seria fazer com que no OnCreate do form este verificasse se precisa ou não abrir as tabelas que ele necessita.
GOSTEI 0