Fórum Função FindClass #285579

21/06/2005

0

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


Mascotepc

Mascotepc

Responder

Posts

21/06/2005

Massuda

...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.


Responder

Gostei + 0

21/06/2005

Mascotepc

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 ?


Responder

Gostei + 0

21/06/2005

Massuda

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;



Responder

Gostei + 0

21/06/2005

Mascotepc

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 !


Responder

Gostei + 0

21/06/2005

Massuda

...´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.


Responder

Gostei + 0

22/06/2005

Mascotepc

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.


Responder

Gostei + 0

22/06/2005

Massuda

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;



Responder

Gostei + 0

22/06/2005

Neto

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


Responder

Gostei + 0

22/06/2005

Massuda

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)?


Responder

Gostei + 0

22/06/2005

Neto

Estão no DataModule
Podem ser Tables ou Query´s ou Banco de dados
Neto


Responder

Gostei + 0

22/06/2005

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar