AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dieses Delphi-Event in C#?

Ein Thema von Pseudemys Nelsoni · begonnen am 4. Aug 2006 · letzter Beitrag vom 8. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Dieses Delphi-Event in C#?

  Alt 4. Aug 2006, 08:50
Moin,

mal abgesehen davon, dass ich nicht verstehe was delegaten in C# sind, bzw was sie mit Events zu tun haben, geb ich hier einfach mal ein Code-Beispiel von Delphi, dass ich gerne in C# hätte:

Delphi-Quellcode:
TMyMethodPointer = procedure(Int, Int2: Integer);

TMyClass = class(TComponent)
private
  FMyMethodPointer: TMyMethodPointer;
  procedure SomeProc;
published
  property MyEvent: FMyMethodPointer;
end;

...

procedure TMyClass.SomeProc;
begin
  if not (FMyMethodPointer = nil) then
    FMyMethodPointer(2, 5);
end;

Ich möchte also ein Event für mein C# Control haben, dass 2 Integers mit übergibt. Jemand ne Ahnung, wie ich genau DAS Beispiel hier in C# hinbekomme?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Dieses Delphi-Event in C#?

  Alt 4. Aug 2006, 09:25
Zitat von Pseudemys Nelsoni:
mal abgesehen davon, dass ich nicht verstehe was delegaten in C# sind, bzw was sie mit Events zu tun haben, [...]
Na dann würde ich an deiner Stelle unbedingt mal "delegates" im Suchindex des SDKs eingeben.

Code:
.
   public delegate void DoSomethingDelegate(int i1, int i2);
   // oder auch (Object sender, DoSomethingEventArgs e)
    // wäre für Komponenten konformer, aber mehr Schreibaufwand ;)

   public class Foo
   {
      public void Bar()
      {
         OnSomethingHappened(2, 5);
      }

      protected virtual void OnSomethingHappened(int i1, int i2)
      {
         if (SomethingHappened != null)
            SomethingHappened(i1, i2);
      }

      public event DoSomethingDelegate SomethingHappened;
   }
[edit=Phoenix]Code-Tags von C in C# geändert. Bitte auf richtige Sprache achten Mfg, Phoenix[/edit]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.607 Beiträge
 
#3

Re: Dieses Delphi-Event in C#?

  Alt 4. Aug 2006, 09:36
Code:
public delegate void MyEventDelegate(Int32 int1, Int32 int2);

public class TMyClass : Object
{
    public event MyEventDelegate MyEvent;

    private void SomeProc()
    {
        MyEvent(2, 5);
    }
}

public class Subscriber : Object
{
    public TMyClass myclass;

    public Subscriber()
    {
        myclass = new TMyClass();
        myclass.MyEvent += new MyEventDelegate(onEvent);
    }

    private void onEvent(Int32 a, Int32 b)
    {
        Int32 c = a + b;
    }
}

Und noch ein Edit: Nachtrag: http://www.codeproject.com/csharp/eventdrivenmodel.asp
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Dieses Delphi-Event in C#?

  Alt 4. Aug 2006, 10:10
