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