Fórum Converter String para TFormClass #398780

06/04/2011

0

Boa noite pessoal. 

Estou com um problema aqui dificil de resolver. Seguinte. 
Criei um aplicação que abre formularios em abas dentro de um pagecontrol. 
Criei uma função que espera uma variavel do tipo TFormClass, onde passo o nome da tela e ele abre a tela dentro do PageControl. 

O problema, é que coloquei os nomes dos Forms no banco de dados, mesmo porque monto os menus de acesso dinamicamente de acordo com cada usuario cadastrado. 
Quando recupero essa informação do banco, que ta em formato String, tenho que converter para TFormClass, pra poder abrir o form. 
O Problema que ta dando Acess Violation e nao abre a tela. 

O Código é esse. 


procedure TFrmPrinc.CapturaClick(Sender: TObject); 
var 
Formulario: TFormClass; 
NomeForm: String; 
begin 
Banco.QryMenu1.Open;// Abro o banco onde estao os nomes das telas. 
//localizo o nome no banco de acordo com o item passado pelo menu. 
if Banco.QryMenu1.Locate('NOME', TMenuItem(Sender).Caption, []) then begin 
//coloco o nome do form em uma variavel. 
NomeForm:= Banco.QryMenu1.FieldByName('FUNCAO').AsString; 
CodTela:= Banco.QryMenu1.FieldByName('CODIGO').AsInteger; 
//tento converter a variavel String para TFormClass 
Formulario:= TFormClass(FindClass(NomeForm)); 
NovaAba(Formulario);//Função que abre o formulario no PageControl. 
end 
else begin 
//se nao existir o nome no banco de dados, dou uma mensagem. 
ShowMessage('Função não encontrada, contate o suporte!'); 
end; 
Banco.QryMenu1.Close;//Fecho o banco de dados. 
end; 


O erro ocorre quando tento converter a variavel String em TFormClass. 


Alguem ai tem uma idéia de como resolver isso? 

Desde já obrigado.
 
Marcos Paulo

Marcos Paulo

Responder

Posts

07/04/2011

Dirceu Morais

Boa noite pessoal. 

Estou com um problema aqui dificil de resolver. Seguinte. 
Criei um aplicação que abre formularios em abas dentro de um pagecontrol. 
Criei uma função que espera uma variavel do tipo TFormClass, onde passo o nome da tela e ele abre a tela dentro do PageControl. 

O problema, é que coloquei os nomes dos Forms no banco de dados, mesmo porque monto os menus de acesso dinamicamente de acordo com cada usuario cadastrado. 
Quando recupero essa informação do banco, que ta em formato String, tenho que converter para TFormClass, pra poder abrir o form. 
O Problema que ta dando Acess Violation e nao abre a tela. 

O Código é esse. 


procedure TFrmPrinc.CapturaClick(Sender: TObject); 
var 
Formulario: TFormClass; 
NomeForm: String; 
begin 
Banco.QryMenu1.Open;// Abro o banco onde estao os nomes das telas. 
//localizo o nome no banco de acordo com o item passado pelo menu. 
if Banco.QryMenu1.Locate('NOME', TMenuItem(Sender).Caption, []) then begin 
//coloco o nome do form em uma variavel. 
NomeForm:= Banco.QryMenu1.FieldByName('FUNCAO').AsString; 
CodTela:= Banco.QryMenu1.FieldByName('CODIGO').AsInteger; 
//tento converter a variavel String para TFormClass 
Formulario:= TFormClass(FindClass(NomeForm)); 
NovaAba(Formulario);//Função que abre o formulario no PageControl. 
end 
else begin 
//se nao existir o nome no banco de dados, dou uma mensagem. 
ShowMessage('Função não encontrada, contate o suporte!'); 
end; 
Banco.QryMenu1.Close;//Fecho o banco de dados. 
end; 


O erro ocorre quando tento converter a variavel String em TFormClass. 


Alguem ai tem uma idéia de como resolver isso? 

Desde já obrigado.
 


Marcos bom Dia,

dê uma olhada neste tôpico: http://www.forumweb.com.br/foruns/topic/48674-converter-string-para-tformclass/
me parece que faltou criar o formulário:
Application.CreateForm(TFormClass(FindClass('TForm2')), F);

procedure TFrmPrinc.CapturaClick(Sender: TObject); 
var Formulario: TFormClass; 
NomeForm: String; 
begin 
   Application.CreateForm(TFormClass(FindClass(Formulario
)), F);
   Banco.QryMenu1.Open;// Abro o banco onde estao os nomes das telas. 
   //localizo o nome no banco de acordo com o item passado pelo menu. 
   if Banco.QryMenu1.Locate('NOME', TMenuItem(Sender).Caption, []) then begin 
      //coloco o nome do form em uma variavel. 
      NomeForm:= Banco.QryMenu1.FieldByName('FUNCAO').AsString; 
      CodTela:= Banco.QryMenu1.FieldByName('CODIGO').AsInteger; 
      //tento converter a variavel String para TFormClass 
      Formulario:= TFormClass(FindClass(NomeForm)); 
      NovaAba(Formulario);//Função que abre o formulario no PageControl. 
   end 
   else begin 
      //se nao existir o nome no banco de dados, dou uma mensagem. 
      ShowMessage('Função não encontrada, contate o suporte!'); 
   end; 
   Banco.QryMenu1.Close;//Fecho o banco de dados. 
end; 


Atenciosamente,

Dirceu Morais
Responder

Gostei + 0

07/04/2011

Marcos Paulo

Bom dia  Dirceu.
Na verdade o que estava faltando era colocar as classes dos forms na sessão initialization e finalization.
Depois de criado isso no Form principal a função funcionou perfeitamente.
Obrigado pela sua ajuda ok.
Abraço.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar