I min klass vill jag skapa en egen event som triggas vid ett speciellt tillfälle. Jag skulle kunna skriva hur du skall gå till väga, men avstår. Istället tycker jag du skall läsa mer om ämnet. Läs om Delegates och Events i SDKn för .Net eller sök på nätet. För jag anser att det är viktigt att veta hur och varför och inte bara gör så här. I vanliga fall så letar jag runt på nätet och hittar de jag söker efter. MSDN är ett bra ställe där man ofta hittar de man söker efter. Men anledningen till att jag frågar här är att jag just vill veta hur man går till väga för att göra denna lilla sak då jag har ett programmerings projekt som ska vara klart närmaste dagarna och inte har många timmar per dag då jag kan sitta och programmera. Räknade med att tjäna lite tid genom att få hjälp av någon som vet men verkar väll som jag får ta tag i det och leta på egen hand. ok. Jag håller på att skapa ett othello spel som projekt och min tanke var att jag skulle kunna göra ett event som triggas när någon spelare vunnigt så att man i form klassen kan hantera vinst och förlust på ett enkelt sätt. Hej, Okej ... ska försöka förklara lite bättre. Jag har byggt ett program där spelet består av en egen klass. Så om jag ska skapa ett othello spel så skriver jag ungefär: ok, Eh, inte för att vara sådan.. Men hur sjutton skapar du ett event utan att använda delegates?? Oj. måste ha skrivit fel, menar delegates utan event... Skall ändra... din kod för att raisa eventet är helt fel och kommer att krasha om inget är assignat till handlern Roggan. Oj oj... tack så mycket... tror detta kan fixa sig nu... ska testa senare ikväll. Fick 1400 idéer nu från eran kod. Kan förbättra en hel del i min kod nu tror jag. Synd att projektet måste vara inne på söndag och att jag jobbar torsdag, fredag och flyttar på lördag/söndag :-/ nja.. men det är väl dumt att han vänjer sig vid att göra fel... det är väl bättre om han gör rätt från början.. Skall kolla. just nu är jag lite rund om fötterna, festar... DoRsal... Roggan..skapa en egen Event
alltså sen när jag använder min klass i mitt program så vill jag kunna skriva ungefär såhär:
<code>
game.onWin += new EventHandler(game_onWin);
private void game_onWin()
{
//...
}
</code>Sv: skapa en egen Event
Mvh JohanSv: skapa en egen Event
Jag vill skälvklart lära mig exakt hur det fungerar med events och sådant men när tiden börjar rinna iväg så väljer man ofta enklare vägar.Sv: skapa en egen Event
Men det finns ju olika sorters sätt att hantera Event. Antingne med Delegate eller delegates rakt av utan event. Sedan kan du bygga egna Eventergs om du vill skicka med egen data etc...
Så det är lite svårt att veta exakt vad du är ute efter. Beskriv exakt vad du vill göra så kan jag klistra in exempel och lite förklaring. Har mer tid nu på kvällen.
Mvh JohanSv: skapa en egen Event
Så det jag vill göra är att ha en kod ... typ
public void onWin()
{
//här kommer kod för att visa att man vunnigt.
}
Hoppas du förstår hur jag menar. Kanske du har något bättre förslag på hur man bör hantera vinst och förlust för othello. Problemet är alltså inte att ta reda på vem som vunnigt utan problemet är hur man ska göra för att överföra informationen till form klassen från själva spel klassenSv: skapa en egen Event
Du vill trigga ett event så fort någon vunnit? Är det flera spelare samtidigt? Vill du notifiera för samtliga att någon vunnit?
Förklara gärna lite mera för det låter som ett event ev inte är på sin plats utan att du är ute efter nått annat. Skall ut och lira lite frisbeegolf nu är tillbaka om någon timma. Kollar vad du skrivit då.
Mvh JohanSv: skapa en egen Event
Game game;
game = new Othello(GameType).
Allt som har med själva spelet att göra finns i egen klass (som i sin tur har underklasser osv). Som det är nu så tar även classen reda på när någon vunnigt eller förlorat. Jag vill nu trigga ett event så att man i form klassen kan utföra en viss kod för om någon vunnigt/förlorat.
Om någon vinner så triggas alltså en metod där jag har kod för vad som ska hända i formen när någon vunnigt, kanske ska man ha en messagebox som ska komma upp och visas eller något annat, detta vill jag inte ha i klassen eftersom det kan variera beroende på hur man lägger upp programmet.
Skulle kanske kunna göra en enkel property get/set och på så sätt ta reda på vem som vunnigt men tror nästan att ett event skulle se bättre ut.
Är svårt att förklara. Jag kan säkert lösa det på något sätt men att få en metod som körs när någon vinner hade varit praktiskt.Sv: skapa en egen Event
När du kör med event så har du ju något som lyssnar på eventet. Du måste alltså bygga upp en instans av något som sedan ligger och kollar om eventet triggas. Ex när du trycker på en knapp kör knappkontrollen ett event ditt form lyssnar av eventet och utför det du vill göra.
Det låter mer som du inte skall lyssna på ett event utan mer trigga en metod som gör något. Så vida det inte är någon annan klass som vill lyssa på en annan klass händelser.
Säg att du har PlayGround klass som i sin tur startar de olika spelen. Othello, fia med knuff etc... Alla spel ärver en Game klass med grundläggande events. Win, GameOver, Alert eller liknande.
Du startar spelet som du skriver ovan.
<code>
Game game = new Othello("John Doe");
</code>
<code>
public class Othello : Game
{...
public Othello(string player)
{
base.Name = "Othello";
base.Player = player;
}
public void Won()
{
base.Win();
}
...
}
public class Game
{
public void delegate WinHandler(object sender,GameEventArgs args);
public event OnWin WinHandler;
private string _name, _player;
public string Name
{
get{ return ( this._name ); }
set{ this._name = value; }
}
public string Palyer
{
get{..}
set{..}
}
public void Win()
{
GameEventArgs e = new GameEvetnArgs(Game.Name,Game.Player);
OnWin(this,e);
}
...
}
public class GameEventArgs : EvetnArgs
{
private string _name,_player;
public GameEventArgs(string name,string player)
{
this._name = name;
this._player = player;
}
public string Name
{
set{...}
get{...}
}
...
}
public class PlayGround
{
...
public void StartGame(.....)
{
Game game = new Othello("Johan Doe");
...
game.OnWin += new WinHandler(Win);
}
public void Win(Object sender,GameEventArgs e)
{
Console.WriteLine(e.Player + " Won the game: " + e.Name);
}
}
</code>
Typ nått sånt. Skrivet ur huvudet så jag kan inte garantera att det kommer funka rakt av.
Vad jag gör är att jag skapar ett GameEventArgs med Properties som talar om vad spelet heter vem som spelar. Sedan när någon har vunnit kommer PlayGround att köra dess egen Win metod som i sin tur skriver ut texten "Johan Doe Won the game: Othello"
Som du ser i StartGame metoden i PlayGround så lyssnar jag på Game eventet OnWin jag säger då till PlayGround att köra dess egen Win metod som tar emot sender (sändaren som i detta fall blir Game (Othello) sedan ett Eventargs med lite information. Sender kan lika gärna ha denna information om man tycker det är bättre.
När du i Othello inser att någon vunnit ropar du på Won() som i sin tur kommer att köra Win metoden som då kör OnWin eventet. (Som PlayGroudn lyssnar på.)
Hoppas jag fick till en någerlunda bra förklaring.
Om du bara skall ha ett Spel Othello och inte flera spel, behöver du inte ha ett event då kan Othello i sig bara trigga ett fönster i Won metoden.
Mvh JohanSv: skapa en egen Event
Delegates är ju grunden i all event-hanteringe i .NET.. Sv: skapa en egen Event
Tack!
Mvh JohanSv: skapa en egen Event
public class Game
{
public void delegate WinHandler(object sender,GameEventArgs args);
public event WinHandler Win; //<--Eventet heter WIN
protected virtual void OnWin(WinEventArgs e) //<- OnWin ska vara metoden som raisar eventet
{
if (Win != null) //<-- kolla så det finns någon som lyssnar på eventet
Win (this,e);
}
private string _name, _player;
public string Name
{
get{ return ( this._name ); }
set{ this._name = value; }
}
public string Palyer
{
get{..}
set{..}
}
public void Win()
{
GameEventArgs e = new GameEvetnArgs(Game.Name,Game.Player);
OnWin(e);
}
...
}
Sv: skapa en egen Event
Det enda fel jag egentligen gjorde i koden var att jag glömde if(OnWin != null)
samt att jag la delegatet i en klass och inte ute i namespacet samt bytte plats på
OnWin och WinHandler.
Så jag fattar inte varför du gör det mer komplicerat?
<code>
public event WinHandler Win; //<--Eventet heter WIN
protected virtual void OnWin(WinEventArgs e) //<- OnWin ska vara metoden som raisar eventet
{
if (Win != null) //<-- kolla så det finns någon som lyssnar på eventet
Win (this,e);
}
</code>
varför byta namn? Var ange ett namn på ett event med samma som en metod?
Eventet notation är oftast i regel On<något> för att lättare förklare när nått sker.
OnClick, OnMove, OnItemBound etc...
Namngivelse är ju smaksak dock.
Fungerande kod:
<code>
using System;
namespace ConsoleApplication2
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
PlayGround o = new PlayGround();
o.StartGame();
}
}
public class Othello : Game
{
public Othello(string player)
{
base.Name = "Othello";
}
public void Won()
{
base.Win();
}
}
public delegate void WinHandler(object sender,GameEventArgs args);
public class Game
{
public event WinHandler OnWin;
private string _name, _player;
public string Name
{
get{ return ( this._name ); }
set{ this._name = value; }
}
public string Player
{
get{return("test");}
}
public void Win()
{
GameEventArgs e = new GameEventArgs(this.Name,this.Player);
if(OnWin != null)
OnWin(this,e);
}
}
public class GameEventArgs : EventArgs
{
private string _name,_player;
public GameEventArgs(string name,string player)
{
this._name = name;
this._player = player;
}
public string Name
{
get{return ( this._name );}
}
public string Player
{
get{return ( this._player );}
}
}
public class PlayGround
{
public void StartGame()
{
Game game = new Othello("Johan Doe");
game.OnWin += new WinHandler(Win);
game.Win();
}
public void Win(Object sender,GameEventArgs e)
{
Console.WriteLine(e.Player + " Won the game: " + e.Name);
}
}
}
</code>Sv: skapa en egen Event
Sv: skapa en egen Event
det du säger nu bryter ju mot alla naming conventions som finns...
ge mig en enda kontroll i .net som raisar ett event utåt som heter något med "On"
dom exempel du drog finns ju inte.
det är ju dessutom en designregel för events... overridar man "OnXXX" i en subklass så kan man lägga kod som exekveras _före_ eller _efter_ att eventet raisats till klienten.
säg att ett event dessutom kan raisas från flera platser .. tex "Win" kanske raisas från flera ställen i koden pga vissa kriterier , i ditt fall skulle det vara omöjligt för en subklass att manipulera parametrarna i GameEventArgs eller förhindra att eventet raisas alls eftersom eventdelegaten anropas direkt från logiken på något ställe som den ärvande utvecklaren inte känner till.
om vi tänker oss att vi har en subklass där wineventet inte ska raisas om score är < 1000
så kan man med en korrekt modell göra följande och veta att det är det enda stället man behöver ändra:protected override OnWin (GameEventArgs e)
{
if (e.Score < 1000)
return; // i det ärvda spelet vinner man inte om inte score är >= 1000
base.OnWin(e); //låt basen raisa eventet
}
i ditt fall så har man inga garantier att man prickat alla ställen som raisar win eventet , dessutom måste du overrida metoder som inte har med ovanstående regel att göra.
säg att du av någon anledning raisar ditt "win" event från onmousedown
så blir den ärvande utvecklaren tvungen att overrida "onmousedown" för att ändra när wineventet ska raisas.
det må vara 2 rader mer kod , men det är inte för inte som hela .net är uppbyggd på det sättet.
//Roger
[edit]
efter att kollat din nya kod så har du ju tom en metod som heter "Win" som gör precis samma sak som en "Onxxx" ska göra..
så du har ju inte gjort det mindre komplext eller mindre kod..
det enda du gjort är ju att byta namn på dom.
eventet heter "OnWin" och metoden som raisar heter "Win" .. precis tvärt om mot hur .net klasserna är gjorda.
[/edit]
DoRsal , du kan även läsa denna
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkeventstutorial.asp
Sv: skapa en egen Event
Jag skrev koden rakt av utan att kolla på något. Men har för mig jag tänkte rätt...
Jag tackar för dina ord och skall ta och granska din text imorgon.
Tack! Alltid kul med feedback... Det är inte allid man har koll på allt :-)
Take care Roggan... Adda mig gärna på messenger om du har.
johan.normen@home.se
Mvh johanSv: skapa en egen Event
Tack! alltid kul när man kan föra kunskaper eller idéer vidare. Nu är jag inte bäst på Events och delegates då jag använder det sällan i mina web applikationer. Men Roggan skrev något jag skall ta en titt på. Återkommer med mera kommentarer ang hans inlägg imorgon.
Mvh JohanSv: skapa en egen Event
Hum... Det är jag som tänkt fel, ber om ursäkt. Blandade ihop naming från html attributen där du signar eventmetoderna med OnClick för en Button, men Click i CodeBehind. Efter 4 veckors semester har ju huvuet satt sig i en liten vila som du vet kan resultera i memmory loss ;-)
Måste friska upp mitt minne med Events känner jag.
Mvh Johan