H
Danke fuer alle Tipps. Mit "Notification() kam ich auf die richtige Spur.
Sorry, dass ich die Tags wieder nicht richtig verwendet habe. Schau spaeter nach, wie man das macht.
Heiner
Ueberschreibung der Elementfunktion Notification().
Wird eine Komponente im Formulardesigner oder waehrend der Laufzeit geloescht, sendet der Destruktor dieser Komponente eine opRemove-Nachricht an alle anderen Komponenten desselben Formulars. Der Aufruf von Notification() ist die Reaktion auf den Empfang einer solchen Botschaft. Standardmaessig leitet Notification() die Botschaft an alle untergeordneten Komponenten weiter. Im vorliegenden Fall muss Notification() fuer TMyComponent ueberschrieben werden:
//Deklaration der Komponente TMyComponent:
class TOtherComponent; // Klasse der anderen Komponente, worauf die
// Eigenschaft in MyComponent zeigt
class PACKAGE TMyComponent : public TComponent
{
private:
TOtherComponent *FOtherComp; // Zeiger auf andere Komponente
protected:
virtual void __fastcall Notification(Classes::TComponent* AComponent,
Classes::TOperation Operation);
// Deklaration der ueberschriebenen Methode Notification
public:
__fastcall TMyComponent(TComponent* Owner);
__published:
__property TOtherComponent* OtherComp = {read= FOtherComp,
write = FOtherComp,default=NULL};
};
//-------------------------------------------------------------------------
// Die Elementfunktion Notification:
void __fastcall TMyComponent::Notification(Classes::TComponent* AComponent, Classes::TOperation Operation)
{
TComponent:: Notification(AComponent,Operation);
// Aufruf von Notification() der Basisklasse
if(Operation == opRemove)
{
if (AComponent == OtherComp)
{
OtherComp = NULL;
}
} // Ende "if(Operation == opRemove)"
} // Ende Notification()
//---------------------------------------------------------------------------
Falls sich OtherComp in einem anderen Formular derselben Anwendung befinden kann, muss Vorsorge getroffen werden, dass die opRemove-Nachricht auch MyComponent erreicht. Das kann mit FreeNotification geschehen, z.B. durch Ueberschreiben der Elementfunktion BeforeDestruction() der Klasse TOtherComponent :
// Deklaration:
class PACKAGE TOtherComponent : public TComponent
{
...
protected:
virtual void __fastcall BeforeDestruction(void);
// wird aufgerufen, wenn die Komponente geloescht public:
__fastcall TOtherComponent(TComponent* Owner); //Konstruktor
__published:
...
};
//-------------------------------------------------------------------------
void __fastcall TOtherComponent::BeforeDestruction(void)
// wird aufgerufen, wenn Instanz von TOtherComponent geloescht werden soll
{
TComponent::BeforeDestruction(); // zuerst geerbte Methode aufrufen
/* Benachrichtigung ("Notification") aller Komponenten in anderen Formularen der Anwendung, dass Instanz von TOtherComponent geloescht wird. Zuerst als obersten "Owner" TApplication suchen; dann dessen Methode FreeNotification() aufrufen.
*/
TComponent* Firstowner = this->Owner;
if(!FirstOwner) return; // Komponente ohne Besitzer, kann nicht benachrichtigen
while ( !FirstOwner->ClassNameIs("TApplication"))
{
FirstOwner = owner->Owner; // eine "Besitzeretage" hoeher
if (FirstOwner==NULL) return; // TApplication nicht gefunden
}
FirstOwner->FreeNotification(this); // Botschaft versenden
}
//---------------------------------------------------------------------------
Bei mir funktioniert das jetzt sowohl im Formulardesigner als auch
zur Laufzeit. Bei Fragen oder Korrekturen dazu bin ich per eMail zu erreichen: Heiner.Kemmann@t-online.de. Vielleicht kann man dieses Problem in die FAQ uebernehmen.
Freundliche Gruesse Heiner
[EDIT] CodeTags eingefügt [/EDIT]