AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Test auf assigned(P) verusacht AV

Ein Thema von messie · begonnen am 10. Dez 2009 · letzter Beitrag vom 14. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2   
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 17:03
Moin,

ich habe einen TChart, in dem ich zur Laufzeit n Datenlinien erzeuge. Manchmal werden die auch gelöscht und neue erzeugt.

Die Zeile
if assigned(Chart1.Series[0]) then erzeugt in einer bestimmten Situation eine AV. Für den Chart habe ich keine debug-dcus, kann also nicht tiefer reinschauen und genau untersuchen.

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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#2

Re: Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 17:07
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.
Uwe Raabe
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 17:07
Überprüfe zuerst ob Chart1 existiert
Markus Kinzler
  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
 
#4

Re: Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 19:01
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.
Ralf Kaiser
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 23:17
Zitat von Uwe Raabe:
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.
Öhm, ich hatte eigentlich erwartet, dass assigned() mir eine Art geschützten Zugriff erlaubt. Dass eine Prüfung eines nachgeordneten Elements (Chart1.Series[n]) am Zugriff auf ein möglicherweise nicht referenziertes Element Chart1 scheitert, wäre mir nicht klar, weil Chart1 eigentlich vorhanden sein sollte bzw ist.

Daher auch meine Frage nach der Funktionsweise von assigned().

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#6

Re: Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 23:25
Nee, Assigned macht im Prinzip auch nichts Anderes, als
if Chart1.Series[0] <> nil then
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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
 
#7

Re: Test auf assigned(P) verusacht AV

  Alt 10. Dez 2009, 23:29
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!
Ralf Kaiser
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Test auf assigned(P) verusacht AV

  Alt 14. Dez 2009, 10:35
Also, ich habe nochmal gesucht und dann das Problem behoben.

Dazu habe ich in der Hilfe
Zitat:
Warning: Never FREE or REMOVE SeriesList elements. Use the Series.Free to remove it or use the Series.Active property to disable it.
gefunden. Warum die public Routine Chart99.SeriesList.Clear - die genau das tut - angeboten ist, ist mir schleierhaft.
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

Danke für die Tipps, Messie
  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: Test auf assigned(P) verusacht AV

  Alt 14. Dez 2009, 10:51
Zitat von messie:
Dazu habe ich in der Hilfe
Zitat:
Warning: Never FREE or REMOVE SeriesList elements. Use the Series.Free to remove it or use the Series.Active property to disable it.
gefunden. Warum die public Routine Chart99.SeriesList.Clear - die genau das tut - angeboten ist, ist mir schleierhaft.
Also dawürde ich so verstehen, dass man die Elemente der Liste nicht manuell (!!!) mit .Free freigeben sollte sondern dazu die Methoden benutzen soll die das Series-Objekt zur verfügung stellt. Wahrscheinlich werden in dem Series-Objekt noch andere Verwaltungsdaten über die enthaltenen Objekte gespeichert die beim Löschen eines der Elemente noch angepasst werden.
Ralf Kaiser
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Test auf assigned(P) verusacht AV

  Alt 14. Dez 2009, 11:13
Zitat von Alfi001:
Also dawürde ich so verstehen, dass man die Elemente der Liste nicht manuell (!!!) mit .Free freigeben sollte sondern dazu die Methoden benutzen soll die das Series-Objekt zur verfügung stellt. Wahrscheinlich werden in dem Series-Objekt noch andere Verwaltungsdaten über die enthaltenen Objekte gespeichert die beim Löschen eines der Elemente noch angepasst werden.
Ich habe sie nicht manuell freigegeben, sondern Chart99.SeriesList.Clear verwendet und damit das Problem erzeugt. Jetzt nehme ich wie angegeben Chart99.Series[i].Free Das löscht n.m.E nur den Verweis, nicht aber das List-Objekt.

Grüße, Messie
  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 09:45 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