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>