Autor Beitrag
mikeb69
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 15.08.08 07:45 
hallo,

ich programmiere seit einiger zeit mit vb.net und möchte meine kompetenzen nun erweitern.
nun meine frage:
so würde ich ein event mit message in vb.net erstellen

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Public Interface IClass
    Event meinevent(ByVal msg As String)
End Interface

Public Class Class1
    Implements IClass

    Public Event meinevent(ByVal msg As String) Implements IClass.meinevent
End Class

jetzt hab ich versucht das nach c# zu konvertieren
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
namespace PowerFileWatcher
{
    interface IFileWatcher
    {
        event EventHandler  ObjectChanged;
    }
}

namespace PowerFileWatcher
{
    class ClassWatchFile : IFileWatcher 
    {

        #region IFileWatcher Members

        public event EventHandler ObjectChanged;

        #endregion

        public void Main()
        { 
        
        }
    }
}

mir gelingt es nicht dem c# event eine message zu verpassen - was muss ich an meinem code ändern ?

gruss

mikeb69

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 17.08.08 10:34 
Du mußt dafür einen eigenen Event-Handler definieren (mittels des Schlüsselworts 'delegate'):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
namespace PowerFileWatcher  
{  
    interface IFileWatcher  
    { 
        delegate void MyEventHandler(string message);
        event MyEventHandler ObjectChanged;
    }
}

 
class ClassWatchFile : IFileWatcher   
{  
        #region IFileWatcher Members  

        public event MyEventHandler ObjectChanged;

        #endregion  
}
mikeb69 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 17.08.08 15:31 
hallo th69,

danke - jedoch meldet er mir da einen fehler

Interfaces can not declare types

nehm ich den delegate aus dem interface raus - wird logischerweise kein fehler gemeldet.

EDIT:
ich bin jetzt soweit, dass ich das hier habe
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
namespace PowerFileWatcher  
{  
    public delegate void MyEventHandler(string message);
    interface IFileWatcher  
    { 
        event MyEventHandler ObjectChanged;
    }
}

 
class ClassWatchFile : IFileWatcher   
{  
        #region IFileWatcher Members  
        public event MyEventHandler ObjectChanged;

        #endregion  

     private static void einesub
     {
     ObjectChanged
     }
}

nur gibt es auch hier eine klippe zu umschiffen
An object reference is required for non static ....

danke

mikeb69
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 18.08.08 12:14 
Sorry für den Interface-Fehler.

Und dein letzter Fehler liegt daran, daß du von einer statischen Methode aus nicht direkt auf nicht-statische Member zugreifen kannst (in VB.NET dürfte das ja nicht anders sein ! -)

Du mußt dich also entscheiden, beides statisch oder besser nicht-statisch:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private void OnObjectChanged(string message)
{
    // dies ist der korrekte Aufruf für ein Event in C#, d.h. erst auf null überprüfen und anschließend die (sogenannten) abonnierten Methode(n) aufrufen
    if(ObjectChanged != null)
        ObjectChanged(message);
}
mikeb69 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 18.08.08 15:23 
hallo th69,

ok - danke.

soweit passt nun alles.
das event wird dennoch nicht ausgelöst, weill wir im code auf NULL prüfen und das event NULL ist.
ich denke das krieg ich hin - sollte in etwa so laufen, wie mit meinem timer event.

ausblenden C#-Quelltext
1:
2:
//Tick Event des Timers hinzufügen
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Tick);


danke

mikeb69
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 21.09.08 08:32 
@th69


user profile iconTh69 hat folgendes geschrieben:

{
// dies ist der korrekte Aufruf für ein Event in C#, d.h. erst auf null überprüfen und anschließend die (sogenannten) abonnierten Methode(n) aufrufen
if(ObjectChanged != null)
ObjectChanged(message);
}
[/cs]



warum wir eine Prüfung auf null durchgeführt? Sorry, ich bin ebenfalls Ein-Umsteiger von VB.Net -> C#

[EDIT]
Ich habe gerade mal in der Hilfe nachgeschaut, da rufen die das Event einfach ohne Prüfung auf..
[END EDIT]




Gruß
Christoph
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.09.08 09:48 
Wenn niemand einen Event-Handler hinzugefügt hat (dann ist ObjectChanged == null), ist nichts da zum Aufrufen und dann dürfte eine Fehlermeldung geben.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 21.09.08 10:14 
Ah ja, Ok. Wenn ich den Event-Handler selbst zugefügt habe kann ich mir die Prüfung also sparen.

Vielen Dank!


Gruß
Christoph
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 21.09.08 13:05 
Du solltest trotzdem immer die Prüfung vornehmen (besser als irgendwann mal eine Null-Exception zu erhalten).