so complementando, olhando o help do Delphi sobre a função *GetClass* ** *Traduzido pelo Altavista..*
"...Chame GetClass para obter uma classe de um nome da classe. Esta classe pode ser usada como um parâmetro às rotinas que requerem uma classe. A classe deve ser registada antes que GetClass possa a encontrar. Dê forma a classes e as classes componentes que referenced em uma declaração do formulário (variáveis do exemplo) são registadas automaticamente quando o formulário é carregado. Outras classes podem ser registadas chamando RegisterClass ou RegisterClasses." por isso Pc := GetClass('T' + AForm); retorna nil.. qual Delphi vc usa? 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]