Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung bei TStringList (https://www.delphipraxis.net/108886-zugriffsverletzung-bei-tstringlist.html)

Yheeky 20. Feb 2008 18:39


Zugriffsverletzung bei TStringList
 
Hallo,

ich möchte verschiedene Funktionen und Prozeduren in einer Unit auslagern. Ich habe hierfür einen Typen definiert, den ich mit diesen bestücke.

Delphi-Quellcode:
type TFormel = class(TComponent)
  private
    TermListe : TStringList;
    function ParseTerm(Term : String) : String;
  public
    procedure Rechnen(Term : String);
  protected
    constructor Create(AOwner : TComponent); override;

end;
Unter anderem ist auch eine StringList für die einzelnen Terme dabei.

Im Konstruktor rufe ich folgendes auf:

Delphi-Quellcode:
constructor TFormel.Create(AOwner : TComponent);
begin
inherited Create(AOwner);

  //Termliste initialisieren
  TermListe := TStringList.Create;

end;
Im Programm erstelle ich dann ein Objekt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var newFormel : TFormel;
begin
newFormel := TFormel.Create(nil);
newFormel.Rechnen(Edit1.Text);

end;
In der Rechnenfunktion wird dann auf den Term zugegriffen (z.B. TermListe.Add('Test');). Genau hier bekomme ich dann aber eine Fehlermeldung, wieso?

Wäre nett, wenn mir jemand helfen könnte. Danke!

alzaimar 20. Feb 2008 18:41

Re: Zugriffsverletzung bei TStringList
 
Ohne den Rest des Codes wird man Dir nicht helfen können. Ich vermute einen Seiteneffekt o.ä.

DeddyH 20. Feb 2008 18:43

Re: Zugriffsverletzung bei TStringList
 
Die Methode Rechnen wäre bestimmt interessant zu sehen.

Yheeky 20. Feb 2008 18:44

Re: Zugriffsverletzung bei TStringList
 
Wie gesagt: ihr könnt die Funktion durch TermListe.Add('Test'); ersetzen, da tritt der Fehler auch schon auf.

busybyte 20. Feb 2008 19:05

Re: Zugriffsverletzung bei TStringList
 
das ist komisch bei Delphi
Delphi-Quellcode:
Var a:TStringList;
//kann nicht mit
a:=TStringList.create;
initiert werden ,
sondern
Delphi-Quellcode:
Var a:TStrings;
a:=TStringlist.create;

mkinzler 20. Feb 2008 19:07

Re: Zugriffsverletzung bei TStringList
 
TStrings ist eine abstrakte Klasse, TStringlist die implemnetierende

Muetze1 20. Feb 2008 19:12

Re: Zugriffsverletzung bei TStringList
 
@busybyte: Das ist irrelevant ob du nun die Basisklasse oder eine spezifische für den Member angibst. Das macht keinen Unterschied für den o.g. Fehler. Es muss entsprechend auch nicht so deklariert werden.

busybyte 20. Feb 2008 19:34

Re: Zugriffsverletzung bei TStringList
 
@muetze1:stimmt Du hast recht sorry es ist andersrum

Delphi-Quellcode:
Var a:TStrings;
begin
a:=TStrings.Create;
a.Add('Test');
end;
so rum geht es nicht.
Entschuldigung, Irre sind menschlich.

Muetze1 20. Feb 2008 20:06

Re: Zugriffsverletzung bei TStringList
 
Aso, nun weiss ich was du meinst. Du willst auf den abstrakten Fehler hinweisen - oder meintest du die Vererbungsreihenfolge? Bei letzterem meintest du dann wohl var vom Typ TStringList, oder nicht?

Yheeky 20. Feb 2008 20:18

Re: Zugriffsverletzung bei TStringList
 
Irgendwie kann ich nicht ganz folgen :-D
Wie muss ich das denn nun machen?

Muetze1 20. Feb 2008 20:24

Re: Zugriffsverletzung bei TStringList
 
Wir sehen keinen Fehler in deinem o.g. Code. Deshalb die Anfrage mehr Code zu posten. Ich empfehle dir sogar mal die ganze Unit hier zu posten.

Yheeky 20. Feb 2008 20:31

Re: Zugriffsverletzung bei TStringList
 
Okay, hier die Unit:

Delphi-Quellcode:
unit Formelrechnen;

interface

uses
  Classes, Controls;

type TFormel = class(TComponent)
  private
    TermListe : TStringList;
    function ParseTerm(Term : String) : String;
  public
    procedure Rechnen(Term : String);
  protected
    constructor Create(AOwner : TComponent); override;

end;

implementation

uses Unit1, Dialogs, SysUtils;

constructor TFormel.Create(AOwner : TComponent);
begin
inherited Create(AOwner);

  //Termliste initialisieren
  TermListe := TStringList.Create;

end;

function TFormel.ParseTerm(Term : String) : String;
begin
  // Funktion implementieren
  // Hier ein Test
  TermListe.Add('test');

end;

procedure TFormel.Rechnen(Term : String);
begin
  ParseTerm(Term);

end;

end.
Der Aufruf im Programm (ausgestattet mit einem Edit und einem Button):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var newFormel : TFormel;
begin
newFormel := TFormel.Create(nil);
newFormel.Rechnen(Edit1.Text);

end;

alzaimar 20. Feb 2008 20:37

Re: Zugriffsverletzung bei TStringList
 
Mehr Code ist wirklich nicht da? Dann ist dein PC kaputt. Oder Delphi. Denn das funktioniert einwandfrei.

Yheeky 20. Feb 2008 20:39

Re: Zugriffsverletzung bei TStringList
 
Zitat:

Zitat von alzaimar
Mehr Code ist wirklich nicht da? Dann ist dein PC kaputt. Oder Delphi. Denn das funktioniert einwandfrei.

:lol:

Ich programmiere ja auch schon ne Weile und deswegen wundert mich das auch irgendwie...seit ner Woche hab ich Vista drauf, vielleicht liegt´s daran ;-)

