Custom Component: Access Violation
-
Hi @all,
So, ein neues Problem mit Custom Components.
Ich habe eine Komponente mit einem "link" auf ein TMenu:class PACKAGE TMenuSerializer : public TComponent { private: TMenu* m_Menu; public: __fastcall TMenuSerializer(TComponent* Owner); __published: __property TMenu* Menu = { read=m_Menu, write=m_Menu, stored=false, default=0 }; };
Im Designer setzte ich die property auf ein vorhandenes Menu, alles Ok.
Sobald das Menu selbst jedoch gelöscht wird, gibt's (bei Klick auf die Cust. Comp) ordentlich Access Violations.Normalerweise werden doch solche verbundene Eigenschaften auf 0 gesetzt?!
c ya, cPanther
-
Hallo
Nein. Wenn dein TMenu von "außen" gelöscht wird bekommt das deine Komponente TMenuSerializer nicht mit, der Zeiger m_Menu wird nicht auf 0 gesetzt.
bis bald
akari
-
Ok, aber wie machen es dann die _real_ vcl Komponenten?
Wenn ich meine Menu-Komponente lösche bekomme ich schließlich keine AV, nur weil mein Form mit dem Menu (Form->MainMenu) verbunden war.
c ya cPanther
-
Hallo
Die Verbindung zwischen den VCL-Komponenten wird eben nicht nur einseitig, sondern zweiseitig aufgebaut. Du hast folgende Situation : Deine Komponente A kennt Komponente B (TMenu). Damit kann A sich um B kümmern, wenn A gelöscht wird. Aber B kennt A nicht, kann also A nicht benachrichtigen wenn B gelöscht wird.
Du könntest als einfachstes von einer zusätzlichen Komponente von TMenu ableiten, die einen Zeiger auf A hat, um diesen über den Destruktor die Verbindung wieder lösen zu lassen. Für noch weitergehende und flexiblere Konzepte siehe z.B. das Observer Pattern.Leider lassen die ganzen VCL-Komponenten ja keine Mehrfachvererbung zu, was solche Sachen eleganter lösen würde.
bis bald
akari
-
ajcPanther schrieb:
Ok, aber wie machen es dann die _real_ vcl Komponenten?
-
Danke, funktioniert mit FreeNotification + Notification!
c ya, cPanther