AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TStringList und AddObject: wie richtig verwenden ?
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList und AddObject: wie richtig verwenden ?

Ein Thema von paule32.jk · begonnen am 4. Sep 2024 · letzter Beitrag vom 4. Sep 2024
Antwort Antwort
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

TStringList und AddObject: wie richtig verwenden ?

  Alt 4. Sep 2024, 15:02
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 ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TStringList und AddObject: wie richtig verwenden ?

  Alt 4. Sep 2024, 15:33
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TStringList und AddObject: wie richtig verwenden ?

  Alt 4. Sep 2024, 15:39
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TStringList und AddObject: wie richtig verwenden ?

  Alt 4. Sep 2024, 16:17
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)
$2B or not $2B

Geändert von himitsu ( 4. Sep 2024 um 16:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TStringList und AddObject: wie richtig verwenden ?

  Alt 4. Sep 2024, 16:29
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
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:48 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