Eduardo,

Matei o problema retornando um TForm na function e fazendo um typecast 
na chamada dele. Eu crio uma variável do mesmo tipo (classe do form) que 
será chamado e aponto pra funtion. Veja:

procedure TForm1.Button1Click(Sender: TObject);
var
  Form : TfrmMeuForm;
begin
  Form := TfrmMeuForm('frmMeuForm');
  Form.BotaoTal.Enabled := True;
  Form.BotaoX.Caption := True;
end;

E etc. Este problema que tive eu descobri pq. Se liga:

No form principal da minha aplicação eu fazia assim como descrito acima.
E dado momento do form aberto ele entrava em um uma procedure que 
tentava atualizar um botão nele mesmo, asim:

procedure TForm2.Button1Click(Sender: TObject);
  procedure Reinicia;
  begin
    with Form2 do
    begin
      btnLocalizar.Enabled:= True;
      ...
    end;
  end;
begin
   ...codigo deste objeto
   ...codigo deste objeto
   ...codigo deste objeto
   ...codigo deste objeto


    Reinicia;
end;

Pois bem, lá em cima no With Form2 do, dava erro na atribuição dos 
valores para o btnLocalizar. Se coloco Self, tipo:

Self.btnLocalizar.Enabled:= True; //Isso funciona

procedure TForm2.Button1Click(Sender: TObject);
  procedure Reinicia;
  begin
    with Form2 do
    begin
      Self.btnLocalizar.Enabled:= True;
      ...
    end;
  end;
begin
   ...codigo deste objeto
   ...codigo deste objeto
   ...codigo deste objeto
   ...codigo deste objeto

    Reinicia;
end;

Funciona, mas não dá pra sair atualizando tudo que é form. Bem, nesta 
tela em particular o que ele fazia no Reinicia podia ser passado para o 
final do procedimento e retirar a procedure.

Eu gostaria de saber o porque do erro. E não consegui.



