Fórum Abrir formulário utilizando TFormClass #320440
02/05/2006
0
Mrmarcelojr
Curtir tópico
+ 0Posts
03/05/2006
Mrmarcelojr
Gente, eu preciso muito desta solução....urgente mesmo......
Gostei + 0
03/05/2006
Massuda
Gostei + 0
03/05/2006
Mrmarcelojr
Já experimentou pesquisar o fórum por TFormClass?
Jah....mas o que eu quero esta dificil de achar. Bem, meu problema é o seguinte, eu tenho uma função pra criar forms MDI em runtime (procedure CriaForm(FormClass:TFormClass;var Form);). Bem, essa rotina funciona perfeitamente, mas surgiu uma situação aqui. Eu não posso chamar essa função diretamente, intaum eu guardo o FormClass em uma variável para depois coloca-la no parametro correspondente no método CriaForm. Até ai beleza, mas como eu faço para armazear o var Form, pois ele não tem tipo nenhum, é apenas uma variável, por isso eu achei que seria mais fácil se eu cria-se o form apenas com o FormClass, mas se existir uma forma de eu armazenar o valor do var Form, será mais util.
ps.:Eu jah tentei usar uma variavel do tipo Variant pra armazenar, mas sem sucesso.
Gostei + 0
03/05/2006
Bruno77
eu consigo assim
Tform(form) := TFormClass.Create(nil);
onde [b:d7321de062]form[/b:d7321de062] sera sua variavel passada em var form, deste forma a variavel ira armazenar a referencia do seu form.
Gostei + 0
03/05/2006
Mrmarcelojr
Mas esta variavel [b:621e989284]form[/b:621e989284] é de que tipo?
Gostei + 0
03/05/2006
Massuda
function CriarFormPelaClasse(const AClasse: TFormClass): TForm; begin Result := AClasse.Create(Application); end;
Gostei + 0
03/05/2006
Mrmarcelojr
Bem, eu quero criar uma tela da vizualização, essa mesma tela vai servir para qualquer tipo de cadastro, por exemplo, quando eu chamo o formulario de clientes, antes de abrir o frmClientes, eu abro essa tela consulta para mostrar os clientes. Nessa tela tenho botões de editar, novo, vizualizar. Ao clicar por exemlpo em novo, eu abro a tela de cliente chamando a função [b:ccafff62b6]CriaForm(TfrmCliente, frmCliente)[/b:ccafff62b6] (do metodo [b:ccafff62b6]CriaForm(FormClas:TFormClass;var Form)[/b:ccafff62b6]. Se eu colocar estes valores em tempo de projeto, a tela funciona, mas quero preencher estes valores em tempo de execução, pois esta tela de consulta serve para qualquer outra tela da cadastro. Na minha frmConsulta eu tenho uma variavel publica do tipo TFormClass para ser usada na CriaForm, mas e quanto ao var Form? É ai q estou perdido.
Soh para complicar um pouco, eu criei um outro metodo para chamar essa minha tela de consulta. TelaConsulta(CDS:TClientDataSet;[b:ccafff62b6]FormClass:TFormClass[/b:ccafff62b6]);. Reparem na FormClass, com este parametro eu preencho a variavel publica FormClass da frmConsulta, que mais tarde será usada para chamar o CriaForm, e o problema fica por conta do [b:ccafff62b6]var Form[/b:ccafff62b6] da CriaForm.
Ufa!!!.....acho que até eu fiquei meio perdido agora, mas tentei me explicar, pois o que estou querendo naum só simplesmente criar um form MDI, é algo um pouco mais ´sombriu´..... :lol:
Grato.
Gostei + 0
03/05/2006
Mrmarcelojr
function CriarFormPelaClasse(const AClasse: TFormClass): TForm; begin Result := AClasse.Create(Application); end;
Isso vai me retornar um TForm, e o que eu faço com esse TForm (sem brincadeirinhas maliciosas :lol: ). Poderia me dar alguns exemplos de utilização dessa função?
Gostei + 0
04/05/2006
Massuda
CriaForm(TfrmCliente, frmCliente);
frmCliente := CriarFormPelaClasse(TfrmCliente);
Desculpe, mas não entendi o que você escreveu sobre tela de visualização.
Gostei + 0
04/05/2006
Mrmarcelojr
..Apenas cria o form.
Bem, resumidamente, o q quero fazer é armazenar os valores de FormClass e var Form. O FormClass é fácil, soh estou tendo problemas com o var Form, pois não sei como declarar a variável.
[b:158f369ddd]Eu não posso chamar meu form diretamente, pois eu vou chamar ele depois, e conforme os valores que tiverem nas variáveis.....[/b:158f369ddd]
Gostei + 0
04/05/2006
Massuda
function CriarFormPelaClasse(const AClasse: TFormClass): TForm; begin Result := AClasse.Create(Application); end; ..... frmCliente := CriarFormPelaClasse(TfrmCliente);
Gostei + 0
05/05/2006
Mrmarcelojr
O problema é que não posso usar o frmCliente:=algumacoisa pq frmCliente não existe.....mas tudo bem, jah discutimos esta arquitetura que eu estava testando, mas decidimos mudar. Então agradeço o esforço de todos, e assim que eu estiver algum tempo livre, estarei estudando o caso e disponibilizando aqui no forum.
Muitissimo agradecido.
Gostei + 0
05/05/2006
Massuda
Gostei + 0
05/05/2006
Vitor Rubio
Cara, veja bem, você está com dificuldades nos conceitos de Orientação a objetos.
Quando você tem uma variavel do tipo Tform, ou do tipo de uma descendente qualquer de tform (toda form criada por você é uma descendente da form basica Tform) vc tem apenas um ponteiro, que pode apontar para qualquer objeto do tipo tform instanciado (criado com o create) na memoria.
o codigo abaixo vai funcionar legal, porque ele vai passar a como parametro uma variavel ou objeto do tipo classe, ou seja, referencia uma classe. Essa classe pode ser qualquer classe de suas forms, desde que estejam no seu uses e que vc tenha acesso a elas.
essa função simplesmente faz o mesmo que a procedure, com a diferença de que a var da form não precisa ser passada como parametro, mas recebe o resultado da função.
ela simplesmente faz:
suaVariavelForm := criaform(ClasseQueTemQueSerCriada);
depois diso vc pode fazer suaVariavelForm.showmodal;
function CriarFormPelaClasse(const AClasse: TFormClass): TForm; begin //aclasse é um tipo de classe de form criado por vc, o T<qualquercoisa> Result := AClasse.Create(Application); //result vai receber um ponteiro para um objeto do tipo dessa classe instanciado na memoria end; //que sera passado para sua variavel frmCliente := CriarFormPelaClasse(TfrmCliente);
procure na ferramenta de busca pelo meu nome, deve ter uns dois tópicos falando sobre o assunto, onde eu não sabia nada e os colegas deram uma força tremenda.
isso consequentemente vai te levar a pesquisar um outro tópico muito interessante, o dos factory methods, procure por isso. Espero ter ajudado ^^
Gostei + 0
05/05/2006
Mrmarcelojr
Muito grato a todos.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)