AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Interfaces, Factory- und Singletonpattern

Ein Thema von Ghostwalker · begonnen am 5. Mai 2018 · letzter Beitrag vom 6. Mai 2018
 
Schokohase
(Gast)

n/a Beiträge
 
#8

AW: Interfaces, Factory- und Singletonpattern

  Alt 5. Mai 2018, 08:12
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)

Geändert von Schokohase ( 5. Mai 2018 um 08:17 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz