[delphi] dynamisch laden van classes

Pagina: 1
Acties:

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13
Hallo,

ik ben nu bezig met een tooltje om bepaalde objecten databasegestuurd te laden. Nu is het (dacht ik) in JAVA mogelijk om objecten te laden dmv een String.

Dit zou ik ook graag in Delphi willen doen, echter met een GetClass (na natuurlijk de registerClasses te hebben gedaan) lukt dit me niet. :S

Heeft iemand een idee, het gaat dus niet om visuele componenten maar om "gewone" classes. (Bij componenten als TEdit lukt het me namleijk wel |:( )

}:O

If you are not wiping out you are nog pushing enough...


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Pinda: Nu is het (dacht ik) in JAVA mogelijk om objecten te laden dmv een String.
Je kan inderdaad klassen via de naam van die klasse dynamisch inladen en instantieren :) . Deze klassen hoeven dus at-compile-time niet bekend te zijn.

Over Delphi weet ik verder niet veel, maar ik ben benieuwd wat de mogelijkheden zijn en wat de verschillen zijn met dynamische class-loading en ClassLoaders in Java :) .

PS: tijd niet gezien hier! :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 27-06 10:54
Hmm ik weet vrij veel van Delphi, maar dit wist ik nog niet.

Lijkt me leuk omt e weten hoe het precies moet.

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Verwijderd

Met TStream.WriteComponent en TStream.ReadComponent kun je component wegschrijven en lezen.

Wel worden alleen de published properties weggeschreven.

Hier staat nog een voorbeeld.

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13
Ik weet inmiddels al hoe het moet.
Je maakt van bijvoorbeeld je BASE class, zeg Base een classe-typering:
TBaseClass : class of TBase;

VCervolgens heb je een aantal classes die deze classe extenden. (Class1, Class2 , Class 3 = class(TBase))
je procedure wordt dan:
code:
1
2
3
4
5
6
7
8
9
10
var
  obj: TPersistentClass;
  obj2: TBase;
begin
  registerClasses([Class1,Class2, Class3]);
  obj := getClass(edit1.Text);
  obj2 := TBaseClass(obj).create(Self);
  //doe met obj2 wat je wilt...
  obj2.free;
end;

Eventueel nog wat try-excepts eromheen.

Dit is dus echt heel erg handig, als je iets db gestuurd doet :o

8-)

If you are not wiping out you are nog pushing enough...


Verwijderd

Ik kan me vergissen, maar creeer je nu niet altijd een TBase.

Dus ook als Edit1.Text = 'TExtBase' en je hebt gedef TExtBase = class(TBase);

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13
Nee hoor, als ik Class1 opgeef dan maakt hij netjes een Class1.
Echter je kunt (geloof ik) enkel functie gebruiken die in TBase zijn gedeclareerd, dit moet ik nog even uitzoeken. Dit is echter niet relevant want op het moment dat je een specifieke functie wilt gaan gebruiken heb je dit niet nodig.

Probeer hetzelfde grapje maar eens met controls. Dan zul je zien dat als je TEdit intikt terwijl je een "Tcontrol" creert je toch een Editbox krijgt.

If you are not wiping out you are nog pushing enough...


Verwijderd

Owkee, ik dacht dat je door
code:
1
obj2 := TBaseClass(obj).create(Self);

altijd de constructor van TBase aanriep..
edit:

Create is virtual, moet ik toch onderhand wel weten |:(

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13
Idd.

Is wel leuk, nu kan ik nog dynamischer mijn systeempske opbouwwen 8-)

If you are not wiping out you are nog pushing enough...

Pagina: 1