Fórum como passar esses Parametros para o application.CreateForm #260845
01/12/2004
0
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
Curtir tópico
+ 0Posts
01/12/2004
Rômulo Barros
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
01/12/2004
Marco Salles
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
01/12/2004
Rômulo Barros
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
01/12/2004
Marco Salles
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
01/12/2004
Marco Salles
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
02/12/2004
Marco Salles
Gostei + 0
02/12/2004
Marco Salles
Gostei + 0
02/12/2004
Emerson Nascimento
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
02/12/2004
Massuda
Procedure TestarSenhaCriarOsForm(TFormulario:TFormClass;Formulario:TForm)
Procedure TestarSenhaCriarOsForm(TFormulario: TComponentClass; var Formulario: TForm)
Gostei + 0
02/12/2004
Marco Salles
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...
Gostei + 0
02/12/2004
Massuda
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
02/12/2004
Emerson Nascimento
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
03/12/2004
Marco Salles
[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
Gostei + 0
03/12/2004
Emerson Nascimento
TForm(Formulario).ShowModal;
TForm(Formulario).Release;
Gostei + 0
03/12/2004
Marco Salles
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
Clique aqui para fazer login e interagir na Comunidade :)