Hallo,
Beim Umstieg von Delphi XE auf XE8 bin ich auf folgendes Problem gestoßen:
Vorgeschichte:
Ich verwende einen auf 10 Zeichen begrenzten String als "ID".
Diesen kann ich ohne Probleme als Typ einer TList verwenden:
Delphi-Quellcode:
type
MyID = String[10];
// ...
var
ID1,
ID2 : MyID;
Liste : TList<MyID>;
begin
ID1 := ('ABCDEFGHIJ');
Liste := (TList<MyID>.Create);
Liste.Add(ID1);
ID2 := (Liste[0]);
end;
In einem TInterfacedObject verwende ich nun TList als Member:
Delphi-Quellcode:
IMyObject<T> = interface
['{22041332-1221-4EBD-BBC5-1AF3C914E08B}']
procedure AddValue(const Value : T);
function GetValue(const Index : Integer) : T;
end;
TMyObject<T> = class(TInterfacedObject, IMyObject<T>)
strict private
internalList : TList<T>;
public
constructor Create;
procedure AddValue(const Value : T);
function GetValue(const Index : Integer) : T;
end;
// ...
constructor TMyObject<T>.Create;
begin
internList := (TList<T>.Create);
end;
procedure TMyObject<T>.AddValue(const Value : T);
begin
internList.Add(Value);
end;
function TMyObject<T>.GetValue(const Index : Integer) : T;
begin
Result := (internList[Index]);
end;
Problem:
Wenn ich ein Objekt vom Typ IMyObject<MyID> erzeuge und via AddValue eine MyID hinzufüge entsteht Datenmüll:
Delphi-Quellcode:
var
ID1,
ID2 : MyID;
MyObj1 : IMyObject<MyID>;
begin
ID1 := ('ABCDEFGHIJ');
MyObj1 := (TMyObject<MyID>.Create);
MyObj1.AddValue(ID1);
ID2 := (MyObj1.GetValue(0));
end;
Wert von ID2: 'ABC'#$90'!'#$B#2#$8D'þ'#$18
Die erste 3 Zeichen sind noch korrekt, der Rest jedoch nicht.
Es sieht so aus, als wenn er nicht genügend Speicher für den String reserviert.
MyID ist ein zentraler Bestandteil der Software.
Wodurch tritt das Problem auf und wie könnte man es lösen?
Vielen Dank im Voraus