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
Thema durchsuchen
Ansicht
Themen-Optionen

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
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.114 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
Online

Registriert seit: 6. Mär 2013
6.114 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
Antwort Antwort


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 09:45 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