GARANTIR DESCONTO

Fórum como passar esses Parametros para o application.CreateForm #260845

01/12/2004

0

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:

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

Marco Salles

Responder

Posts

01/12/2004

Rômulo Barros

[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:


Responder

Gostei + 0

01/12/2004

Marco Salles

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] :?:


Responder

Gostei + 0

01/12/2004

Rômulo Barros

[color=green:89feac6781][b:89feac6781]Declarei a seguinte procedure:[/b:89feac6781][/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]

:?


Responder

Gostei + 0

01/12/2004

Marco Salles

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


Responder

Gostei + 0

01/12/2004

Marco Salles

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:

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]


Responder

Gostei + 0

02/12/2004

Marco Salles

sobe


Responder

Gostei + 0

02/12/2004

Marco Salles

sobe?????


Responder

Gostei + 0

02/12/2004

Emerson Nascimento

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)


Responder

Gostei + 0

02/12/2004

Massuda

[quote:3bdbc9a2be=´Marco Salles´]
Procedure TestarSenhaCriarOsForm(TFormulario:TFormClass;Formulario:TForm)
[/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:
Procedure TestarSenhaCriarOsForm(TFormulario: TComponentClass; var Formulario: TForm)
Assim você pode usar o form retornado pela procedure.


Responder

Gostei + 0

02/12/2004

Marco Salles

Emerson Escreveu:
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...


Responder

Gostei + 0

02/12/2004

Massuda

Meu último comentário sobre isso seria que isto:
procedure FooBar(ClasseDoForm: TFormClass; var OForm: TForm);
begin
    Application.CreateForm(ClasseDoForm, OForm);
    OForm.ShowModal;
    OForm.Release;
end;
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:
procedure FooBar(ClasseDoForm: TFormClass; var OForm: TForm);
begin
    OForm := ClasseDoForm.Create(Application);
    OForm.ShowModal;
    OForm.Release;
end;
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; // ou OForm.Free;
end;



Responder

Gostei + 0

02/12/2004

Emerson Nascimento

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;



Responder

Gostei + 0

03/12/2004

Marco Salles

Massuda escreveu:
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


Responder

Gostei + 0

03/12/2004

Emerson Nascimento

houve um pequeno erro de transcrição. o correto é:

TForm(Formulario).ShowModal;
TForm(Formulario).Release;


Responder

Gostei + 0

03/12/2004

Marco Salles

emerson escreveu:
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


Responder

Gostei + 0

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

Aceitar