event Problem
-
Hey,
stehe wieder mal vor einem Problem, zudem ich gerade leider keine Lösung finde.
Ich würde gerne ein Event nutzen, welches wie folgt aussieht:
public event SearchOnExceptionHandler^ OnException = nullptr;
Dabei wird auf folgendes verwiesen:
public delegate void SearchOnExceptionHandler(System::Object^ o, SearchOnExceptionEventArgs^ e);
Die Fehlermeldung die dabei jedoch auftritt lautet jedesmal:
"Syntaxfehler: Fehlendes ';' vor Bezeichner 'SearchOnExceptionHandler'"
(In der Zeile vom erst genannten Befehl)Weiß da einer von euch vielleicht eine Lösung?
Danke schon mal im Voraus.
LG
Edit:
Das ganze steht in der Header Datei (falls die Info benötigt wird).
-
Hast Du die SearchOnExceptionEventArgs definiert?
Simon
-
Ja und zwar so:
public ref class SearchOnExceptionEventArgs : EventArgs { protected: System::Exception^ excError; System::Diagnostics::StackFrame^ sfPos; // ------------------------------------------ public: SearchOnExceptionEventArgs(System::Exception^ excError, System::Diagnostics::StackFrame^ sfPos); property System::Exception^ Result { System::Exception^ get(); } property System::Diagnostics::StackFrame^ Pos { System::Diagnostics::StackFrame^ get(); } // ----------------------------------------- };
-
Hallo,
eventuell "umdrehen": delegate vor event setzen:
delegate void SearchOnExceptionHandler(System::Object^ o, SearchOnExceptionEventArgs^ e); event SearchOnExceptionHandler^ OnException = nullptr;
MfG,
Probe-Nutzer
-
Hey,
so habe ich es soweiso bereits geschrieben. Bringt also leider nichts.
LG
-
Hat keiner eine Idee dazu? Schade...
-
Dein event ist ja Member einer Klasse, desshalb musst Du hinter dem public noch ein : hinmachen.
Simon
-
Habe ich gemacht, ändert leider nichts. Habe auch schon probiert " = nullptr" wegzulassen. Dann kommt an der Stelle auch kein Fehler mehr, allerdings zeigt er dann eine andere Fehlermeldung an, sobald ich folgendes überprüfe:
if (OnException != nullptr)
Die Fehlermeldung, die dann folgt, lautet:
"Für die Syntax muss "Search::OnException" ein Datenmember sein."
-
So, zeig mal deine ganze Klasse mit dem event und die Dekl. des delegaten.
Die initialisierung mit nullptr und auch die Prüfung gegen nullptr kannst Du dir sparen.
Simon
Edit:
Ich vermute Du, dass Du dein event nicht als Klassen- Member gemacht hast.
-
Habe dir das mal per Mail geschickt.
-
Du kannst ein Event nicht mit nullptr vergleichen bzw. einem Event einen nullptr zuweisen.
Wenn Du überprüfen willst, ob Handler registriert sind, musst Du anders vorgehen. Es gibt eine ausführliche Deklaration von Events, die lautet:
event SearchOnExceptionHandler^ OnException { void add(SearchOnExceptionHandler^); void remove(SearchOnExceptionHandler^); void raise(System::Object^ o, SearchOnExceptionEventArgs^ e); }
Du definierst dir eine Liste von SearchOnExceptionHandler. Bei add(...) fügst du den Handler hinzu, bei remove entfernst du ihn und bei raise gehst Du durch die Liste und rufst die Handler auf. Wenn Du überprüfen, willst, wieviele Handler registriert sind, kannst du die Anzahl der Elemente in der Liste abrufen.
-
Mh, also ist das nicht so wie in C# möglich?
Dort kann man ja schreiben:
public delegate void SearchOnExceptionHandler(object o, SearchOnExceptionEventArgs e);
und
public class Search { public event SearchOnExceptionHandler OnException = null; }
-
Ich denke nicht.
Ich habe es eine Zeit lang probiert und es nicht geschafft. Jetzt bin ich mit der ausführlichen Lösung aber auch ganz zufrieden.
-
Okay.
Mh, und noch einmal zum Verständnis:
Eine Abfrage dann (z.B. jetzt wie in C#):
protected void DoOnException(Object Sender, Exception exException, StackFrame sfPos) { if (OnException != null) { try { OnException(this, new SearchOnExceptionEventArgs(exException, sfPos)); } catch { } } }
.. kann ich jetzt wie in C++/CLI umsetzen?
-
Ausserhalb der Klasse:
public ref class SearchOnExceptionEventArgs : public EventArgs { public: SearchOnExceptionEventArgs(Exception ^ex, System::Diagnostics::StackFrame ^sf) : Exception(ex), Stack(sf) {} public: Exception^ Exception; public: System::Diagnostics::StackFrame^ Stack; }; public delegate void SearchOnExceptionHandler(Object^ sender, SearchOnExceptionEventArgs^ e);
Innerhalb der Klasse:
public: event SearchOnExceptionHandler^ OnException; // INFO: Auto-Event (man braucht das add/remove/raise nicht selber implementieren... protected: void DoOnException(Object^ Sender, Exception^ exException, System::Diagnostics::StackFrame^ sfPos) { // Die Abfrage auf "null(ptr)" braucht man hier nicht, da es in der "raise" Methode sowieso gemacht wird. try { OnException(this, gcnew SearchOnExceptionEventArgs(exException, sfPos)); } catch(Exception^) { } }
-
Vielen Dank!