Wo ist denn jetzt eigentlich noch das Problem? Immernoch die
Access Violations?
Theoretisch würde es reichen, wenn du
Delphi-Quellcode:
TEackItem = class
name:string;
typ:TETyp;
int:pint;
str:pstr;
bol:pbol;
end;
In
Delphi-Quellcode:
TEackItem = class
name:string;
typ :TETyp;
ptr : Pointer;
end;
änderst. Dann sparst du dir so viele Parameter bei Add und bist flexibler, wenn doch mal ein neuer Typ hinzukommt.
Schreiben würde dann in etwa so aussehen (Achtung ungetest):
Delphi-Quellcode:
procedure SetInteger(var Item: TEackItem; Int: Integer);
begin
// Prüfen, ob es wirklich vom Typ Integer ist.
Assert(Item.typ=etInteger);
PInteger(Item.Ptr)^:=Int;
end;
procedure SetBoolean(var Item: TEackItem; Bool: Boolean);
begin
// Prüfen, ob es wirklich vom Typ Boolean ist.
Assert(Item.typ=etBoolean);
PBoolean(Item.Ptr)^:=Bool;
end;
procedure SetString(var Item: TEackItem; Str: String);
begin
// Prüfen, ob es wirklich vom Typ Integer ist.
Assert(Item.typ=etString);
PString(Item.Ptr)^:=Str;
end;
Lesen geht dann ähnlich:
Delphi-Quellcode:
function GetInteger(const Item: TEackItem): Integer;
begin
// Prüfen, ob es wirklich vom Typ Integer ist.
Assert(Item.typ=etInteger);
result:=PInteger(Item.Ptr)^;
end;
procedure GetBoolean(const Item: TEackItem): Boolean;
begin
// Prüfen, ob es wirklich vom Typ Boolean ist.
Assert(Item.typ=etBoolean);
result:=PBoolean(Item.Ptr)^;
end;
procedure GetString(constItem: TEackItem: string;
begin
// Prüfen, ob es wirklich vom Typ Integer ist.
Assert(Item.typ=etString);
result:=PString(Item.Ptr)^;
end;
Bei Strings muss ich aber ehrlich sagen, dass ich mir nicht ganz sicher bin, ob es so funktioniert. Vielleicht erstmal mit Integer/Boolean probieren.
P.S: Hoffe das hilft