In einem Delphi 7 Projekt haben wir FastMM installiert. Bald darauf bemerkten wir, dass eines der Formulare beim Schließen die Fehlermeldung "Abstract Error" (Fehlermeldung) ausgab. Ich habe das ausführlich getestet und kann den Grund dafür nicht finden. Der übliche Grund für diese Fehlermeldung scheint hier nicht zu gelten. Die Anwendung definiert keine abstrakten Klassen. Ich suchte auch das Formular für eine mögliche Verwendung von TStrings oder so ähnlich. Am wichtigsten ist, dass wir dieses Formular nicht geändert haben (naja, wir denken, dass wir es nicht getan haben). Es ist einfach kaputt gegangen.
Wenn die Antwort auf diese Fragen nein ist, dann suche ich einfach weiter nach einem nicht implementierten Methodenaufruf, erleichtert, dass ich etwas anderes nicht verpasse.
Wenn eine Speicherbeschädigung vorliegt, können alle Arten von Fehlern ausgelöst werden, und es ist sehr schwierig, die Ursache zu finden.
Um Ihre Fragen zu beantworten: 1) Ja abstrakter Fehler kann auch durch Speicherbeschädigung verursacht werden, und 2) Ja, wenn FastMM aktiviert wird, können Fehler sichtbar gemacht werden, die normalerweise unbemerkt bleiben (aber immer noch behoben sein sollten).
Einige allgemeine Hinweise zum Auffinden von Speicherfehlern:
"Es ist einfach kaputt" - es war wahrscheinlich immer kaputt, aber jetzt weißt du es.
Ich habe Probleme beim Schließen eines Formulars als Teil eines Schaltflächenereignisses gesehen. Das Formular wird gelöscht, und der Rest der Schaltflächenmeldungen wird an eine nicht mehr vorhandene Schaltfläche gesendet. Die Release-Methode vermeidet dies, indem (aus dem Speicher) eine wm_close-Nachricht zurück an das Formular
gesendet wirdBeantworten Sie Frage 1:
Ja. Dies hat in meinem Fall einen Abstract Error verursacht:
%Vor%Das hat funktioniert, als der Sender eine TButton war, aber den Fehler (natürlich) ausgelöst hat, als der Sender eine TAction war.
Antwort zu Frage 2: Ja. Das habe ich auch gesehen. Wir sollten sehr klar sein, dass dies nicht bedeutet, dass FastMM fehlerhaft ist. Der Fehler war "schlafend". FastMM hat es nur ausgelöst.
Eigentlich sollten Sie sich auf FastMM noch mehr verlassen, um Ihr Problem zu finden. Schalten Sie FastMM in den vollständigen Debug-Modus. Es wird dir helfen mit:
Stellen Sie sicher, dass ein Objekt nicht verwendet wird, nachdem es freigegeben wurde (oder davor) wurde erstellt)
In einigen wenigen Fällen wurde das ganze Projekt durcheinander gebracht und ich bekam den Abstract Fehler. Nichts funktionierte, bis ich die DPROJ-Datei löschte. Machen Sie einfach einen Vergleich zwischen Ihrer aktuellen DPROJ-Datei und der in Ihrem Rücken und Sie werden sehen, wie die IDE die Datei auffängt.
Sie könnten versuchen, Ihrem Projekt u_dzAbstractHandler hinzuzufügen. Es sollte den abstrakten Fehler, wo die Methode aufgerufen wurde, auslösen, so dass es einfacher ist, es zu debuggen. Das hilft natürlich nur, wenn der Fehler beim Ausführen im Debugger auftritt.