Registriert seit: 16. Mär 2004
2.287 Beiträge
|
Boolean killt Variant-Array?
6. Apr 2007, 00:32
Hi,
Ich möchte zum speichern einiger Konfigurationen ein Array of Variant nehmen.
Diese sind jedoch für jeden Klassentyp (alle von einer Klasse abgeleitet) unterschiedlich...
Dafür habe ich mir folgende Konstruktion überlegt.
Jedoch kommt beim Zuweisen bereits eine Fehlermeldung welche mir sagt dass irgendwas ein "Invalid Variant Type" ist.
Delphi-Quellcode:
TAgent = class;
TAgentClass = class of TAgent;
TConfigEnum = ( ceXMax, ceYMax, ceStdXPos, ceStdYPos, ceStdEnergy, ceRandomInit, ceDeltaEnergy, ceReproduceMin );
TConfigs = array [TConfigEnum] of array of Variant;
TClassMap = class
protected
FTypeMap: TClassMapArray;
public
constructor Create;
function GetClassID(AC: TAgentClass): Integer; //Get ID for Class
end;
TConfig = class
protected
FData: TConfigs;
FClassMap: TClassMap;
public
constructor Create;
destructor Destroy; override;
procedure SetValue(AC: TAgentClass; CT: TConfigEnum; Value: Variant);
function GetValue(AC: TAgentClass; CT: TConfigEnum): Variant;
end;
TGeneral = class(TAgent);
TFoodAgent = class(TAgent);
TAnimalAgent = class(TAgent);
implementation
constructor TClassMap.Create;
var i: Integer;
begin
inherited;
FTypeMap[1]:=TGeneral;
FTypeMap[2]:=TAgent;
FTypeMap[3]:=TFoodAgent;
FTypeMap[4]:=TAnimalAgent;
end;
function TClassMap.GetClassID(AC: TAgentClass): Integer;
var i: Integer;
begin
Result:=-1;
for i:=Low(FTypeMap) to High(FTypeMap) do
if FTypeMap[i]=AC then Result:=i;
end;
constructor TConfig.Create;
var i: TConfigEnum;
begin
inherited;
FClassMap:=TClassMap.Create;
for i:=Low(TConfigEnum) to High(TConfigEnum) do
SetLength(FData[i],cClassCount);
SetValue(TGeneral,ceXMax,100);
SetValue(TGeneral,ceYMax,100);
SetValue(TGeneral,ceRandomInit,True); //<- Hier hakts wohl
SetValue(TAgent,ceStdXPos,50);
SetValue(TAgent,ceStdYPos,50);
SetValue(TFoodAgent,ceStdEnergy,10);
SetValue(TFoodAgent,ceDeltaEnergy,1);
SetValue(TFoodAgent,ceReproduceMin,20);
SetValue(TAnimalAgent,ceStdEnergy,10);
SetValue(TAnimalAgent,ceDeltaEnergy,-1);
SetValue(TAnimalAgent,ceReproduceMin,20); //<- Und hier kommt der Error
end;
destructor TConfig.Destroy;
begin
FClassMap.Free;
inherited;
end;
procedure TConfig.SetValue(AC: TAgentClass; CT: TConfigEnum; Value: Variant);
begin
FData[CT][FClassMap.GetClassID(AC)]:=Value;
end;
Zum Zeitpunkt der Zuweisung sieht der FData-Array so aus:
(Aus der Watchlist kopiert und formatiert)
Delphi-Quellcode:
(
( //ceXMax
Unassigned,
100,
Unassigned,
Unassigned
),
( //ceYMax
Unassigned,
100,
Unassigned,
Unassigned
),
( //ceStdXPos
Unassigned,
Unassigned,
50,
Unassigned
),
( //ceStdYPos
Unassigned,
Unassigned,
50,
Unassigned
),
( //ceStdEnergy
Unassigned,
Unassigned,
Unassigned,
10
),
( //ceRandomInit
Unassigned,
True,
Unassigned,
Unassigned,
Unknown type: 78,
Unassigned,
Unassigned,
Unassigned,
Unassigned,
Unassigned
),
( //ceDeltaEnergy
Unassigned,
Unassigned,
Unassigned,
1
),
( //ceReproduceMin
)
)
und das kann ich mir nun leider absolut nicht erklären
wieso ist das drittletzte Element zu lang und das letzte so kurz???
Was besagt "Unknown type: 78"?
»Unlösbare Probleme sind in der Regel schwierig...«
|