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]> 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] Site: http://www.drdsistemas.com/ [As partes desta mensagem que não continham texto foram removidas]