Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# Ereignisse in C# (https://www.delphipraxis.net/63919-ereignisse-c.html)

Luckie 24. Feb 2006 15:34


Ereignisse in C#
 
Ich habe es jetzt geschaft in C# eine Klasse zu schreiben die in einer Methode ein Ereignis auslöst. Und ich habe es geschaft auf dieses Ereignis zu reagieren.

Die Klasse mit dem Ereignis:
Code:
    class DemoCls
    {
        public delegate void OnCountDelegate(int number);
               
        public event OnCountDelegate OnCount;
       
        public void Count(int from, int to)
        {
            for (int i = from; i < to; i++)
                OnCount(i);
        }
    }
Der Code, in dem die Klasse genutzt wird:
Code:
private void MyOnCount(int number)
        {
            listBox1.Items.Add(number.ToString());
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            DemoCls demo = new DemoCls();
            demo.OnCount += new DemoCls.OnCountDelegate(MyOnCount);
            demo.Count(1, 100);
        }
Das funktioniert wunderbar so wie es soll. Aber kann mir mal bitte jemand sagen, was ich da eigentlich genau mache?

phXql 24. Feb 2006 15:57

Re: Ereignisse in C#
 
Code:
public delegate void OnCountDelegate(int number);
definiert einen Typensicheren Methodenzeiger...

Code:
public event OnCountDelegate OnCount;
definiert das eigentliche Event in der Klasse, das ist wie eine Property, nur eben als event (:D)

Code:
for (int i = from; i < to; i++)
   OnCount(i);
ruft das Event OnCount auf. (du solltest noch abfragen, ob OnCount != null und erst dann aufrufen)

mit
Code:
demo.OnCount += new DemoCls.OnCountDelegate(MyOnCount);
weist du dem OnCount-Event eine neue Methode zu, die dann aufgerufen werden soll. dieses doofe
Code:
new DemoCls.OnCountDelegate
brauch man, damit C# merkt, dass man die methode in einen delegaten (sicheren methodenzeiger) wandeln will...

Luckie 24. Feb 2006 16:01

Re: Ereignisse in C#
 
Aha, da wird doch schon einiges klarer.

Könnte man auch ohne den Delegaten auskommen oder ist der ein MUSS unter C#?

Zitat:

du solltest noch abfragen, ob OnCount != null und erst dann aufrufen
:mrgreen:
Habe ich schon gemacht, nach dem es einmal gekracht hat, als ich die Zuweisung zu einer Methode mal auskommentiert hatte. :mrgreen:

Elvis 24. Feb 2006 16:49

Re: Ereignisse in C#
 
Zitat:

Zitat von Luckie
Könnte man auch ohne den Delegaten auskommen oder ist der ein MUSS unter C#?

Wie in Delphi auch: brauchst du etwas, dass eine Referenz auf die Methoden halten kann, die du dem Event zuweisen willst.
Reichen dir die bestehenden delegate Typen bist du doch fein raus. Wenn nicht ist es nun wirklich kein Problem einen anzulegen. ;)

@phXql
Du vertauschst die Benennung der einzelnen Dingsens. Sieht eher nach dem alten Delphi-Standard aus...
OnXXX wird höchstens die Methode benannt, die du intern benutzt um den Event zu feuern...

Um deinen Bleistift mal in eine Form zu bringen, die in .Net üblich ist:

Code:
public delegate void CountEventHandler(object sender, int items);
Code:
class DemoCls
{
  public event CountEventHandler Count;

  protected virtual OnCount(int items)
  {
    if(Count != null)
      Count(this, items);
  }

Luckie 24. Feb 2006 17:09

Re: Ereignisse in C#
 
Zitat:

Zitat von Elvis
@phXql
Du vertauschst die Benennung der einzelnen Dingsens. Sieht eher nach dem alten Delphi-Standard aus...
OnXXX wird höchstens die Methode benannt, die du intern benutzt um den Event zu feuern...

Da vertauscht du aber was. Nämlich phXql mit mir. :mrgreen:

Nun ja, natürlcih sieht das nach Delphi aus, rat mal, was ich die letzen 4 Jahre gemacht habe? ;)

Phoenix 24. Feb 2006 20:10

Re: Ereignisse in C#
 
Aso Luckie.. worüber ich am Anfang immer gestolpert bin, weil das bei Delphi arg unüblich ist: Du kannst einem Event mehrere Routinen zuweisen (deswegen += ).

Luckie 24. Feb 2006 20:16

Re: Ereignisse in C#
 
Jupp, das kam mir auch komisch vor. ;)

phXql 25. Feb 2006 12:43

Re: Ereignisse in C#
 
Zitat:

Zitat von Phoenix
Aso Luckie.. worüber ich am Anfang immer gestolpert bin, weil das bei Delphi arg unüblich ist: Du kannst einem Event mehrere Routinen zuweisen (deswegen += ).

Nur wenns ein Multicast-Event ist.. Allerdings gibts SingleCast-Events gar nicht mehr in .NET 1.1 / 2.0

Elvis 25. Feb 2006 13:18

Re: Ereignisse in C#
 
Zitat:

Zitat von phXql
Nur wenns ein Multicast-Event ist.. Allerdings gibts SingleCast-Events gar nicht mehr in .NET 1.1 / 2.0

Aus gutem Grund: einen schnöden Funktionszeiger würde der nächste, der benachrichtigt werden will einfach überschreiben...

Da das eine ziemlich nervige Geschichte ist, sollte man sich in Delphi32 genau überlegen, ob man wirklich einen "Event" in seine Klasse packen will oder schreibintensivere Lösungen nicht sicherer sind.

Christian S. 25. Feb 2006 13:42

Re: Ereignisse in C#
 
Finde, MutliCast-Events sind eine sehr schöne Sache. Schreibe gerade eine Anwendung, die auch Plugins unterstützen soll. Bei MultiCast-Events kann sich jedes Plugin einfach auch noch "in die Liste eintragen", wenn es auf ein Ereignis reagieren will :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz