Eigenes Event erstellen

Divi

Erfahrenes Mitglied
Hi Leute
Ich würde gerne meinem Server beibringen auf OnConnect etwas auszuführen ... aber was auszuführen ist, dass soll der Benutzer meiner Komponente selber entscheiden können. Dafür würde ich dem Benutzer gerne ein Event zur Verfügung stellen - aber ich finde hier immer nur Erweiterungen von OnClick, OnClose oder ganz weltfremde Sachen - nur ein EINFACHES EVENT wird nirgendwo sauber erklärt ... Ich möchte einfach, dass jemand, der meine DLL einbindet sagen kann "OnConnect - tu das", wobei ihm mein Server mitteilt, wann es soweit ist.
Hat dafür jemand ein Codebeispiel?
 
Das ist nicht schwer.
Hierfür gibt es die Delegates in C#.

du musst in deinem C# Programm festlegen, wie die Funktion ausschauen soll, die der Benutzer dann aufgerufen haben will, das geht so:

delegate OnServerConnectedHandler(object deineParams,..);

ein kleines Beispiel:

C#:
class MyClient
{
    public MyClient()
    {
        this.connect();
    }
 
    private void connect()
    {
        //hier wird mit dem Server connected
        //dann musst du sagen, dass jetzt das Event ausgelöst werden soll
        if (this.Event_OnServerConnnected != null) //ist ein EventHandler zugewiesen?
        {
            this.Event_OnServerConnnected.Invoke(); //mit diesem Befehl wird sein festgelegter
            //Handler aufgerufen
            //im Normalfall macht man hierfür einen neuen Thread auf, muss aber nicht sein
        }
        else {} //sonst einfach irgnieren
    }
    
    //auf diese Variable kann er dann seine Funktion zuweisen, die aufgerufen werden soll
    public OnServerConnectedHandler Event_OnServerConnnected;
}
 
//festlegen wie die Funktion ausschaut, die das Event abruft
delegate void OnServerConnectedHandler();


der Benutzer, der dann deine Klassen verwendet, muss dann lediglich dies machen:
C#:
static void Main()
{
  MyClient client = new MyClient();
  client.Event_OnServerConnnected += new OnServerConnectedHandler(OnServerConnected);
}
static void OnServerConnected()
{
  //das hier wird ausgeführt, wenn der Client zum Server gerade connected ist
}

Diese Delegates sind so etwas wie Zeiger auf Methoden (in einer Klasse verpackt)
 
Zuletzt bearbeitet:
Hörte sich sehr gut an und hab ich ohne zögern eingebaut ... Ich hab ganz oben den Delegaten erstellt und in der Zeile darauf das Event. Aber der sagt mir bereits in der zweiten Zeile, dass es ein "Inkonsistenter Datenzugriff ist", da "Feldtyp [HandlerName] ist weniger zugreifbar als das Feld [EventName]"...
Hast du ne Idee, was das bedeuten könnte?
 
Das heisst, dass auf eine der beiden Variablen nicht zugegriffen werden kann, da die eine public ist und die eine private, also, es hat auf jeden fall etwas mit public, private und protected und so zeug zu tun, wie es konkret in deinem beispiel ausschaut weiss ich jetzt nicht, da müsstest du mir das Beispiel hier reinschreiben.

Aber im Notfall kannst du mal alles auf Public setzen, dann geht es auch... Nur ist das nicht sauber.
 
achja, in C# gibt es noch Extra ein Schlüsselwort für Events, ich weiss zwar nicht was das bringt, ausser, dass es dann ein Blitz ist, wenn man es im Editor eintippt..

das würde halt dann so gehen

public event MyEventHandler OnServerConnected;
 
Schade - weder mit noch ohne dem Schlüsselwort "event" reagiert der ... ich hab deinen Vorgang genau so eingebaut ... und es taucht auch kein Fehler auf ... Eingebaut hab ich das mit dem Invoke direkt unter dem TCPListener.AcceptSocket() aus den üblichen Beispielen, aber trotz keiner Fehlermeldung passiert einfach nichts ...
 
hm.... Wenn du das Invoke direkt unter dem Listenter.AcceptSocket eigebaut hast, MUSS es aufgerufen werden, sobald sich wer dranhängt an deinen PC, und richtigen Port...

Es gibt also nur 2 Möglichkeiten warum nichts geschieht: Du hast das Vergessen:

C#:
client.Event_OnServerConnnected += new OnServerConnectedHandler(OnServerConnected);
//und in der Methode OnServerConnected muss natürlich auch was drinnen stehen *g*

Oder dein TcpListener funktioniert noch nicht
Versuchs mal zum Debuggen und schau, ob das Programm überhaupt bis zum Invoke schafft.
 
Es kann auch sein, dass diese Zeile:

client.Event_OnServerConnnected += new OnServerConnectedHandler(OnServerConnected);

so ausschauen muss (glaube ich aber nicht):

client.Event_OnServerConnnected += OnServerConnected;
 

Neue Beiträge

Zurück