![]() |
AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Ich bin absolut ratlos. Ich platziere einen Frame (TContainedFrame) auf einem Formular (TMyForm). Der Frame hat eine
Delphi-Quellcode:
.
public var OnClickedAButton: Event<TNotifyEvent>
Im OnCreate-Event des Formulars füge ich eine Methode des Formulars zum Event des Frames hinzu:
Delphi-Quellcode:
procedure TMyForm.FormCreate(Sender: TObject);
begin containedFrame.OnClickedAButton.Add(handleAButtonClick); end; procedure TMyForm.handleAButtonClick(Sender: TObject); begin Caption := 'A button in '+Sender.ClassName+' was clicked'; end; Das Problem: Der Destruktor von TContainedFrame erzeugt eine Zugriffsverletzung mit folgendem, mysteriösen Callstack:
Code:
Ich kann diese AV auch manuell herbeiführen wenn ich im Destruktor von TContainedFrame einfach nur
System.Classes.{System.Generics.Collections}TList<System.Classes.TComponent>.IndexOf(???)
System.Classes.{System.Generics.Collections}TList<System.Classes.TComponent>.Remove(???) System.Classes.TComponent.RemoveNotification($9672) System.Classes.TComponent.RemoveFreeNotification($7EF3A7D0) System._IntfClear(???) :004CE51F System::Generics::Collections::TList__1<System::Classes::TComponent *>::IndexOf(????)
Delphi-Quellcode:
sage.
OnClickedAButton := nil;
Ja, die Abhilfe wäre, dort stattdessen
Delphi-Quellcode:
zu sagen. Aber warum ist das so? Die AV bekomme ich nur, wenn ich FastMM4 im FullDebugMode verwende.
OnClickedAButton.Clear();
Noch komischer: Ist keine VCL im Spiel, läuft folgender Code, trotz FastMM, problemlos durch:
Delphi-Quellcode:
program Project14;
{$APPTYPE CONSOLE} {$R *.res} uses FastMM4, System.SysUtils, System.Classes, Spring; type TContainedClass = class public var myEvent: Event<TNotifyEvent>; end; TMyClass = class protected var containedInstance: TContainedClass; protected procedure handleEvent(Sender: TObject); public constructor Create(); destructor Destroy(); override; end; constructor TMyClass.Create; begin containedInstance := TContainedClass.Create(); containedInstance.myEvent.Add(handleEvent); end; destructor TMyClass.Destroy; begin containedInstance.Free(); inherited; end; procedure TMyClass.handleEvent(Sender: TObject); begin // end; begin try TMyClass.Create().Destroy(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Ich habe absolut keinen Ansatz, warum das hier so passiert. Ja, es ist ein wilder Wust von irgendeinem speziellen Spezialproblem. Aber jede wilde Idee macht mich froh :oops: |
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Hast du mal versucht deinen Code in Form.OnShow zu verfrachten?
|
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Macht keinen Unterschied. Sobald ich dem Event des Frames einmal einen Handler hinzugefügt habe fliegt er mir im Destruktor des Frames um die Ohren.
|
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
das Event<> createn?
|
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Zitat:
|
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Delphi-Quellcode:
Dat gibts aber..
class function Create: Event<T>; static;
|
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Ganz durschaut habe ich es auch noch nicht, aber explizit anlegen muss man es nicht. Es funktioniert auch alles wie es soll, nur beim Zerstören des Frames bzw. Formulars läuft etwas nicht richtig.
|
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Eventhandler von TComponents werden vom Event automatisch verwaltet (d.h. wenn eine TComponent freigegeben wird, dann sagt sie dem Event bescheid, womit die Eventhandler dort entfernt werden).
Um mir die Fehlersuche zu erleichtern, könntest du mir mal das fehlerhafte Projekt inkl der von dir benutzen FastMM4 zukommen lassen. Entweder hier per Anhang oder in unserem Bugtracker auf bitbucket Ach ja, und die Spring4D Version bitte noch, die du einsetzt |
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Danke, jetzt ist es in guten Händen :-)
Spring 1.1 mit XE7 Habe es auf eurem Tracker eingetragen: ![]() Mich wundert es nur, warum nur mit FastMM und FullDebugMode. |
AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
Hab den Fehler gefunden und gefixt. Das lag daran, dass im Destructor der TEvent Klasse erst fNotificationHandler freigegeben wird und dann im Notify Event der fHandlers Liste, die danach freigegeben wird, noch benutzt wird.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr. |
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 by Thomas Breitkreuz