![]() |
TStringList - Zugriffsverletzung beim erstellen
Hallo zusammen.
Ich experimentiere gerade mit eigenen Klassen. Jetzt hab ich ein Problem Ich habe folgende Klasse erstellt:
Delphi-Quellcode:
Beim aufrufen von test.create, wird eine Zugriffsverletzung erzeugt.
test = class
All : TStrings; Male : TStringList; Female : TStringList; procedure Create; end; procedure test.Create; begin All := TStrings.Create; Male := TStringList.Create; Female := TStringList.Create; end; Wie kann ich das vermeiden, und warum ist das so ? Liebe Grüße, stift |
Re: TStringList - Zugriffsverletzung beim erstellen
Du verwendest "TStrings"! Das ist eine abstrakte Basisklasse von der man keine Instanzen erstellen sollte.
Verwende hier eingach auch TStringList Bei einer abstrakten Basisklasse werden erst einmal nur die Methoden definiert die es hinterher in einer abgeleiteten Klasse geben wird. Diese Methoden haben keinen Inhalt (also keinen Code). Der Code kommt erst in der Ableitung dazu. Du solltest eigentlich beim compillieren des Programmes für die betreffende Zeile auch eine Compilerwarnung sehen! |
Re: TStringList - Zugriffsverletzung beim erstellen
Hallo,
Bei TStringList passiert genua dasselbe :(. - stift |
Re: TStringList - Zugriffsverletzung beim erstellen
Das Ding heißt auch constructor.
Delphi-Quellcode:
Und im destructor die angelegten Objekte wieder freigeben nicht vergessen.
test = class
All : TStrings; Male : TStringList; Female : TStringList; constructor Create; end; constructor test.Create; begin All := TStringList.Create; Male := TStringList.Create; Female := TStringList.Create; end; |
Re: TStringList - Zugriffsverletzung beim erstellen
Zitat:
Create ist hier aber kein Konstruktor, sondern nur eine Prozedur. So sieht es mit einem Konstruktor aus:
Delphi-Quellcode:
Tipp: wenn die Instanz nicht mehr benötigt und mit Free freigegeben wird, sollte auch der Speicher der für die TStrings belegt wird, über einen Destruktor freigegeben werden. Sonst entstehen Speicherlecks, die sich leicht zu Problemen anhäufen können.Test = class All : TStrings; Male : TStrings; Female : TStrings; constructor Create; end; constructor Test.Create; begin All := TStringList.Create; <-- hier TStringlist Male := TStringList.Create; <-- hier TStringlist Female := TStringList.Create; <-- hier TStringlist end;
Delphi-Quellcode:
Viele Grüße,Test = class All : TStrings; Male : TStrings; Female : TStrings; constructor Create; destructor Destroy; override; end; |
Re: TStringList - Zugriffsverletzung beim erstellen
Danke für den Hinweis.
Es wird leider immer noch eine "Access Violation" erzeugt. ~stift // Das ist der gesamte Code :
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type Test = class All : TStrings; Male : TStrings; Female : TStrings; constructor Create; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; blub: test; implementation {$R *.dfm} constructor Test.Create; begin All := TStringList.Create; Male := TStringList.Create; Female := TStringList.Create; end; procedure TForm1.FormCreate(Sender: TObject); begin blub.Create; end; end. |
Re: TStringList - Zugriffsverletzung beim erstellen
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin blub := test.Create; end; |
Re: TStringList - Zugriffsverletzung beim erstellen
Ach du meine Güte ;D...
Wie konnte ich das nur übersehen :oops: . Danke für eure nette Hilfe :). ~ stift |
Re: TStringList - Zugriffsverletzung beim erstellen
Zitat:
|
Re: TStringList - Zugriffsverletzung beim erstellen
Tröste Dich, ich hatte das auch nicht auf Anhieb gesehen ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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