Ich glaube, du hast da irgendwas verwechselt. Du meinst sicher TButton(FINDCOMPONENT('Button1'));
Wie auch immer, ich habe heir mal eine kleine ungetestete Lösung vorbereitet: Die Basisklasse TNachricht verwaltet hier eine interne Liste mit Unterklassen. Dabei benutze ich TClassList aus der
unit contnrs. Jede abgeleitete Klasse kann sich dort registrieren (Musst du manuell aufrufen (siehe initialization-abschnitt). Ich hätte schwören können, ich wollte da noch irgendwas automatisieren...). Per TNachricht.getSubClass(klassenname) wird die passende klasse aus der liste gesucht und zurückgegeben.
Delphi-Quellcode:
unit Unit1;
interface
uses
classes, types, contnrs;
type
TNachrichtClass =
class of TNachricht;
TNachricht =
class
strict protected
class var fSubClasses: TClassList;
class procedure Register_Class;
virtual;
public
class function getSubClass(
const ClassName:
string): TNachrichtClass;
procedure Execute(Strings : TStringList);
virtual;
abstract;
end;
type
TKarteHinzufügen =
class(TNachricht)
strict private
class procedure Register_Class;
override;
public
procedure Execute(Strings : TStringList);
override;
end;
//...
implementation
var
AddKarte : TNachricht;
//...
procedure TKarteHinzufügen.Execute(Strings : TStringList);
var InfoFile : TextFile;
Info :
string;
begin
//...
end;
procedure TFMain.FormCreate(Sender: TObject);
begin
AddKarte := TKarteHinzufügen.Create;
//...
end;
//...
// Client sendet string (Inhalt: AddKarte,...)
//...
procedure TFMain.ServerExecute(AContext: TIdContext);
var Strings : TStringList;
//test : TNachricht;
begin
Strings := TStringList.Create;
Strings.CommaText := AContext.Connection.IOHandler.Readln;
//test := TNachricht(Strings[0]);
//test.Execute(strings);
with TNachricht.getSubClass[strings[0]].create
do
begin
Execute(Strings);
end;
end;
{ TNachricht }
class procedure TNachricht.Register_Class;
begin
// nix
end;
class function TNachricht.getSubClass(
const ClassName:
string): TNachrichtClass;
begin
result := TNachrichtClass(fSubClasses[classname]);
end;
{ TKarteHinzufügen }
class procedure TKarteHinzufügen.register_Class;
begin
fSubClasses.Add(Self);
end;
initialization
TNachricht.SubClasses := TClassList.Create;
Tkartehinzufügen.Register_Class;
end.
Logischerweise ungetestet, da delphi die ganzen bezeichner nicht kennt und ich zu faul bin, ein demoprojekt zu erstellen.
Btw: Herlich Willkommen in der
DP