Test auf assigned(P) verusacht AV
Moin,
ich habe einen TChart, in dem ich zur Laufzeit n Datenlinien erzeuge. Manchmal werden die auch gelöscht und neue erzeugt. Die Zeile
Delphi-Quellcode:
erzeugt in einer bestimmten Situation eine AV. Für den Chart habe ich keine debug-dcus, kann also nicht tiefer reinschauen und genau untersuchen.
if assigned(Chart1.Series[0]) then
Wenn Chart1.Series[0] nil wäre, dürfte ich ja keine AV bekommen. Scheint eine ungültige Referenz auf das Objekt zu sein. Was macht denn assigned genau und wie bekomme ich die Nachricht hinter der Schlagzeile raus? Grüße, Messie |
Re: Test auf assigned(P) verusacht AV
Wenn die Anzahl der Elemente in Chart1.Series = 0 ist, verursacht der Zugriff auf Chart1.Series[0] einen Fehler. Das Assigned ist da noch gar nicht am Zug.
|
Re: Test auf assigned(P) verusacht AV
Überprüfe zuerst ob Chart1 existiert
|
Re: Test auf assigned(P) verusacht AV
Gibt es kein "Series.Count"? - Wenn ja zuerst überprüfen bevor du einen Index "Series[x]" benutzt.
Ich gehe mal davon aus, dass beim löschen einer Datenreihe das dahinterliegende Objket einfach mittels Delete aus der Collection/Liste (was ist es??) entfernt wird. In diesem Fall gibt es kein "Series[x]" mehr. Mit Assigned prüfst du ja nach, on "Series[x]" unleich NIL ist aber nicht, ob dieses Element der Collection (oder Liste) wirklich existiert. |
Re: Test auf assigned(P) verusacht AV
Zitat:
Daher auch meine Frage nach der Funktionsweise von assigned(). Grüße, Messie |
Re: Test auf assigned(P) verusacht AV
Nee, Assigned macht im Prinzip auch nichts Anderes, als
Delphi-Quellcode:
if Chart1.Series[0] <> nil then
|
Re: Test auf assigned(P) verusacht AV
Dein Problem ist, dass Assigned() den zu prüfenden Zeiger garnicht zu sehen bekommt, da er nicht da ist.
Beispiel: OK := Assigned(Chart1-Series[4]) bedeutet wenn es genügend Elemente gibt: Hol dir das 5. Element Übergib das "geholte" Element an Assigned() Weise das Ergebnis der Variablen OK zu OK := Assigned(Chart1-Series[4]) bedeutet wenn es nicht genügend Elemente gibt: Hol dir das 5. Element => kein Element an dieser Position vorhanden. => AV Übergib das "geholte" Element an Assigned() Weise das Ergebnis der Variablen OK zu Man sieht also: Der Fehler tritt auf, bevor Assigned() überhaupt eine Möglichkeit hatte etwas zu testen! |
Re: Test auf assigned(P) verusacht AV
Also, ich habe nochmal gesucht und dann das Problem behoben.
Dazu habe ich in der Hilfe Zitat:
Jedenfalls muss es statt eines nil setzen des n-ten Elements einen verbogenen Pointer geben, der genau zu der Zugriffsverletzung führt. Da ich keine Quellen und keine Debug-dcus habe, kann ich auch nicht in den Katakomben nachsehen, was dahinter steht. Kann damit zusammenhängen, dass die Series sowohl als eigene VCL-Objekte als auch als Member des TChart behandelt werden. Dann wird wahrscheinlich die SeriesList nur ein PointerArray enthalten statt den Objekten selbst. Darüber hätte ich beinahe den Glauben an die assigned-Prüfung verloren :zwinker: Danke für die Tipps, Messie |
Re: Test auf assigned(P) verusacht AV
Zitat:
|
Re: Test auf assigned(P) verusacht AV
Zitat:
Delphi-Quellcode:
Das löscht n.m.E nur den Verweis, nicht aber das List-Objekt.
Chart99.Series[i].Free
Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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