Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TStringList und AddObject: wie richtig verwenden ? (https://www.delphipraxis.net/215767-tstringlist-und-addobject-wie-richtig-verwenden.html)

paule32.jk 4. Sep 2024 14:02

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:
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.
ist da irgendwo ein Fehler ?

jaenicke 4. Sep 2024 14:33

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.

Sinspin 4. Sep 2024 14:39

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.

himitsu 4. Sep 2024 15:17

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)

paule32.jk 4. Sep 2024 15:29

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 Link saugen, um das nachzuspielen, was ich hier versuche zu erreichen.
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:
Klick mich


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