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]

Responder a