-------- Mensagem original --------
De: "Eduardo Silva dos Santos" <[EMAIL PROTECTED]>
Para: delphi-br@yahoogrupos.com.br
Assunto: Re:[delphi-br] Função AbrirForm
Data: 14-03-2007 18:49
>
> acabei de verificar isso aqui..
>
> fiz um teste na função que eu fiz mudei para Show..
> quando eu tento fazer uma referencia ao form Criado tb da violação de
> acesso.
>
> agora lascou;;
>
> Em 14/03/07, Thiago Filiano (America Soft) <[EMAIL PROTECTED] 
> <mailto:thiago%40americasoft.com.br>>
> escreveu:
> >
> > pra vc usar essa função, no seu form tem que ter as seguintes linhas...
> >
> > initialization
> > RegisterClass(NomeDaClasseDoForm)
> > finalization
> > UnRegisterClass(NomeDaClasseDoForm)
> >
> > Eduardo Silva dos Santos escreveu:
> > > Interessante a sua rotina, eu tentei testar aqui mas
> > > na linha Pc := GetClass('T' + AForm);
> > > mesmo com um Nome de Form Certinho PC sempre fica como Nil.. dai não
> > > executa o resto.
> > >
> > >
> > > eu fiz uma rotina generica so que bem mais simples que pra min
> > > provisoriamente ta resolvendo, mas to tentando chamar o form so pelo
> > nome
> > > tb..
> > >
> > >
> > > ShowForm( TFrmCliente, FrmClientes );
> > >
> > > **************
> > >
> > > procedure ShowForm( TFrm:TFormClass; Frm:TForm );
> > > begin
> > > try
> > > if not Assigned( Frm ) then
> > > Frm := TFrm.Create( Application );
> > > Frm.ShowModal;
> > > finally
> > > FreeAndNil( Frm );
> > > end;
> > >
> > > end;
> > >
> > >
> > >
> > > Em 14/03/07, Adriano Santos - Direção de Arte 
> <[EMAIL PROTECTED] 
> <mailto:artes%40doiscliques.com><artes%40doiscliques.com>
> > >
> > > escreveu:
> > >> Pessoal, alguém pode ver se consegue dar um help pra gente?
> > >> Estamos tentando terminar a função para abrir form pelo nome.
> > >> Já está funcionando em partes.
> > >>
> > >> Quando chamamos o form assim:
> > >> AbrirForm('frmMatCol06', frmMatCol06);
> > >>
> > >> O form abre, porém se este mesmo form faz alguma referência a algum
> > >> componente visual em tela tipo um:
> > >> btnCancelar.Enabled := True;
> > >>
> > >> Dá AccessViolation, se alteramos para
> > >> Self.btnCancelar.Enabled := True;
> > >>
> > >> Funciona. Tem alguma coisa a ver com o Dono do objeto. Não consigo
> > >> descobrir.
> > >> Já tentamos de tudo que é jeito:
> > >>
> > >> 1º AbrirForm('frmMatCol06', Self);
> > >> 2º AbrirForm('frmMatCol06', Application);
> > >> 3º AbrirForm('frmMatCol06', frmMatOpe01); //frmMatOpe01 é o form
> > chamador.
> > >>
> > >> ou ainda:
> > >>
> > >> procedure TfrmMatOpe01.N110Click(Sender: TObject);
> > >> var
> > >> frmMatCol06 : TfrmMatCol06;
> > >> begin
> > >> frmMatCol06 := TfrmMatCol06(AbrirForm('frmMatCol06', Self));
> > >> .....
> > >> end;
> > >>
> > >> A função completa AbrirForm é esta. Vlw.
> > >>
> > >> function AbrirForm(AForm: string; ADono: TComponent; AEstilo:
> > >> TFormBorderStyle = bsSingle;
> > >> AShow: Boolean = True): TForm;
> > >> var
> > >> Pc : TPersistentClass;
> > >> Nome : TForm;
> > >> I : Integer;
> > >> begin
> > >> try
> > >> Pc := GetClass('T' + AForm);
> > >> if (Pc <> nil) then
> > >> begin
> > >> Nome := nil;
> > >> I := 0;
> > >> while I < Screen.FormCount do
> > >> begin
> > >> if Screen.Forms[I] is Pc then
> > >> Nome := Screen.Forms[I];
> > >> Inc(I);
> > >> end;
> > >> if Nome = nil then
> > >> begin
> > >> try
> > >> Nome := TFormClass(Pc).Create(ADono);
> > >> Nome.KeyPreview := True;
> > >> Nome.OnKeyDown := frmAmerica.AdicionarAtalho;
> > >> Result := Nome;
> > >>
> > >> if AShow then
> > >> Nome.Show
> > >> else
> > >> Nome.ShowModal;
> > >>
> > >> except on E: Exception do
> > >> begin
> > >> MessageDlg('Ocorreu um erro ao carregar esta função.' + #13 +
> > >> 'Erro original: ' + #13#13 +
> > >> E.Message, mtWarning, [mbOk], 0);
> > >> Result := nil;
> > >> Exit;
> > >> end;
> > >> end;
> > >> end
> > >> else
> > >> begin
> > >> if AShow then
> > >> Nome.Show
> > >> else
> > >> Nome.ShowModal;
> > >> Result := Nome;
> > >> end;
> > >> end
> > >> else
> > >> begin
> > >> MessageDlg('Ocorreu um erro ao carregar esta função.' + #13 +
> > >> 'Janela: ' + AForm, mtWarning, [mbOk], 0);
> > >> Result := nil;
> > >> end;
> > >> except
> > >> Result := nil;
> > >> end;
> > >> end;
> > >> --
> > >>
> > >> ----------------------------------------------------------
> > >> *Adriano Santos*
> > >>
> > >>
> > >
> > >
> > >
> >
> >
> >
>
> -- 
> Eduardo Silva dos Santos
> DRD Sistemas.
> (27) 3218-4201
> MSN: [EMAIL PROTECTED] <mailto:eduardo.drd%40gmail.com>
> Site: http://www.drdsistemas.com/ <http://www.drdsistemas.com/>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  

-- 

------------------------------------------------------------------------
*Adriano Santos*
Direção de Arte
Doiscliques.com Identidade Visual e Propaganda
www.doiscliques.com <http://www.doiscliques.com>

Sua empresa de mãos dadas com a mídia.
<http://www.doiscliques.com>

Responder a