Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


skapa en egen Event

Postades av 2004-08-09 20:49:02 - Jesper Brännström, i forum c# (c-sharp), Tråden har 16 Kommentarer och lästs av 1379 personer

I min klass vill jag skapa en egen event som triggas vid ett speciellt tillfälle.

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>




Svara

Sv: skapa en egen Event

Postades av 2004-08-10 09:39:57 - Johan Normén

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.

Mvh Johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-10 16:34:07 - Jesper Brännström

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.

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.


Svara

Sv: skapa en egen Event

Postades av 2004-08-10 17:27:36 - Johan Normén

ok.
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 Johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-10 17:58:40 - Jesper Brännström

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.

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 klassen


Svara

Sv: skapa en egen Event

Postades av 2004-08-10 18:55:48 - Johan Normén

Hej,

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 Johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-10 19:32:48 - Jesper Brännström

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:

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.


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 08:12:47 - Johan Normén

ok,

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 Johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 13:05:26 - Patrik Löwendahl

Eh, inte för att vara sådan.. Men hur sjutton skapar du ett event utan att använda delegates??

Delegates är ju grunden i all event-hanteringe i .NET..


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 13:15:36 - Johan Normén

Oj. måste ha skrivit fel, menar delegates utan event... Skall ändra...
Tack!

Mvh Johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 16:45:21 - Roger Alsing

din kod för att raisa eventet är helt fel och kommer att krasha om inget är assignat till handlern

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);
     }
     ...
}


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 18:46:18 - Johan Normén

Roggan.

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>


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 20:10:51 - Jesper Brännström

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 :-/


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 20:43:17 - Roger Alsing

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..

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


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 21:12:00 - Johan Normén

Skall kolla. just nu är jag lite rund om fötterna, festar...
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 johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-11 21:13:32 - Johan Normén

DoRsal...

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 Johan


Svara

Sv: skapa en egen Event

Postades av 2004-08-12 08:06:15 - Johan Normén

Roggan..

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


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
931
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies