Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung bei Adresse 00000000 bei TImage (https://www.delphipraxis.net/127762-zugriffsverletzung-bei-adresse-00000000-bei-timage.html)

gsh 18. Jan 2009 19:02

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Zitat:

Zitat von SuperSeb
@3_of_8: Also, bin jetzt Zeile für Zeile durchgesprungen - läuft ohne Probleme. Der Fehler tritt erst auf, wenn man die Form schließt

Kann es sein das du beim beenden die Klasse und somit das Bild freigibst aber dann noch mal drauf zugreifst.

Mach ambesten folgendes:
* Breakpoint bei der Position wo der Fehler kommt
* Breakpoint im Destroy von der Klasse

So nun schliesst du deine Exe und springst solange weiter bis du im Destroy angekommen bist. Wird der andere Breakpoint danach noch aufgerufen?

SuperSeb 18. Jan 2009 19:11

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Hurra, erster Erfolg: Er kommt tatsächlich noch mal da vorbei. Abver mir ist sehr schleierhaft, wo der Aufruf herkommen soll...
Die Prozedur, in der er vorbeikommt und wo der Fehler auftaucht wird nur bei einer Größenänderung (OnResize) und im Constructor aufgerufen...

:gruebel:

Edit: Nachtrag: Wenn ich das Bild.Free; aus dem Destructor rausnehme, gehts logischerweise. Aber das ist dann ja nicht mehr saubere OOP, oder?

3_of_8 18. Jan 2009 19:21

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Naja, ist im Prinzip auch egal, wenn das Programm beendet ist, wird der Speicher sowieso freigegeben. Aber ich frag mich auch, wieso das noch kracht - irgendwas ruft offenbar noch den Destruktor von dem Bild auf, aber wenn du keinen Owner übergibst, wer könnte das denn dann noch sein?

gsh 18. Jan 2009 19:22

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Zitat:

Zitat von SuperSeb
Hurra, erster Erfolg: Er kommt tatsächlich noch mal da vorbei. Abver mir ist sehr schleierhaft, wo der Aufruf herkommen soll...
Die Prozedur, in der er vorbeikommt und wo der Fehler auftaucht wird nur bei einer Größenänderung (OnResize) und im Constructor aufgerufen...

:gruebel:

Edit: Nachtrag: Wenn ich das Bild.Free; aus dem Destructor rausnehme, gehts logischerweise. Aber das ist dann ja nicht mehr saubere OOP, oder?

ok versuch noch folgendes:
Gebe deine Klasse nicht mit Bild.Free sondern mit FreeAndNil(Bild) frei.
Dann versiehst du jeden Aufruf von Bild mit:
Delphi-Quellcode:
if Bild <> nil then Bild.Irgendwas;

DeddyH 18. Jan 2009 19:27

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Deshalb auch meine Frage aus #5. Vermutlich wird die Klasse bereits an anderer Stelle freigegeben und nicht genullt. Da Free aber auf Assigned prüft, knallt es dann im Destruktor.

SuperSeb 18. Jan 2009 19:27

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Selbst die Krücke geht nicht...

bin so langsam am verzweifeln....

DeddyH 18. Jan 2009 19:32

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Jetzt prüf doch nochmal alles durch, ob
- die Klasse in jedem Fall erzeugt und
- sie nicht vor dem Aufruf des Destruktors freigegeben wird

turboPASCAL 18. Jan 2009 19:36

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Mal eine (blöde) Frage, um was für ein Bild handelt es sich denn ( JPEG ) ?

Ich frage deswegen:

ungefähres Zitat
... Wenn ich das mit einem anderem Bild mache, klappt es ...

himitsu 18. Jan 2009 19:46

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Zitat:

Zitat von SuperSeb
@himitsu: Also den AOwner habe ich durchgeschleift, d.h. das ist der des Klassen-Konstructors. Wahrscheinlich liegt hier der Hase im Pfeffer. Beim Erzeugen eines Objekts hatte ich dem Constructor schon mal Application mitgegeben, dann auch mal den eigenen Objektnamen. Es machte bisher keinen Unterschied und funktionierte Einwandfrei - habe auch schon gegooglet, aber so richtig schlau geworden, wo der Unterschied liegt, bin ich nicht.

Vielleicht sollte ich noch dazu sagen (jetzt werde ich wahrscheinlich gesteinigt), dass ich das Objekt unter initialization instanziere, denn wenn ich das erst bei FormCreate einbaue (habs mal getestet), kommt ein schöner Fehler.

OK, meinte zwar erstmal nur den Owner, welchen du beim .Create des Images übergibst,
aber wenn das auch "Klasse" ist, dann liegt da vermutlich wirklich das Problem.

PS: [TImage].Left greift auf dessen Owner zu ... drumm sollte da besser mal alles korrekt ablaufen!

Code:
[b]initialization[/b]
  [color=#ff0000]Klasse[/color] := TKlasse.Create([color=#0000ff]Klasse[/color]); //Ob das wohl so stimmt???
[b]end[/b].
und hier ... welchen Wert hat Klasse denn vorher?
ich vermute aber mal, daß Klasse irgendwo als eine globale Variable definiert ist, weswegen sie wohl zufällig den wert NIL enthält und warum es rein zufällt, bei diesem Aufruf nicht kracht. ([TImage].Create greift auch auf den Owner zu, wenn er existiert, also nicht NIL ist)

ja und Klasse is nicht Klasse ... es sind 2 unterschiedliche Inhalte.

SuperSeb 18. Jan 2009 20:01

Re: Zugriffsverletzung bei Adresse 00000000 bei TImage
 
Also: 1. Ich arbeite da mit leeren Bildern, da ich nur die Hover- und OnClick- Eigenschaften brauche. Wenn dafür jemand ne bessere Idee hat, dann könnte ich das Ganze komplett umgehen.

Also sollte ich beim Create besser

Delphi-Quellcode:
Klasse := TKlasse.Create(Application);
schreiben, oder wie sonst?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr.
Seite 3 von 4     123 4      

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