Einzelnen Beitrag anzeigen

QStorm

Registriert seit: 28. Jun 2008
46 Beiträge
 
#1

Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:00
Delphi-Version: 5
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
  Mit Zitat antworten Zitat