AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TStringList - Zugriffsverletzung beim erstellen

TStringList - Zugriffsverletzung beim erstellen

Ein Thema von stiftII · begonnen am 27. Nov 2009 · letzter Beitrag vom 27. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2   
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#1

TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 17:59
Hallo zusammen.

Ich experimentiere gerade mit eigenen Klassen. Jetzt hab ich ein Problem

Ich habe folgende Klasse erstellt:

Delphi-Quellcode:
  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;
Beim aufrufen von test.create, wird eine Zugriffsverletzung erzeugt.

Wie kann ich das vermeiden, und warum ist das so ?

Liebe Grüße,
stift
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 18:34
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!
Ralf Kaiser
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#3

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 18:54
Hallo,
Bei TStringList passiert genua dasselbe .

-
stift
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.535 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 18:56
Das Ding heißt auch constructor.
Delphi-Quellcode:
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;
Und im destructor die angelegten Objekte wieder freigeben nicht vergessen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#5

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 18:57
Zitat von stiftII:
Hallo zusammen.

Ich experimentiere gerade mit eigenen Klassen. Jetzt hab ich ein Problem

Ich habe folgende Klasse erstellt:

Delphi-Quellcode:
  test = class
    All : TStrings;
    Male : TStringList;
    Female : TStringList;
    procedure Create;
  end;
Beim aufrufen von test.create, wird eine Zugriffsverletzung erzeugt.

Wie kann ich das vermeiden, und warum ist das so ?
test ist eine Klasse. Um eine Instanz von ihr zu benutzen, muss man sie mit einem Konstruktor erzeugen.

Create ist hier aber kein Konstruktor, sondern nur eine Prozedur.

So sieht es mit einem Konstruktor aus:
Delphi-Quellcode:
  
  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;
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.

Delphi-Quellcode:
  
  Test = class
    All : TStrings;
    Male : TStrings;
    Female : TStrings;
    constructor Create;
    destructor Destroy; override;
  end;
Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#6

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 19:03
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.535 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 19:04
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  blub := test.Create;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#8

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 19:07
Ach du meine Güte ;D...

Wie konnte ich das nur übersehen .

Danke für eure nette Hilfe .

~
stift
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 19:43
Zitat von DeddyH:
Das Ding heißt auch constructor.
Autsch. Da war ich beim Antworten aber auch ziemlich blind!
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.535 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: TStringList - Zugriffsverletzung beim erstellen

  Alt 27. Nov 2009, 19:46
Tröste Dich, ich hatte das auch nicht auf Anhieb gesehen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:15 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