Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   StringList in eigener Klasse (https://www.delphipraxis.net/154069-stringlist-eigener-klasse.html)

youuu 26. Aug 2010 14:28

StringList in eigener Klasse
 
Hi,

ich habe eine Klasse.

z.B.
Delphi-Quellcode:
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;
Wieso knallt mir da immer die exception rein, lesen von Adresse 000000, als wenn de Stringlist nicht createt ist?
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;

DeddyH 26. Aug 2010 14:34

AW: StringList in eigener Klasse
 
Delphi-Quellcode:
sl := THashedStringList.Create;
Dieser Fehler kommt hier bestimmt einmal die Woche :zwinker:

[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]

mkinzler 26. Aug 2010 14:36

AW: StringList in eigener Klasse
 
Delphi-Quellcode:
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;
-In den Methoden auf die realen Felder zugreifen
-Vorher überprüfen, ob die Eigenschaft zugewiesen ist

himitsu 26. Aug 2010 14:37

AW: StringList in eigener Klasse
 
Zitat:

Zugriffsverletzung bei Adresse $000000xx
Spricht fast immer für einen NIL-Pointer.

Also wann hast du die Stringliste erstellt, welche du dort nutzen willst?


PS:
Delphi-Quellcode:
write Fsl;
wird sehr schnell zu einem Speicherleck fürhen, wenn du nicht auspaßt.

[edit] wo kommen denn plötzlich die Beiträge her ... huhu? ... blöde RedBox

youuu 26. Aug 2010 14:40

AW: StringList in eigener Klasse
 
Zitat:

Zitat von DeddyH (Beitrag 1045235)
Delphi-Quellcode:
sl := THashedStringList.Create;


Meinte ich natürlich, nur vergessen beim abtippen hinzu zu schreiben :)

DeddyH 26. Aug 2010 14:47

AW: StringList in eigener Klasse
 
Wird die Liste wirklich jedesmal neu erzeugt, wenn ein Eintrag hinzukommen soll?

youuu 26. Aug 2010 14:51

AW: StringList in eigener Klasse
 
Delphi-Quellcode:
if Assigned(FslLink_id) then FslLink_id.add('sss');
Wird aber nie durch laufen, da anscheinend ja die StringList nicht existiert für die Klasse.
Wo muss ich die Stringlist erstellen, damit Sie für die ganze Klasse zur Verfügung steht?

Im Constructor bringt es nichts

mleyen 26. Aug 2010 14:54

AW: StringList in eigener Klasse
 
Delphi-Quellcode:
procedure addSl(content: string);
Begin
  if not Assigned( Fsl) then
    Fsl := THashedStringList.Create;
  Fsl.add(content);
end;

DeddyH 26. Aug 2010 14:56

AW: StringList in eigener Klasse
 
Oder wenn sie in jedem Fall gebraucht wird, im Konstruktor anlegen und im Destruktor wieder freigeben.

mkinzler 26. Aug 2010 14:56

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

DeddyH 26. Aug 2010 14:58

AW: StringList in eigener Klasse
 
Siehe Edit in #2.

Klaus01 26. Aug 2010 14:58

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;

youuu 26. Aug 2010 14:59

AW: StringList in eigener Klasse
 
Delphi-Quellcode:
constructor TMyClass.Create;
Var
  Fsl: THashedStringList;
Begin
  Fsl.Create;
End;
Brachte leider auch nicth den Erfolg, denn das habe ich schon versucht.
Denn:
Delphi-Quellcode:
if Assigned(Fsl) then
läuft nicht durch.




Edit:

Zitat:

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;

Hatte ich doch schon ;)

mleyen 26. Aug 2010 15:02

AW: StringList in eigener Klasse
 
goto: Post#2

implementation 26. Aug 2010 15:08

AW: StringList in eigener Klasse
 
Zitat:

Zitat von youuu (Beitrag 1045252)
Delphi-Quellcode:
constructor TMyClass.Create;
Var
  Fsl: THashedStringList;
Begin
  Fsl.Create;
End;

Wie wärs denn mal mit:
Delphi-Quellcode:
constructor TMyClass.Create;
Begin
  Fsl := THashedStringList.Create;
End;

DeddyH 26. Aug 2010 15:09

AW: StringList in eigener Klasse
 
Und noch ein Verweis auf #2. Ist der irgendwie weiß auf weiß, oder weshalb wird das ständig überlesen?

mkinzler 26. Aug 2010 15:09

AW: StringList in eigener Klasse
 
Wenn schon:
Delphi-Quellcode:
Fsl := THashedStringList.Create;
Das steht so aber schon alles in Detlefs Beitrag, auf den schon mehrmals hingewiesen wurde!

implementation 26. Aug 2010 15:10

AW: StringList in eigener Klasse
 
Ähm ja, mein Beitrag hatte den Focus auf der lokalen Variablen:wink:

mkinzler 26. Aug 2010 15:13

AW: StringList in eigener Klasse
 
Zitat:

Zitat von DeddyH (Beitrag 1045258)
Und noch ein Verweis auf #2. Ist der irgendwie weiß auf weiß, oder weshalb wird das ständig überlesen?

Mach dir nichts draus. Mir gehts ständig genauso.

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!

himitsu 26. Aug 2010 15:17

AW: StringList in eigener Klasse
 
Zitat:

Delphi-Quellcode:
procedure TmyClass.addSl(content: string);
Begin
  sl.add(content);
end;

Und intern bitte auch möglichst das interne Feld verwenden und nicht den externen Property.

Delphi-Quellcode:
procedure TmyClass.addSl(content: string);
Begin
  fsl.add(content);
end;

DeddyH 26. Aug 2010 15:19

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.

Bernerbaer 26. Aug 2010 15:21

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)

mleyen 26. Aug 2010 15:23

AW: StringList in eigener Klasse
 
Zitat:

Zitat von Bernerbaer (Beitrag 1045266)
Was bringt mir diese Klasse, ausser Speicherlecks und Fehler?

Sagen wir mal so: Erfahrung für den TE.
Das sind ja aber wahrscheinlich auch nur Codeausschnitte. Wer weiß was (später) noch alles geschieht.

mkinzler 26. Aug 2010 15:24

AW: StringList in eigener Klasse
 
@Frank: http://www.delphipraxis.net/1045236-post3.html
@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