Saber o ancestral da classe
Eu tenho algumas classes registradas no sistema.
Elas são organizadas da seguinte forma:
Então eu declaro types
Na minha factory eu executo
Agora a pergunta: eu gostaria de saber se a classe que eu achei é descente direto de TFilho ou de TPai?
Operadores como ´oClass is TFilho´ não funcionam.
Desde já obrigado.
Elas são organizadas da seguinte forma:
TFilho = class(TPai) TNeto = class(TFilho)
Então eu declaro types
TFilhoClass = class of TFilho;
Na minha factory eu executo
var oClass: TFilhoClass; begin oClass := TFilhoClass(GetClass(AClasse));
Agora a pergunta: eu gostaria de saber se a classe que eu achei é descente direto de TFilho ou de TPai?
Operadores como ´oClass is TFilho´ não funcionam.
Desde já obrigado.
Andremuller
Curtidas 0
Respostas
Ronaldo
12/07/2005
Dá uma estudada neste exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
ClassRef: TClass;
begin
ListBox1.Clear;
ClassRef := Sender.ClassType;
while ClassRef <> nil do
begin
ListBox1.Items.Add(ClassRef.ClassName);
ClassRef := ClassRef.ClassParent;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ClassRef: TClass;
begin
ListBox1.Clear;
ClassRef := Sender.ClassType;
while ClassRef <> nil do
begin
ListBox1.Items.Add(ClassRef.ClassName);
ClassRef := ClassRef.ClassParent;
end;
end;
GOSTEI 0
Beppe
12/07/2005
Opa!
O método InheritsFrom(C) não precisa de uma instância.
if C.InheritsFrom(SuaClasse) then
O método InheritsFrom(C) não precisa de uma instância.
if C.InheritsFrom(SuaClasse) then
GOSTEI 0
Kapak
12/07/2005
Operadores como ´oClass is TFilho´ não funcionam.
Pq não funciona ? Se ele retorna false é pq oClass não é TFilho.GOSTEI 0
Andremuller
12/07/2005
não funciona porque oClass não é um objeto, é uma referência para uma class TFilhoClass que tá declarada no type.
Vou testar o InheritsFrom e depois posto o resultado no fórum
Valeu pessoal
Vou testar o InheritsFrom e depois posto o resultado no fórum
Valeu pessoal
Operadores como ´oClass is TFilho´ não funcionam.
Pq não funciona ? Se ele retorna false é pq oClass não é TFilho
GOSTEI 0
Kapak
12/07/2005
Tá certo o operador não é aplicável. E se fizer:?
if oClass = TFilho then ...
GOSTEI 0
Andremuller
12/07/2005
também não dá porque a factory não conhece todas as classes que cria, todas as classes criadas não estão declaradas na uses.
Ela cria um monte de classes, algumas descentes de TPai e outras descentendes de TFilho.
pra fazer o que tu disse que teria que fazer, em alguns casos
Digamos o seguinte
TNeto´X´ = class(TFilho)
TFilho´X´ = class(TPai)
if oClasse = TNeto1 ...
else
if oClasse = TNeto2 ....
else
if oClasse = TFilho1
isso seria inviável
Ela cria um monte de classes, algumas descentes de TPai e outras descentendes de TFilho.
pra fazer o que tu disse que teria que fazer, em alguns casos
Digamos o seguinte
TNeto´X´ = class(TFilho)
TFilho´X´ = class(TPai)
if oClasse = TNeto1 ...
else
if oClasse = TNeto2 ....
else
if oClasse = TFilho1
isso seria inviável
GOSTEI 0
Kapak
12/07/2005
Mas se for utilizar o InheritsFrom, também não precisa colocar no uses ?
Outra opção seria usar a propriedade ClassName de oClass:
if SameText(oClass.ClassName, ´classex´) then
Outra opção seria usar a propriedade ClassName de oClass:
if SameText(oClass.ClassName, ´classex´) then
GOSTEI 0
Andremuller
12/07/2005
Class name gera o mesmo problema do oClass = TFilho, eu teria que escrever todas as classes lá, o que não dá.
Meu problema é resolvido com o inheritsFrom
Valeu, pessoal
Meu problema é resolvido com o inheritsFrom
Valeu, pessoal
GOSTEI 0
Beppe
12/07/2005
O ´uses´ é um recurso de compile-time, InheritsFrom é run-time, pode tudo.
GOSTEI 0