Guten Morgen zusammen!
Ich habe jetzt schon sämtliche Beiträge zum erstellen von eigenen Events durchgelesen aber ich werde irgendwie nicht schlau daraus bzw. war irgendwie nicht das richtige dabei.
Es geht um folgendes:
Ich habe einen Wlan-Handscanner der in einem Netzwerk arbeitet. Nun überwache ich den Rückgabewert eines Pings auf einen Server. Sobald sich dieser ändert, soll das Event ausgelöst werden.
Meine Frage, wie bekomme ich diesen Wert in den Event übergeben?
Ich habe als Grundgerüst diesen Code genommen: [Lösung] Problem mit EventHandler
Vielen Dank für Eure Hilfe im Voraus! Vielleicht steh ich auch einfach nur auf der Leitung 😦
Habe ich es richtig verstanden, dass du den Rückgabewert per Event weitergeben willst? Ich sehe da zwei Lösungsmöglichkeiten (Für weitere bin ich offen). Ich weiß allerdings nicht, welche die Bessere ist. Vll kann dazu jmd was sagen.
Also 1: Den Rückgabewert in eine Propertie speicher, dass Event auslösen und die Klasse die das Event abonniert hat, liest die Properite aus:
public class HandScanner
{
private object _rueckgabe;
public object Rueckgabe
{
get { return _rueckgabe;}
}
private void UeberwacheHandScanner()
{
if(_rueckgabe != rueckgabeNeuerPing)
{
_rueckgabe = rueckgabeNeuerPing;
OnChangeEvent();
}
}
public delegate void EventDelegate(object source, EventArgs e);
public event EventDelegate ChangeEvent;
private void OnChangeEvent()
{
if(ChangeEvent != null)
{
ChangeEvent(this, new EventArgs());
}
}
}
public class VerarbeiteRueckgabe
{
public VerarbeiteRueckgabe()
{
_handScanner = new HandScanner;
_handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
}
private HandScanner _handScanner;
private void _handScanner_ChangeEvent(object value, EventArgs e)
{
object rueckgabe = _handScanner.Rueckgabe;
}
}
oder 2. den Übergabewert mit ins Event verpacken:
public class HandScanner
{
private void UeberwacheHandScanner()
{
if(rueckgabeAlterPing != rueckgabeNeuerPing)
{
OnChangeEvent(rueckgabeNeuerPing);
}
}
public delegate void EventDelegate(object value, EventArgs e);
public event EventDelegate ChangeEvent;
private void OnChangeEvent(object rueckgabe)
{
if(ChangeEvent != null)
{
ChangeEvent(rueckgabe, new EventArgs ());
}
}
}
public class VerarbeiteRueckgabe
{
public VerarbeiteRueckgabe()
{
_handScanner = new HandScanner;
_handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
}
private HandScanner _handScanner;
private void _handScanner_ChangeEvent(object value, EventArgs e)
{
object rueckgabe = value;
}
}
Ich habe den Code nicht getestet. Nur kurz runtergeschrieben. Wie gesagt, so würde ich es lösen, weiß allerdings nicht, welche der Beiden Methoden besser ist.
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
Hallo benji,
Du definierst in dem Beispielcode von Herbivore einen Delegaten mit dem Namen "MyHandler". Dieser Delegat definiert wie die aufzurufende Methode auszusehen hat (Methodenrumpf).
In Herbivore's Fall sind das 2 Strings. Du kannst hier aber definieren was Du möchtest. Wenn Du z.B. einen Bool-Wert übertragen willst (Ping war erfolgreich), dann definierst Du das folgendermaßen:
public delegate void MyHandler (bool p_PingSuccesfull);
Entsprechend muss dann natürlich die Event-Behandlungsmethode und auch die "OnXXX"-Methode angepasst werden.
Der Parameter wird dann über die "OnXXX"-Methode an folgender Stelle übergeben:
protected virtual void OnMyEvent (bool p_PingErfolgreich)
{
MyHandler myEvent = MyEvent;
if (myEvent != null) {
myEvent (p_PingErfolgreich); // hier werden alle Behandlungs-Methode aufgerufen
}
}
Hoffe, dass Parameter für eigene Events nun klarer geworden sind?
Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
hallo davidG,
in variante 1 ist beschrieben, wie amn es generell nicht machen sollte. hierfür sind evantargs (wie der name schon sagt) gut.
in variante 2 machst du es fast richtig aber:
hallo benji,
im prinzip kannst du ein event erstellen, das den sender (also aktuelle instanz der auslösenden klasse) und die von dir erstellten eventargs mitgibt. eventuell musst du von eventargs erben und noch ein zusätzliches feld/propertie definieren.
wie man es richtig macht ist auf golos styleguide beschrieben:
http://www.guidetocsharp.de/CodingStyleEvents.aspx
danke für die hinweise
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
Wow danke für die superschnellen Antworten!
Ich werde gleich mal alles ausprobieren...