como passar esses Parametros para o application.CreateForm
No meu aplicativo tenho um procedimento que são muito , parecidos.. ele ocorre ao longo de todo form. então pensei em escrever um método, para evitar estas repetiçoes de código. Mas estou com dificuldade em passar esses parametros :cry: :cry:
esses códigos , São iguais , com exceção do [b:5a0db7da9e]Form Que Será Criado[/b:5a0db7da9e]..
Por exemplo se após a conferencia da senha eu Posso Criar os Mais diversos Form... Mas com Fazer Para Passar os Paramentros
[b:5a0db7da9e]TFormDefinirEmpresas,FormDefinirEmpresas [/b:5a0db7da9e]Para Um Procedimento [b:5a0db7da9e]Application.CreateForm Genérico[/b:5a0db7da9e].. A única coisa que muda no código é a criação dos Diversos Form.... :arrow:
O Que eu gostaria então era de algo parecido assim
Ai , toda Vez Que eu Precissasse eu So Chamava o Método
Poe Exemplo:
:P :P :P :P
var mensagem:String; FormMenu.SenhaTestada :=FormMenu.senha; Application.CreateForm(TFormDigitarSenha, FormDigitarSenha); FormDigitarSenha.showmodal; if FormMenu.SenhaCorreta Then begin Application.CreateForm(TFormDefinirEmpresas,FormDefinirEmpresas); FormDefinirEmpresas.ShowModal; FormDefinirEmpresas.Release; end else if not FormMenu.Retornar Then begin mensagem:=´ERROR : Senha Incorreta . Cadastro Da Matriz´; Modulo.GravarInformacoesNaTabelaSeguranca(mensagem); Mensagem:=´ERROR FATAL : Este Aplicativo Executou Uma´+#13+ ´ Operação Ilegal e Será Fechado .´; beep; showmessage(mensagem); application.Terminate; end; end;
esses códigos , São iguais , com exceção do [b:5a0db7da9e]Form Que Será Criado[/b:5a0db7da9e]..
Por exemplo se após a conferencia da senha eu Posso Criar os Mais diversos Form... Mas com Fazer Para Passar os Paramentros
[b:5a0db7da9e]TFormDefinirEmpresas,FormDefinirEmpresas [/b:5a0db7da9e]Para Um Procedimento [b:5a0db7da9e]Application.CreateForm Genérico[/b:5a0db7da9e].. A única coisa que muda no código é a criação dos Diversos Form.... :arrow:
O Que eu gostaria então era de algo parecido assim
Procedure TestarSenhaCriarOsForm(.Paramentros ?????) var mensagem:String; FormMenu.SenhaTestada :=FormMenu.senha; Application.CreateForm(TFormDigitarSenha, FormDigitarSenha); FormDigitarSenha.showmodal; if FormMenu.SenhaCorreta Then begin Application.CreateForm( Parametros ??????); **************** Parametros.ShowModal; ????????????? ********************** Parametros.Release; ??????????????? *********************** end else if not FormMenu.Retornar Then begin mensagem:=´ERROR : Senha Incorreta . Cadastro Da Matriz´; Modulo.GravarInformacoesNaTabelaSeguranca(mensagem); Mensagem:=´ERROR FATAL : Este Aplicativo Executou Uma´+#13+ ´ Operação Ilegal e Será Fechado .´; beep; showmessage(mensagem); application.Terminate; end; end;
Ai , toda Vez Que eu Precissasse eu So Chamava o Método
Poe Exemplo:
TestarSenhaCriarOsForm(.Paramentros ?????)
:P :P :P :P
Marco Salles
Curtidas 0
Respostas
Rômulo Barros
01/12/2004
[color=green:4aae36939e][b:4aae36939e]Já postei algo a respeito.[/b:4aae36939e][/color:4aae36939e]
Veja [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=43947&highlight=classes]ESTE LINK[/url] para resolver o seu problema.
:wink: :wink: :wink:
Veja [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=43947&highlight=classes]ESTE LINK[/url] para resolver o seu problema.
:wink: :wink: :wink:
GOSTEI 0
Marco Salles
01/12/2004
Já postei algo a respeito.
Veja ESTE LINK para resolver o seu problema.
eu Tinha pensado Nisso. Mas para minha surpreza o Form é Criado , so que não tá dando certo...Eu tenho um Procedure no Evento OnShow Do formulário Criado quan por incrível que pareça Simplismente Não esta sendo executado..Ou Melhor , ele e executado, mas não da o efeito Desejado...
Fiz Assim , com voce postou:
Procedure TestarSenhaCriarOsForm(TFormulario:TFormClass;Formulario:TForm) var mensagem:String; FormMenu.SenhaTestada :=FormMenu.senha; Application.CreateForm(TFormDigitarSenha, FormDigitarSenha); FormDigitarSenha.showmodal; if FormMenu.SenhaCorreta Then begin Application.CreateForm(TFormulario,Formulario); Formulario.ShowModal; Formulario.Release; end else if not FormMenu.Retornar Then begin mensagem:=´ERROR : Senha Incorreta . Cadastro Da Matriz´; Modulo.GravarInformacoesNaTabelaSeguranca(mensagem); Mensagem:=´ERROR FATAL : Este Aplicativo Executou Uma´+#13+ ´ Operação Ilegal e Será Fechado .´; beep; showmessage(mensagem); application.Terminate; end; end;
E Chamei o Método Assim:
TestarSenhaCriarOsForm(TformDefinirEmpresas,formDefinirEmpresas);
[b:04f5aa829d]So que ta dando Problema...[/b:04f5aa829d].. Eu ja tinha Chegado Nisso, so não consegui Resolver
O Formulario [b:04f5aa829d]formDefinirEmpresas[/b:04f5aa829d] Tem No evento OnShow Um Método Chamado Bloqueio ..
Este Método é responsável por Liberar [b:04f5aa829d]Um Botoes e Inibir Outros[/b:04f5aa829d].. Mas quando eu Crio o Formulário , Usando a passagem por Parametro, todos os botoes Estão Liberados e em algums , os eventos Simplismente Não Funciona :cry: :cry: :cry: :cry: ...
To Achando Que tá Faltando Algo mais.. Algo por exemplo como passagem por Valor.. :?: :?: :?:
Se Voce notar quais são os parametros para o Método :
[b:04f5aa829d]Application.CreteForm(IstanceClass:TComponenteClass;var reference);[/b:04f5aa829d]
É isto que a gente tem que passar para lá.. Mas eu não tenho idéia do que seja [b:04f5aa829d]IstanceClass:TComponenteClass e Var Reference????[/b:04f5aa829d] :?:
GOSTEI 0
Rômulo Barros
01/12/2004
[color=green:89feac6781][b:89feac6781]Declarei a seguinte procedure:[/b:89feac6781][/color:89feac6781]
[b:89feac6781]Agora, criei um novo Form com o name = ´FormCadastro´.
No evento OnShow do FormCadastro fiz:[/b:89feac6781]
No Evento OnClick de um botão, fiz:
ChamarTela(FormCadastro,TFormCadastro,´Caption do FormCadastro´);
Então, o evento OnShow do FormCadastro foi disparado, exibindo a seguinte mensagem na tela: [color=green:89feac6781]´Teste do evento OnShow´[/color:89feac6781]
:?
procedure ChamarTela(parForm: Tform; parInstance: TComponentClass; parMsg: String); begin Application.CreateForm(parInstance,parForm); parForm.Caption := parMsg; Try parForm.ShowModal; Finally parForm.Release; parForm := Nil; End; end;
[b:89feac6781]Agora, criei um novo Form com o name = ´FormCadastro´.
No evento OnShow do FormCadastro fiz:[/b:89feac6781]
ShowMessage(´Teste do evento OnShow´);
No Evento OnClick de um botão, fiz:
ChamarTela(FormCadastro,TFormCadastro,´Caption do FormCadastro´);
Então, o evento OnShow do FormCadastro foi disparado, exibindo a seguinte mensagem na tela: [color=green:89feac6781]´Teste do evento OnShow´[/color:89feac6781]
:?
GOSTEI 0
Marco Salles
01/12/2004
E Amigo... Mas meu problema e mais embaixo.. Ta dificil, [b:7150e74189]Falta definição Afinada do Processo.[/b:7150e74189]. Falta saber direitinho o que que na verdade se Ta criando.. Se é mais um formulario Com a cara do Outro ou se é o Formulário mesmo em si.... Ta parecendo que é mais um formulario com a cara do Outro..
em alguns eventos do formulario Eu recebo uma mensagem do compilador que ele um determinado componente esta fora de Foco.
Este componente é claro que pertence ao Formulário Real e não ao Formulário Que se esta Criando
Imagine a situação que e algum botao eu tenha um método
formDefinirEmpresas.BtSalvar.Setfocus;
Quando eu crio o formulário Usando Passagem ele dá o erro quando se executa este método..Diz que ta Invisível.......... :cry:
Mas se eu crio o Formulário , normalmente , o método é executado sem problema...
Então , pode ter certeza que parece que ta faltando algo.. Algo que diga o seguinte...Olhe este formulario ai que voce esta criando e o : [b:7150e74189]formDefinirEmpresas[/b:7150e74189]. e não uma instancia do mesmo ou coisa parecida..
eu não sei se isto se consegue , mudando a passagem de parametros ou usando uma outra tecnica :cry: :cry:
Para voce ter uma idéia , to com o Problema de foco....
em alguns eventos do formulario Eu recebo uma mensagem do compilador que ele um determinado componente esta fora de Foco.
Este componente é claro que pertence ao Formulário Real e não ao Formulário Que se esta Criando
Imagine a situação que e algum botao eu tenha um método
formDefinirEmpresas.BtSalvar.Setfocus;
Quando eu crio o formulário Usando Passagem ele dá o erro quando se executa este método..Diz que ta Invisível.......... :cry:
Mas se eu crio o Formulário , normalmente , o método é executado sem problema...
Então , pode ter certeza que parece que ta faltando algo.. Algo que diga o seguinte...Olhe este formulario ai que voce esta criando e o : [b:7150e74189]formDefinirEmpresas[/b:7150e74189]. e não uma instancia do mesmo ou coisa parecida..
eu não sei se isto se consegue , mudando a passagem de parametros ou usando uma outra tecnica :cry: :cry:
GOSTEI 0
Marco Salles
01/12/2004
Mas conversa vai e conversa vem , me surgiu uma outra idéia...
Meu problema era na criação.. eu tinha que criar o FormCadastro e não uma cópia Dele...
então pensei, :idea: :idea: porque não o [b:5fb3c493c6]crio antes [/b:5fb3c493c6]e o apresento depois....
Batei isto forte e testei .. Parece que funciona prefeitamente.. Fiz Assim:
E Para Chamar o Método Fiz Assim:
É , Agora eu so vou ter que escrever 3 linhas , toda a vez que eu quiser
Testar a senha para abrir ou não um novo formulário... O Grande incoveniente disso tudo é que mesmo que a senha for errada o formulário ja foi criado.. quer dizer, um processo que poderia ser Evitado,
se eu conseguisse criar o formulário dentro do procedimento[b:5fb3c493c6]
TestarSenha[/b:5fb3c493c6]
Mas eu não desisto fácil não... Esta idéia e apenas[b:5fb3c493c6] paleativa[/b:5fb3c493c6], ela diminui a [b:5fb3c493c6]digitação[/b:5fb3c493c6], mas em contrapartida[b:5fb3c493c6] aumenta [/b:5fb3c493c6]o tempo de processamento , ja que [b:5fb3c493c6]os formulários sempre serão criados[/b:5fb3c493c6]..
[b:5fb3c493c6] Então será que ningume consegue dar Uma palavra final no assunto[/b:5fb3c493c6]
Vamos jogar pessoal , estes conceitos academicos que estão adormecidos para fora... Eu tenho quase certeza que este problema e [b:5fb3c493c6]conceitual[/b:5fb3c493c6]
Meu problema era na criação.. eu tinha que criar o FormCadastro e não uma cópia Dele...
então pensei, :idea: :idea: porque não o [b:5fb3c493c6]crio antes [/b:5fb3c493c6]e o apresento depois....
Batei isto forte e testei .. Parece que funciona prefeitamente.. Fiz Assim:
procedure TestarSenha(Formulario:TForm); var mensagem:String; begin FormMenu.SenhaTestada :=FormMenu.senha; Application.CreateForm(TFormDigitarSenha, FormDigitarSenha); FormDigitarSenha.showmodal; if FormMenu.SenhaCorreta Then begin Formulario.ShowModal; ******Apresento o Formulário end else if not FormMenu.Retornar Then begin mensagem:=´ERROR : Senha Incorreta . Cadastro Da Matriz´; Modulo.GravarInformacoesNaTabelaSeguranca(mensagem); Mensagem:= ´ERROR FATAL : Este Aplicativo sera fechado´; beep; showmessage(mensagem); application.Terminate; end; end;
E Para Chamar o Método Fiz Assim:
application.Createform(TformDefinirEmpresas,formDefinirEmpresas); testarSenha(formDefinirEmpresas); formDefinirEmpresas.Release;
É , Agora eu so vou ter que escrever 3 linhas , toda a vez que eu quiser
Testar a senha para abrir ou não um novo formulário... O Grande incoveniente disso tudo é que mesmo que a senha for errada o formulário ja foi criado.. quer dizer, um processo que poderia ser Evitado,
se eu conseguisse criar o formulário dentro do procedimento[b:5fb3c493c6]
TestarSenha[/b:5fb3c493c6]
Mas eu não desisto fácil não... Esta idéia e apenas[b:5fb3c493c6] paleativa[/b:5fb3c493c6], ela diminui a [b:5fb3c493c6]digitação[/b:5fb3c493c6], mas em contrapartida[b:5fb3c493c6] aumenta [/b:5fb3c493c6]o tempo de processamento , ja que [b:5fb3c493c6]os formulários sempre serão criados[/b:5fb3c493c6]..
[b:5fb3c493c6] Então será que ningume consegue dar Uma palavra final no assunto[/b:5fb3c493c6]
Vamos jogar pessoal , estes conceitos academicos que estão adormecidos para fora... Eu tenho quase certeza que este problema e [b:5fb3c493c6]conceitual[/b:5fb3c493c6]
GOSTEI 0
Marco Salles
01/12/2004
sobe
GOSTEI 0
Marco Salles
01/12/2004
sobe?????
GOSTEI 0
Emerson Nascimento
01/12/2004
Marco Salles, nem testei, mas percebi que no cabeçalho da sua função você está usando
TFormulario:TFormClass
enquanto que o Undeclared Identifier usou TComponentClass.
então o cabeçalho da sua função deveria ser:
Procedure TestarSenhaCriarOsForm(TFormulario:TComponentClass;Formulario:TForm)
TFormulario:TFormClass
enquanto que o Undeclared Identifier usou TComponentClass.
então o cabeçalho da sua função deveria ser:
Procedure TestarSenhaCriarOsForm(TFormulario:TComponentClass;Formulario:TForm)
GOSTEI 0
Massuda
01/12/2004
[quote:3bdbc9a2be=´Marco Salles´][/quote:3bdbc9a2be]Além do que o colega emerson.en escreveu, como o parâmetro Formulario é passado por valor, o form criado dentro da procedure não é retornado para a rotina que chamou a procedure. O correto seria:Assim você pode usar o form retornado pela procedure.
Procedure TestarSenhaCriarOsForm(TFormulario:TFormClass;Formulario:TForm)
Procedure TestarSenhaCriarOsForm(TFormulario: TComponentClass; var Formulario: TForm)
GOSTEI 0
Marco Salles
01/12/2004
Emerson Escreveu:
Coerente , mas inrelevante...
O Problema é que quando se passa esse dois paramentros para um método , o que se cria , na verdade é um outro objeto , instanciado pela classe [b:29bc3082ab]TformDefinirEmpresas.. [/b:29bc3082ab]
Tanto este fato é verdade, que se no formulário criado se voce testar , vera que o [b:29bc3082ab]formDefinirEmpresas[/b:29bc3082ab] e nil ...[b:29bc3082ab]Isto que é o problema Chave.[/b:29bc3082ab]..
Eu tenho Códigos que usa explicitamente o Objeto formDefinirEmpresas, e ele Não pode ser Nil :cry: :cry: :cry:
Massuda escreveu:
Usar o [b:29bc3082ab]Parametro Var [/b:29bc3082ab], seria tudo que eu pedi a deus...Mas neste caso o compilador não aceita :cry: :cry: :cry: :cry: :cry:
Então amigos, eu acho que ainda não consegui Descobrir Um Jeito De Criar Formulários Em Rum-Time... Este Tópico talvez Seja antigo, mas alguem pode ter uma solução :cry: :cry: :cry:
To No Aguardo , ate de Contestações...
Marco Salles, nem testei, mas percebi que no cabeçalho da sua função você está usando
TFormulario:TFormClass
enquanto que o Undeclared Identifier usou TComponentClass.
então o cabeçalho da sua função deveria ser:
Procedure TestarSenhaCriarOsForm(TFormulario:TComponentClass;Formulario:TForm)
Coerente , mas inrelevante...
O Problema é que quando se passa esse dois paramentros para um método , o que se cria , na verdade é um outro objeto , instanciado pela classe [b:29bc3082ab]TformDefinirEmpresas.. [/b:29bc3082ab]
Tanto este fato é verdade, que se no formulário criado se voce testar , vera que o [b:29bc3082ab]formDefinirEmpresas[/b:29bc3082ab] e nil ...[b:29bc3082ab]Isto que é o problema Chave.[/b:29bc3082ab]..
Eu tenho Códigos que usa explicitamente o Objeto formDefinirEmpresas, e ele Não pode ser Nil :cry: :cry: :cry:
Massuda escreveu:
Código:
Procedure TestarSenhaCriarOsForm(TFormulario: TComponentClass; var Formulario: TForm) .
Assim você pode usar o form retornado pela procedure
Usar o [b:29bc3082ab]Parametro Var [/b:29bc3082ab], seria tudo que eu pedi a deus...Mas neste caso o compilador não aceita :cry: :cry: :cry: :cry: :cry:
Então amigos, eu acho que ainda não consegui Descobrir Um Jeito De Criar Formulários Em Rum-Time... Este Tópico talvez Seja antigo, mas alguem pode ter uma solução :cry: :cry: :cry:
To No Aguardo , ate de Contestações...
GOSTEI 0
Massuda
01/12/2004
Meu último comentário sobre isso seria que isto:compila sem problemas; note que é o seu código sem o form para entrada de senha e sem o menu. Aliás, como não é obrigatório usar Application.CreateForm para criar os forms (exceto o form principal), este código é equivalente:Um último detalhe é que como Release é executado dentro da procedure, não tem como usar o form criado pela procedure fora da própria procedure (pois o form será destruído) e daí não faz sentido passar o form como argumento... poderia reescrever assim:
procedure FooBar(ClasseDoForm: TFormClass; var OForm: TForm); begin Application.CreateForm(ClasseDoForm, OForm); OForm.ShowModal; OForm.Release; end;
procedure FooBar(ClasseDoForm: TFormClass; var OForm: TForm); begin OForm := ClasseDoForm.Create(Application); OForm.ShowModal; OForm.Release; end;
procedure FooBar(ClasseDoForm: TFormClass); var OForm: TForm begin Application.CreateForm(ClasseDoForm, OForm); OForm.ShowModal; OForm.Release; // ou OForm.Free; end;
GOSTEI 0
Emerson Nascimento
01/12/2004
tente assim:
procedure TestarSenhaCriarOsForm(ClasseFormulario:TComponentClass; var Formulario); // a variável Formulário é assim mesmo, sem um tipo var mensagem:String; begin FormMenu.SenhaTestada := FormMenu.senha; Application.CreateForm(TFormDigitarSenha, FormDigitarSenha); FormDigitarSenha.showmodal; if FormMenu.SenhaCorreta Then begin Application.CreateForm(ClasseFormulario,Formulario); Formulario.ShowModal; Formulario.Release; end else if not FormMenu.Retornar Then begin mensagem:=´ERROR : Senha Incorreta . Cadastro Da Matriz´; Modulo.GravarInformacoesNaTabelaSeguranca(mensagem); Mensagem:=´ERROR FATAL : Este Aplicativo Executou Uma´+#13+ ´ Operação Ilegal e Será Fechado .´; beep; showmessage(mensagem); application.Terminate; end; end;
GOSTEI 0
Marco Salles
01/12/2004
Massuda escreveu:
[b:e867cc950b]Não compila[/b:e867cc950b]..Infelismente Não compila . Dá um erro de :
[b:e867cc950b]´Record , Object or Class´[/b:e867cc950b]
emerson escreveu:
[b:e867cc950b]emerson , Dá erro de Type requered[/b:e867cc950b], mais do que justo :!: :!: :!:
[b:e867cc950b]Mas , ainda não desisti... No aguardo de contestações[/b:e867cc950b] :P :P :P :P :P
Meu último comentário sobre isso seria que isto:Código:
procedure FooBar(ClasseDoForm: TFormClass; var OForm: TForm);
begin
Application.CreateForm(ClasseDoForm, OForm);
OForm.ShowModal;
OForm.Release;
end;
compila sem problemas
[b:e867cc950b]Não compila[/b:e867cc950b]..Infelismente Não compila . Dá um erro de :
[b:e867cc950b]´Record , Object or Class´[/b:e867cc950b]
emerson escreveu:
tente assim:
Código:
procedure TestarSenhaCriarOsForm(ClasseFormulario:TComponentClass; var Formulario); // a variável Formulário é assim mesmo, sem um tipo
var
mensagem:String;
................................
.................................
Formulario.ShowModal; >>>>> Dá erro : Type Requerid
.................................
[b:e867cc950b]emerson , Dá erro de Type requered[/b:e867cc950b], mais do que justo :!: :!: :!:
[b:e867cc950b]Mas , ainda não desisti... No aguardo de contestações[/b:e867cc950b] :P :P :P :P :P
GOSTEI 0
Emerson Nascimento
01/12/2004
houve um pequeno erro de transcrição. o correto é:
TForm(Formulario).ShowModal;
TForm(Formulario).Release;
TForm(Formulario).ShowModal;
TForm(Formulario).Release;
GOSTEI 0
Marco Salles
01/12/2004
emerson escreveu:
os primeiros teste que eu realisei, foram Shows... :P :P :P :P :P :P :P
Agora , parece que to criando Realmente o Objeto Passado Pelo Paramentro e Não uma instancia Dele :P :P :P :P :P
E olha que este tópico , Já rodou No Forum , e parece que ninguem tinha percebido esta sutileza
Mesmo , que a principio , parece que esta seja a saída, quero agradecer a todos que contribuiram, porque o resultado final e sem sombra de dúvidas a soma de todas as contribuiçoes... :P :P :P :P
Voce mesmo, :wink: pode ter se despertado para esta questão, devido ao meu relato :idea: :idea: :idea: ....
E quem não entendeu , o que se passou , devido ao tamanho do tópico, acho que vale a pena refletir sobre esta questão. Afinal , ela ja foi no meu entendimento , mau interpreta outrora aqui mesmo no forum :cry:
Valeu amigos :P :P :P :P
houve um pequeno erro de transcrição. o correto é:
TForm(Formulario).ShowModal;
TForm(Formulario).Release;
os primeiros teste que eu realisei, foram Shows... :P :P :P :P :P :P :P
Agora , parece que to criando Realmente o Objeto Passado Pelo Paramentro e Não uma instancia Dele :P :P :P :P :P
E olha que este tópico , Já rodou No Forum , e parece que ninguem tinha percebido esta sutileza
Mesmo , que a principio , parece que esta seja a saída, quero agradecer a todos que contribuiram, porque o resultado final e sem sombra de dúvidas a soma de todas as contribuiçoes... :P :P :P :P
Voce mesmo, :wink: pode ter se despertado para esta questão, devido ao meu relato :idea: :idea: :idea: ....
E quem não entendeu , o que se passou , devido ao tamanho do tópico, acho que vale a pena refletir sobre esta questão. Afinal , ela ja foi no meu entendimento , mau interpreta outrora aqui mesmo no forum :cry:
Valeu amigos :P :P :P :P
GOSTEI 0