AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign AV bei Spring.Event<> auf VCL-Komponenten und FastMM FullDebugMode

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

Offene Frage von "Der schöne Günther"
Ein Thema von Der schöne Günther · begonnen am 27. Nov 2014 · letzter Beitrag vom 28. Nov 2014
Antwort Antwort
Seite 1 von 2  1 2   
Der schöne Günther

Registriert seit: 6. Mär 2013
6.109 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 27. Nov 2014, 20:12
Ich bin absolut ratlos. Ich platziere einen Frame (TContainedFrame) auf einem Formular (TMyForm). Der Frame hat eine 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 OnClickedAButton := nil; sage.

Ja, die Abhilfe wäre, dort stattdessen 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
  Mit Zitat antworten Zitat
Benutzerbild von humbuck
humbuck

Registriert seit: 26. Nov 2014
Ort: BW
65 Beiträge
 
Delphi XE4 Professional
 
#2

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

  Alt 27. Nov 2014, 20:19
Hast du mal versucht deinen Code in Form.OnShow zu verfrachten?
Jörch
Wissen ist Macht!
Wenn man nix weiß, muss man halt nur wissen, wo man nachschlagen muss.
Ergo: Ich weiß nix - macht nix.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.109 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 27. Nov 2014, 20:28
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.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#4

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

  Alt 27. Nov 2014, 22:39
das Event<> createn?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 27. Nov 2014, 22:49
das Event<> createn?
Nö, das ist ein Record mit einem internen Interface, das created sich alles selber.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#6

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

  Alt 27. Nov 2014, 23:10
class function Create: Event<T>; static; Dat gibts aber..
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.109 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 28. Nov 2014, 05:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

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

  Alt 28. Nov 2014, 06:56
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (28. Nov 2014 um 07:06 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.109 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

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

  Alt 28. Nov 2014, 08:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

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

  Alt 28. Nov 2014, 14:00
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 Uhr.
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