[Delphi] funkcja zwracająca klasę obiektu

0

Jak dostać się do zmiennych klasy kiedy:
Mam tablice obiektów

tab : array [0..9] of TCustomControl;

Jednak obiekty znajdujące sie w tablicy są pochodne od TCustomControl (tu: TObjRepeat, TObjWhile itd)
Metoda

if tab[i] is TObjRepeat then
TObjRepeat(tab[i]).zmienna

jest dla mnie niezadowalająca, ponieważ musiałbym stosować tą metodę dziesiątki razy.
Potrzebuję zatem przechowywać w jakiś sposób informację o klasie obiektu lub stworzyć funkcję odnajdującą klasę tego obiektu próbowałem tak:

function FindClass(Obiekt:TCustomControl):TClass;
begin
if Obiekt is TObjRepeat then result:=TObjRepeat;
if Obiekt is TObjWhile then result:=TObjWhile;
itd...
end;

potem uzycie funkcji:

var kl:TClass;
begin
kl:=FindClass(Obiekt);
kl(Obiekt).zmienna:=costam //to nie dziala
end;

I juz nie wiem ... chyba będę if'ował jak nie znajdę rozwiązania.
Dodam, że obiektów mam 7 a ich prawie wszystkie zmienne mają takie same nazwy.

0
Result := TypeOf(Obiekt);

albo ClassType()

0

Nie mogę dalej dostać się do zmiennej ... jeśli możesz podaj przykład.

0

var
ClassT: TClass;
begin
ClassT := Button1.ClassType;
ShowMessage(ClassT.ClassName);
end;

0
Deti napisał(a)

var
ClassT: TClass;
begin
ClassT := Button1.ClassType;
ShowMessage(ClassT.ClassName);
end;

No i ClassT.zmienna nie działa ... że nazwa klasy jest znana po uruchomieniu aplikacji to wiem ale ja muszę dostać się do zmiennej ... a przed uruchomieniem kompilator nie wie jaki to bedzie obiekt.
Chyba pozostaje mi jedynie napisanie siedmiu warunków dla każdego obiektu.
<edit>
Chodzi mi o podobny zapis do TEdit(obiekt).zmienna jednak nie mogę użyć TEdit bo w tablicy mam obiekty 7 rożnych klas (na bazie TCustomControl)

0

Chyba wiem o co Ci chodzi. Potrzebujesz biblioteki TypInfo. Sa w niej dwie procki:
SetObjectProp i GetObjectProp. Ogoolnie biblioteka umozliwia "poruszanie" sie po wlasciwosciach obiektow.

0

No i ClassT.zmienna nie działa ... że nazwa klasy jest znana po uruchomieniu aplikacji to wiem ale ja muszę dostać się do zmiennej ... a przed uruchomieniem kompilator nie wie jaki to bedzie obiekt.
Chyba pozostaje mi jedynie napisanie siedmiu warunków dla każdego obiektu.

Hmm nie bardzo rozumiem właśnie tego zamierzenia.. co chcesz osiągnąć? Jak możesz to sprecyzuj, bo "nie działa" to nie wiem ..

Chyba wiem o co Ci chodzi. Potrzebujesz biblioteki TypInfo. Sa w niej dwie procki:
SetObjectProp i GetObjectProp. Ogoolnie biblioteka umozliwia "poruszanie" sie po wlasciwosciach obiektow.

A co mają właściwości do tego? :|

0

Bo jak sie domyslam o to chyba koledze chodzi. Zreszta niech sie autor watku wypowie :p

0

Chodzi mi o to aby dostać się do właściwości obiektu. Podaje warunki:

tabObj : array[0..9] of TCustomControl;

w tej tablicy mam obiekty zbudowane na bazie TCustomControl nazwy ich klas to min. TObjRepeat, TObjWhile, TObjFor i inne.
Teraz wyszukuje w tej tablicy, który obiekt ma focus i odczytuje jego wlasciwos (każdy obiekt ma prawie wszystkie takie same nazwy właściwości

function ZnajdzObiekt:TCustomControl;
var
i:byte;
begin
i:=0;
result:=nil;
while i < LiczbaObj do
  begin
  if TabObj[i].Focused then
  Result:=TabObj[i];
  inc(i);
  end;
end;

Mógłbym stworzyć tablicę dla konkretnych obiektów (nie TCustomControl) np.

tabObj : array [0..9] of TObjRepeat  

ale to mnie nie urządza ... musze mieć wszystkie w jeden tablicy.
Każdy z obiektów ma inny wygląd i może byc rodzicem dla innych obiektów, dlatego muszę wiedzieć jaki obiekt aktualnie ma focus i w jakie miejsce mam wstawić 'dziecko'
Czyli podsumowując, chcąc wstawić obiekt muszę rozpoznać kto ma być Parentem i jaki obiekt zamierzam wstawić, ponieważ w momencie wywołania kreatora komponentu

TabObj[ostatni+1]:=TObjRepeat.Create(Self);

mam dostęp tylko do właściwości klasy TCustomControl
(obiekty tworzone są dynamicznie)
<edit>
Mam 7 rożnych obiektów 7X7=49 bardzo podobnych warunków ... róznica będzie tylko w określeniu klasy danego obiektu

if TabOb[aktualny].Parent is TObjRepeat then 
if TabOb[aktualny] is TObjRepeat then 
//instrukcje np. TObjRepeat(TabOb[aktualny]).wlasciwosc:=10;

if TabOb[aktualny].Parent is TObjWhile then 
if TabOb[aktualny] is TObjFor then 
//prawie takie same instrukcje TObjFor(TabOb[aktualny]).wlasciwosc:=10;
0

W module TypInfo masz deklaracje:

function GetObjectProp(Instance: TObject; const PropName: string; MinClass: TClass = nil): TObject; overload;

procedure SetObjectProp(Instance: TObject; const PropName: string; Value: TObject); overload;

Sadze ze do twoich potrzeb wystarcza. Podajesz instancje obiektu i nazwe jej wlasciwosci jako string, czyli wszystko ok na poziomie kompilacji.

BTW: Co to za aplikacja?

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