Hallo,
Zitat von Pseudemys Nelsoni:
mal abgesehen davon, dass ich nicht verstehe was delegaten in C# sind, bzw was sie mit Events zu tun haben, geb ich hier einfach mal ein Code-Beispiel von Delphi, dass ich gerne in C# hätte: ...
Das Problem hatte ich auch (ich bin ebenfalls von Delphi 5 auf Delphi 2005 und jetzt auf C# umgestiegen). Du musst Dich in der Tat dringend mit Delegates beschäftigen, weil sie auch anstelle der Methoden-Pointer von Delphi verwendet werden.

Mir hat dabei folgende Lektüre geholfen:
Zitat:
Walter Doberenz, Thomas Gewinnus: Borland Delphi 2005 - Grundlagen, Profiwissen, Kochbuch. Hanser-Verlag 2005, ISBN 3-446-40202-0
Dieses Kochbuch hat m.E. eine erheblich bessere Qualität als die vorherigen Ausgaben und bezieht sich auf NET-Entwicklung mit Delphi. Kapitel 14.1 "Das Microsoft Event Pattern" erläutert den Zusammenhang zwischen Delegates und Events.

Zitat von Khabarakh:
Na dann würde ich an deiner Stelle unbedingt mal "delegates" im Suchindex des SDKs eingeben.
Naja, das SDK hilft für die Praxis gerade dann oft wenig, wenn man grundlegende Erläuterungen sucht.

Zu den vorgeschlagenen Codes: Diese sind im Prinzip OK, entsprechen aber nicht den MS-Vorschlägen, nach denen Delegates immer mit EventArgs verbunden werden sollen:

Zitat von Khabarakh:
Code:
public delegate void DoSomethingDelegate(int i1, int i2);
   // oder auch (Object sender, DoSomethingEventArgs e)
    // wäre für Komponenten konformer, aber mehr Schreibaufwand ;)
Arbeitsanleitung
Aus Doberenz/Gewinnus (Kochbuch Delphi 2005), einem C#-Lehrbuch und NET-Doku habe ich ein
Verfahren zusammengestellt, das ich als Anlage beigefügt habe.

Viel Erfolg! Jürgen
Angehängte Dateien
Dateityp: txt anleitung_delegates_375.txt (3,5 KB, 20x aufgerufen)
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Dieses Delphi-Event in C#?

  Alt 4. Aug 2006, 13:37
Danke Leute, )). Gleich mal schauen.
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Dieses Delphi-Event in C#?

  Alt 4. Aug 2006, 14:19
Zitat von Jürgen Thomas:
Zitat von Khabarakh:
Na dann würde ich an deiner Stelle unbedingt mal "delegates" im Suchindex des SDKs eingeben.
Naja, das SDK hilft für die Praxis gerade dann oft wenig, wenn man grundlegende Erläuterungen sucht.
Ich glaube du verwechselst das SDK gerade mit der Delphihilfe . Die Kapitel über Delegates und Events sind geradezu sagenhaft ausführlich und lassen wirklich keine Wünsche mehr offen.

