![]() |
Dieses Delphi-Event in C#?
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? |
Re: Dieses Delphi-Event in C#?
Zitat:
Code:
[edit=Phoenix]Code-Tags von C in C# geändert. Bitte auf richtige Sprache achten :) Mfg, Phoenix[/edit]
.
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; } |
Re: Dieses Delphi-Event in C#?
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: ![]() |
Re: Dieses Delphi-Event in C#?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:
Mir hat dabei folgende Lektüre geholfen: Zitat:
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: 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. Viel Erfolg! Jürgen |
Re: Dieses Delphi-Event in C#?
Danke Leute, :))). Gleich mal schauen.
|
Re: Dieses Delphi-Event in C#?
Zitat:
Zitat:
Zitat:
|
Re: Dieses Delphi-Event in C#?
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:
Könnte mir jemand mein Beispiel:
Delphi-Quellcode:
In C# umschreiben, mit gleichen Namen der Klasse/Prozedur usw?
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; |
Re: Dieses Delphi-Event in C#?
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. |
Re: Dieses Delphi-Event in C#?
Liste der Anhänge anzeigen (Anzahl: 1)
Ein klein wenig Offtopic: So einen Multicast kann man sich in Delphi recht easy nachbauen:
Delphi-Quellcode:
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.
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; Im Anhang ein kleines D5-Beispiel was ich vor ein paar Jahren mal gebastelt hab (170 KB). |
Re: Dieses Delphi-Event in C#?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr. |
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-2025 by Thomas Breitkreuz