![]() |
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:
Unter anderem ist auch eine StringList für die einzelnen Terme dabei.
type TFormel = class(TComponent)
private TermListe : TStringList; function ParseTerm(Term : String) : String; public procedure Rechnen(Term : String); protected constructor Create(AOwner : TComponent); override; end; Im Konstruktor rufe ich folgendes auf:
Delphi-Quellcode:
Im Programm erstelle ich dann ein Objekt:
constructor TFormel.Create(AOwner : TComponent);
begin inherited Create(AOwner); //Termliste initialisieren TermListe := TStringList.Create; end;
Delphi-Quellcode:
In der Rechnenfunktion wird dann auf den Term zugegriffen (z.B. TermListe.Add('Test');). Genau hier bekomme ich dann aber eine Fehlermeldung, wieso?
procedure TForm1.Button1Click(Sender: TObject);
var newFormel : TFormel; begin newFormel := TFormel.Create(nil); newFormel.Rechnen(Edit1.Text); end; Wäre nett, wenn mir jemand helfen könnte. Danke! |
Re: Zugriffsverletzung bei TStringList
Ohne den Rest des Codes wird man Dir nicht helfen können. Ich vermute einen Seiteneffekt o.ä.
|
Re: Zugriffsverletzung bei TStringList
Die Methode Rechnen wäre bestimmt interessant zu sehen.
|
Re: Zugriffsverletzung bei TStringList
Wie gesagt: ihr könnt die Funktion durch TermListe.Add('Test'); ersetzen, da tritt der Fehler auch schon auf.
|
Re: Zugriffsverletzung bei TStringList
das ist komisch bei Delphi
Delphi-Quellcode:
initiert werden ,
Var a:TStringList;
//kann nicht mit a:=TStringList.create; sondern
Delphi-Quellcode:
Var a:TStrings;
a:=TStringlist.create; |
Re: Zugriffsverletzung bei TStringList
TStrings ist eine abstrakte Klasse, TStringlist die implemnetierende
|
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.
|
Re: Zugriffsverletzung bei TStringList
@muetze1:stimmt Du hast recht sorry es ist andersrum
Delphi-Quellcode:
so rum geht es nicht.
Var a:TStrings;
begin a:=TStrings.Create; a.Add('Test'); end; Entschuldigung, Irre sind menschlich. |
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?
|
Re: Zugriffsverletzung bei TStringList
Irgendwie kann ich nicht ganz folgen :-D
Wie muss ich das denn nun machen? |
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.
|
Re: Zugriffsverletzung bei TStringList
Okay, hier die Unit:
Delphi-Quellcode:
Der Aufruf im Programm (ausgestattet mit einem Edit und einem Button):
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.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var newFormel : TFormel; begin newFormel := TFormel.Create(nil); newFormel.Rechnen(Edit1.Text); end; |
Re: Zugriffsverletzung bei TStringList
Mehr Code ist wirklich nicht da? Dann ist dein PC kaputt. Oder Delphi. Denn das funktioniert einwandfrei.
|
Re: Zugriffsverletzung bei TStringList
Zitat:
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 ;-) |
Re: Zugriffsverletzung bei TStringList
welche Fehlermeldung kommt denn jetzt genau?
|
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)
|
Re: Zugriffsverletzung bei TStringList
Es wird auf eine Referenzvariable zugegriffen, welche kein Objekt referenziert
|
Re: Zugriffsverletzung bei TStringList
Und wie kann ich das beheben? :roll:
|
Re: Zugriffsverletzung bei TStringList
Warum ist TFormel eine Komponente? Du gibst sie auch nicht mehr frei.
Versuch mal
Delphi-Quellcode:
newFormel := TFormel.Create(self);
|
Re: Zugriffsverletzung bei TStringList
Ich weiss nicht, welchen Typ ich sonst nehmen soll ;-) Nee...ganz ehrlich!
Funktioniert leider immer noch nicht :-( |
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:
und dann darauf nen Breakpoint usw^^
if Assigned(TermListe) then
TermListe.Add('blA'); |
Re: Zugriffsverletzung bei TStringList
Vererb doch mal von TObject statt von TComponent.
|
Re: Zugriffsverletzung bei TStringList
Hallo,
ein Component ohne Owner?
Delphi-Quellcode:
Ich würde auch von TObject ableiten. Oder soll es mal zu einer Komponente ausgebaut werden?
newFormel := TFormel.Create(nil);
Gruß Andreas |
Re: Zugriffsverletzung bei TStringList
Zitat:
@Yheeky: Bitte poste ein Beispielprojekt, das den Fehler reproduzierbar provoziert. Ich glaube nämlich nicht, das da nicht noch mehr Code ist. |
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 |
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 |
Re: Zugriffsverletzung bei TStringList
Zitat:
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; |
Re: Zugriffsverletzung bei TStringList
Zitat:
DANKE für die Hilfe! |
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