Zugriffsverletzung bei TForm::Update Anweisung
-
Dein CallStack zeigt ja, dass die Funktion StaffNumbers::startRefresh() den Fehler auslöst. Setze doch da mal einen Breakpoint und schau was passiert.
-
Braunstein schrieb:
Dein CallStack zeigt ja, dass die Funktion StaffNumbers::startRefresh() den Fehler auslöst. Setze doch da mal einen Breakpoint und schau was passiert.
Ja, das ist ja die Funktion wo ich das Update() aufrufe.
Bis dahin funktioniert ja alles und Kommentiere ich die Update()-Anweisung aus, läufts komplett durch (nur zeigt er mir dann logischerweise nix mehr auffem Bildschirm an, da das Textfeld nich aktualisiert wird).
-
Geh mit dem Debugger durch und schau dir den Inhalt deiner Variablen an. Dann wirst du schon sehen, warum hier eine Exception fliegt.
-
Das ist mein Block der nicht funktioniert...
frmMain->lblStaffStatus->Caption = message; // das funzt frmMain->lblStaffStatus->Update(); // <- das nicht Application->ProcessMessages(); // das funzt auchWäre frmMain oder wahlweise lblStaffStatus nicht richtig initialisiert o.ä. könnte ich ja schon nicht die Caption setzen, das funktioniert aber!
Ich kann auch z.B. andere Textfelder auslesen (also per überwachte Ausdrücke o.Ä.) aber sobald ich ein Update() fahre machts Bumm.Das is ja das Problem was ich habe, wäre frmMain nich initialisiert oder ich könnte gar nix damit machen, wäre es ja klar, aber es IST da und ich KANN damit alles machen, nur eben kein Update().

-
Zugriff auf einen nichtinitialisierten Speicherbereich erzeugt undefiniertes Verhalten. Undefiniert heißt, das alles passieren kann, auch das es funktioniert.
Das bedeutet, die Tatsache dass frmMain->lblStaffStatus->Caption = message; keinen Fehler verursacht bedeutet nicht, dass frmMain oder lblStaffStatus nicht doch unitialisert sein können. Also schau dir die Zeiger an.
-
Braunstein schrieb:
...Also schau dir die Zeiger an.
mainframe.cpp -> this = 00B1B1F0
staffNumbers.cpp -> frmMain = 00B1B1F0Also da passt meiner Meinung nach alles...
Und wie gesagt, ich kann ja sogar Inhalt auslesen und diese werden mir korrekt angezeigt!
Wäre der Zeiger ins Nirvana, könnte ich ja vielleicht was überschreiben, aber doch nix auslesen, oder?
-
Natürlich könntest du was auslesen. Solange der Speicherbereich nicht überschrieben wurde stehen da noch die alten Werte. Welchen Wert hat denn lblStaffStatus? Was ist eigentlich message?
-
mainframe.cpp
this = 00B1B1F0
lblStaffStatus = 00B0C360staffNumbers.cpp
frmMain = 00B1B1F0
lblStaffStatus = 00B0C360Fehlermeldung:
"Im Projekt ...exe ist eine Exception der der Klasse EAccessViolation mit der Meldung "Zugriffsverletzung" aufgetreten.
-
Das sieht ok aus. Evtl. hast du vorher schon einen Speicherzugriffsfehler, der sich erst dann auswirkt. schau am besten mal deinen ganzen Code durch, ob du sowas erkennen kannst. Du kannst auch versuchen alle nicht relevanten teile auszukommentieren und schauen wann der Fehler nicht mehr auftritt.
-
So, habs jetzt gelöst.
Den Fehler versteh ich nach wie vor nich ganz aber ich hab zumindest ne Ahnung.Das Problem war ich hatte vorher je Modul nur eine .CPP (und keine .H) Datei.
D.h. ich hab in der Mainframe.h jeweils die <Modul>.cpp geladen und nicht die <Modul>.h.Seitdem ich das Ganze gesplittet habe, in .CPP und .H Datei (wie es sich eigentlich gehört, aber ich war zu faul :D) klappts einwandfrei.
Schätze mal der kam durch das zig fache hin und her-importieren der Header / CPP-Dateien irgendwie durcheinander.
Danke nochmals

-
Man inkludiert niemals cpp-Dateien. Da sind derartige Fehler (sowie alle Menge Linker-Fehler) vorprogrammiert.
-
Joar ich sag ja: eigentlich is mir das bekannt, aber ich war zu faul... ^^
Hätte aber niemals gedacht, dass das solche Auswirkungen hat, wenn ich ehrlich bin.
Naja man lernt nie aus, beim nächsten Mal weiß ich bescheid.
