realmente, eu tb não consegui descobrir o motivo.. vou continuar usando a rotina que eu criei, pq ficar registrando os forms pra min não compensa.
de qualquer forma vou tentar + aqui, se eu descobrir algo te aviso. Em 14/03/07, Adriano Santos <[EMAIL PROTECTED]> escreveu: > > 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]<eduardo.drd%40gmail.com> > > > Para: delphi-br@yahoogrupos.com.br <delphi-br%40yahoogrupos.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]<thiago%40americasoft.com.br> > > <mailto:thiago% <thiago%25>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] <artes%40doiscliques.com> > > <mailto:artes% <artes%25>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] <eduardo.drd%40gmail.com> <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> > > > -- Eduardo Silva dos Santos DRD Sistemas. (27) 3218-4201 MSN: [EMAIL PROTECTED] Site: http://www.drdsistemas.com/ [As partes desta mensagem que não continham texto foram removidas]