Eigener Eventhandler, aber static. Wie? Oder wie schliesse ich den ApplicationContext


Macan

Mitglied
Grüss euch,

so - jetzt fällt mir wieder nix ein. Ich habe mir einen eigenen Event Handler gebaut. Hier ein Ausschnitt:

Code:
public ref class MyEvent
	{
	public:
		delegate void MyEventHandler(Object^ Sender, MyEventArgs^ e);
		event MyEventHandler^ Event;
		void TriggerEvent(String^ MyEventName);
	};

void MyEvent::TriggerEvent(String^ EventName)
	{
	MyEventArgs^ Args = gcnew MyEventArgs(MyEventName);
	Event(this, Args);
	};
Das funktioniert alles wunderbar. Nur... wenn ich nun diese Klasse static haben will:

Code:
static ref class MyEvent
	{
	public:
		delegate static void MyEventHandler(Object^ Sender, MyEventArgs^ e);
		static event MyEventHandler^ Event;
		static void TriggerEvent(String^ MyEventName);
	};
... dann wird es schwierig.

Ab dann bekomme ich folgenden Fehler an dieser Stelle:
Code:
	Event(this, Args);
error C2671: 'MyEvent::TriggerEvent': Statische Memberfunktionen haben keinen this-Zeiger
Das ist mir ja auch klar, nur weiss ich nicht, durch was ich "this" ersetzen soll. Ich habe wirklich alles versucht.

Weiss jemand von euch Rat?

Ganz nebenbei: Ich versuche nur, diese Klasse statisch zu machen, damit ich eben von allen Headern aus darauf zugreifen kann, denn
Code:
extern ref class MyEvent myEvent
geht ja leider nicht.

Singleton?
Wie kann ich in .net eine bereits instantiierte Klasse/Methode in anderen Headern verwenden? Nur #include reicht ja leider nicht.

Noch noch mehr nebenbei. Das brauche ich eigentlich nur (also denke ich mal), da ich im ApplicationContext ein Problem mit Application::Exit() habe. Es werden immer nur Forms dadurch geschlossen, da ich es immer schaffe, aus solch einem Kontext aus Exit() zu rufen (was mir persönlich ein Rätsel ist, denn ich rufe - meiner Meinung nach - aus einem ganz anderen Strang Exit() auf, aber es wird immer nur ein Form geschlossen, die Application läuft weiter und beim nächsten Form->Close gibt's dann ein Problem mit bereits disposed resources *g*). Also will ich das über ein eigenes Exit-Event machen. Application::Exit() abfangen habe ich schon versucht, aber das ändert leider nichts.
Auch interessant ist, dass Exit() aus einem Form aufgerufen (ich setze Application::MainForm auf ein Form) immer die Application beendet. Sogar, wenn MainForm = nullptr ist *g*

Ich habe den Thread hier gelesen, in dem das Abfangen des closing Events half - aber bei mir hilft es nicht.

Also ich hoffe, jemand hier weiss Rat :)
 

Nico Graichen

Erfahrenes Mitglied
Hi,

Wie die Fehlermeldung schon sagt, steht in Static-Methoden der This-Pointer nicht zur Verfügung. Wenn du diesen nicht brauchst innerhalb des Events (sender wird also nicht genutzt) kanst du auch null übergeben.
 

Macan

Mitglied
Danke :) So funktioniert das nun wenigstens, wobei ich gerade da schon auch den Sender brauchen würde. Oder auch egal, dann gebe ich eben in den EventArgs noch Informationen über den Sender mit.

Auf den nullptr wäre ich nie gekommen, da ich einfach nur an die zwei Delegatsversionen dachte. Also (this, &Objekt::Methode) und eben (&Objekt::Methode) für die statischen Delegaten.

Warum ist es denn hier anders? Oder habe ich da einfach ein Verständnisproblem oder etwas übersehen.

Das Application.Idle Event ist ja auch statisch und wenn ich dort auch von meiner Seite aus alles genauso statisch erstelle, dann habe ich da das Problem nicht und bekomme auch einen Sender mit. Ich gehe mal davon aus, dass ich da irgend etwas nicht verstehe oder übersehe.

Oder - anders gefragt - was muss ich ändern, damit der Sender mit von der Partie ist, aber dennoch alles statisch bleibt?
 
Zuletzt bearbeitet: