Autor Beitrag
VampireSilence
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109
Erhaltene Danke: 5


C# (VS 2008 Express), PHP/MySQL, Windows XP
BeitragVerfasst: Mo 20.09.10 22:38 
Ich hab das Gefühl, ich bin jetzt öfters da. Also ich habe gerade versucht ein Event für eine Klasse zu implementieren, aber nach dem Debugstart erschienen nun Fehlermeldungen, mit denen ich nicht wirklich etwas anfangen kann. Ich sollte vielleicht dazu sagen, dass ich vorher noch nie Events in Klassen implementiert habe. Das habe ich jetzt nur mit Hilfe eines Tutorials gemacht.

Ich möchte erreichen, dass bei Änderung der Felder "FileSize" oder "FileSizeCurrent" ein Event namens "ProgressChanged" aufgerufen wird, um den Fortschritt damit grafisch darstellen zu können.

Hier erstmal der Code der Klasse:

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
    class DownloadManager
    {
        private int LastId = 0;
        private DownloadManagerEntry[] DownloadManagerEntries = new DownloadManagerEntry[Int16.MaxValue];

        public int CreateId()
        {
            return ++this.LastId;
        }

        public DownloadManager()
        {
            //
        }

        public DownloadManagerEntry CreateNewEntry()
        {
            DownloadManagerEntry dmEntry = new DownloadManagerEntry();
            dmEntry.Id = this.CreateId();
            this.DownloadManagerEntries[dmEntry.Id] = dmEntry;

            return dmEntry;
        }

        public class DownloadManagerEntry
        {
            public int Id;
            //public Int64 FileSize, FileSizeCurrent;
            public string FileName, FilePath, DownloadUri;

            public Int64 FileSize
            {
                get
                {
                    return FileSize;
                }
                set
                {
                    FileSize = value;
                    ProgressChangedEventArgs e = new DownloadManager.DownloadManagerEntry.ProgressChangedEventArgs(this.FileSize, this.FileSizeCurrent);
                    OnProgressChanged(e);
                }
            }

            public Int64 FileSizeCurrent
            {
                get
                {
                    return FileSizeCurrent;
                }
                set
                {
                    FileSizeCurrent = value;
                    ProgressChangedEventArgs e = new DownloadManager.DownloadManagerEntry.ProgressChangedEventArgs(this.FileSize, this.FileSizeCurrent);
                    OnProgressChanged(e);
                }
            }

            public DownloadManagerEntry()
            {
            }

            
            public class ProgressChangedEventArgs : System.EventArgs
            {
                //protected Int64 ProgressCurrent;
                //protected Int64 ProgressMaximum;

                public Int64 ProgressMaximum
                {
                    get { return ProgressMaximum; }
                }

                public Int64 ProgressCurrent
                {
                    get { return ProgressCurrent; }
                }

                private ProgressChangedEventArgs()
                {

                }

                public ProgressChangedEventArgs(Int64 ProgressMax, Int64 ProgressCur) 
                {
                    Int64 ProgressMaximum = ProgressMax;
                    Int64 ProgressCurrent = ProgressCur; 
                }
            }

            public delegate void ProgressChangedHandler(object sender, ProgressChangedEventArgs e);
            public event ProgressChangedHandler ProgressChanged;

            protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
            {
                if (ProgressChanged != null)
                {
                    ProgressChanged(this, e);
                }
            }
        }
    }


Der wird von der IDE soweit erstmal nicht beanstandet. Jetzt will ich aber eine Instanz der Klasse erstellen, mit folgendem Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        public DownloadManager _DownloadManager = new DownloadManager();

        public void DownloadManagerEntry_ProgressChanged(object sender, DownloadManager.DownloadManagerEntry.ProgressChangedEventArgs e)
        {
            // Status mit e.ProgressCurrent aktualisieren;
        }


Und die IDE spuckt mir folgende Fehler dazu aus:

Zitat:

Fehler 1 Inkonsistenter Zugriff: Feldtyp "TestProject.DownloadManager" ist weniger zugreifbar als Feld "TestProject.frmMain._DownloadManager" X:\frmMain.cs 19 32 TestProject

Fehler 2 Inkonsistenter Zugriff: Parametertyp "TestProject.DownloadManager.DownloadManagerEntry.ProgressChangedEventArgs" ist weniger zugreifbar als Methode "TestProject.frmMain.DownloadManagerEntry_ProgressChanged(object, TestProject.DownloadManager.DownloadManagerEntry.ProgressChangedEventArgs)" X:\frmMain.cs 802 21 TestProject



Was bedeutet denn "weniger zugreifbar" überhaupt ? Und wie kann ich nun eine Instanz der Klasse erstellen ?
Bevor ich das Event formuliert hatte, waren diese Aufrufe jedenfalls noch nicht fehlerhaft.

mfg
- VampireSilence


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Mo 20.09.2010 um 22:41
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 20.09.10 22:44 
Hallo!

"weniger zugreifbar" heißt, dass Du das Feld _DownloadManager als public deklariert hast, die Klasse DownloadManager aber, da nichts anderes angegeben, internal ist. Das heißt, das Feld wäre theoretisch öffentlich sichtbar (auch aus anderen Assemblies heraus), der Typ aber nicht. Das passt dann natürlich nicht.

Du solltest übrigens auch das Verschachteln von Klassen eher vermeiden. Macht man nur ganz selten, weil es schnell unübersichtlich werden kann. :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".