Zitat:
Zu den vorgeschlagenen Codes: Diese sind im Prinzip OK, entsprechen aber nicht den MS-Vorschlägen, nach denen Delegates immer mit EventArgs verbunden werden sollen:
Bei Events.
Zitat:
Aus Doberenz/Gewinnus (Kochbuch Delphi 2005), einem C#-Lehrbuch und NET-Doku habe ich ein
Verfahren zusammengestellt, das ich als Anlage beigefügt habe.
Schöne Zusammenfassung (für weitere Informationen gibt es ja immer noch das .Net-SDK), nur ein paar Kleinigkeiten/Anmerkungen:
  • Schritt 1:
    • Mit System.EventHandler<TEventArgs> kann man sich das Leben noch ein wenig leichter machen.
    • Code:
      //  Achtung: u.U. sind alle Typen als Klassen zu deklarieren;
              //  aber überall, wo ich es bisher gemacht habe, klappt die implizite Typwandlung
    • Typen-Präfixe ("bCancel") sind unüblich, Konstruktorargumente fangen wie Variablen mit einem Kleinbuchstaben an.
  • Schritt 2 kann man sich sparen, indem man SharpDevelop und Alt + Einfg benutzt .
  • Schritt 3 und 4 können seit 2.0 durch anonyme Methoden ersetzt werden (zusätzlich ist nun das "new XYEventHandler(..." optional), außerdem wird einem hier viel Schreibaufwand durch die IDE abgenommen (#d: automatische Deklaration anonymer Methoden, VS: automatische Deklaration benannter Methoden).
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#7

Re: Dieses Delphi-Event in C#?

  Alt 7. Aug 2006, 09:24
Moin,

ich hab jetzt etliche Tutorials gelesen etc und auch versucht diese Beispiele hier nachzuvollziehen, aber ich verstehe das mit den delegates nicht.

u.a das hier:

Zitat:
myclass.MyEvent += new MyEventDelegate(onEvent);
An sowas kann ich mich bei Delphi nicht erinnern.

Könnte mir jemand mein Beispiel:

Delphi-Quellcode:
TMyMethodPointer = procedure(Int, Int2: Integer);

TMyClass = class(TComponent)
private
  FMyMethodPointer: TMyMethodPointer;
  procedure SomeProc;
published
  property MyEvent: FMyMethodPointer;
end;

...

procedure TMyClass.SomeProc;
begin
  if not (FMyMethodPointer = nil) then
    FMyMethodPointer(2, 5);
end;
In C# umschreiben, mit gleichen Namen der Klasse/Prozedur usw?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Dieses Delphi-Event in C#?

  Alt 7. Aug 2006, 11:55
Der Unterschied zwischen Delphi und C#, also das, was dich verwirrt, dürfte wohl sein, dass Eriegnisse in Delphi technisch gesehen nur Methodenzeiger sind, also Zeiger auf eine Methode.

In C# sind Events eigene Sprachfeatures und deswegen als Multicast eingeführt, d.h. du weißt nicht eine Methode dem Event zu wie in Delphi, sondern mehrere.

Deswegen verwendest du den Operator += und nicht den einfachen Zuweisungsoperator, wie du es in Delphi machen würdest.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.607 Beiträge
 
#9

Re: Dieses Delphi-Event in C#?

  Alt 7. Aug 2006, 12:11
Ein klein wenig Offtopic: So einen Multicast kann man sich in Delphi recht easy nachbauen:

Delphi-Quellcode:
private
      m_events: array of TNotifyEvent;
public
      procedure RegisterEvent(event: TNotifyEvent);
      procedure UnregisterEvent(Subscriber: TObject);

...

////////////////////////////////////////////////////////////////////////////////
// register event to distributor
////////////////////////////////////////////////////////////////////////////////

procedure TFrmEventTest.RegisterEvent(Event: TNotifyEvent);
begin
   SetLength( m_events, Length(m_events) + 1 );
   m_events[ Length(m_events) - 1 ] := Event;
end;

////////////////////////////////////////////////////////////////////////////////
// unregister event from distributor
////////////////////////////////////////////////////////////////////////////////

procedure TFrmEventTest.UnregisterEvent(Subscriber: TObject);
var
   i: integer;
begin
   for i := 0 to Length(m_events) - 1 do
   begin
      if TMethod(m_events[i]).Data = Subscriber then
      begin
         m_events[i] := m_events[Length(m_events) - 1];
         SetLength(m_events, Length(m_events) - 1);
      end;
   end;
end;


////////////////////////////////////////////////////////////////////////////////
// distribute the event
////////////////////////////////////////////////////////////////////////////////

procedure TFrmEventTest.btnEventClick(Sender: TObject);
var
   i: integer;
begin
   for i := 0 to Length(m_events) - 1 do
      m_events[i](Sender);
end;
Man beachte dass ein Objekt mehrere Events registrieren kann und dann auch mehrfach benachrichtigt wird. Ein unregister hebt nur die erste Registrierung wieder auf, die anderen bleiben unberührt.

Im Anhang ein kleines D5-Beispiel was ich vor ein paar Jahren mal gebastelt hab (170 KB).
Angehängte Dateien
Dateityp: zip event_distributor_107.zip (169,3 KB, 9x aufgerufen)
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#10

Re: Dieses Delphi-Event in C#?

  Alt 7. Aug 2006, 18:58
Zitat von Chewie:
Der Unterschied zwischen Delphi und C#, also das, was dich verwirrt, dürfte wohl sein, dass Eriegnisse in Delphi technisch gesehen nur Methodenzeiger sind, also Zeiger auf eine Methode.

In C# sind Events eigene Sprachfeatures und deswegen als Multicast eingeführt, d.h. du weißt nicht eine Methode dem Event zu wie in Delphi, sondern mehrere.

Deswegen verwendest du den Operator += und nicht den einfachen Zuweisungsoperator, wie du es in Delphi machen würdest.
Danke für die Erklärung, nur versteh ich das nicht ganz. Man weisst Mehr events an ein Delegate? oder wie? *g hm
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz