![]() |
StringList in eigener Klasse
Hi,
ich habe eine Klasse. z.B.
Delphi-Quellcode:
Wieso knallt mir da immer die exception rein, lesen von Adresse 000000, als wenn de Stringlist nicht createt ist?
type
TMyClass = class private Fsl: THashedStringList; // Links public property sl: THashedStringList read Fsl write Fsl; procedure addSl(content: string); end; procedure addSl(content: string); Begin sl.add(content); end; Nur wenn ich ein Create davor pack, knallt es ebenfalls, das von Adresse xxxxxxx.
Delphi-Quellcode:
procedure addSl(content: string);
Begin sl.create; sl.add(content); end; |
AW: StringList in eigener Klasse
Delphi-Quellcode:
Dieser Fehler kommt hier bestimmt einmal die Woche :zwinker:
sl := THashedStringList.Create;
[edit] P.S.: Wenn Du die Liste schon selbst erzeugst, kannst Du sie auch ReadOnly definieren. Falls Du das nicht willst, solltest Du zumindest einen Setter schreiben, der die übergebene Liste dann mit Assign in Deine eigene kopiert. [/edit] |
AW: StringList in eigener Klasse
Delphi-Quellcode:
-In den Methoden auf die realen Felder zugreifen
type
TMyClass = class private Fsl: THashedStringList; // Links public property sl: THashedStringList read Fsl write Fsl; procedure addSl(content: string); end; procedure addSl(content: string); Begin if Assigned( Fsl) then Fsl.add(content); end; -Vorher überprüfen, ob die Eigenschaft zugewiesen ist |
AW: StringList in eigener Klasse
Zitat:
Also wann hast du die Stringliste erstellt, welche du dort nutzen willst? PS:
Delphi-Quellcode:
wird sehr schnell zu einem Speicherleck fürhen, wenn du nicht auspaßt.
write Fsl;
[edit] wo kommen denn plötzlich die Beiträge her ... huhu? ... blöde RedBox |
AW: StringList in eigener Klasse
Zitat:
Meinte ich natürlich, nur vergessen beim abtippen hinzu zu schreiben :) |
AW: StringList in eigener Klasse
Wird die Liste wirklich jedesmal neu erzeugt, wenn ein Eintrag hinzukommen soll?
|
AW: StringList in eigener Klasse
Delphi-Quellcode:
Wird aber nie durch laufen, da anscheinend ja die StringList nicht existiert für die Klasse.
if Assigned(FslLink_id) then FslLink_id.add('sss');
Wo muss ich die Stringlist erstellen, damit Sie für die ganze Klasse zur Verfügung steht? Im Constructor bringt es nichts |
AW: StringList in eigener Klasse
Delphi-Quellcode:
procedure addSl(content: string);
Begin if not Assigned( Fsl) then Fsl := THashedStringList.Create; Fsl.add(content); end; |
AW: StringList in eigener Klasse
Oder wenn sie in jedem Fall gebraucht wird, im Konstruktor anlegen und im Destruktor wieder freigeben.
|
AW: StringList in eigener Klasse
Da das ja keine interne Liste ist, sondern extern zugewisen werden kann, kann man sich so einen schönen Leak basteln
|
AW: StringList in eigener Klasse
Siehe Edit in #2.
|
AW: StringList in eigener Klasse
..
die Procedure sollte schon zu Klasse gehöhren. Die StringList würde ich dann im Constructor Create erstellen. Grüße Klaus
Delphi-Quellcode:
type
TMyClass = class private Fsl: THashedStringList; // Links public property sl: THashedStringList read Fsl write Fsl; procedure addSl(content: string); end; procedure TmyClass.addSl(content: string); Begin sl.add(content); end; |
AW: StringList in eigener Klasse
Delphi-Quellcode:
Brachte leider auch nicth den Erfolg, denn das habe ich schon versucht.
constructor TMyClass.Create;
Var Fsl: THashedStringList; Begin Fsl.Create; End; Denn:
Delphi-Quellcode:
läuft nicht durch.
if Assigned(Fsl) then
Edit: Zitat:
|
AW: StringList in eigener Klasse
goto: Post#2
|
AW: StringList in eigener Klasse
Zitat:
Delphi-Quellcode:
constructor TMyClass.Create;
Begin Fsl := THashedStringList.Create; End; |
AW: StringList in eigener Klasse
Und noch ein Verweis auf #2. Ist der irgendwie weiß auf weiß, oder weshalb wird das ständig überlesen?
|
AW: StringList in eigener Klasse
Wenn schon:
Delphi-Quellcode:
Das steht so aber schon alles in Detlefs Beitrag, auf den schon mehrmals hingewiesen wurde!
Fsl := THashedStringList.Create;
|
AW: StringList in eigener Klasse
Ähm ja, mein Beitrag hatte den Focus auf der lokalen Variablen:wink:
|
AW: StringList in eigener Klasse
Zitat:
Trotzdem würde ich das entweder als interne Eigenschaft ( Liste dann im Konstruktor erzeugen und im Destruktor freigeben) oder als extern zuweisbare Eigenschaft machen. Nicht beides gleichzeitig! |
AW: StringList in eigener Klasse
Zitat:
Delphi-Quellcode:
procedure TmyClass.addSl(content: string);
Begin fsl.add(content); end; |
AW: StringList in eigener Klasse
Man weiß ja nicht, was der TE will: zuweisbare Liste oder nicht? Im ersteren Fall würde ich keine interne Liste führen, dafür dann aber vor jedem Zugriff mit Assigned prüfen, im zweiten Fall dann die Property ReadOnly deklarieren.
|
AW: StringList in eigener Klasse
ich verfolge diesen thread nun schon eine Weile und trotzdem ist mir relativ altem Mann der Sinn, der hinter der Ursprungsklasse steht noch immer nicht klar. Entweder fehlt da die Hälfte der Klassendefinition oder es ist ein typisches Beispiel für das sinnlose Verwenden von Klassen. Was bringt mir diese Klasse, ausser Speicherlecks und Fehler? Ist es heute allgemein üblich Klassen zu erstellen von Klassen (hier THashedstringlist) ohne sie zu erweitern? Ich sehe jedenfalls hier keinen Vorteil gegenüber dem direkten Verwenden von Thashedstringlist.
Zeige doch mal mehr von deiner Klasse! (Constructor) |
AW: StringList in eigener Klasse
Zitat:
Das sind ja aber wahrscheinlich auch nur Codeausschnitte. Wer weiß was (später) noch alles geschieht. |
AW: StringList in eigener Klasse
@Frank:
![]() @Detlef: So sehe ich das auch. Sonst müsste man ja noch speichern, ob die Referenz selbst erzeugt oder zugewisen wurde und dann entsprechend Freigeben oder nicht. Besser strikte Trennung: -intern ohne Setter -extern mit Setter und Überprüfung ob zugewiesen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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