Funkcja sprawdzająca czy dany obiekt jest danej klasy - jak to zrobić?

0

W moim programie bardzo często korzystam ze sprawdzania czy dany obiekt jest danej klasy jeśli tak to coś tam wykonuje. I zamiast powtarzać ten kod kilka naście razy chciałem go opakować w funkcji ale tutaj pojawił się problem:

function FindTabSheet(Tab : TTabSheet; TDrugiParametr): TPageControl;
var 
  x : Integer;
begin
  Result := nil;
  for x := 0 to Tab.ComponentCount-1 do
    if (Tab.Components[x] is TDrugiParametr) then
      begin
        Result := TDrugiParametr(Tab.Components[x]).PageContent;
        break;
      end;
end;

Czy jest to wykonywalne aby jako drugi parametr nie przekazywać zmiennej a klasę ?

0

jeżeli to nowa wersja delphi to zdaje się że są tam już generyki, wtedy możesz przesłać typ jako parametr generyczny funkcja<TDrugiParametr>(...)
jeśli nie to pewnie dalej to będzie możliwe, zdaje się że drugi parametr byłby typu TClass, problem jest tylko ze sprawdzeniem czy coś z niego dziedziczy, nie możesz użyć zwykłego operatora is tylko musisz pogrzebać wtedy

0
fdfdfdf napisał(a):

nie możesz użyć zwykłego operatora is tylko musisz pogrzebać wtedy

najwyraźniej istnieje metoda .InheritsFrom która powinna rozwiązać problem

0

Tak jest to nowa wersja Delphiego - muszę się trochę podszkolić i dowiedzieć się co to typy generyczne i jak tego się używa

0

A czy tutaj nie przyda się przypadkiem ClassType?

0

Ew.możesz przekazać nazwę klasy jako string lub enum.

0

Spróbowałem tak:

function FindTabSheet(Tab : TsTabSheet; cType: TClass): TsPageControl;
var
  x : Integer;
begin
  Result := nil;
  for x := 0 to Tab.ComponentCount-1 do
    if (Tab.Components[x] is cType) then
      begin
        Result := cType(Tab.Components[x]).PageContent;
        break;
      end;
end;

I teraz problem się pojawił z komponentem PageContent - bo jak zmusić kompilator do ignorowania / oszukania tego błędu ? //Kompilator: Skąd mam wiedzieć że ta klasa ma PageContent :)

0

cType musi mieć taką właściwość.

0

To że cType musi mieć taką właściwość to ja wiem. Ale jeśli jest ** cType : TClass** to cType może być dowolnej klasy. Natomiast jeśli zrobię cType : TMojaKlasa to powiedzmy że TMojaKlasa ma zdefiniowaną taką metodę czy komponent jak TPageControl ale kompilator przyjmie mi tylko cType typu TMojaKlasa. A ja bym chciał aby przyjmował różne klasy które podają i które wiem że mają daną właściwość.

0

Może by się coś dało wykombinować z RTTI ale co to jest ten PageContent wiem że to coś (metoda?, właściwość?) zwraca coś typu TsPageControl ale nie wiem znowu co to ten TsPageControl.

0

Nie sprawdzałem, ale spróbuj może w taki sposób:

(cType as TMyComponent).PageContent
0

Jeśli masz nowsze wersje delphi posiadające extended rtti to można tak

 
procedure InvokeClassMethod(ACalss: TClass; AMethod: string; AParams: array of TValue);
var
  AContext: TRttiContext;
  AType: TRttiType;
begin
    AContext := TRttiContext.Create;
    try
      AType := AContext.GetType(AClass); 
      AValue := AType.GetMethod(AMethod).Invoke(
        Components[i], AParams);     
    finally
      AContext.Free;
    end;   

petle sobie już sam dorobisz - powinno dzialac (pisałem z glowy wiec sprawdz czy będzie ok)

1 użytkowników online, w tym zalogowanych: 0, gości: 1