![]() |
TStringList und AddObject: wie richtig verwenden ?
Hallo,
ich habe folgenden Code, der mir in einer anderen Anwendung ein MAV memory access violence liefert:
Delphi-Quellcode:
ist da irgendwo ein Fehler ?
type
Thelper = class public caption: String; id: Integer; end; var tester: Thelper; var sl: TStringList; begin tester := Thelper.Create; tester.caption := 'foo'; tester.id := 123; sl := TStringList.Create; sl.AddObject('bar', TObject(tester)); ShowMessage(Thelper(sl.Objects[0]).caption); end. |
AW: TStringList und AddObject: wie richtig verwenden ?
An welcher Stelle und mit welcher Adresse tritt die Schutzverletzung denn auf?
Der Code passt so schon, auch wenn der Cast auf TObject unnötig ist. Grundsätzlich ist es aber heute mit Generics in 99,9% der Fälle nicht sinnvoll, den Weg mit TStringList zu gehen, wenn man Objekte und Strings einander zuordnen möchte. Es gibt TObjectDictionary und andere Möglichkeiten, bei denen du keinen Cast benötigst und daher typsicher arbeiten kannst. |
AW: TStringList und AddObject: wie richtig verwenden ?
Außer Speicherlöcher sehe ich keine Fehler.
Daher mal ohne Speicherlöcher. Step mal durch und schreib wo es knallt.
Delphi-Quellcode:
type
Thelper = class public caption: String; id: Integer; end; var tester: Thelper; sl: TStringList; begin sl := TStringList.Create; sl.OwnsObjects := true; try tester := Thelper.Create; tester.caption := 'foo'; tester.id := 123; sl.AddObject('bar', tester); ShowMessage(Thelper(sl.Objects[0]).caption); finally sl.Free; end; end. |
AW: TStringList und AddObject: wie richtig verwenden ?
Ist das auch "wirklich" der Code mit dem Fehler
oder nur ein "Beispielcode"? Nicht alle TStrings-Nachfahren implementieren das Objects ... viel schlimmer noch, sie werfen oft einfach still und heimlich die Zuweisung weg, anstatt einen Fehler auszulösen. (z.B. das TMemoStrings aka TMemo.Lines) und eigentlich ist es (in der VCL) bei vielen Implementationen auch ein Pointer und kein Object. (auch wenn das meistens nichts ausmacht) Muß es unbedingt ein TStringList sein? Wie wäre es mit einem generischen TDictionary<> ? (natürlich auch mit aktivem OwnsObjects) |
AW: TStringList und AddObject: wie richtig verwenden ?
ich weiß grad nicht, inwiefern Euch das hilft...
aber ich verweende den Pascal Code in Verbindung mit HelpNDoc.com HelpNDoc ist ein Hilfe-Authoring Software-Tool, das ähnlich wie Word arbeitet - nur das man die Texte dann in verschiedene andere Formate wie zum Beispiel PDF umwandeln kann. Eine kostenlose Testversion könnt Ihr unter diesen ![]() Aber ich denke, dass das Problem an HelpNDoc selbst liegt. Hier der Code, den Ihr mit der topics.pas.htm auswechseln müstet, oder das folgende Projekt saugen: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz