Er hat tatsächlich den falschen Constructor erwischt.
Nein, er hatte gar keinen erwischt
Änderungen:
Delphi-Quellcode:
Class function DialogManager.CreateInstance(AClass:TClass):TInterfacedPersistent;
var
ctx : TRttiContext;
rt : TRttiInstanceType;
rm : TRttiMethod;
begin
if not AClass.InheritsFrom(TInterfacedPersistent)
then
raise EArgumentException.Create('
AClass muss von TInterfacedPersistend abgeleitet sein');
ctx := TRttiContext.create;
try
rt := ctx.GetType(AClass.ClassInfo).AsInstance;
while Assigned(rt)
do
begin
for rm
in rt.GetMethods
do
begin
if (rm.IsConstructor)
and (Length(rm.GetParameters)=0)
then
begin
result := rm.Invoke(AClass,[]).AsObject
as TInterfacedPersistent;
Exit;
end;
end;
rt := rt.BaseType;
end;
raise Exception.Create('
Fehlermeldung');
finally
ctx.Free;
end;
end;
und es läuft.
Verstehen muss man diesen Part, wie?
Delphi-Quellcode:
Class function DialogManager.CallDialog(AName: string; var value: TValue):boolean;
var
intf : IVTDialogCall;
dm : TDialogItem;
begin
...
// Wenn es keine Instanz gibt, dann eine erzeugen und eintragen
if (dm.Ainst = NIL) then
begin
dm.AInst := CreateInstance(dm.AClass);
fdialogs.AddOrSetValue(Aname,dm);
end;
// Wenn es eine gibt, dann eine erzeugen und eintragen (wozu?)
if (dm.AInst <> NIL) then
begin
dm.AInst := CreateInstance(dm.AClass);
fdialogs.AddOrSetValue(Aname,dm);
end;
...
end;
Wenn es keine Instanz gibt, dann eine erzeugen und eintragen, ok.
Wenn es eine gibt, dann eine erzeugen und eintragen
(wenn es keine Instanz gibt, dann wird der zweite Part auch immer durchlaufen, also eine Instanz wird entweder doppelt oder immer wieder neu erzeugt)