Zugriffsverletzung bei TForm::Update Anweisung



  • 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 auch
    

    Wä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 = 00B1B1F0

    Also 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 = 00B0C360

    staffNumbers.cpp
    frmMain = 00B1B1F0
    lblStaffStatus = 00B0C360

    Fehlermeldung:
    "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. 😃 👍


Anmelden zum Antworten