ERLEDIGT
JA
JA
ANTWORTEN
10
10
ZUGRIFFE
19688
19688
EMPFEHLEN
-
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?................
iKloetzchen wurde released ;-D *freu*
-
27.05.06 16:53 #2
- 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:
Diese Delegates sind so etwas wie Zeiger auf Methoden (in einer Klasse verpackt)Geändert von yan1 (27.05.06 um 17:03 Uhr)
-
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?................
iKloetzchen wurde released ;-D *freu*
-
27.05.06 18:16 #4
- 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.
-
Ah - das wars - der Delegat musste nur auf public gesetzt werden ...
................
iKloetzchen wurde released ;-D *freu*
-
27.05.06 18:39 #6
- Registriert seit
- Feb 2005
- Ort
- Kirchdorf a. d. Krems, OÖ
- Beiträge
- 213
ja genau...
-
27.05.06 18:41 #7
- 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;
-
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 ...
................
iKloetzchen wurde released ;-D *freu*
-
27.05.06 19:05 #9
- 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.
-
27.05.06 19:08 #10
- 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;
-
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
................
iKloetzchen wurde released ;-D *freu*
Ähnliche Themen
-
Eigenes Layout in SWT erstellen?
Von lam_tr im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 11.03.10, 09:05 -
eigenes Setup erstellen
Von Erks im Forum .NET CaféAntworten: 4Letzter Beitrag: 09.05.09, 01:21 -
[eclipse] Eigenes Event feuern?
Von Vatar im Forum JavaAntworten: 5Letzter Beitrag: 27.05.07, 12:51 -
eigenes Event
Von skoWWi im Forum JavaAntworten: 3Letzter Beitrag: 16.06.05, 19:29 -
Wie mache ich ein eigenes Event mit eigenem Listener?
Von GoldKaetzchen im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 8Letzter Beitrag: 21.05.05, 15:00





Zitieren
Login





