tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
19688
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    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?
     

  2. #2
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    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:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    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:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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)
    Geändert von yan1 (27.05.06 um 17:03 Uhr)
     

  3. #3
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    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?
     

  4. #4
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    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.
     

  5. #5
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    Ah - das wars - der Delegat musste nur auf public gesetzt werden ...
     

  6. #6
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    ja genau...
     

  7. #7
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    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;
     

  8. #8
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    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 ...
     

  9. #9
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    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:

    Code csharp:
    1
    2
    
    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.
     

  10. #10
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    Es kann auch sein, dass diese Zeile:

    client.Event_OnServerConnnected += new OnServerConnectedHandler(OnServerConnected);

    so ausschauen muss (glaube ich aber nicht):

    client.Event_OnServerConnnected += OnServerConnected;
     

  11. #11
    Avatar von Divi
    Divi Divi ist offline Mitglied Gold
    Registriert seit
    Aug 2004
    Beiträge
    238
    Danke - ich habs weiter hoch geschoben im Code und fand raus, dass deine Code 1A funktioniert ... einziges Problem war, dass ich den Code als Komponente geschrieben habe und direkt auf die verwendete Komponente statt auf das neu erstellte Objekt zugreifen musste. ... Dennoch haste ne PM
     

Ähnliche Themen

  1. Eigenes Layout in SWT erstellen?
    Von lam_tr im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 11.03.10, 09:05
  2. eigenes Setup erstellen
    Von Erks im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 09.05.09, 01:21
  3. [eclipse] Eigenes Event feuern?
    Von Vatar im Forum Java
    Antworten: 5
    Letzter Beitrag: 27.05.07, 12:51
  4. eigenes Event
    Von skoWWi im Forum Java
    Antworten: 3
    Letzter Beitrag: 16.06.05, 19:29
  5. Wie mache ich ein eigenes Event mit eigenem Listener?
    Von GoldKaetzchen im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 8
    Letzter Beitrag: 21.05.05, 15:00