Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 6 odgovora
  • 2.701 pregleda

Najnovija ↓

Instance of object from class name DELPHI 22.07.2014. u 13:51 · pre 149 meseci #1
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);
Re: Instance of object from class name DELPHI 22.07.2014. u 14:14 · pre 149 meseci #2
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');
Sviđa mi se1
Re: Instance of object from class name DELPHI 24.07.2014. u 09:22 · pre 149 meseci #4
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
Re: Instance of object from class name DELPHI 24.07.2014. u 13:13 · pre 149 meseci #5
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 :)
Re: Instance of object from class name DELPHI 24.07.2014. u 22:59 · pre 149 meseci #6
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
Re: Instance of object from class name DELPHI 25.07.2014. u 09:25 · pre 149 meseci #7
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
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme