[C#] Problém s eventy – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

[C#] Problém s eventy – .NET – Fórum – Programujte.com[C#] Problém s eventy – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
RiZe0
Newbie
13. 11. 2008   #1
-
0
-

Programuji si knihovnu pro aplikaci. Mám v ní uložené interface tříd, které aplikace obsahuje, tj. hlavně interface pro Controller. Ve třídě Controller jsou tři eventy (jejichž delegáti jsou deklarováni v knihovně) a metody, kterým předávám argumenty eventů. Bez problému eventy přiřadím, ale při jejich použití už nastává chyba. Více snad poví kód. Předem děkuji za každou radu.

Soubor s interface Controlleru v knihovně



/// <summary>
/// Argumenty eventu
/// </summary>
public class MessageEventArgs : EventArgs
{
...
}

/// <summary>
/// Argumenty eventu
/// </summary>
public class SystemMessageEventArgs : EventArgs
{
...
}

/// <summary>
/// Argumenty eventu
/// </summary>
public class ContactListEventArgs : EventArgs
{
...
}

/// <summary>
/// Delegát pro zpracování klientských zpráv
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void MessageTo(Object sender, MessageEventArgs args);

/// <summary>
/// Delegát pro event systémové zprávy
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void SystemMessageTo(Object sender, SystemMessageEventArgs args);

/// <summary>
/// Delegát event ContactListu
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public delegate void ContactListTo(Object sender, ContactListEventArgs args);

/// <summary>
/// Controller pro klientskou aplikaci
/// </summary>
public interface IClientController
{
/// <summary>
/// Eventhandler na okno zpráv
/// </summary>
event MessageTo MessageRedirect;

/// <summary>
/// Eventhandler pro systémové zprávy
/// </summary>
event SystemMessageTo SystemMessageRedirect;

/// <summary>
/// Eventhandler pro kontakt list
/// </summary>
event ContactListTo ContactListRedirect;

/// <summary>
/// Metoda vrací instanci třídy Server pro komunikaci se serverem
/// </summary>
IServer Server { get; }

/// <summary>
/// Metoda pro handlování příchozí systémové zprávy, kterou zaslal
/// server.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void SystemMessageHandler(Object sender, SystemMessageEventArgs args);

/// <summary>
/// Metoda pro handlování příchozích zpráv od serveru, které zaslal
/// nějaký klient.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void MessageHandler(Object sender, MessageEventArgs args);

/// <summary>
/// Metoda pro handlování contact listu
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void ContactListHandler(Object sender, ContactListEventArgs args);
}


Další soubor knihovny



public class ClientLoginStatus : IPacketReadable
{
private IClientController Controller;

public ClientLoginStatus(..., IClientController controller)
{
...
this.Controller = controller;
}

public void Run()
{
...
Controller.ContactListRedirect += new ContactListTo(Controller.ContactListHandler);
Controller.MessageRedirect += new MessageTo(Controller.MessageHandler);
Controller.SystemMessageRedirect += new SystemMessageTo(Controller.SystemMessageHandler);
}
}
}


A nyní chybka v nemožnosti použít event v třídě podobné výše zmiňované, která je taktéž v knihovně. Chyba je: The event '...IClientController.SystemMessageRedirect' can only appear on the left hand side of += or -=



public class ClientSystemMessage : IPacketReadable
{
private String Data;
private IClientController Controller;

public ClientSystemMessage(..., IClientController controller)
{
...
this.Controller = controller;
}

public void Run()
{
...
SystemMessageEventArgs Arguments = new SystemMessageEventArgs(Data);
Controller.SystemMessageRedirect(this, Arguments); // Zde chyba
}
}

Nahlásit jako SPAM
IP: 85.207.186.–
Reklama
Reklama
czbero0
Stálý člen
13. 11. 2008   #2
-
0
-

No nejsem si jistý, ale myslím si, že chyba je ve vyvolání události mimo její třídu.

Nahlásit jako SPAM
IP: 62.240.178.–
http://moddb.com/mods/police-brutality/
RiZe0
Newbie
13. 11. 2008   #3
-
0
-

Zabrousil jsem ještě po internetu a našel jsem citát: "Invoking an event can only be done from within the class that declared the event", takže to vypadá, že máš pravdu. Trošku divné omezení ale budiž, trošku to překopu.

Nahlásit jako SPAM
IP: 85.207.186.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 68 hostů

Podobná vlákna

Java fx - Eventy — založil me.name

Problem s VS C# — založil Mrakoplas

Problem s &lt; a &gt; — založil 7raul

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý