![]() |
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:
|
Re: Dieses Delphi-Event in C#?
Also, du hast in C# zunächst mal keine Methodenzeiger wie in Delphi. Anstelle derer benutzt du ein Delegate.
Ein Event ist ein entsprechendes Sprachfeature, nicht nur eine Property, die einen Methodenzeiger enthält. Du brauchst also ein public event. Dann brauchst du, genauso wie in Delphi, eine Methode, die der Signatur des Methodenzeigers bzw. hier des Delegates entspricht. Dem Event wird diese Methode zugewiesen allerdings nicht mit =, sondern mit +=. Der Text hier ist im Prinzip nur die Erläuterung des Quellcodes von ![]() |
Re: Dieses Delphi-Event in C#?
Danke, ich hoffe ich habs nun verstanden ;)
Und wie ist es wenn ich einen Parameter an ein Event weitergeben möchte, den ich hinterher in meiner Komponente wieder brauche? In Delphi hat man diesen ja einfach mit "var" definiert. Wie ist das in C#? |
Re: Dieses Delphi-Event in C#?
Dort heißts ref und funktioniert genauso, man muss nur drauf achten, dass man das ref nicht nur im Methodenkopf hinschreibt, sondern auch beim Aufruf.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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