Tworzenie obiektu na podstawie innego obiektu

0

Witam,
chcialbym utworzyc obiekt tej samej klasy co obiekt przechowywany w zmiennej.

oto przyklad:

var a,b: TComponent;    
begin
  a := TButton.create(nil);
  b := a.create(nil); 
// tu specjalnie uzylem zmiennej zeby uzyc konstruktora zaleznie od tego 
// jaki jest tam obiekt. ZAKLADAM ZE KONSTRUKTOR JEST VIRTUALNY}
end;

no i wszystko dziala ladnie, ale nie do konca.
przy wykonywaniu destruktora wyskakuja jakies bledy:/
niestety sa one gleboko w kodzie komponentu bazowego
w ktorego kod nie chce za bardzo wnikac.

moje pytanie jest takie:
Jakie sa przeciwwskazania do takiego tworzenia obiektow?
czy cos sie dzieje z obiektem na podstwie ktorego tworze nowy obiekt?
czy nowo powstaly obiekt jakos zalezy od tego na podstawie ktorego go utworzylem (moze jest jego kopia??)??

//sprawdzone
niestety po wykonaniu czegos takiego jak w przykladzie
obiekt b jest kopia a:/

//dopisane: (nie kopia - jest to ten sam obiekt)

Ma ktos pomysl jak rozwiazac moj problem?

pozdrawiam

0

konstruktor to nic innego tylko metoda klasowa, czyli taka, która może być wywołana na rzecz klasy a nie obiektu. To co zrobiłeś (a.Create(nil);) to jakbyś drugi raz zainicjował obiekt.
Inaczej
Jakbyś przeniósł wszystko co masz w konstruktorze do zwykłej metody i w konstruktorze ją wywoływał to to co zrobiłeś to jest dokładnie wywołanie tej dodatkowej metody bezpośrednio.

ja bym nawt stwierdził, że b nie jest kopią tylko jest a - zmień coś w a (np. caption) i zobacz czy dla b też się zmieni.

btw może to http://xion.org.pl/2007/08/20/referencje-do-klas-w-delphi/ + a.ClassType Ci pomoże

0

tak, masz racje, zle sie wyrazilem b = a - czyli jest to ten sam obiekt.

No ale dalej mam problem jak zrobic obiekt takiej samej klasy jak ten w zmiennej....?
(gdyby to byla kopia to moze by wystarczylo do moich potrzeb)

0
var a,b: TObject;    
begin
  a := TButton.create(nil);
  b := a.classtype.create; 
  showmessage(b.classname)
end;
0
procedure TForm1.btn1Click(Sender: TObject);
var
  a, b: TWinControl;
begin
  a := TButton.create(nil);
  a.Parent := Self;
  a.Left := 40;
  a.Top := 10;

  b :=  TWinControlClass(a.ClassType).Create(nil);
  b.Parent := Self;
  b.Left := 40;
  b.Top := 40;
end;

dlatego TWinControl bo tam masz dostęp do parent, left i top i konstruktor ma parametr

0

dzieki,
wlasnie brakowalo mi w TClass parametrow w konstruktorze.

Ale niestety zrezygnowalem juz z tego rozwiazania. Strasznie pokretne to bylo.
A Wam zdarza sie tego uzywac? Jakby dobrze przemyslec to moze i ciekawe rzeczy by z tego wyszly...

0
Johny_Morfina napisał(a)

A Wam zdarza sie tego uzywac? Jakby dobrze przemyslec to moze i ciekawe rzeczy by z tego wyszly...

W życiu takich rzeczy nie robiłem. Najwyżej wywoływałem konstruktor klasy bazowej na rzecz potomnej i potem jakieś rzutowanie.

0

Ja też takiego rozwiązania nie stosowałem. Napisz co chcesz osiągnąć to może ktoś coś podpowie (może jakaś fabryka interfejsów ...).

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