Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Dynamischer Funktionsaufruf (https://www.delphipraxis.net/85468-dynamischer-funktionsaufruf.html)

Sämy 31. Jan 2007 10:22


Dynamischer Funktionsaufruf
 
Hallo

Ich habe einige verschiedene Klassen, welche Listen für andere Klassen darstellen:

Delphi-Quellcode:
TBCEffect = class
private
  eid: Integer;
  name: String;
public
  getEID: integer;
  getName: String;
  //...
end;

TBCEffectList = class
private
  function getEffectByID(eid: integer): TBCEffect;
  function getEffectByName(name: String): TBCEffect;
  //...
end;
Nun speichere ich die verschiendenen TBCEffect- Objekte in einer eigen gebauten HashMap im TBCEffectList.

Ich möchte nun über die Liste (TBCEffectList) ein TBCEffect- Objekt finden können. Und zwar nach einer seiner Eigenschaften(eid, name, ...).
Dies ist auch kein Problem. Doch muss ich die Prozeduren(getEffectByID, getEffectByName) in jeder Liste implementieren(gibt noch andere ausser TBCEffectList).

Mein Vorhaben ist es nun, diese Funktion in eine abstrakte Klasse zu extrahieren.
Doch habe ich nun das Problem, dass die Funktionen zum die ID zu holen, in jeder Klasse anders heissen (getEID, getDID, getBID, ...)

Kann ich nun von der Kinderklasse TBCEffectList zB. per String angeben, wie die benötigte Funktion heisst und diese, ohne case oder so, direkt aufrufen? (Ich kenne dieses Vorgehen aus Java, dort funktioniert dies)
Oder kann man dies irgentwie durch Pointer auf die Funktion lösen?

Gruss und Danke
Sämy

yörsch 31. Jan 2007 10:39

Re: Dynamischer Funktionsaufruf
 
HAI Sämy :hi:


ich hab sowas für Kameras gemacht.
in der abstrakten Klasse KAMERA weis ich nicht was die konkrete Kamera kann.
Muß aber über die Abstrate Klasse abfragen was kann die konktete Kamera kann...

in der Abstrakten Klasse für allgemeine Parameter:
Delphi-Quellcode:
function TKamera.GetParameter(Param:Integer): string;
begin
  IF     Param = ckam_act_size_x    then Result := IntTostr(fact_size_x)
  Else IF Param = ckam_act_size_y    then Result := InttoStr(fact_size_y)
  Else IF Param = ckam_org_size_x    then Result := InttoStr(forg_size_x)
  Else IF Param = ckam_org_size_y    then Result := InttoStr(forg_size_y)
  ...
  ; // case geht auch!!!
end;
in der Konkreten Klasse TBaumer ist von TKamera abgeleitet:
Delphi-Quellcode:
procedure TBaumer_fx.SetParameterInt(Param: integer;
  const Value: Integer);
begin
  IF     Param = ckam_dym_size_x    then Result := IntTostr(fdym_size_x)
  Else IF Param = ckam_dym_size_y    then Result := InttoStr(fdym_size_y)
  ...
  Else Result := inherited GetParameterInt(Param);
end;
oder versteh ich das Problem Falsch ???

Sämy 31. Jan 2007 12:45

Re: Dynamischer Funktionsaufruf
 
Mein Ziel wäre es eben, dass ich in der abstrakten Klasse keine ifs schreiben müsste.
Sondern, dass ich der abstrakten Klasse beibringen könnte, wie er auf die Funktion zugreifen kann(von extern).

Dann könnte auch die Situation, dass eine andere Klasse zB. eine Eigenschaft "length" hat, eine weitere jedoch nicht, behandelt werden... (und ich müsste diese nicht in der abstrakten Klasse mit einem if "registrieren")

Khabarakh 31. Jan 2007 13:19

Re: Dynamischer Funktionsaufruf
 
Dann solltest du dich einmal mit der Delphi-RTTI/Unit TypInfo anfreunden, wobei auch Einiges dazu hier im Forum zu finden ist.

DP-Maintenance 31. Jan 2007 14:18

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz