Hier nochmal eine andere Fassung: Zugriff auf die Variablen über getrennte Get-und Set-Routinen mit typlosem Value (-> ausserhalb kein Casting nötig, aber halt auch kein "property-Zugriff").
Wenn Du bei der vorherigen Lösung bleiben willst dann würde ich das TNumber wieder rausschmeissen und statt dessen mit TQuat arbeiten, da passen die anderen Typen schliesslich auch rein.
Delphi-Quellcode:
type
TVariableArray = array [TVarNames] of TQuat;
TDummy = class
private
FVars: TVariableArray;
protected
public
NumFormat: TNumFormat;
procedure SetVariable(VarName: TVarNames; const Value);
procedure GetVariable(VarName: TVarNames; var Value);
end;
implementation
{ TVaribles }
procedure TDummy.GetVariable(VarName: TVarNames; var Value);
begin
case NumFormat of
nfReal:
Double(Value) := PDouble(@FVars[VarName])^;
nfComplex:
TComplex(Value) := PComplex(@FVars[VarName])^;
nfQuat:
TQuat(Value) := FVars[VarName];
end;
end;
procedure TDummy.SetVariable(VarName: TVarNames; const Value);
begin
case NumFormat of
nfReal:
PDouble(@FVars[VarName])^ := Double(Value);
nfComplex:
PComplex(@FVars[VarName])^ := TComplex(Value);
nfQuat:
FVars[VarName] := TQuat(Value);
end;
end;
procedure Test;
var
Dum: TDummy;
D: Double;
C: TComplex;
Q: TQuat;
begin
Dum := TDummy.Create;
Dum.NumFormat := nfReal;
D := 1.234;
Dum.SetVariable(A, D);
Dum.NumFormat := nfComplex;
C.X := 1.23;
C.Y := 4.56;
Dum.SetVariable(B, C);
Dum.NumFormat := nfQuat;
Q.X := 1.23;
Q.Y := 4.56;
Q.Z := 7.89;
Q.W := 10;
Dum.SetVariable(C, Q);
end;
MfG,
Tryer