Probleme mit Event einer Klasse.
-
SDo, ich steige gerade in die C# Programmierung mit dem C# Builder von Borland ein. Zur Übung habe ich einen Filesplitter geschrieben. Wie es sich gehört auch alles schön in eine Klasse gepackt. Diese Klasse habe ich mit einem Event versehen, der mich bei dem Fortschritt benachrichtigen soll. Nun ja, eigentlich habe ich das ganze mehr oder weniger zusammengebastelt.
Hier mal mein Code:public class FileSplitter { private string BuildPartFilename(string Filename, long Part) { string s; s = Filename+"."+Part.ToString(); return s; } private int MinToRead(int a, int b) { return Math.Min(a, b); } protected virtual void OnProgress(string Filename, long Progress) { if(Splitted != null) { Splitted(this, new SplitEventArgs(Filename, Progress)); } } public event SplitEventHandler Splitted; public Boolean Split(string Filename, string DestFolder, long cntParts, int PartSize) { FileStream fts; // FileToSplit FileStream pf; // PartFile string PartFilename; int nBytes = 4096; byte[] ByteArray = new byte[nBytes]; int BytesToRead, BytesRead; long Done, OldDone; try { fts = new FileStream(Filename, FileMode.Open, FileAccess.Read); fts.Seek(0, SeekOrigin.Begin); for (int i = 1; i <= cntParts; i++) { OldDone = 0; BytesToRead = PartSize * 1024; // Size of the file parts try { PartFilename = DestFolder+"\\"+BuildPartFilename(Path.GetFileName(Filename), i); if (File.Exists(PartFilename)) File.Delete(PartFilename); pf = new FileStream(PartFilename, FileMode.CreateNew, FileAccess.Write); do { BytesRead = fts.Read(ByteArray, 0, Math.Min(ByteArray.Length, BytesToRead)); pf.Write(ByteArray, 0, BytesRead); BytesToRead = BytesToRead - ByteArray.Length; Done = fts.Position * 100 / fts.Length; if (Done != OldDone) { OldDone = Done; OnProgress(PartFilename, Done); } } while (BytesToRead > 0); } catch (Exception e) { MessageBox.Show(e.Message, "FileSplitter", 0, MessageBoxIcon.Error); fts.Close(); return false; } } } catch (Exception e) { MessageBox.Show(e.Message, "FileSplitter", 0, MessageBoxIcon.Error); return false; } return true; } }
Dann kommt noch dazu:
public delegate void SplitEventHandler(object sender, SplitEventArgs e); public class SplitEventArgs : EventArgs { public SplitEventArgs(string Filename, long Progress) {} public string FileName { get{return this.FileName;} } public long Progress { get{return this.Progress;} } }
Zuweisen des Events:
public WinForm() { // // Required for Windows Form Designer support // InitializeComponent(); FileSplitter splitter = new FileSplitter(); splitter.Splitted += new SplitEventHandler(HandleSplitted); // // TODO: Add any constructor code after InitializeComponent call // }
Und aufruf im Programm:
private void HandleSplitted(object sender, SplitEventArgs e) { statusBar1.Panels[0].Text = e.FileName; statusBar1.Panels[1].Text = e.Progress.ToString()+"%"; } private void btnGo_Click(object sender, System.EventArgs e) { FileSplitter fs; fs = new FileSplitter(); fs.Split(txtFile.Text, txtFolder.Text, Convert.ToInt32(lblCntFiles.Text), Convert.ToInt32(txtFileSize.Text)); }
Problem: Das Event wird nicht ausgelöst.
protected virtual void OnProgress(string Filename, long Progress) { if(Splitted != null) { Splitted(this, new SplitEventArgs(Filename, Progress)); } }
Splitted ist an dieser Stelle immer null.
Kann mir da mal jemand helfen? ist mein erstes C# Projekt und ich hätte das schon gerne richtig am zum Laufen bekommen.
-
Überleg' doch mal, was du da wirklich machst?
in dem Konstruktor WinForm() wird ein FileSplitter erstellt und eine Ereignisbehandlung zugewiesen. es wird abber für die erstellte Instance nie Split() Methode aufgerufen. Diese Instance wird gar nicht benutzt. Müllt nur Speicher zu.
andererseits
in btnGo_Click() wird auch eine Instance des FileSplitter erstellt und es wird die Methode Split() aufgerufen. es wird aber keine Behandlung für das Ereignis dort imlementiert.
das kann unmöglich funtzen.