AGB  ·  Datenschutz  ·  Impressum  







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

Klasseninstanz zur Laufzeit bestimmen

Ein Thema von Delbor · begonnen am 1. Aug 2015 · letzter Beitrag vom 4. Aug 2015
 
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.196 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Klasseninstanz zur Laufzeit bestimmen

  Alt 2. Aug 2015, 19:14
Hi zusammen

Sorry, wenn ich auf Sir Rufos Vorschlag bisher nicht eingegangen bin; der Grund liegt vor allem darin, dass ich bisher sehr wenig mit Generics arbeite, da ich die Dinger zu wenig durchschaue.
Eigentlich ist die einzige generische Klasse, die ich bisher benutze, eine Objectliste, die mir einst DeddyH vorgeschlagen hat. Ein weiterer seiner Vorschläge betraf die Verwendung einer Class Factory.Und so sieht das Ding heute bei mir aus :

Delphi-Quellcode:
uses Generics.Collections, Vcl.Forms, System.Classes, System.SysUtils;

type
  EFrameNotRegistered = class(Exception);
  TFrameClass = class of TFrame;

  TFrameFactory = class abstract
  strict private
    class var FAssociations: TDictionary<string, TFrameClass>;
    class constructor Create;
    class destructor Destroy;
  public
    class procedure RegisterFrameClass(const Extension: string; FrameClass: TFrameClass);
    class function GetRegisteredFrameClass(const Extension: string; AOwner: TComponent): TFrame;
  end;

implementation

{ TFrameFactory }

class constructor TFrameFactory.Create;
begin
  FAssociations := TDictionary<string, TFrameClass>.Create;
end;

class destructor TFrameFactory.Destroy;
begin
  FAssociations.Free;
end;

class function TFrameFactory.GetRegisteredFrameClass(const Extension: string;
  AOwner: TComponent): TFrame;
  var AFrameClass: TFrameClass; //TCustomFrameClass
begin
  if FAssociations.TryGetValue(AnsiLowerCase(Extension), AFrameClass) then
    Result := AFrameClass.Create(AOwner)
  else
    raise EFrameNotRegistered.CreateFmt('Für die Endung %s ist keine Frameklasse registriert.', [Extension]);
end;

class procedure TFrameFactory.RegisterFrameClass(const Extension: string;
  FrameClass: TFrameClass);
begin
  FAssociations.AddOrSetValue('.' + AnsiLowerCase(Extension), FrameClass);
end;

end.
Meinen Frames muss ich dann noch folgendes verpassen:
Delphi-Quellcode:
initialization
  TFrameFactory.RegisterFrameClass('css', TCSSFrame);
Dein Vorschlag ist offenbar das generische Gegenstück zu dieser Fabrikklasse, und wenn mich meine bisherigen Kenntnisse der Generics nicht täuschen, könnte ich da jede Klasse registrieren, die, in deinem Beispiel, von TFoo, bzw. TBar erbt oder selbst von einem dieser Typen ist.
Somit könnte ich da jeden meiner Eventhandler registrieren. Hab ich das richtig verstanden?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  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 17:23 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