Fórum Função FindClass #285579
21/06/2005
0
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
Curtir tópico
+ 0Posts
21/06/2005
Massuda
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
21/06/2005
Mascotepc
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
21/06/2005
Massuda
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
21/06/2005
Mascotepc
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
21/06/2005
Massuda
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
22/06/2005
Mascotepc
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
22/06/2005
Massuda
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
22/06/2005
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
22/06/2005
Massuda
Gostei + 0
22/06/2005
Neto
Podem ser Tables ou Query´s ou Banco de dados
Neto
Gostei + 0
22/06/2005
Massuda
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
Clique aqui para fazer login e interagir na Comunidade :)