Autor Beitrag
Mangafreak1995
Hält's aus hier
Beiträge: 7

Win XP
Delphi 7 Enterprise, Visual Studio 2008 Express, Visual Studio 2008 Professional
BeitragVerfasst: Mo 31.05.10 22:44 
Hallo Com,

ich habe grade an einem Control gearbeitet und wollte jetzt ein noch ein paar Events hinzufügen.
Ich habe mich an diese Vorlage(www.harding.edu/fmcc...l#delegatesandevents) gehalten und bei mir kommt bei folgendem Code:
ausblenden C#-Quelltext
1:
2:
private delegate void CellChange(Point cell, OwnEnum curuser, OwnEnum newuser);
public event CellChange CellChanged;

in der 2. Zeile den Fehler:
Zitat:
Inkonsistenter Zugriff: Feldtyp "Namespace.UserControl.CellChange" ist weniger zugreifbar als Feld "Namespace.UserControl.CellChanged"

dabei wird "CellChanged" unterstrichen.

Ich weiß leider nichts mit der Fehlermeldung anzufangen.
Ich hoffe, dass ihr mir weiterhelfen könnt.

MfG M4n94fr34k
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 31.05.10 23:03 
Hallo,

die Fehlermeldung sagt, dass CellChanged öffentlich ist, aber das Delegate nicht. Das funktioniert dann nicht weil, du (von außen) zwar CellChanged kennst, aber das Delegate eben nicht.

D.h. du musst das Delegate auch öffentlich machen (und auch die Parameter).

Gruß

Edit: Alternativ kannst du natürlich auch das Event selbst als privat kennzeichnen, wie bei dem Beispiel - dann funktioniert es auch. Allgemein kannst du auch einen einfachen EventHandler verwenden.

public event EventHandler CellChanged;
Mangafreak1995 Threadstarter
Hält's aus hier
Beiträge: 7

Win XP
Delphi 7 Enterprise, Visual Studio 2008 Express, Visual Studio 2008 Professional
BeitragVerfasst: Di 01.06.10 00:40 
Ah, da lag das Problem.
Die Fehlermeldung kam so umgangsprachlich rüber auf den 1. Blick ;)
Ja, jetzt klappt das ganze auch.

Danke, für deinen Tipp. Ich bleibe aber erstmal bei dem was ich definitiv verstehe :D

MfG M4n94fr34k
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 01.06.10 07:53 
Naja, du verwendest halt kein Event sondern ein Delegate.

Sprich du setzt eine Methode die Aufgerufen werden soll, wenn der Zellinhalt sich verändert.

Ein Event ist im Prinzip das Selbe, allerdings kann man es von "Außen" nicht auslösen und auch nicht zuweisen (=) - Vergleich.

D.h. du hast das Problem das innerhalb deiner Anwendung jemand anderes das Delegate auslösen kann bzw. dein Delegate mit = überschreiben kann. Dies könnte dazu führen, dass du einen Bug einbaust der extrem schwierig zu finden ist.

Gruß
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 01.06.10 12:14 
Hallo danielf,

es wird doch ein Event benutzt (und nicht direkt ein Delegate, so wie du es schreibst bzw. ich es so verstanden habe -).

Es wäre bei einem von außen verwendbaren Event sicherlich besser, wenn er den Standardweg benutzt, d.h. EventHandler<MyEventArgs>, d.h. die Eventmethodensignatur sähe dann so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
class MyEventArgs : EventArgs
{
  // ...
}

void MyCellChanged(object sender, MyEventArgs e);

jedoch ist das kein unbedingtes Muss (ich selber verwende auch oft eigene Delegates für meine internen Events).
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 01.06.10 13:45 
Stimmt,
Zitat:
2: public event CellChange CellChanged;


Ich hatte die event-Deklaration übersehen. (ich habe gesehen: public CellChange CellChanged;).

Alles in Ordnung :)
Mangafreak1995 Threadstarter
Hält's aus hier
Beiträge: 7

Win XP
Delphi 7 Enterprise, Visual Studio 2008 Express, Visual Studio 2008 Professional
BeitragVerfasst: Di 01.06.10 14:01 
Und wieder etwas gelernt :)