Fórum Variável tipo genérica em um formulário #453551
29/08/2013
0
function TForm1.CriaInstancia<T>: T;
var
valor: TValue;
ctx: TRttiContext;
tipo: TRttiType;
metodo: TRttiMethod;
tipoInstancia: TRttiInstanceType;
begin
tipo := ctx.GetType(TypeInfo(T));
metodo := tipo.GetMethod('Create');
//
if Assigned(metodo) and tipo.IsInstance then
begin
tipoInstancia := tipo.AsInstance;
//
valor := metodo.Invoke(tipoInstancia.MetaclassType, []);
// cria parametros
//
Result := valor.AsType<T>
end;
end;
o que eu queria era que no meu form, tivesse uma variável do tipo genérica para que eu consiga passar no create do fomulário para a função cria instância
algo do tipo
tteste = class
teste: string;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
function CriaInstancia<T>: T;
{ Private declarations }
public
variavelGenetica: ????????;
end;
var
Form1: TForm1;
implementation
uses RTTI;
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
vavriavelGenerica := TTeste;
CriaInstancia<variavelGenerica>
end;
Alguém saberia me dizer como fazer isso?
agradeço antecipadamente.
Rafael Reis
Curtir tópico
+ 0Posts
29/08/2013
Rafael Reis
Gostei + 0
30/08/2013
Gustavo Bretas
Cara, eu não sou muito bom com RTTI, mas eu fiz um método genérico pra criar formulários que talvez possa te ajudar!
Eu uso o método GetClass e FindClass para buscar a classe pelo nome, com string mesmo, só que pra conseguir usá-las, eu tenho que declarar as classes previamente, então declaro todas no arquivo de projeto pra ficar centralizado, o comando é:
RegisterClasses([Classe1, Classe2]);
Então prosseguindo, vc pode adicionar um parâmetro no construtor do formulário dessa forma:
constructor Create(AOwner: TComponent; NomeClasse : String); reintroduce;
constructor TForm2.Create(AOwner: TComponent; NomeClasse : String);
begin
inherited Create(AOwner); // Essa linha chama o create original
// Verifica se a classe foi declarada
if GetClass(NomeClasse) <> nil then
begin
variavelGenetica := TComponentClass(FindClass(NomeClasse));
end;
// Só testar! rsrs
CriaInstancia<variavelGenerica>
end;
No meu caso eu uso TComponentClass, pq ela é ancestral de TForm, e a função é somente para criar os formulários, mas acredito que vc possa usar a classe ancestral das suas variáveis, só substituir.
Daí pra frente vc tem na mão sua classe, e teoricamente pode chamar a função pra instanciar ela!
Espero ter ajudado, depois nos diga se deu certo!
Gostei + 0
30/08/2013
Marco Salles
Bem o que vc quer não é dificil , mas vc esta esquecendo de um detalhe
Mesmo que vc defina esta variavel Genérica como acessar os métodos de uma classe especifica ??
vamos supor
variavelGenetica: TObject ; // esta classe é genérica , pois todas as outra derivam dela
ai vc instancia
variavelGenetica:=CriaInstancia<TTeste>;
para accessar os métodos vc tem que fazer um typcast
TTeste(variavelGenetica).MetodosDaClasseTeste
entendeu ???????
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)