Einzelnen Beitrag anzeigen

Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Boolean killt Variant-Array?

  Alt 5. Apr 2007, 23: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...«
  Mit Zitat antworten Zitat