dominikkv 20. Feb 2008 21:33

Re: Zugriffsverletzung bei TStringList
 
welche Fehlermeldung kommt denn jetzt genau?

Yheeky 20. Feb 2008 22:41

Re: Zugriffsverletzung bei TStringList
 
Die da kommt:
Delphi-Quellcode:
Erste Gelegenheit für Exception bei $7655B09E. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 0045AC18 in Modul 'Formelrechner.exe'. Lesen von Adresse 00000000'. Prozess Formelrechner.exe (1740)

mkinzler 20. Feb 2008 22:43

Re: Zugriffsverletzung bei TStringList
 
Es wird auf eine Referenzvariable zugegriffen, welche kein Objekt referenziert

Yheeky 20. Feb 2008 22:54

Re: Zugriffsverletzung bei TStringList
 
Und wie kann ich das beheben? :roll:

mkinzler 20. Feb 2008 23:00

Re: Zugriffsverletzung bei TStringList
 
Warum ist TFormel eine Komponente? Du gibst sie auch nicht mehr frei.
Versuch mal
Delphi-Quellcode:
newFormel := TFormel.Create(self);

Yheeky 20. Feb 2008 23:13

Re: Zugriffsverletzung bei TStringList
 
Ich weiss nicht, welchen Typ ich sonst nehmen soll ;-) Nee...ganz ehrlich!
Funktioniert leider immer noch nicht :-(

dominikkv 20. Feb 2008 23:15

Re: Zugriffsverletzung bei TStringList
 
naja dann fang mal mit so banalen Sachen an wie nen Breakpoint auf den Create-Aufruf zu machen oder mal sowas wie
Delphi-Quellcode:
if Assigned(TermListe) then
  TermListe.Add('blA');
und dann darauf nen Breakpoint usw^^

Nuclear-Ping 20. Feb 2008 23:26

Re: Zugriffsverletzung bei TStringList
 
Vererb doch mal von TObject statt von TComponent.

Andreas H. 21. Feb 2008 03:42

Re: Zugriffsverletzung bei TStringList
 
Hallo,

ein Component ohne Owner?
Delphi-Quellcode:
newFormel := TFormel.Create(nil);
Ich würde auch von TObject ableiten. Oder soll es mal zu einer Komponente ausgebaut werden?

Gruß Andreas

alzaimar 21. Feb 2008 06:09

Re: Zugriffsverletzung bei TStringList
 
Zitat:

Zitat von Andreas H.
ein Component ohne Owner?

Wieso nicht?

@Yheeky: Bitte poste ein Beispielprojekt, das den Fehler reproduzierbar provoziert. Ich glaube nämlich nicht, das da nicht noch mehr Code ist.

jottkaerr 21. Feb 2008 06:35

Re: Zugriffsverletzung bei TStringList
 
Hallo,

befindet sich TFormel wirklich in einer anderen Unit? Dann kann der Konstruktor nicht aufgerufen werden, weil er protected ist. Mit TFormel.Create(nil) rufst Du also den Konstruktor von TComponent auf, und TFormel.TermListe wird nie erzeugt.

jkr

hoika 21. Feb 2008 07:24

Re: Zugriffsverletzung bei TStringList
 
Hallo,

erstelle ein komplettes Beispiel-Projekt, zippe es
und hänge es an ein Post an.
Der Fehler kommt von was anderem.


Heiko

Nuclear-Ping 21. Feb 2008 10:24

Re: Zugriffsverletzung bei TStringList
 
Zitat:

Zitat von jottkaerr
Hallo,

befindet sich TFormel wirklich in einer anderen Unit? Dann kann der Konstruktor nicht aufgerufen werden, weil er protected ist. Mit TFormel.Create(nil) rufst Du also den Konstruktor von TComponent auf, und TFormel.TermListe wird nie erzeugt.

jkr

Guter Punkt.

Setz doch mal einen Breakpoint und schau, ob der Debugger da anhält.
Delphi-Quellcode:
constructor TFormel.Create(AOwner : TComponent);
begin
inherited Create(AOwner);

  //Termliste initialisieren
  TermListe := TStringList.Create; // <<<< Hier Breakpoint setzen

end;

Yheeky 21. Feb 2008 10:50

Re: Zugriffsverletzung bei TStringList
 
Zitat:

Zitat von jottkaerr
Hallo,

befindet sich TFormel wirklich in einer anderen Unit? Dann kann der Konstruktor nicht aufgerufen werden, weil er protected ist. Mit TFormel.Create(nil) rufst Du also den Konstruktor von TComponent auf, und TFormel.TermListe wird nie erzeugt.

jkr

Super Einwand! Daran lag´s! Der Konstruktor muss also public sein, damit ich ihn auch von anderen Projekten aus aufrufen kann, richtig?

DANKE für die Hilfe!

Nuclear-Ping 21. Feb 2008 13:16

Re: Zugriffsverletzung bei TStringList
 
Ja, sonst ist er nicht nach aussen hin "sichtbar" und dadurch wird der Standard-Constructor aufgerufen. Eigentlich logisch ... Nur manchmal sieht man den Wald vor lauter Bäumen nicht. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 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