AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Begrenzter String, TList und InterfaceObject > Datenmüll
Thema durchsuchen
Ansicht
Themen-Optionen

Begrenzter String, TList und InterfaceObject > Datenmüll

Ein Thema von QStorm · begonnen am 9. Sep 2015 · letzter Beitrag vom 10. Sep 2015
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:08
XE8 oder XE8.1?

Die Generics - speziell die Listen - sind bei XE8 komplett umgestellt worden und es gibt dort einen Bug speziell mit Records - der aber auch diesen String[10] Typen betrifft. Behoben wurde dieser Bug mit XE8.1

https://quality.embarcadero.com/browse/RSP-11096
http://stackoverflow.com/questions/2...eed-workaround
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 9. Sep 2015 um 09:10 Uhr)
  Mit Zitat antworten Zitat
QStorm

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

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:11
Hallo,

Ich verwende "22.0.19908.869" (XE8 Subscription Update 1).

UPDATE: Mit dem inoffiziellen Fix (http://rghost.ru/6qq87QGGX) funktioniert es leider auch nicht.

BTW: Vielen Dank für die Links.

Geändert von QStorm ( 9. Sep 2015 um 10:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:25
Jupp, da scheint noch ein Bug zu sein ...

Mit DX10 funktioniert das auf jeden Fall
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:39
Wodurch tritt das Problem auf und wie könnte man es lösen?
Alternativ kannst du eventuell auch zurück auf XE7 gehen, was ja im Kaufpreis von XE8 mit enthalten ist.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:44
Wenn der Bug in Seattle gelöst wurde, müsste er demnächst auch in XE8 (Subscription Update 2 o.ä.) gefixt werden, wurde ja für demnächst angekündigt.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 09:48
Wenn der Bug in Seattle gelöst wurde, müsste er demnächst auch in XE8 (Subscription Update 2 o.ä.) gefixt werden, wurde ja für demnächst angekündigt.
Dazu müsste man bei Rückportieren wissen das es ein entsprechend relevanter Bug ist. Ist er z.B. nur wegen eines neuen Features in Seatle gefixt würde ich mich nicht darauf verlassen das er auch in XE8 korrigiert wird.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
QStorm

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

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 10:16
Kann einer bitte die Units "System.Generics.Collections" und "System.Generics.Defaults" von Delphi XE7 posten?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 10:21
Kann einer bitte die Units "System.Generics.Collections" und "System.Generics.Defaults" von Delphi XE7 posten?
Glaube ich mal eher nicht, denn die sind urheberrechtlich geschützt!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Begrenzter String, TList und InterfaceObject > Datenmüll

  Alt 9. Sep 2015, 10:22
Das dürfte nicht erlaubt sein. Diese würden mit großer Wahrscheinlichkeit auch nicht so einfach unter XE8 funktionieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz