Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode (https://www.delphipraxis.net/182939-av-bei-spring-event-auf-vcl-komponenten-und-fastmm-fulldebugmode.html)

Der schöne Günther 27. Nov 2014 20:12

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:
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(????)
Ich kann diese AV auch manuell herbeiführen wenn ich im Destruktor von TContainedFrame einfach nur
Delphi-Quellcode:
OnClickedAButton := nil;
sage.

Ja, die Abhilfe wäre, dort stattdessen
Delphi-Quellcode:
OnClickedAButton.Clear();
zu sagen. Aber warum ist das so? Die AV bekomme ich nur, wenn ich FastMM4 im FullDebugMode verwende.


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:

humbuck 27. Nov 2014 20:19

AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
 
Hast du mal versucht deinen Code in Form.OnShow zu verfrachten?

Der schöne Günther 27. Nov 2014 20:28

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.

Jens01 27. Nov 2014 22:39

AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
 
das Event<> createn?

Sir Rufo 27. Nov 2014 22:49

AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
 
Zitat:

Zitat von Jens01 (Beitrag 1281407)
das Event<> createn?

Nö, das ist ein Record mit einem internen Interface, das created sich alles selber.

Jens01 27. Nov 2014 23:10

AW: AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode
 
Delphi-Quellcode:
class function Create: Event<T>; static;
Dat gibts aber..

Der schöne Günther 28. Nov 2014 05:58

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.

Stevie 28. Nov 2014 06:56

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

Der schöne Günther 28. Nov 2014 08:54

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:
https://bitbucket.org/sglienke/spring4d/issue/57/

Mich wundert es nur, warum nur mit FastMM und FullDebugMode.

Stevie 28. Nov 2014 14:00

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 00:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz