Moin erstmal,
Ich hab mir so eine Art Taskplaner, unix-cron, etc.. geschrieben.
Die jobs lese ich aus einer
DB-Tabelle und arbeite sie zeitgesteuert ab.
Der "JobName" ist die Bezeichnung der aufzurufen Procedure den ich per Variable
übergebe.
Sigi
Wenn ich das richtig verstehen dann gibt es keine "unbekannten" Prozeduren und Methoden sondern lediglich Objekte/Klassen die sich auf mehrere Units verteilen und die Du einheitlich aufrufen willst, Du weisst aber wo (in welcher
Unit/Klasse) diese Funktionen ursprünglich definiert sind. Da du alle Methoden in Deinem Beispiel ohne Parameter aufrufen wolltest gehe ich davon aus das alle aufzurufenden Methoden paramterlos sind.
In jedem Fall würde ich dafür sorgen das sich die aufzurufenden Objekte/Methoden selbst bei einer zentralen Instanz "registrieren".
Delphi-Quellcode:
unit register;
....
type TJobRegister =
class(TObject)
private
FRegister : TStringList;
public
procedure registerCall (
const registeredName :
String; m : pMethod);
procedure Call(
const registeredName :
String);
end;
function RegisteredJobs : TJobRegister;
// singleton für arme
implementation
procedure TJobRegister.registerCall (
const registeredName :
String; m : pMethod);
begin
if (FRegister.IndexOf(registeredName)<0)
then
FRegister.AddObject(registeredName,m);
end;
procedure TJobRegister.Call(
const registeredName :
String);
var idx : Integer;
begin
idx := FRegister.IndexOf(registeredName);
if (idx >= 0 )
then begin
TExecute(FRegister.Objects[idx]^).Execute;
end
else begin
.....
end;
end;
Die Klassen deren Methoden aufgerufen werden sollen müssten dann die
Unit Register verwenden und sich dort anmelden, beispielsweise so
Delphi-Quellcode:
uses Register;
type TUseable = class(TObject)
public
constructor Create;
procedure TuWas;
end;
constructor TUseable.Create;
var m : pMethod;
begin
New(m);
m.Data := self;
m.Code := @TuWas;
register.registeredJobs.registerCall('Irgendwas',m);
end;
Das hätte auch den Vorteil das Du beliebige Namen verwenden kannst. Die Registerklasse müsste sich freilich noch um die Freigabe der pMethod Variablen kümmern, eine Deregistrierung wäre angeraten wenn es passieren kann das Instanzen während der Laufzeit des Programmes zerstört werden etc. Aber wenn Du das so machst, dann kannst Du es auch gleich richtig machen und entweder Interfaces verwenden oder Dir einen Wrapper je aufzurufender Klasse schreiben und dessen Instanzen / Objekte registrieren.
cu Ha-Jö