[ looping @ 22.07.2014. 12:51 ] @
Pokusavam da kreiram objekat od klase, a da pri tome imam samo ime klase (string vrednost)
Kako da od imena klase kreiram objekat te klase u DELPHI-ju?
Pokusavam nesto slicno ovome:
Code:

var
  imeKlase : string;
  objKlase : TClass;

  objKlase := GetInstanceFromClassName(imeKlase);
[ reiser @ 22.07.2014. 13:14 ] @
Mozes pomocu RTTI-ja, ovako:

Code:
function CreateClassFromName(const AClassName: String): TObject;
var
  c: TRttiContext;
  t: TRttiInstanceType;
  v: TValue;
begin
  c := TRttiContext.Create;
  t := c.FindType(AClassName) as TRttiInstanceType;
  v := t.GetMethod('Create').Invoke(T.MetaclassType, []);
  result := v.AsObject;
end;

...

var
  neka_klasa: TNekaKlasa;
begin
  neka_klasa := CreateClassFromName('Unit1.TNekaKlasa');


Alternativno resenje preko GetClass(), s' tim sto moras da registrujes klase (RegisterClass/UnregisterClass ili RegisterClasses/UnregisterClasses) koje zelis da budu nadjene ovim, i te klase takodje moraju da nasledjuju TPersistent:

Code:

function CreateClassFromName(const AClassName: String): TObject;
begin
  result := GetClass(AClassName).Create;
end;

...

var
  neka_klasa: TNekaKlasa;
begin
  RegisterClass(neka_klasa)
  neka_klasa := CreateClassFromName('TNekaKlasa');
[ looping @ 22.07.2014. 16:07 ] @
Hvala na odgovoru. To je ono sto mi je trebalo.
[ Rapaic Rajko @ 24.07.2014. 08:22 ] @
looping, ne znam zasta ti ovo treba, tj. koji je scenario u kojem radis, ali - generalno je retka praksa instanciranje preko string-a odnosno imena klase.

U Delphi-ju postoji bolji mehanizam za instanciranje nepoznate klase, i rukovanje dobijenom instancom. Pogledaj metaklase, konkretno deklaracija neke metaklase ide ovako:

Code:

  type
    TControlClass = class of TControl;


Ovo podrzava nasledjivanje i donosi gomilu prednosti u odnosu na instanciranje preko string imena klase. Pogledaj npr. ovo:

Code:

  var 
    MyClass: TControlClass;
    MyInstance: TControl;

  begin
    ...
    MyClass := TButton; // class, ne string!
    MyInstance := MyClass.Create(AnyParent);
    ...  
  end;


Da li uvidjas flexibilnost i moc gornjeg koda? Istrazi malo po Delphi help-u, ima jos na ovu temu.

Pozz
[ looping @ 24.07.2014. 12:13 ] @
Pozrdav Rapaic Rajko.
Scenario gde mi je potrebno da na osnovu stringa dobijem instancu klase je sledeci:

Kreiram alat koji treba da ucita exe ili bpl file i da iz exe-a ili bpl-a izvucem sve TForm objekte.
Taj deo sam uradio i mogu da dobijem formu kao string (dobijem isti string kao i u DFM file-u forme)
E sad, u DFM-u forma pocinje sa
Code:

inherited nekaForma: TnekaForma

inherited oznacava da forma ne nasledjuje direktno TForm, nego postoji Custom forma koju ova koju ucitavam nasledjuje.
Iz odredjenih razloga moram da prodjem kroz propertije u baznoj formi (a moze biti bilo koja Custom forma-nemam spisak formi koje mogu biti bazne)
pa iz tog razloga treba da kreiram instancu na osnovu stringa iz DFM filea

Nadam se da nisam konfuzno objasnio :)
[ Rapaic Rajko @ 24.07.2014. 21:59 ] @
Citat:
Iz odredjenih razloga moram da prodjem kroz propertije u baznoj formi (a moze biti bilo koja Custom forma-nemam spisak formi koje mogu biti bazne)


Kako znas koje propertije ces da citas a ne znas koje su klase? Ili sve bazne klase imaju iste propertije..?

Pozz
[ looping @ 25.07.2014. 08:25 ] @
Petljom prolazim kroz sve kontrole i po unapred definisanom pravilu izcitavam samo odredjene property-je odredjenih kontrola.
Problem je dobiti objekat, ostalo je lako :-)

U principu, gornji primeri funkcionisu, samo sto je potrebno znati Unit u kome je klasa definisana, sto zahteva postojanje mapera klasa-Unit